brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.3 KiB · 2c5aff2 Raw
145 lines · plain
1; RUN: not opt -S %s -passes=verify 2>&1 | FileCheck %s2 3declare token @llvm.call.preallocated.setup(i32)4declare ptr @llvm.call.preallocated.arg(token, i32)5declare void @llvm.call.preallocated.teardown(token)6 7; Fake LLVM intrinsic to return a token8declare token @llvm.what()9 10declare void @foo0()11declare void @foo1(ptr preallocated(i32))12declare void @foo2(ptr preallocated(i32), ptr, ptr preallocated(i32))13declare i32 @blackbox()14 15; CHECK: llvm.call.preallocated.arg must be called with a "preallocated" call site attribute16define void @preallocated_arg_missing_preallocated_attribute() {17    %cs = call token @llvm.call.preallocated.setup(i32 1)18    %x = call ptr @llvm.call.preallocated.arg(token %cs, i32 0)19    call void @foo1(ptr preallocated(i32) %x) ["preallocated"(token %cs)]20    ret void21}22 23; CHECK: preallocated as a call site attribute can only be on llvm.call.preallocated.arg24define void @preallocated_call_site_attribute_not_on_arg() {25    call void @foo0() preallocated(i32)26    ret void27}28 29; CHECK: "preallocated" argument must be a token from llvm.call.preallocated.setup30define void @preallocated_bundle_token() {31    %i = call i32 @blackbox()32    call void @foo0() ["preallocated"(i32 %i)]33    ret void34}35 36; CHECK: "preallocated" argument must be a token from llvm.call.preallocated.setup37define void @preallocated_bundle_token_from_setup() {38    %cs = call token @llvm.what()39    call void @foo0() ["preallocated"(token %cs)]40    ret void41}42 43; CHECK: Expected exactly one preallocated bundle operand44define void @preallocated_bundle_one_token() {45    %cs0 = call token @llvm.call.preallocated.setup(i32 0)46    %cs1 = call token @llvm.call.preallocated.setup(i32 0)47    call void @foo0() ["preallocated"(token %cs0, token %cs1)]48    ret void49}50 51; CHECK: Multiple preallocated operand bundles52define void @preallocated_multiple_bundles() {53    %cs0 = call token @llvm.call.preallocated.setup(i32 0)54    %cs1 = call token @llvm.call.preallocated.setup(i32 0)55    call void @foo0() ["preallocated"(token %cs0), "preallocated"(token %cs1)]56    ret void57}58 59; CHECK: Can have at most one call60define void @preallocated_one_call() {61    %cs = call token @llvm.call.preallocated.setup(i32 1)62    %x = call ptr @llvm.call.preallocated.arg(token %cs, i32 0) preallocated(i32)63    call void @foo1(ptr preallocated(i32) %x) ["preallocated"(token %cs)]64    call void @foo1(ptr preallocated(i32) %x) ["preallocated"(token %cs)]65    ret void66}67 68; CHECK: immarg operand has non-immediate parameter69define void @preallocated_setup_constant() {70    %ac = call i32 @blackbox()71    %cs = call token @llvm.call.preallocated.setup(i32 %ac)72    ret void73}74 75; CHECK: llvm.call.preallocated.alloc arg index must be a constant76define void @preallocated_arg_constant() {77    %ac = call i32 @blackbox()78    %cs = call token @llvm.call.preallocated.setup(i32 3)79    call token @llvm.call.preallocated.arg(token %cs, i32 %ac)80    ret void81}82 83; CHECK: must be between 0 and corresponding84define void @preallocated_setup_arg_index_in_bounds() {85    %cs = call token @llvm.call.preallocated.setup(i32 2)86    %a0 = call ptr @llvm.call.preallocated.arg(token %cs, i32 2) preallocated(i32)87    ret void88}89 90; CHECK: preallocated operand either requires a preallocated bundle or the call to be musttail91define void @preallocated_require_bundle() {92    %cs = call token @llvm.call.preallocated.setup(i32 1)93    %x = call ptr @llvm.call.preallocated.arg(token %cs, i32 0) preallocated(i32)94    call void @foo1(ptr preallocated(i32) %x)95    ret void96}97 98; CHECK: arg size must be equal to number of preallocated arguments99define void @preallocated_num_args() {100    %cs = call token @llvm.call.preallocated.setup(i32 3)101    %x = call ptr @llvm.call.preallocated.arg(token %cs, i32 0) preallocated(i32)102    %y = call ptr @llvm.call.preallocated.arg(token %cs, i32 1) preallocated(i32)103    %a = inttoptr i32 0 to ptr104    call void @foo2(ptr preallocated(i32) %x, ptr %a, ptr preallocated(i32) %y) ["preallocated"(token %cs)]105    ret void106}107 108; CHECK: token argument must be a llvm.call.preallocated.setup109define void @preallocated_arg_token() {110    %t = call token @llvm.what()111    %x = call ptr @llvm.call.preallocated.arg(token %t, i32 1) preallocated(i32)112    ret void113}114 115; CHECK: cannot use preallocated intrinsics on a call without preallocated arguments116define void @preallocated_no_preallocated_args() {117    %cs = call token @llvm.call.preallocated.setup(i32 0)118    call void @foo0() ["preallocated"(token %cs)]119    ret void120}121 122; CHECK: preallocated operand either requires a preallocated bundle or the call to be musttail123define void @musttail_and_bundle(ptr preallocated(i32) %a) {124    %cs = call token @llvm.call.preallocated.setup(i32 0)125    musttail call void @musttail_and_bundle(ptr preallocated(i32) %a) ["preallocated"(token %cs)]126    ret void127}128 129; CHECK: cannot guarantee tail call due to mismatched ABI impacting function attributes130define void @musttail_attr_no_match(ptr preallocated(i32) %a) {131    musttail call void @musttail_and_bundle(ptr %a)132    ret void133}134 135; CHECK: token argument must be a llvm.call.preallocated.setup136define void @teardown_token_not_from_setup() {137    %cs = call token @llvm.what()138    call void @llvm.call.preallocated.teardown(token %cs)139    ret void140}141 142; CHECK: Attribute 'preallocated(i32)' applied to incompatible type!143; CHECK-NEXT: ptr @not_pointer144declare void @not_pointer(i32 preallocated(i32))145