xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/promote-alloca-to-lds-select.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -mtriple=amdgcn-unknown-amdhsa -mcpu=kaveri -amdgpu-promote-alloca < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @lds_promoted_alloca_select_invalid_pointer_operand(
4*9880d681SAndroid Build Coastguard Worker; CHECK: %alloca = alloca i32
5*9880d681SAndroid Build Coastguard Worker; CHECK: select i1 undef, i32* undef, i32* %alloca
6*9880d681SAndroid Build Coastguard Workerdefine void @lds_promoted_alloca_select_invalid_pointer_operand() #0 {
7*9880d681SAndroid Build Coastguard Worker  %alloca = alloca i32, align 4
8*9880d681SAndroid Build Coastguard Worker  %select = select i1 undef, i32* undef, i32* %alloca
9*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %select, align 4
10*9880d681SAndroid Build Coastguard Worker  ret void
11*9880d681SAndroid Build Coastguard Worker}
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @lds_promote_alloca_select_two_derived_pointers(
14*9880d681SAndroid Build Coastguard Worker; CHECK: [[ARRAYGEP:%[0-9]+]] = getelementptr inbounds [256 x [16 x i32]], [256 x [16 x i32]] addrspace(3)* @lds_promote_alloca_select_two_derived_pointers.alloca, i32 0, i32 %{{[0-9]+}}
15*9880d681SAndroid Build Coastguard Worker; CHECK: %ptr0 = getelementptr inbounds [16 x i32], [16 x i32] addrspace(3)* [[ARRAYGEP]], i32 0, i32 %a
16*9880d681SAndroid Build Coastguard Worker; CHECK: %ptr1 = getelementptr inbounds [16 x i32], [16 x i32] addrspace(3)* [[ARRAYGEP]], i32 0, i32 %b
17*9880d681SAndroid Build Coastguard Worker; CHECK: %select = select i1 undef, i32 addrspace(3)* %ptr0, i32 addrspace(3)* %ptr1
18*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, i32 addrspace(3)* %select, align 4
19*9880d681SAndroid Build Coastguard Workerdefine void @lds_promote_alloca_select_two_derived_pointers(i32 %a, i32 %b) #0 {
20*9880d681SAndroid Build Coastguard Worker  %alloca = alloca [16 x i32], align 4
21*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds [16 x i32], [16 x i32]* %alloca, i32 0, i32 %a
22*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [16 x i32], [16 x i32]* %alloca, i32 0, i32 %b
23*9880d681SAndroid Build Coastguard Worker  %select = select i1 undef, i32* %ptr0, i32* %ptr1
24*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %select, align 4
25*9880d681SAndroid Build Coastguard Worker  ret void
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker; FIXME: This should be promotable but requires knowing that both will be promoted first.
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @lds_promote_alloca_select_two_allocas(
31*9880d681SAndroid Build Coastguard Worker; CHECK: %alloca0 = alloca i32, i32 16, align 4
32*9880d681SAndroid Build Coastguard Worker; CHECK: %alloca1 = alloca i32, i32 16, align 4
33*9880d681SAndroid Build Coastguard Worker; CHECK: %ptr0 = getelementptr inbounds i32, i32* %alloca0, i32 %a
34*9880d681SAndroid Build Coastguard Worker; CHECK: %ptr1 = getelementptr inbounds i32, i32* %alloca1, i32 %b
35*9880d681SAndroid Build Coastguard Worker; CHECK: %select = select i1 undef, i32* %ptr0, i32* %ptr1
36*9880d681SAndroid Build Coastguard Workerdefine void @lds_promote_alloca_select_two_allocas(i32 %a, i32 %b) #0 {
37*9880d681SAndroid Build Coastguard Worker  %alloca0 = alloca i32, i32 16, align 4
38*9880d681SAndroid Build Coastguard Worker  %alloca1 = alloca i32, i32 16, align 4
39*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds i32, i32* %alloca0, i32 %a
40*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds i32, i32* %alloca1, i32 %b
41*9880d681SAndroid Build Coastguard Worker  %select = select i1 undef, i32* %ptr0, i32* %ptr1
42*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %select, align 4
43*9880d681SAndroid Build Coastguard Worker  ret void
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker; TODO: Maybe this should be canonicalized to select on the constant and GEP after.
47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @lds_promote_alloca_select_two_derived_constant_pointers(
48*9880d681SAndroid Build Coastguard Worker; CHECK: [[ARRAYGEP:%[0-9]+]] = getelementptr inbounds [256 x [16 x i32]], [256 x [16 x i32]] addrspace(3)* @lds_promote_alloca_select_two_derived_constant_pointers.alloca, i32 0, i32 %{{[0-9]+}}
49*9880d681SAndroid Build Coastguard Worker; CHECK: %ptr0 = getelementptr inbounds [16 x i32], [16 x i32] addrspace(3)* [[ARRAYGEP]], i32 0, i32 1
50*9880d681SAndroid Build Coastguard Worker; CHECK: %ptr1 = getelementptr inbounds [16 x i32], [16 x i32] addrspace(3)* [[ARRAYGEP]], i32 0, i32 3
51*9880d681SAndroid Build Coastguard Worker; CHECK: %select = select i1 undef, i32 addrspace(3)* %ptr0, i32 addrspace(3)* %ptr1
52*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, i32 addrspace(3)* %select, align 4
53*9880d681SAndroid Build Coastguard Workerdefine void @lds_promote_alloca_select_two_derived_constant_pointers() #0 {
54*9880d681SAndroid Build Coastguard Worker  %alloca = alloca [16 x i32], align 4
55*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds [16 x i32], [16 x i32]* %alloca, i32 0, i32 1
56*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [16 x i32], [16 x i32]* %alloca, i32 0, i32 3
57*9880d681SAndroid Build Coastguard Worker  %select = select i1 undef, i32* %ptr0, i32* %ptr1
58*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %select, align 4
59*9880d681SAndroid Build Coastguard Worker  ret void
60*9880d681SAndroid Build Coastguard Worker}
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @lds_promoted_alloca_select_input_select(
63*9880d681SAndroid Build Coastguard Worker; CHECK: getelementptr inbounds [256 x [16 x i32]], [256 x [16 x i32]] addrspace(3)* @lds_promoted_alloca_select_input_select.alloca, i32 0, i32 %{{[0-9]+}}
64*9880d681SAndroid Build Coastguard Worker; CHECK: %ptr0 = getelementptr inbounds [16 x i32], [16 x i32] addrspace(3)* %{{[0-9]+}}, i32 0, i32 %a
65*9880d681SAndroid Build Coastguard Worker; CHECK: %ptr1 = getelementptr inbounds [16 x i32], [16 x i32] addrspace(3)* %{{[0-9]+}}, i32 0, i32 %b
66*9880d681SAndroid Build Coastguard Worker; CHECK: %ptr2 = getelementptr inbounds [16 x i32], [16 x i32] addrspace(3)* %{{[0-9]+}}, i32 0, i32 %c
67*9880d681SAndroid Build Coastguard Worker; CHECK: %select0 = select i1 undef, i32 addrspace(3)* %ptr0, i32 addrspace(3)* %ptr1
68*9880d681SAndroid Build Coastguard Worker; CHECK: %select1 = select i1 undef, i32 addrspace(3)* %select0, i32 addrspace(3)* %ptr2
69*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, i32 addrspace(3)* %select1, align 4
70*9880d681SAndroid Build Coastguard Workerdefine void @lds_promoted_alloca_select_input_select(i32 %a, i32 %b, i32 %c) #0 {
71*9880d681SAndroid Build Coastguard Worker  %alloca = alloca [16 x i32], align 4
72*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds [16 x i32], [16 x i32]* %alloca, i32 0, i32 %a
73*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [16 x i32], [16 x i32]* %alloca, i32 0, i32 %b
74*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [16 x i32], [16 x i32]* %alloca, i32 0, i32 %c
75*9880d681SAndroid Build Coastguard Worker  %select0 = select i1 undef, i32* %ptr0, i32* %ptr1
76*9880d681SAndroid Build Coastguard Worker  %select1 = select i1 undef, i32* %select0, i32* %ptr2
77*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %select1, align 4
78*9880d681SAndroid Build Coastguard Worker  ret void
79*9880d681SAndroid Build Coastguard Worker}
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerdefine void @lds_promoted_alloca_select_input_phi(i32 %a, i32 %b, i32 %c) #0 {
82*9880d681SAndroid Build Coastguard Workerentry:
83*9880d681SAndroid Build Coastguard Worker  %alloca = alloca [16 x i32], align 4
84*9880d681SAndroid Build Coastguard Worker  %ptr0 = getelementptr inbounds [16 x i32], [16 x i32]* %alloca, i32 0, i32 %a
85*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [16 x i32], [16 x i32]* %alloca, i32 0, i32 %b
86*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %ptr0
87*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %bb1, label %bb2
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerbb1:
90*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [16 x i32], [16 x i32]* %alloca, i32 0, i32 %c
91*9880d681SAndroid Build Coastguard Worker  %select0 = select i1 undef, i32* undef, i32* %ptr2
92*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %ptr1
93*9880d681SAndroid Build Coastguard Worker  br label %bb2
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerbb2:
96*9880d681SAndroid Build Coastguard Worker  %phi.ptr = phi i32* [ %ptr0, %entry ], [ %select0, %bb1 ]
97*9880d681SAndroid Build Coastguard Worker  %select1 = select i1 undef, i32* %phi.ptr, i32* %ptr1
98*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %select1, align 4
99*9880d681SAndroid Build Coastguard Worker  ret void
100*9880d681SAndroid Build Coastguard Worker}
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_null_rhs(
103*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: alloca
104*9880d681SAndroid Build Coastguard Worker; CHECK: select i1 %tmp2, double addrspace(3)* %{{[0-9]+}}, double addrspace(3)* null
105*9880d681SAndroid Build Coastguard Workerdefine void @select_null_rhs(double addrspace(1)* nocapture %arg, i32 %arg1) #1 {
106*9880d681SAndroid Build Coastguard Workerbb:
107*9880d681SAndroid Build Coastguard Worker  %tmp = alloca double, align 8
108*9880d681SAndroid Build Coastguard Worker  store double 0.000000e+00, double* %tmp, align 8
109*9880d681SAndroid Build Coastguard Worker  %tmp2 = icmp eq i32 %arg1, 0
110*9880d681SAndroid Build Coastguard Worker  %tmp3 = select i1 %tmp2, double* %tmp, double* null
111*9880d681SAndroid Build Coastguard Worker  store double 1.000000e+00, double* %tmp3, align 8
112*9880d681SAndroid Build Coastguard Worker  %tmp4 = load double, double* %tmp, align 8
113*9880d681SAndroid Build Coastguard Worker  store double %tmp4, double addrspace(1)* %arg
114*9880d681SAndroid Build Coastguard Worker  ret void
115*9880d681SAndroid Build Coastguard Worker}
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @select_null_lhs(
118*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: alloca
119*9880d681SAndroid Build Coastguard Worker; CHECK: select i1 %tmp2, double addrspace(3)* null, double addrspace(3)* %{{[0-9]+}}
120*9880d681SAndroid Build Coastguard Workerdefine void @select_null_lhs(double addrspace(1)* nocapture %arg, i32 %arg1) #1 {
121*9880d681SAndroid Build Coastguard Workerbb:
122*9880d681SAndroid Build Coastguard Worker  %tmp = alloca double, align 8
123*9880d681SAndroid Build Coastguard Worker  store double 0.000000e+00, double* %tmp, align 8
124*9880d681SAndroid Build Coastguard Worker  %tmp2 = icmp eq i32 %arg1, 0
125*9880d681SAndroid Build Coastguard Worker  %tmp3 = select i1 %tmp2, double* null, double* %tmp
126*9880d681SAndroid Build Coastguard Worker  store double 1.000000e+00, double* %tmp3, align 8
127*9880d681SAndroid Build Coastguard Worker  %tmp4 = load double, double* %tmp, align 8
128*9880d681SAndroid Build Coastguard Worker  store double %tmp4, double addrspace(1)* %arg
129*9880d681SAndroid Build Coastguard Worker  ret void
130*9880d681SAndroid Build Coastguard Worker}
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Workerattributes #0 = { norecurse nounwind "amdgpu-max-waves-per-eu"="1" }
133*9880d681SAndroid Build Coastguard Workerattributes #1 = { norecurse nounwind }