xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/promote-alloca-to-lds-phi.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
4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @branch_ptr_var_same_alloca(
5*9880d681SAndroid Build Coastguard Worker; CHECK: getelementptr inbounds [256 x [64 x i32]], [256 x [64 x i32]] addrspace(3)* @branch_ptr_var_same_alloca.alloca, i32 0, i32 %{{[0-9]+}}
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; CHECK: if:
8*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx0 = getelementptr inbounds [64 x i32], [64 x i32] addrspace(3)* %{{[0-9]+}}, i32 0, i32 %a
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker; CHECK: else:
11*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx1 = getelementptr inbounds [64 x i32], [64 x i32] addrspace(3)* %15, i32 0, i32 %b
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker; CHECK: endif:
14*9880d681SAndroid Build Coastguard Worker; CHECK: %phi.ptr = phi i32 addrspace(3)* [ %arrayidx0, %if ], [ %arrayidx1, %else ]
15*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, i32 addrspace(3)* %phi.ptr, align 4
16*9880d681SAndroid Build Coastguard Workerdefine void @branch_ptr_var_same_alloca(i32 %a, i32 %b) #0 {
17*9880d681SAndroid Build Coastguard Workerentry:
18*9880d681SAndroid Build Coastguard Worker  %alloca = alloca [64 x i32], align 4
19*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if, label %else
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerif:
22*9880d681SAndroid Build Coastguard Worker  %arrayidx0 = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 %a
23*9880d681SAndroid Build Coastguard Worker  br label %endif
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerelse:
26*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 %b
27*9880d681SAndroid Build Coastguard Worker  br label %endif
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerendif:
30*9880d681SAndroid Build Coastguard Worker  %phi.ptr = phi i32* [ %arrayidx0, %if ], [ %arrayidx1, %else ]
31*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %phi.ptr, align 4
32*9880d681SAndroid Build Coastguard Worker  ret void
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @branch_ptr_phi_alloca_null_0(
36*9880d681SAndroid Build Coastguard Worker; CHECK: %phi.ptr = phi i32 addrspace(3)* [ %arrayidx0, %if ], [ null, %entry ]
37*9880d681SAndroid Build Coastguard Workerdefine void @branch_ptr_phi_alloca_null_0(i32 %a, i32 %b) #0 {
38*9880d681SAndroid Build Coastguard Workerentry:
39*9880d681SAndroid Build Coastguard Worker  %alloca = alloca [64 x i32], align 4
40*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if, label %endif
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerif:
43*9880d681SAndroid Build Coastguard Worker  %arrayidx0 = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 %a
44*9880d681SAndroid Build Coastguard Worker  br label %endif
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerendif:
47*9880d681SAndroid Build Coastguard Worker  %phi.ptr = phi i32* [ %arrayidx0, %if ], [ null, %entry ]
48*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %phi.ptr, align 4
49*9880d681SAndroid Build Coastguard Worker  ret void
50*9880d681SAndroid Build Coastguard Worker}
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @branch_ptr_phi_alloca_null_1(
53*9880d681SAndroid Build Coastguard Worker; CHECK: %phi.ptr = phi i32 addrspace(3)*  [ null, %entry ], [ %arrayidx0, %if ]
54*9880d681SAndroid Build Coastguard Workerdefine void @branch_ptr_phi_alloca_null_1(i32 %a, i32 %b) #0 {
55*9880d681SAndroid Build Coastguard Workerentry:
56*9880d681SAndroid Build Coastguard Worker  %alloca = alloca [64 x i32], align 4
57*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if, label %endif
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerif:
60*9880d681SAndroid Build Coastguard Worker  %arrayidx0 = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 %a
61*9880d681SAndroid Build Coastguard Worker  br label %endif
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerendif:
64*9880d681SAndroid Build Coastguard Worker  %phi.ptr = phi i32* [ null, %entry ], [ %arrayidx0, %if ]
65*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %phi.ptr, align 4
66*9880d681SAndroid Build Coastguard Worker  ret void
67*9880d681SAndroid Build Coastguard Worker}
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @one_phi_value(
70*9880d681SAndroid Build Coastguard Worker; CHECK: getelementptr inbounds [256 x [64 x i32]], [256 x [64 x i32]] addrspace(3)* @one_phi_value.alloca, i32 0, i32 %14
71*9880d681SAndroid Build Coastguard Worker; CHECK:  %arrayidx0 = getelementptr inbounds [64 x i32], [64 x i32] addrspace(3)* %{{[0-9]+}}, i32 0, i32 %a
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker; CHECK: br label %exit
74*9880d681SAndroid Build Coastguard Worker; CHECK: %phi.ptr = phi i32 addrspace(3)* [ %arrayidx0, %entry ]
75*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, i32 addrspace(3)* %phi.ptr, align 4
76*9880d681SAndroid Build Coastguard Workerdefine void @one_phi_value(i32 %a) #0 {
77*9880d681SAndroid Build Coastguard Workerentry:
78*9880d681SAndroid Build Coastguard Worker  %alloca = alloca [64 x i32], align 4
79*9880d681SAndroid Build Coastguard Worker  %arrayidx0 = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 %a
80*9880d681SAndroid Build Coastguard Worker  br label %exit
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workerexit:
83*9880d681SAndroid Build Coastguard Worker  %phi.ptr = phi i32* [ %arrayidx0, %entry ]
84*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %phi.ptr, align 4
85*9880d681SAndroid Build Coastguard Worker  ret void
86*9880d681SAndroid Build Coastguard Worker}
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @branch_ptr_alloca_unknown_obj(
89*9880d681SAndroid Build Coastguard Worker; CHECK: %alloca = alloca [64 x i32], align 4
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Worker; CHECK: if:
92*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx0 = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 %a
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker; CHECK: else:
95*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx1 = call i32* @get_unknown_pointer()
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Worker; CHECK: endif:
98*9880d681SAndroid Build Coastguard Worker; CHECK: %phi.ptr = phi i32* [ %arrayidx0, %if ], [ %arrayidx1, %else ]
99*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 0, i32* %phi.ptr, align 4
100*9880d681SAndroid Build Coastguard Workerdefine void @branch_ptr_alloca_unknown_obj(i32 %a, i32 %b) #0 {
101*9880d681SAndroid Build Coastguard Workerentry:
102*9880d681SAndroid Build Coastguard Worker  %alloca = alloca [64 x i32], align 4
103*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if, label %else
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerif:
106*9880d681SAndroid Build Coastguard Worker  %arrayidx0 = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 %a
107*9880d681SAndroid Build Coastguard Worker  br label %endif
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerelse:
110*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = call i32* @get_unknown_pointer()
111*9880d681SAndroid Build Coastguard Worker  br label %endif
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerendif:
114*9880d681SAndroid Build Coastguard Worker  %phi.ptr = phi i32* [ %arrayidx0, %if ], [ %arrayidx1, %else ]
115*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %phi.ptr, align 4
116*9880d681SAndroid Build Coastguard Worker  ret void
117*9880d681SAndroid Build Coastguard Worker}
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker; kernel void ptr_induction_var_same_alloca(void)
120*9880d681SAndroid Build Coastguard Worker; {
121*9880d681SAndroid Build Coastguard Worker;     int alloca[64];
122*9880d681SAndroid Build Coastguard Worker;     int i = 0;
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker;     #pragma nounroll
125*9880d681SAndroid Build Coastguard Worker;     for (int* p = &alloca[2], *e = &alloca[48]; p != e; ++p, ++i)
126*9880d681SAndroid Build Coastguard Worker;     {
127*9880d681SAndroid Build Coastguard Worker;         *p = i;
128*9880d681SAndroid Build Coastguard Worker;     }
129*9880d681SAndroid Build Coastguard Worker; }
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker; FIXME: This should be promotable. We need to use
132*9880d681SAndroid Build Coastguard Worker; GetUnderlyingObjects when looking at the icmp user.
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ptr_induction_var_same_alloca(
135*9880d681SAndroid Build Coastguard Worker; CHECK: %alloca = alloca [64 x i32], align 4
136*9880d681SAndroid Build Coastguard Worker; CHECK: phi i32* [ %arrayidx, %entry ], [ %incdec.ptr, %for.body ]
137*9880d681SAndroid Build Coastguard Workerdefine void @ptr_induction_var_same_alloca() #0 {
138*9880d681SAndroid Build Coastguard Workerentry:
139*9880d681SAndroid Build Coastguard Worker  %alloca = alloca [64 x i32], align 4
140*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 2
141*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 48
142*9880d681SAndroid Build Coastguard Worker  br label %for.body
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:                                 ; preds = %for.body
145*9880d681SAndroid Build Coastguard Worker  ret void
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body, %entry
148*9880d681SAndroid Build Coastguard Worker  %i.09 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
149*9880d681SAndroid Build Coastguard Worker  %p.08 = phi i32* [ %arrayidx, %entry ], [ %incdec.ptr, %for.body ]
150*9880d681SAndroid Build Coastguard Worker  store i32 %i.09, i32* %p.08, align 4
151*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i32, i32* %p.08, i32 1
152*9880d681SAndroid Build Coastguard Worker  %inc = add nuw nsw i32 %i.09, 1
153*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32* %incdec.ptr, %arrayidx1
154*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.cond.cleanup, label %for.body
155*9880d681SAndroid Build Coastguard Worker}
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Worker; extern int* get_unknown_pointer(void);
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Worker; kernel void ptr_induction_var_alloca_unknown(void)
161*9880d681SAndroid Build Coastguard Worker; {
162*9880d681SAndroid Build Coastguard Worker;     int alloca[64];
163*9880d681SAndroid Build Coastguard Worker;     int i = 0;
164*9880d681SAndroid Build Coastguard Worker;
165*9880d681SAndroid Build Coastguard Worker;     for (int* p = &alloca[2], *e = get_unknown_pointer(); p != e; ++p, ++i)
166*9880d681SAndroid Build Coastguard Worker;     {
167*9880d681SAndroid Build Coastguard Worker;         *p = i;
168*9880d681SAndroid Build Coastguard Worker;     }
169*9880d681SAndroid Build Coastguard Worker; }
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ptr_induction_var_alloca_unknown(
172*9880d681SAndroid Build Coastguard Worker; CHECK: %alloca = alloca [64 x i32], align 4
173*9880d681SAndroid Build Coastguard Worker; CHECK: %p.08 = phi i32* [ %incdec.ptr, %for.body ], [ %arrayidx, %for.body.preheader ]
174*9880d681SAndroid Build Coastguard Worker; CHECK: %cmp = icmp eq i32* %incdec.ptr, %call
175*9880d681SAndroid Build Coastguard Workerdefine void @ptr_induction_var_alloca_unknown() #0 {
176*9880d681SAndroid Build Coastguard Workerentry:
177*9880d681SAndroid Build Coastguard Worker  %alloca = alloca [64 x i32], align 4
178*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds [64 x i32], [64 x i32]* %alloca, i32 0, i32 2
179*9880d681SAndroid Build Coastguard Worker  %call = tail call i32* @get_unknown_pointer() #2
180*9880d681SAndroid Build Coastguard Worker  %cmp.7 = icmp eq i32* %arrayidx, %call
181*9880d681SAndroid Build Coastguard Worker  br i1 %cmp.7, label %for.cond.cleanup, label %for.body.preheader
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Workerfor.body.preheader:                               ; preds = %entry
184*9880d681SAndroid Build Coastguard Worker  br label %for.body
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup.loopexit:                        ; preds = %for.body
187*9880d681SAndroid Build Coastguard Worker  br label %for.cond.cleanup
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:                                 ; preds = %for.cond.cleanup.loopexit, %entry
190*9880d681SAndroid Build Coastguard Worker  ret void
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body, %for.body.preheader
193*9880d681SAndroid Build Coastguard Worker  %i.09 = phi i32 [ %inc, %for.body ], [ 0, %for.body.preheader ]
194*9880d681SAndroid Build Coastguard Worker  %p.08 = phi i32* [ %incdec.ptr, %for.body ], [ %arrayidx, %for.body.preheader ]
195*9880d681SAndroid Build Coastguard Worker  store i32 %i.09, i32* %p.08, align 4
196*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i32, i32* %p.08, i32 1
197*9880d681SAndroid Build Coastguard Worker  %inc = add nuw nsw i32 %i.09, 1
198*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32* %incdec.ptr, %call
199*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.cond.cleanup.loopexit, label %for.body
200*9880d681SAndroid Build Coastguard Worker}
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Workerdeclare i32* @get_unknown_pointer() #0
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind "amdgpu-max-waves-per-eu"="1" }
205