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