brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.5 KiB · a2c2611 Raw
131 lines · plain
1; RUN: opt -S -mtriple=amdgcn-unknown-amdhsa -mcpu=kaveri -passes=amdgpu-promote-alloca < %s | FileCheck %s2 3; CHECK-LABEL: @lds_promoted_alloca_select_invalid_pointer_operand(4; CHECK: %alloca = alloca i325; CHECK: select i1 undef, ptr addrspace(5) poison, ptr addrspace(5) %alloca6define amdgpu_kernel void @lds_promoted_alloca_select_invalid_pointer_operand() #0 {7  %alloca = alloca i32, align 4, addrspace(5)8  %select = select i1 undef, ptr addrspace(5) poison, ptr addrspace(5) %alloca9  store i32 0, ptr addrspace(5) %select, align 410  ret void11}12 13; CHECK-LABEL: @lds_promote_alloca_select_two_derived_pointers(14; CHECK: [[ARRAYGEP:%[0-9]+]] = getelementptr inbounds [256 x [16 x i32]], ptr addrspace(3) @lds_promote_alloca_select_two_derived_pointers.alloca, i32 0, i32 %{{[0-9]+}}15; CHECK: %ptr0 = getelementptr inbounds [16 x i32], ptr addrspace(3) [[ARRAYGEP]], i32 0, i32 %a16; CHECK: %ptr1 = getelementptr inbounds [16 x i32], ptr addrspace(3) [[ARRAYGEP]], i32 0, i32 %b17; CHECK: %select = select i1 undef, ptr addrspace(3) %ptr0, ptr addrspace(3) %ptr118; CHECK: store i32 0, ptr addrspace(3) %select, align 419define amdgpu_kernel void @lds_promote_alloca_select_two_derived_pointers(i32 %a, i32 %b) #0 {20  %alloca = alloca [16 x i32], align 4, addrspace(5)21  %ptr0 = getelementptr inbounds [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 %a22  %ptr1 = getelementptr inbounds [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 %b23  %select = select i1 undef, ptr addrspace(5) %ptr0, ptr addrspace(5) %ptr124  store i32 0, ptr addrspace(5) %select, align 425  ret void26}27 28; FIXME: This should be promotable but requires knowing that both will be promoted first.29 30; CHECK-LABEL: @lds_promote_alloca_select_two_allocas(31; CHECK: %alloca0 = alloca i32, i32 16, align 432; CHECK: %alloca1 = alloca i32, i32 16, align 433; CHECK: %ptr0 = getelementptr inbounds i32, ptr addrspace(5) %alloca0, i32 %a34; CHECK: %ptr1 = getelementptr inbounds i32, ptr addrspace(5) %alloca1, i32 %b35; CHECK: %select = select i1 undef, ptr addrspace(5) %ptr0, ptr addrspace(5) %ptr136define amdgpu_kernel void @lds_promote_alloca_select_two_allocas(i32 %a, i32 %b) #0 {37  %alloca0 = alloca i32, i32 16, align 4, addrspace(5)38  %alloca1 = alloca i32, i32 16, align 4, addrspace(5)39  %ptr0 = getelementptr inbounds i32, ptr addrspace(5) %alloca0, i32 %a40  %ptr1 = getelementptr inbounds i32, ptr addrspace(5) %alloca1, i32 %b41  %select = select i1 undef, ptr addrspace(5) %ptr0, ptr addrspace(5) %ptr142  store i32 0, ptr addrspace(5) %select, align 443  ret void44}45 46; TODO: Maybe this should be canonicalized to select on the constant and GEP after.47; CHECK-LABEL: @lds_promote_alloca_select_two_derived_constant_pointers(48; CHECK: [[ARRAYGEP:%[0-9]+]] = getelementptr inbounds [256 x [16 x i32]], ptr addrspace(3) @lds_promote_alloca_select_two_derived_constant_pointers.alloca, i32 0, i32 %{{[0-9]+}}49; CHECK: %ptr0 = getelementptr inbounds [16 x i32], ptr addrspace(3) [[ARRAYGEP]], i32 0, i32 150; CHECK: %ptr1 = getelementptr inbounds [16 x i32], ptr addrspace(3) [[ARRAYGEP]], i32 0, i32 351; CHECK: %select = select i1 undef, ptr addrspace(3) %ptr0, ptr addrspace(3) %ptr152; CHECK: store i32 0, ptr addrspace(3) %select, align 453define amdgpu_kernel void @lds_promote_alloca_select_two_derived_constant_pointers() #0 {54  %alloca = alloca [16 x i32], align 4, addrspace(5)55  %ptr0 = getelementptr inbounds [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 156  %ptr1 = getelementptr inbounds [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 357  %select = select i1 undef, ptr addrspace(5) %ptr0, ptr addrspace(5) %ptr158  store i32 0, ptr addrspace(5) %select, align 459  ret void60}61 62; FIXME: Can be promoted, but we'd have to recursively show that the select63; operands all point to the same alloca.64 65; CHECK-LABEL: @lds_promoted_alloca_select_input_select(66; CHECK: alloca67define amdgpu_kernel void @lds_promoted_alloca_select_input_select(i32 %a, i32 %b, i32 %c, i1 %c1, i1 %c2) #0 {68  %alloca = alloca [16 x i32], align 4, addrspace(5)69  %ptr0 = getelementptr inbounds [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 %a70  %ptr1 = getelementptr inbounds [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 %b71  %ptr2 = getelementptr inbounds [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 %c72  %select0 = select i1 %c1, ptr addrspace(5) %ptr0, ptr addrspace(5) %ptr173  %select1 = select i1 %c2, ptr addrspace(5) %select0, ptr addrspace(5) %ptr274  store i32 0, ptr addrspace(5) %select1, align 475  ret void76}77 78define amdgpu_kernel void @lds_promoted_alloca_select_input_phi(i32 %a, i32 %b, i32 %c, i1 %c0) #0 {79entry:80  %alloca = alloca [16 x i32], align 4, addrspace(5)81  %ptr0 = getelementptr inbounds [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 %a82  %ptr1 = getelementptr inbounds [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 %b83  store i32 0, ptr addrspace(5) %ptr084  br i1 %c0, label %bb1, label %bb285 86bb1:87  %ptr2 = getelementptr inbounds [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 %c88  %select0 = select i1 undef, ptr addrspace(5) poison, ptr addrspace(5) %ptr289  store i32 0, ptr addrspace(5) %ptr190  br label %bb291 92bb2:93  %phi.ptr = phi ptr addrspace(5) [ %ptr0, %entry ], [ %select0, %bb1 ]94  %select1 = select i1 undef, ptr addrspace(5) %phi.ptr, ptr addrspace(5) %ptr195  store i32 0, ptr addrspace(5) %select1, align 496  ret void97}98 99; CHECK-LABEL: @select_null_rhs(100; CHECK-NOT: alloca101; CHECK: select i1 %tmp2, ptr addrspace(3) %{{[0-9]+}}, ptr addrspace(3) null102define amdgpu_kernel void @select_null_rhs(ptr addrspace(1) nocapture %arg, i32 %arg1) #1 {103bb:104  %tmp = alloca double, align 8, addrspace(5)105  store double 0.000000e+00, ptr addrspace(5) %tmp, align 8106  %tmp2 = icmp eq i32 %arg1, 0107  %tmp3 = select i1 %tmp2, ptr addrspace(5) %tmp, ptr addrspace(5) null108  store double 1.000000e+00, ptr addrspace(5) %tmp3, align 8109  %tmp4 = load double, ptr addrspace(5) %tmp, align 8110  store double %tmp4, ptr addrspace(1) %arg111  ret void112}113 114; CHECK-LABEL: @select_null_lhs(115; CHECK-NOT: alloca116; CHECK: select i1 %tmp2, ptr addrspace(3) null, ptr addrspace(3) %{{[0-9]+}}117define amdgpu_kernel void @select_null_lhs(ptr addrspace(1) nocapture %arg, i32 %arg1) #1 {118bb:119  %tmp = alloca double, align 8, addrspace(5)120  store double 0.000000e+00, ptr addrspace(5) %tmp, align 8121  %tmp2 = icmp eq i32 %arg1, 0122  %tmp3 = select i1 %tmp2, ptr addrspace(5) null, ptr addrspace(5) %tmp123  store double 1.000000e+00, ptr addrspace(5) %tmp3, align 8124  %tmp4 = load double, ptr addrspace(5) %tmp, align 8125  store double %tmp4, ptr addrspace(1) %arg126  ret void127}128 129attributes #0 = { norecurse nounwind "amdgpu-waves-per-eu"="1,1" "amdgpu-flat-work-group-size"="1,256" }130attributes #1 = { norecurse nounwind }131