xref: /aosp_15_r20/external/llvm/test/Transforms/LICM/sinking.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -basicaa -licm -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdeclare i32 @strlen(i8*) readonly nounwind
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdeclare void @foo()
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; Sink readonly function.
8*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i8* %P) {
9*9880d681SAndroid Build Coastguard Worker	br label %Loop
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard WorkerLoop:		; preds = %Loop, %0
12*9880d681SAndroid Build Coastguard Worker	%A = call i32 @strlen( i8* %P ) readonly
13*9880d681SAndroid Build Coastguard Worker	br i1 false, label %Loop, label %Out
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard WorkerOut:		; preds = %Loop
16*9880d681SAndroid Build Coastguard Worker	ret i32 %A
17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1(
18*9880d681SAndroid Build Coastguard Worker; CHECK: Out:
19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call i32 @strlen
20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %A
21*9880d681SAndroid Build Coastguard Worker}
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerdeclare double @sin(double) readnone nounwind
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker; Sink readnone function out of loop with unknown memory behavior.
26*9880d681SAndroid Build Coastguard Workerdefine double @test2(double %X) {
27*9880d681SAndroid Build Coastguard Worker	br label %Loop
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard WorkerLoop:		; preds = %Loop, %0
30*9880d681SAndroid Build Coastguard Worker	call void @foo( )
31*9880d681SAndroid Build Coastguard Worker	%A = call double @sin( double %X ) readnone
32*9880d681SAndroid Build Coastguard Worker	br i1 true, label %Loop, label %Out
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard WorkerOut:		; preds = %Loop
35*9880d681SAndroid Build Coastguard Worker	ret double %A
36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2(
37*9880d681SAndroid Build Coastguard Worker; CHECK: Out:
38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call double @sin
39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %A
40*9880d681SAndroid Build Coastguard Worker}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker; This testcase checks to make sure the sinker does not cause problems with
43*9880d681SAndroid Build Coastguard Worker; critical edges.
44*9880d681SAndroid Build Coastguard Workerdefine void @test3() {
45*9880d681SAndroid Build Coastguard WorkerEntry:
46*9880d681SAndroid Build Coastguard Worker	br i1 false, label %Loop, label %Exit
47*9880d681SAndroid Build Coastguard WorkerLoop:
48*9880d681SAndroid Build Coastguard Worker	%X = add i32 0, 1
49*9880d681SAndroid Build Coastguard Worker	br i1 false, label %Loop, label %Exit
50*9880d681SAndroid Build Coastguard WorkerExit:
51*9880d681SAndroid Build Coastguard Worker	%Y = phi i32 [ 0, %Entry ], [ %X, %Loop ]
52*9880d681SAndroid Build Coastguard Worker	ret void
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3(
55*9880d681SAndroid Build Coastguard Worker; CHECK:     Exit.loopexit:
56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %X.le = add i32 0, 1
57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  br label %Exit
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker}
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker; If the result of an instruction is only used outside of the loop, sink
62*9880d681SAndroid Build Coastguard Worker; the instruction to the exit blocks instead of executing it on every
63*9880d681SAndroid Build Coastguard Worker; iteration of the loop.
64*9880d681SAndroid Build Coastguard Worker;
65*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i32 %N) {
66*9880d681SAndroid Build Coastguard WorkerEntry:
67*9880d681SAndroid Build Coastguard Worker	br label %Loop
68*9880d681SAndroid Build Coastguard WorkerLoop:		; preds = %Loop, %Entry
69*9880d681SAndroid Build Coastguard Worker	%N_addr.0.pn = phi i32 [ %dec, %Loop ], [ %N, %Entry ]
70*9880d681SAndroid Build Coastguard Worker	%tmp.6 = mul i32 %N, %N_addr.0.pn		; <i32> [#uses=1]
71*9880d681SAndroid Build Coastguard Worker	%tmp.7 = sub i32 %tmp.6, %N		; <i32> [#uses=1]
72*9880d681SAndroid Build Coastguard Worker	%dec = add i32 %N_addr.0.pn, -1		; <i32> [#uses=1]
73*9880d681SAndroid Build Coastguard Worker	%tmp.1 = icmp ne i32 %N_addr.0.pn, 1		; <i1> [#uses=1]
74*9880d681SAndroid Build Coastguard Worker	br i1 %tmp.1, label %Loop, label %Out
75*9880d681SAndroid Build Coastguard WorkerOut:		; preds = %Loop
76*9880d681SAndroid Build Coastguard Worker	ret i32 %tmp.7
77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4(
78*9880d681SAndroid Build Coastguard Worker; CHECK:     Out:
79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn
80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  mul i32 %N, %[[LCSSAPHI]]
81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  sub i32 %tmp.6.le, %N
82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret i32
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker; To reduce register pressure, if a load is hoistable out of the loop, and the
86*9880d681SAndroid Build Coastguard Worker; result of the load is only used outside of the loop, sink the load instead of
87*9880d681SAndroid Build Coastguard Worker; hoisting it!
88*9880d681SAndroid Build Coastguard Worker;
89*9880d681SAndroid Build Coastguard Worker@X = global i32 5		; <i32*> [#uses=1]
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32 %N) {
92*9880d681SAndroid Build Coastguard WorkerEntry:
93*9880d681SAndroid Build Coastguard Worker	br label %Loop
94*9880d681SAndroid Build Coastguard WorkerLoop:		; preds = %Loop, %Entry
95*9880d681SAndroid Build Coastguard Worker	%N_addr.0.pn = phi i32 [ %dec, %Loop ], [ %N, %Entry ]
96*9880d681SAndroid Build Coastguard Worker	%tmp.6 = load i32, i32* @X		; <i32> [#uses=1]
97*9880d681SAndroid Build Coastguard Worker	%dec = add i32 %N_addr.0.pn, -1		; <i32> [#uses=1]
98*9880d681SAndroid Build Coastguard Worker	%tmp.1 = icmp ne i32 %N_addr.0.pn, 1		; <i1> [#uses=1]
99*9880d681SAndroid Build Coastguard Worker	br i1 %tmp.1, label %Loop, label %Out
100*9880d681SAndroid Build Coastguard WorkerOut:		; preds = %Loop
101*9880d681SAndroid Build Coastguard Worker	ret i32 %tmp.6
102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5(
103*9880d681SAndroid Build Coastguard Worker; CHECK:     Out:
104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %tmp.6.le = load i32, i32* @X
105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret i32 %tmp.6.le
106*9880d681SAndroid Build Coastguard Worker}
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker; The loop sinker was running from the bottom of the loop to the top, causing
111*9880d681SAndroid Build Coastguard Worker; it to miss opportunities to sink instructions that depended on sinking other
112*9880d681SAndroid Build Coastguard Worker; instructions from the loop.  Instead they got hoisted, which is better than
113*9880d681SAndroid Build Coastguard Worker; leaving them in the loop, but increases register pressure pointlessly.
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker	%Ty = type { i32, i32 }
116*9880d681SAndroid Build Coastguard Worker@X2 = external global %Ty
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Workerdefine i32 @test6() {
119*9880d681SAndroid Build Coastguard Worker	br label %Loop
120*9880d681SAndroid Build Coastguard WorkerLoop:
121*9880d681SAndroid Build Coastguard Worker	%dead = getelementptr %Ty, %Ty* @X2, i64 0, i32 0
122*9880d681SAndroid Build Coastguard Worker	%sunk2 = load i32, i32* %dead
123*9880d681SAndroid Build Coastguard Worker	br i1 false, label %Loop, label %Out
124*9880d681SAndroid Build Coastguard WorkerOut:		; preds = %Loop
125*9880d681SAndroid Build Coastguard Worker	ret i32 %sunk2
126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6(
127*9880d681SAndroid Build Coastguard Worker; CHECK:     Out:
128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %dead.le = getelementptr %Ty, %Ty* @X2, i64 0, i32 0
129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %sunk2.le = load i32, i32* %dead.le
130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret i32 %sunk2.le
131*9880d681SAndroid Build Coastguard Worker}
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker; This testcase ensures that we can sink instructions from loops with
136*9880d681SAndroid Build Coastguard Worker; multiple exits.
137*9880d681SAndroid Build Coastguard Worker;
138*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i32 %N, i1 %C) {
139*9880d681SAndroid Build Coastguard WorkerEntry:
140*9880d681SAndroid Build Coastguard Worker	br label %Loop
141*9880d681SAndroid Build Coastguard WorkerLoop:		; preds = %ContLoop, %Entry
142*9880d681SAndroid Build Coastguard Worker	%N_addr.0.pn = phi i32 [ %dec, %ContLoop ], [ %N, %Entry ]
143*9880d681SAndroid Build Coastguard Worker	%tmp.6 = mul i32 %N, %N_addr.0.pn
144*9880d681SAndroid Build Coastguard Worker	%tmp.7 = sub i32 %tmp.6, %N		; <i32> [#uses=2]
145*9880d681SAndroid Build Coastguard Worker	%dec = add i32 %N_addr.0.pn, -1		; <i32> [#uses=1]
146*9880d681SAndroid Build Coastguard Worker	br i1 %C, label %ContLoop, label %Out1
147*9880d681SAndroid Build Coastguard WorkerContLoop:
148*9880d681SAndroid Build Coastguard Worker	%tmp.1 = icmp ne i32 %N_addr.0.pn, 1
149*9880d681SAndroid Build Coastguard Worker	br i1 %tmp.1, label %Loop, label %Out2
150*9880d681SAndroid Build Coastguard WorkerOut1:		; preds = %Loop
151*9880d681SAndroid Build Coastguard Worker	ret i32 %tmp.7
152*9880d681SAndroid Build Coastguard WorkerOut2:		; preds = %ContLoop
153*9880d681SAndroid Build Coastguard Worker	ret i32 %tmp.7
154*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7(
155*9880d681SAndroid Build Coastguard Worker; CHECK:     Out1:
156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn
157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  mul i32 %N, %[[LCSSAPHI]]
158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  sub i32 %tmp.6.le, %N
159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret
160*9880d681SAndroid Build Coastguard Worker; CHECK:     Out2:
161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn
162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  mul i32 %N, %[[LCSSAPHI]]
163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  sub i32 %tmp.6.le4, %N
164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret
165*9880d681SAndroid Build Coastguard Worker}
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker; This testcase checks to make sure we can sink values which are only live on
169*9880d681SAndroid Build Coastguard Worker; some exits out of the loop, and that we can do so without breaking dominator
170*9880d681SAndroid Build Coastguard Worker; info.
171*9880d681SAndroid Build Coastguard Workerdefine i32 @test8(i1 %C1, i1 %C2, i32* %P, i32* %Q) {
172*9880d681SAndroid Build Coastguard WorkerEntry:
173*9880d681SAndroid Build Coastguard Worker	br label %Loop
174*9880d681SAndroid Build Coastguard WorkerLoop:		; preds = %Cont, %Entry
175*9880d681SAndroid Build Coastguard Worker	br i1 %C1, label %Cont, label %exit1
176*9880d681SAndroid Build Coastguard WorkerCont:		; preds = %Loop
177*9880d681SAndroid Build Coastguard Worker	%X = load i32, i32* %P		; <i32> [#uses=2]
178*9880d681SAndroid Build Coastguard Worker	store i32 %X, i32* %Q
179*9880d681SAndroid Build Coastguard Worker	%V = add i32 %X, 1		; <i32> [#uses=1]
180*9880d681SAndroid Build Coastguard Worker	br i1 %C2, label %Loop, label %exit2
181*9880d681SAndroid Build Coastguard Workerexit1:		; preds = %Loop
182*9880d681SAndroid Build Coastguard Worker	ret i32 0
183*9880d681SAndroid Build Coastguard Workerexit2:		; preds = %Cont
184*9880d681SAndroid Build Coastguard Worker	ret i32 %V
185*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8(
186*9880d681SAndroid Build Coastguard Worker; CHECK:     exit1:
187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret i32 0
188*9880d681SAndroid Build Coastguard Worker; CHECK:     exit2:
189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %[[LCSSAPHI:.*]] = phi i32 [ %X
190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %V.le = add i32 %[[LCSSAPHI]], 1
191*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret i32 %V.le
192*9880d681SAndroid Build Coastguard Worker}
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Workerdefine void @test9() {
196*9880d681SAndroid Build Coastguard Workerloopentry.2.i:
197*9880d681SAndroid Build Coastguard Worker	br i1 false, label %no_exit.1.i.preheader, label %loopentry.3.i.preheader
198*9880d681SAndroid Build Coastguard Workerno_exit.1.i.preheader:		; preds = %loopentry.2.i
199*9880d681SAndroid Build Coastguard Worker	br label %no_exit.1.i
200*9880d681SAndroid Build Coastguard Workerno_exit.1.i:		; preds = %endif.8.i, %no_exit.1.i.preheader
201*9880d681SAndroid Build Coastguard Worker	br i1 false, label %return.i, label %endif.8.i
202*9880d681SAndroid Build Coastguard Workerendif.8.i:		; preds = %no_exit.1.i
203*9880d681SAndroid Build Coastguard Worker	%inc.1.i = add i32 0, 1		; <i32> [#uses=1]
204*9880d681SAndroid Build Coastguard Worker	br i1 false, label %no_exit.1.i, label %loopentry.3.i.preheader.loopexit
205*9880d681SAndroid Build Coastguard Workerloopentry.3.i.preheader.loopexit:		; preds = %endif.8.i
206*9880d681SAndroid Build Coastguard Worker	br label %loopentry.3.i.preheader
207*9880d681SAndroid Build Coastguard Workerloopentry.3.i.preheader:		; preds = %loopentry.3.i.preheader.loopexit, %loopentry.2.i
208*9880d681SAndroid Build Coastguard Worker	%arg_num.0.i.ph13000 = phi i32 [ 0, %loopentry.2.i ], [ %inc.1.i, %loopentry.3.i.preheader.loopexit ]		; <i32> [#uses=0]
209*9880d681SAndroid Build Coastguard Worker	ret void
210*9880d681SAndroid Build Coastguard Workerreturn.i:		; preds = %no_exit.1.i
211*9880d681SAndroid Build Coastguard Worker	ret void
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9(
214*9880d681SAndroid Build Coastguard Worker; CHECK: loopentry.3.i.preheader.loopexit:
215*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %inc.1.i.le = add i32 0, 1
216*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  br label %loopentry.3.i.preheader
217*9880d681SAndroid Build Coastguard Worker}
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Worker; Potentially trapping instructions may be sunk as long as they are guaranteed
221*9880d681SAndroid Build Coastguard Worker; to be executed.
222*9880d681SAndroid Build Coastguard Workerdefine i32 @test10(i32 %N) {
223*9880d681SAndroid Build Coastguard WorkerEntry:
224*9880d681SAndroid Build Coastguard Worker	br label %Loop
225*9880d681SAndroid Build Coastguard WorkerLoop:		; preds = %Loop, %Entry
226*9880d681SAndroid Build Coastguard Worker	%N_addr.0.pn = phi i32 [ %dec, %Loop ], [ %N, %Entry ]		; <i32> [#uses=3]
227*9880d681SAndroid Build Coastguard Worker	%tmp.6 = sdiv i32 %N, %N_addr.0.pn		; <i32> [#uses=1]
228*9880d681SAndroid Build Coastguard Worker	%dec = add i32 %N_addr.0.pn, -1		; <i32> [#uses=1]
229*9880d681SAndroid Build Coastguard Worker	%tmp.1 = icmp ne i32 %N_addr.0.pn, 0		; <i1> [#uses=1]
230*9880d681SAndroid Build Coastguard Worker	br i1 %tmp.1, label %Loop, label %Out
231*9880d681SAndroid Build Coastguard WorkerOut:		; preds = %Loop
232*9880d681SAndroid Build Coastguard Worker	ret i32 %tmp.6
233*9880d681SAndroid Build Coastguard Worker
234*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10(
235*9880d681SAndroid Build Coastguard Worker; CHECK: Out:
236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn
237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %tmp.6.le = sdiv i32 %N, %[[LCSSAPHI]]
238*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret i32 %tmp.6.le
239*9880d681SAndroid Build Coastguard Worker}
240*9880d681SAndroid Build Coastguard Worker
241*9880d681SAndroid Build Coastguard Worker; Should delete, not sink, dead instructions.
242*9880d681SAndroid Build Coastguard Workerdefine void @test11() {
243*9880d681SAndroid Build Coastguard Worker	br label %Loop
244*9880d681SAndroid Build Coastguard WorkerLoop:
245*9880d681SAndroid Build Coastguard Worker	%dead = getelementptr %Ty, %Ty* @X2, i64 0, i32 0
246*9880d681SAndroid Build Coastguard Worker	br i1 false, label %Loop, label %Out
247*9880d681SAndroid Build Coastguard WorkerOut:
248*9880d681SAndroid Build Coastguard Worker	ret void
249*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11(
250*9880d681SAndroid Build Coastguard Worker; CHECK:     Out:
251*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret void
252*9880d681SAndroid Build Coastguard Worker}
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Worker@c = common global [1 x i32] zeroinitializer, align 4
255*9880d681SAndroid Build Coastguard Worker
256*9880d681SAndroid Build Coastguard Worker; Test a *many* way nested loop with multiple exit blocks both of which exit
257*9880d681SAndroid Build Coastguard Worker; multiple loop nests. This exercises LCSSA corner cases.
258*9880d681SAndroid Build Coastguard Workerdefine i32 @PR18753(i1* %a, i1* %b, i1* %c, i1* %d) {
259*9880d681SAndroid Build Coastguard Workerentry:
260*9880d681SAndroid Build Coastguard Worker  br label %l1.header
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard Workerl1.header:
263*9880d681SAndroid Build Coastguard Worker  %iv = phi i64 [ %iv.next, %l1.latch ], [ 0, %entry ]
264*9880d681SAndroid Build Coastguard Worker  %arrayidx.i = getelementptr inbounds [1 x i32], [1 x i32]* @c, i64 0, i64 %iv
265*9880d681SAndroid Build Coastguard Worker  br label %l2.header
266*9880d681SAndroid Build Coastguard Worker
267*9880d681SAndroid Build Coastguard Workerl2.header:
268*9880d681SAndroid Build Coastguard Worker  %x0 = load i1, i1* %c, align 4
269*9880d681SAndroid Build Coastguard Worker  br i1 %x0, label %l1.latch, label %l3.preheader
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Workerl3.preheader:
272*9880d681SAndroid Build Coastguard Worker  br label %l3.header
273*9880d681SAndroid Build Coastguard Worker
274*9880d681SAndroid Build Coastguard Workerl3.header:
275*9880d681SAndroid Build Coastguard Worker  %x1 = load i1, i1* %d, align 4
276*9880d681SAndroid Build Coastguard Worker  br i1 %x1, label %l2.latch, label %l4.preheader
277*9880d681SAndroid Build Coastguard Worker
278*9880d681SAndroid Build Coastguard Workerl4.preheader:
279*9880d681SAndroid Build Coastguard Worker  br label %l4.header
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Workerl4.header:
282*9880d681SAndroid Build Coastguard Worker  %x2 = load i1, i1* %a
283*9880d681SAndroid Build Coastguard Worker  br i1 %x2, label %l3.latch, label %l4.body
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Workerl4.body:
286*9880d681SAndroid Build Coastguard Worker  call void @f(i32* %arrayidx.i)
287*9880d681SAndroid Build Coastguard Worker  %x3 = load i1, i1* %b
288*9880d681SAndroid Build Coastguard Worker  %l = trunc i64 %iv to i32
289*9880d681SAndroid Build Coastguard Worker  br i1 %x3, label %l4.latch, label %exit
290*9880d681SAndroid Build Coastguard Worker
291*9880d681SAndroid Build Coastguard Workerl4.latch:
292*9880d681SAndroid Build Coastguard Worker  call void @g()
293*9880d681SAndroid Build Coastguard Worker  %x4 = load i1, i1* %b, align 4
294*9880d681SAndroid Build Coastguard Worker  br i1 %x4, label %l4.header, label %exit
295*9880d681SAndroid Build Coastguard Worker
296*9880d681SAndroid Build Coastguard Workerl3.latch:
297*9880d681SAndroid Build Coastguard Worker  br label %l3.header
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Workerl2.latch:
300*9880d681SAndroid Build Coastguard Worker  br label %l2.header
301*9880d681SAndroid Build Coastguard Worker
302*9880d681SAndroid Build Coastguard Workerl1.latch:
303*9880d681SAndroid Build Coastguard Worker  %iv.next = add nsw i64 %iv, 1
304*9880d681SAndroid Build Coastguard Worker  br label %l1.header
305*9880d681SAndroid Build Coastguard Worker
306*9880d681SAndroid Build Coastguard Workerexit:
307*9880d681SAndroid Build Coastguard Worker  %lcssa = phi i32 [ %l, %l4.latch ], [ %l, %l4.body ]
308*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR18753(
309*9880d681SAndroid Build Coastguard Worker; CHECK:       exit:
310*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    %[[LCSSAPHI:.*]] = phi i64 [ %iv, %l4.latch ], [ %iv, %l4.body ]
311*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    %l.le = trunc i64 %[[LCSSAPHI]] to i32
312*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 %l.le
313*9880d681SAndroid Build Coastguard Worker
314*9880d681SAndroid Build Coastguard Worker  ret i32 %lcssa
315*9880d681SAndroid Build Coastguard Worker}
316*9880d681SAndroid Build Coastguard Worker
317*9880d681SAndroid Build Coastguard Worker; Can't sink stores out of exit blocks containing indirectbr instructions
318*9880d681SAndroid Build Coastguard Worker; because loop simplify does not create dedicated exits for such blocks. Test
319*9880d681SAndroid Build Coastguard Worker; that by sinking the store from lab21 to lab22, but not further.
320*9880d681SAndroid Build Coastguard Workerdefine void @test12() {
321*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12
322*9880d681SAndroid Build Coastguard Worker  br label %lab4
323*9880d681SAndroid Build Coastguard Worker
324*9880d681SAndroid Build Coastguard Workerlab4:
325*9880d681SAndroid Build Coastguard Worker  br label %lab20
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Workerlab5:
328*9880d681SAndroid Build Coastguard Worker  br label %lab20
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Workerlab6:
331*9880d681SAndroid Build Coastguard Worker  br label %lab4
332*9880d681SAndroid Build Coastguard Worker
333*9880d681SAndroid Build Coastguard Workerlab7:
334*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %lab8, label %lab13
335*9880d681SAndroid Build Coastguard Worker
336*9880d681SAndroid Build Coastguard Workerlab8:
337*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %lab13, label %lab10
338*9880d681SAndroid Build Coastguard Worker
339*9880d681SAndroid Build Coastguard Workerlab10:
340*9880d681SAndroid Build Coastguard Worker  br label %lab7
341*9880d681SAndroid Build Coastguard Worker
342*9880d681SAndroid Build Coastguard Workerlab13:
343*9880d681SAndroid Build Coastguard Worker  ret void
344*9880d681SAndroid Build Coastguard Worker
345*9880d681SAndroid Build Coastguard Workerlab20:
346*9880d681SAndroid Build Coastguard Worker  br label %lab21
347*9880d681SAndroid Build Coastguard Worker
348*9880d681SAndroid Build Coastguard Workerlab21:
349*9880d681SAndroid Build Coastguard Worker; CHECK: lab21:
350*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store
351*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 false, label %lab21, label %lab22
352*9880d681SAndroid Build Coastguard Worker  store i32 36127957, i32* undef, align 4
353*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %lab21, label %lab22
354*9880d681SAndroid Build Coastguard Worker
355*9880d681SAndroid Build Coastguard Workerlab22:
356*9880d681SAndroid Build Coastguard Worker; CHECK: lab22:
357*9880d681SAndroid Build Coastguard Worker; CHECK: store
358*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: indirectbr i8* undef
359*9880d681SAndroid Build Coastguard Worker  indirectbr i8* undef, [label %lab5, label %lab6, label %lab7]
360*9880d681SAndroid Build Coastguard Worker}
361*9880d681SAndroid Build Coastguard Worker
362*9880d681SAndroid Build Coastguard Worker; Test that we don't crash when trying to sink stores and there's no preheader
363*9880d681SAndroid Build Coastguard Worker; available (which is used for creating loads that may be used by the SSA
364*9880d681SAndroid Build Coastguard Worker; updater)
365*9880d681SAndroid Build Coastguard Workerdefine void @test13() {
366*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13
367*9880d681SAndroid Build Coastguard Worker  br label %lab59
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard Workerlab19:
370*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %lab20, label %lab38
371*9880d681SAndroid Build Coastguard Worker
372*9880d681SAndroid Build Coastguard Workerlab20:
373*9880d681SAndroid Build Coastguard Worker  br label %lab60
374*9880d681SAndroid Build Coastguard Worker
375*9880d681SAndroid Build Coastguard Workerlab21:
376*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %lab22, label %lab38
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Workerlab22:
379*9880d681SAndroid Build Coastguard Worker  br label %lab38
380*9880d681SAndroid Build Coastguard Worker
381*9880d681SAndroid Build Coastguard Workerlab38:
382*9880d681SAndroid Build Coastguard Worker  ret void
383*9880d681SAndroid Build Coastguard Worker
384*9880d681SAndroid Build Coastguard Workerlab59:
385*9880d681SAndroid Build Coastguard Worker  indirectbr i8* undef, [label %lab60, label %lab38]
386*9880d681SAndroid Build Coastguard Worker
387*9880d681SAndroid Build Coastguard Workerlab60:
388*9880d681SAndroid Build Coastguard Worker; CHECK: lab60:
389*9880d681SAndroid Build Coastguard Worker; CHECK: store
390*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: indirectbr
391*9880d681SAndroid Build Coastguard Worker  store i32 2145244101, i32* undef, align 4
392*9880d681SAndroid Build Coastguard Worker  indirectbr i8* undef, [label %lab21, label %lab19]
393*9880d681SAndroid Build Coastguard Worker}
394*9880d681SAndroid Build Coastguard Worker
395*9880d681SAndroid Build Coastguard Workerdeclare void @f(i32*)
396*9880d681SAndroid Build Coastguard Worker
397*9880d681SAndroid Build Coastguard Workerdeclare void @g()
398