xref: /aosp_15_r20/external/llvm/test/Transforms/LoopUnroll/unloop.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -S -loop-unroll -verify-loop-info | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker;
3*9880d681SAndroid Build Coastguard Worker; Unit tests for LoopInfo::markAsRemoved.
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdeclare i1 @check() nounwind
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; Ensure that tail->inner is removed and rely on verify-loopinfo to
8*9880d681SAndroid Build Coastguard Worker; check soundness.
9*9880d681SAndroid Build Coastguard Worker;
10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @skiplevelexit(
11*9880d681SAndroid Build Coastguard Worker; CHECK: tail:
12*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br
13*9880d681SAndroid Build Coastguard Worker; CHECK: ret void
14*9880d681SAndroid Build Coastguard Workerdefine void @skiplevelexit() nounwind {
15*9880d681SAndroid Build Coastguard Workerentry:
16*9880d681SAndroid Build Coastguard Worker  br label %outer
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workerouter:
19*9880d681SAndroid Build Coastguard Worker  br label %inner
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerinner:
22*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [ 0, %outer ], [ %inc, %tail ]
23*9880d681SAndroid Build Coastguard Worker  %inc = add i32 %iv, 1
24*9880d681SAndroid Build Coastguard Worker  call zeroext i1 @check()
25*9880d681SAndroid Build Coastguard Worker  br i1 true, label %outer.backedge, label %tail
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workertail:
28*9880d681SAndroid Build Coastguard Worker  br i1 false, label %inner, label %exit
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workerouter.backedge:
31*9880d681SAndroid Build Coastguard Worker  br label %outer
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerexit:
34*9880d681SAndroid Build Coastguard Worker  ret void
35*9880d681SAndroid Build Coastguard Worker}
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker; Remove the middle loop of a triply nested loop tree.
38*9880d681SAndroid Build Coastguard Worker; Ensure that only the middle loop is removed and rely on verify-loopinfo to
39*9880d681SAndroid Build Coastguard Worker; check soundness.
40*9880d681SAndroid Build Coastguard Worker;
41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @unloopNested(
42*9880d681SAndroid Build Coastguard Worker; Outer loop control.
43*9880d681SAndroid Build Coastguard Worker; CHECK: while.body:
44*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %cmp3, label %if.then, label %if.end
45*9880d681SAndroid Build Coastguard Worker; Inner loop control.
46*9880d681SAndroid Build Coastguard Worker; CHECK: while.end14.i:
47*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %call15.i, label %if.end.i, label %exit
48*9880d681SAndroid Build Coastguard Worker; Middle loop control should no longer reach %while.cond.
49*9880d681SAndroid Build Coastguard Worker; Now it is the outer loop backedge.
50*9880d681SAndroid Build Coastguard Worker; CHECK: exit:
51*9880d681SAndroid Build Coastguard Worker; CHECK: br label %while.cond.outer
52*9880d681SAndroid Build Coastguard Workerdefine void @unloopNested() {
53*9880d681SAndroid Build Coastguard Workerentry:
54*9880d681SAndroid Build Coastguard Worker  br label %while.cond.outer
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerwhile.cond.outer:
57*9880d681SAndroid Build Coastguard Worker  br label %while.cond
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerwhile.cond:
60*9880d681SAndroid Build Coastguard Worker  %cmp = call zeroext i1 @check()
61*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %while.body, label %while.end
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerwhile.body:
64*9880d681SAndroid Build Coastguard Worker  %cmp3 = call zeroext i1 @check()
65*9880d681SAndroid Build Coastguard Worker  br i1 %cmp3, label %if.then, label %if.end
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerif.then:
68*9880d681SAndroid Build Coastguard Worker  br label %return
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workerif.end:
71*9880d681SAndroid Build Coastguard Worker  %cmp.i48 = call zeroext i1 @check()
72*9880d681SAndroid Build Coastguard Worker  br i1 %cmp.i48, label %if.then.i, label %if.else20.i
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerif.then.i:
75*9880d681SAndroid Build Coastguard Worker  %cmp8.i = call zeroext i1 @check()
76*9880d681SAndroid Build Coastguard Worker  br i1 %cmp8.i, label %merge, label %if.else.i
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerif.else.i:
79*9880d681SAndroid Build Coastguard Worker  br label %merge
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerif.else20.i:
82*9880d681SAndroid Build Coastguard Worker  %cmp25.i = call zeroext i1 @check()
83*9880d681SAndroid Build Coastguard Worker  br i1 %cmp25.i, label %merge, label %if.else28.i
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Workerif.else28.i:
86*9880d681SAndroid Build Coastguard Worker  br label %merge
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workermerge:
89*9880d681SAndroid Build Coastguard Worker  br label %while.cond2.i
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerwhile.cond2.i:
92*9880d681SAndroid Build Coastguard Worker  %cmp.i = call zeroext i1 @check()
93*9880d681SAndroid Build Coastguard Worker  br i1 %cmp.i, label %while.cond2.backedge.i, label %while.end.i
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerwhile.cond2.backedge.i:
96*9880d681SAndroid Build Coastguard Worker  br label %while.cond2.i
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerwhile.end.i:
99*9880d681SAndroid Build Coastguard Worker  %cmp1114.i = call zeroext i1 @check()
100*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1114.i, label %while.body12.lr.ph.i, label %while.end14.i
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Workerwhile.body12.lr.ph.i:
103*9880d681SAndroid Build Coastguard Worker  br label %while.end14.i
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerwhile.end14.i:
106*9880d681SAndroid Build Coastguard Worker  %call15.i = call zeroext i1 @check()
107*9880d681SAndroid Build Coastguard Worker  br i1 %call15.i, label %if.end.i, label %exit
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerif.end.i:
110*9880d681SAndroid Build Coastguard Worker  br label %while.cond2.backedge.i
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Workerexit:
113*9880d681SAndroid Build Coastguard Worker  br i1 false, label %while.cond, label %if.else
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Workerif.else:
116*9880d681SAndroid Build Coastguard Worker  br label %while.cond.outer
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Workerwhile.end:
119*9880d681SAndroid Build Coastguard Worker  br label %return
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Workerreturn:
122*9880d681SAndroid Build Coastguard Worker  ret void
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker; Remove the middle loop of a deeply nested loop tree.
126*9880d681SAndroid Build Coastguard Worker; Ensure that only the middle loop is removed and rely on verify-loopinfo to
127*9880d681SAndroid Build Coastguard Worker; check soundness.
128*9880d681SAndroid Build Coastguard Worker;
129*9880d681SAndroid Build Coastguard Worker; This test must be disabled until trip count computation can be optimized...
130*9880d681SAndroid Build Coastguard Worker; rdar:14038809 [SCEV]: Optimize trip count computation for multi-exit loops.
131*9880d681SAndroid Build Coastguard Worker; CHECKFIXME-LABEL: @unloopDeepNested(
132*9880d681SAndroid Build Coastguard Worker; Inner-inner loop control.
133*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: while.cond.us.i:
134*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: br i1 %cmp.us.i, label %next_data.exit, label %while.body.us.i
135*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: if.then.us.i:
136*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: br label %while.cond.us.i
137*9880d681SAndroid Build Coastguard Worker; Inner loop tail.
138*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: if.else.i:
139*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: br label %while.cond.outer.i
140*9880d681SAndroid Build Coastguard Worker; Middle loop control (removed).
141*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: valid_data.exit:
142*9880d681SAndroid Build Coastguard Worker; CHECKFIXME-NOT: br
143*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: %cmp = call zeroext i1 @check()
144*9880d681SAndroid Build Coastguard Worker; Outer loop control.
145*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: copy_data.exit:
146*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: br i1 %cmp38, label %if.then39, label %while.cond.outer
147*9880d681SAndroid Build Coastguard Worker; Outer-outer loop tail.
148*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: while.cond.outer.outer.backedge:
149*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: br label %while.cond.outer.outer
150*9880d681SAndroid Build Coastguard Workerdefine void @unloopDeepNested() nounwind {
151*9880d681SAndroid Build Coastguard Workerfor.cond8.preheader.i:
152*9880d681SAndroid Build Coastguard Worker  %cmp113.i = call zeroext i1 @check()
153*9880d681SAndroid Build Coastguard Worker  br i1 %cmp113.i, label %make_data.exit, label %for.body13.lr.ph.i
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Workerfor.body13.lr.ph.i:
156*9880d681SAndroid Build Coastguard Worker  br label %make_data.exit
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Workermake_data.exit:
159*9880d681SAndroid Build Coastguard Worker  br label %while.cond.outer.outer
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Workerwhile.cond.outer.outer:
162*9880d681SAndroid Build Coastguard Worker  br label %while.cond.outer
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Workerwhile.cond.outer:
165*9880d681SAndroid Build Coastguard Worker  br label %while.cond
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Workerwhile.cond:
168*9880d681SAndroid Build Coastguard Worker  br label %while.cond.outer.i
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Workerwhile.cond.outer.i:
171*9880d681SAndroid Build Coastguard Worker  %tmp192.ph.i = call zeroext i1 @check()
172*9880d681SAndroid Build Coastguard Worker  br i1 %tmp192.ph.i, label %while.cond.outer.split.us.i, label %while.body.loopexit
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Workerwhile.cond.outer.split.us.i:
175*9880d681SAndroid Build Coastguard Worker  br label %while.cond.us.i
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Workerwhile.cond.us.i:
178*9880d681SAndroid Build Coastguard Worker  %cmp.us.i = call zeroext i1 @check()
179*9880d681SAndroid Build Coastguard Worker  br i1 %cmp.us.i, label %next_data.exit, label %while.body.us.i
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Workerwhile.body.us.i:
182*9880d681SAndroid Build Coastguard Worker  %cmp7.us.i = call zeroext i1 @check()
183*9880d681SAndroid Build Coastguard Worker  br i1 %cmp7.us.i, label %if.then.us.i, label %if.else.i
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Workerif.then.us.i:
186*9880d681SAndroid Build Coastguard Worker  br label %while.cond.us.i
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Workerif.else.i:
189*9880d681SAndroid Build Coastguard Worker  br label %while.cond.outer.i
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Workernext_data.exit:
192*9880d681SAndroid Build Coastguard Worker  %tmp192.ph.i.lcssa28 = call zeroext i1 @check()
193*9880d681SAndroid Build Coastguard Worker  br i1 %tmp192.ph.i.lcssa28, label %while.end, label %while.body
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Workerwhile.body.loopexit:
196*9880d681SAndroid Build Coastguard Worker  br label %while.body
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Workerwhile.body:
199*9880d681SAndroid Build Coastguard Worker  br label %while.cond.i
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Workerwhile.cond.i:
202*9880d681SAndroid Build Coastguard Worker  %cmp.i = call zeroext i1 @check()
203*9880d681SAndroid Build Coastguard Worker  br i1 %cmp.i, label %valid_data.exit, label %while.body.i
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Workerwhile.body.i:
206*9880d681SAndroid Build Coastguard Worker  %cmp7.i = call zeroext i1 @check()
207*9880d681SAndroid Build Coastguard Worker  br i1 %cmp7.i, label %valid_data.exit, label %if.end.i
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Workerif.end.i:
210*9880d681SAndroid Build Coastguard Worker  br label %while.cond.i
211*9880d681SAndroid Build Coastguard Worker
212*9880d681SAndroid Build Coastguard Workervalid_data.exit:
213*9880d681SAndroid Build Coastguard Worker  br i1 true, label %if.then, label %while.cond
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Workerif.then:
216*9880d681SAndroid Build Coastguard Worker  %cmp = call zeroext i1 @check()
217*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then12, label %if.end
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Workerif.then12:
220*9880d681SAndroid Build Coastguard Worker  br label %if.end
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Workerif.end:
223*9880d681SAndroid Build Coastguard Worker  %tobool3.i = call zeroext i1 @check()
224*9880d681SAndroid Build Coastguard Worker  br i1 %tobool3.i, label %copy_data.exit, label %while.body.lr.ph.i
225*9880d681SAndroid Build Coastguard Worker
226*9880d681SAndroid Build Coastguard Workerwhile.body.lr.ph.i:
227*9880d681SAndroid Build Coastguard Worker  br label %copy_data.exit
228*9880d681SAndroid Build Coastguard Worker
229*9880d681SAndroid Build Coastguard Workercopy_data.exit:
230*9880d681SAndroid Build Coastguard Worker  %cmp38 = call zeroext i1 @check()
231*9880d681SAndroid Build Coastguard Worker  br i1 %cmp38, label %if.then39, label %while.cond.outer
232*9880d681SAndroid Build Coastguard Worker
233*9880d681SAndroid Build Coastguard Workerif.then39:
234*9880d681SAndroid Build Coastguard Worker  %cmp5.i = call zeroext i1 @check()
235*9880d681SAndroid Build Coastguard Worker  br i1 %cmp5.i, label %while.cond.outer.outer.backedge, label %for.cond8.preheader.i8.thread
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Workerfor.cond8.preheader.i8.thread:
238*9880d681SAndroid Build Coastguard Worker  br label %while.cond.outer.outer.backedge
239*9880d681SAndroid Build Coastguard Worker
240*9880d681SAndroid Build Coastguard Workerwhile.cond.outer.outer.backedge:
241*9880d681SAndroid Build Coastguard Worker  br label %while.cond.outer.outer
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Workerwhile.end:
244*9880d681SAndroid Build Coastguard Worker  ret void
245*9880d681SAndroid Build Coastguard Worker}
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Worker; Remove a nested loop with irreducible control flow.
248*9880d681SAndroid Build Coastguard Worker; Ensure that only the middle loop is removed and rely on verify-loopinfo to
249*9880d681SAndroid Build Coastguard Worker; check soundness.
250*9880d681SAndroid Build Coastguard Worker;
251*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @unloopIrreducible(
252*9880d681SAndroid Build Coastguard Worker; Irreducible loop.
253*9880d681SAndroid Build Coastguard Worker; CHECK: for.inc117:
254*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.cond103t
255*9880d681SAndroid Build Coastguard Worker; Nested loop (removed).
256*9880d681SAndroid Build Coastguard Worker; CHECK: for.inc159:
257*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.inc163
258*9880d681SAndroid Build Coastguard Workerdefine void @unloopIrreducible() nounwind {
259*9880d681SAndroid Build Coastguard Worker
260*9880d681SAndroid Build Coastguard Workerentry:
261*9880d681SAndroid Build Coastguard Worker  br label %for.body
262*9880d681SAndroid Build Coastguard Worker
263*9880d681SAndroid Build Coastguard Workerfor.body:
264*9880d681SAndroid Build Coastguard Worker  %cmp2113 = call zeroext i1 @check()
265*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2113, label %for.body22.lr.ph, label %for.inc163
266*9880d681SAndroid Build Coastguard Worker
267*9880d681SAndroid Build Coastguard Workerfor.body22.lr.ph:
268*9880d681SAndroid Build Coastguard Worker  br label %for.body22
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Workerfor.body22:
271*9880d681SAndroid Build Coastguard Worker  br label %for.body33
272*9880d681SAndroid Build Coastguard Worker
273*9880d681SAndroid Build Coastguard Workerfor.body33:
274*9880d681SAndroid Build Coastguard Worker  br label %for.end
275*9880d681SAndroid Build Coastguard Worker
276*9880d681SAndroid Build Coastguard Workerfor.end:
277*9880d681SAndroid Build Coastguard Worker  %cmp424 = call zeroext i1 @check()
278*9880d681SAndroid Build Coastguard Worker  br i1 %cmp424, label %for.body43.lr.ph, label %for.end93
279*9880d681SAndroid Build Coastguard Worker
280*9880d681SAndroid Build Coastguard Workerfor.body43.lr.ph:
281*9880d681SAndroid Build Coastguard Worker  br label %for.end93
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Workerfor.end93:
284*9880d681SAndroid Build Coastguard Worker  %cmp96 = call zeroext i1 @check()
285*9880d681SAndroid Build Coastguard Worker  br i1 %cmp96, label %if.then97, label %for.cond103
286*9880d681SAndroid Build Coastguard Worker
287*9880d681SAndroid Build Coastguard Workerif.then97:
288*9880d681SAndroid Build Coastguard Worker  br label %for.cond103t
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard Workerfor.cond103t:
291*9880d681SAndroid Build Coastguard Worker  br label %for.cond103
292*9880d681SAndroid Build Coastguard Worker
293*9880d681SAndroid Build Coastguard Workerfor.cond103:
294*9880d681SAndroid Build Coastguard Worker  %cmp105 = call zeroext i1 @check()
295*9880d681SAndroid Build Coastguard Worker  br i1 %cmp105, label %for.body106, label %for.end120
296*9880d681SAndroid Build Coastguard Worker
297*9880d681SAndroid Build Coastguard Workerfor.body106:
298*9880d681SAndroid Build Coastguard Worker  %cmp108 = call zeroext i1 @check()
299*9880d681SAndroid Build Coastguard Worker  br i1 %cmp108, label %if.then109, label %for.inc117
300*9880d681SAndroid Build Coastguard Worker
301*9880d681SAndroid Build Coastguard Workerif.then109:
302*9880d681SAndroid Build Coastguard Worker  br label %for.inc117
303*9880d681SAndroid Build Coastguard Worker
304*9880d681SAndroid Build Coastguard Workerfor.inc117:
305*9880d681SAndroid Build Coastguard Worker  br label %for.cond103t
306*9880d681SAndroid Build Coastguard Worker
307*9880d681SAndroid Build Coastguard Workerfor.end120:
308*9880d681SAndroid Build Coastguard Worker  br label %for.inc159
309*9880d681SAndroid Build Coastguard Worker
310*9880d681SAndroid Build Coastguard Workerfor.inc159:
311*9880d681SAndroid Build Coastguard Worker  br i1 false, label %for.body22, label %for.cond15.for.inc163_crit_edge
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Workerfor.cond15.for.inc163_crit_edge:
314*9880d681SAndroid Build Coastguard Worker  br label %for.inc163
315*9880d681SAndroid Build Coastguard Worker
316*9880d681SAndroid Build Coastguard Workerfor.inc163:
317*9880d681SAndroid Build Coastguard Worker  %cmp12 = call zeroext i1 @check()
318*9880d681SAndroid Build Coastguard Worker  br i1 %cmp12, label %for.body, label %for.end166
319*9880d681SAndroid Build Coastguard Worker
320*9880d681SAndroid Build Coastguard Workerfor.end166:
321*9880d681SAndroid Build Coastguard Worker  ret void
322*9880d681SAndroid Build Coastguard Worker
323*9880d681SAndroid Build Coastguard Worker}
324*9880d681SAndroid Build Coastguard Worker
325*9880d681SAndroid Build Coastguard Worker; Remove a loop whose exit branches into a sibling loop.
326*9880d681SAndroid Build Coastguard Worker; Ensure that only the loop is removed and rely on verify-loopinfo to
327*9880d681SAndroid Build Coastguard Worker; check soundness.
328*9880d681SAndroid Build Coastguard Worker;
329*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @unloopCriticalEdge(
330*9880d681SAndroid Build Coastguard Worker; CHECK: while.cond.outer.i.loopexit.split:
331*9880d681SAndroid Build Coastguard Worker; CHECK: br label %while.body
332*9880d681SAndroid Build Coastguard Worker; CHECK: while.body:
333*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.end78
334*9880d681SAndroid Build Coastguard Workerdefine void @unloopCriticalEdge() nounwind {
335*9880d681SAndroid Build Coastguard Workerentry:
336*9880d681SAndroid Build Coastguard Worker  br label %for.cond31
337*9880d681SAndroid Build Coastguard Worker
338*9880d681SAndroid Build Coastguard Workerfor.cond31:
339*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %for.body35, label %for.end94
340*9880d681SAndroid Build Coastguard Worker
341*9880d681SAndroid Build Coastguard Workerfor.body35:
342*9880d681SAndroid Build Coastguard Worker  br label %while.cond.i.preheader
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Workerwhile.cond.i.preheader:
345*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %while.cond.i.preheader.split, label %while.cond.outer.i.loopexit.split
346*9880d681SAndroid Build Coastguard Worker
347*9880d681SAndroid Build Coastguard Workerwhile.cond.i.preheader.split:
348*9880d681SAndroid Build Coastguard Worker  br label %while.cond.i
349*9880d681SAndroid Build Coastguard Worker
350*9880d681SAndroid Build Coastguard Workerwhile.cond.i:
351*9880d681SAndroid Build Coastguard Worker  br i1 true, label %while.cond.i, label %while.cond.outer.i.loopexit
352*9880d681SAndroid Build Coastguard Worker
353*9880d681SAndroid Build Coastguard Workerwhile.cond.outer.i.loopexit:
354*9880d681SAndroid Build Coastguard Worker  br label %while.cond.outer.i.loopexit.split
355*9880d681SAndroid Build Coastguard Worker
356*9880d681SAndroid Build Coastguard Workerwhile.cond.outer.i.loopexit.split:
357*9880d681SAndroid Build Coastguard Worker  br i1 false, label %while.cond.i.preheader, label %Func2.exit
358*9880d681SAndroid Build Coastguard Worker
359*9880d681SAndroid Build Coastguard WorkerFunc2.exit:
360*9880d681SAndroid Build Coastguard Worker  br label %while.body
361*9880d681SAndroid Build Coastguard Worker
362*9880d681SAndroid Build Coastguard Workerwhile.body:
363*9880d681SAndroid Build Coastguard Worker  br i1 false, label %while.body, label %while.end
364*9880d681SAndroid Build Coastguard Worker
365*9880d681SAndroid Build Coastguard Workerwhile.end:
366*9880d681SAndroid Build Coastguard Worker  br label %for.end78
367*9880d681SAndroid Build Coastguard Worker
368*9880d681SAndroid Build Coastguard Workerfor.end78:
369*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %Proc2.exit, label %for.cond.i.preheader
370*9880d681SAndroid Build Coastguard Worker
371*9880d681SAndroid Build Coastguard Workerfor.cond.i.preheader:
372*9880d681SAndroid Build Coastguard Worker  br label %for.cond.i
373*9880d681SAndroid Build Coastguard Worker
374*9880d681SAndroid Build Coastguard Workerfor.cond.i:
375*9880d681SAndroid Build Coastguard Worker  br label %for.cond.i
376*9880d681SAndroid Build Coastguard Worker
377*9880d681SAndroid Build Coastguard WorkerProc2.exit:
378*9880d681SAndroid Build Coastguard Worker  br label %for.cond31
379*9880d681SAndroid Build Coastguard Worker
380*9880d681SAndroid Build Coastguard Workerfor.end94:
381*9880d681SAndroid Build Coastguard Worker  ret void
382*9880d681SAndroid Build Coastguard Worker}
383*9880d681SAndroid Build Coastguard Worker
384*9880d681SAndroid Build Coastguard Worker; Test UnloopUpdater::removeBlocksFromAncestors.
385*9880d681SAndroid Build Coastguard Worker;
386*9880d681SAndroid Build Coastguard Worker; Check that the loop backedge is removed from the middle loop 1699,
387*9880d681SAndroid Build Coastguard Worker; but not the inner loop 1676.
388*9880d681SAndroid Build Coastguard Worker; CHECK: while.body1694:
389*9880d681SAndroid Build Coastguard Worker; CHECK:   br label %while.cond1676
390*9880d681SAndroid Build Coastguard Worker; CHECK: while.end1699:
391*9880d681SAndroid Build Coastguard Worker; CHECK:   br label %sw.default1711
392*9880d681SAndroid Build Coastguard Workerdefine void @removeSubloopBlocks() nounwind {
393*9880d681SAndroid Build Coastguard Workerentry:
394*9880d681SAndroid Build Coastguard Worker  br label %tryagain.outer
395*9880d681SAndroid Build Coastguard Worker
396*9880d681SAndroid Build Coastguard Workertryagain.outer:                                   ; preds = %sw.bb304, %entry
397*9880d681SAndroid Build Coastguard Worker  br label %tryagain
398*9880d681SAndroid Build Coastguard Worker
399*9880d681SAndroid Build Coastguard Workertryagain:                                         ; preds = %while.end1699, %tryagain.outer
400*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %sw.bb1669, label %sw.bb304
401*9880d681SAndroid Build Coastguard Worker
402*9880d681SAndroid Build Coastguard Workersw.bb304:                                         ; preds = %tryagain
403*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %return, label %tryagain.outer
404*9880d681SAndroid Build Coastguard Worker
405*9880d681SAndroid Build Coastguard Workersw.bb1669:                                        ; preds = %tryagain
406*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %sw.default1711, label %while.cond1676
407*9880d681SAndroid Build Coastguard Worker
408*9880d681SAndroid Build Coastguard Workerwhile.cond1676:                                   ; preds = %while.body1694, %sw.bb1669
409*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %while.end1699, label %while.body1694
410*9880d681SAndroid Build Coastguard Worker
411*9880d681SAndroid Build Coastguard Workerwhile.body1694:                                   ; preds = %while.cond1676
412*9880d681SAndroid Build Coastguard Worker  br label %while.cond1676
413*9880d681SAndroid Build Coastguard Worker
414*9880d681SAndroid Build Coastguard Workerwhile.end1699:                                    ; preds = %while.cond1676
415*9880d681SAndroid Build Coastguard Worker  br i1 false, label %tryagain, label %sw.default1711
416*9880d681SAndroid Build Coastguard Worker
417*9880d681SAndroid Build Coastguard Workersw.default1711:                                   ; preds = %while.end1699, %sw.bb1669, %tryagain
418*9880d681SAndroid Build Coastguard Worker  br label %defchar
419*9880d681SAndroid Build Coastguard Worker
420*9880d681SAndroid Build Coastguard Workerdefchar:                                          ; preds = %sw.default1711, %sw.bb376
421*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if.end2413, label %if.then2368
422*9880d681SAndroid Build Coastguard Worker
423*9880d681SAndroid Build Coastguard Workerif.then2368:                                      ; preds = %defchar
424*9880d681SAndroid Build Coastguard Worker  unreachable
425*9880d681SAndroid Build Coastguard Worker
426*9880d681SAndroid Build Coastguard Workerif.end2413:                                       ; preds = %defchar
427*9880d681SAndroid Build Coastguard Worker  unreachable
428*9880d681SAndroid Build Coastguard Worker
429*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %sw.bb304
430*9880d681SAndroid Build Coastguard Worker  ret void
431*9880d681SAndroid Build Coastguard Worker}
432*9880d681SAndroid Build Coastguard Worker
433*9880d681SAndroid Build Coastguard Worker; PR11335: the most deeply nested block should be removed from the outer loop.
434*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @removeSubloopBlocks2(
435*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond3:
436*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br
437*9880d681SAndroid Build Coastguard Worker; CHECK: ret void
438*9880d681SAndroid Build Coastguard Workerdefine void @removeSubloopBlocks2() nounwind {
439*9880d681SAndroid Build Coastguard Workerentry:
440*9880d681SAndroid Build Coastguard Worker  %tobool.i = icmp ne i32 undef, 0
441*9880d681SAndroid Build Coastguard Worker  br label %lbl_616
442*9880d681SAndroid Build Coastguard Worker
443*9880d681SAndroid Build Coastguard Workerlbl_616.loopexit:                                 ; preds = %for.cond
444*9880d681SAndroid Build Coastguard Worker  br label %lbl_616
445*9880d681SAndroid Build Coastguard Worker
446*9880d681SAndroid Build Coastguard Workerlbl_616:                                          ; preds = %lbl_616.loopexit, %entry
447*9880d681SAndroid Build Coastguard Worker  br label %for.cond
448*9880d681SAndroid Build Coastguard Worker
449*9880d681SAndroid Build Coastguard Workerfor.cond:                                         ; preds = %for.cond3, %lbl_616
450*9880d681SAndroid Build Coastguard Worker  br i1 false, label %for.cond1.preheader, label %lbl_616.loopexit
451*9880d681SAndroid Build Coastguard Worker
452*9880d681SAndroid Build Coastguard Workerfor.cond1.preheader:                              ; preds = %for.cond
453*9880d681SAndroid Build Coastguard Worker  br label %for.cond1
454*9880d681SAndroid Build Coastguard Worker
455*9880d681SAndroid Build Coastguard Workerfor.cond1.loopexit:                               ; preds = %for.cond.i
456*9880d681SAndroid Build Coastguard Worker  br label %for.cond1
457*9880d681SAndroid Build Coastguard Worker
458*9880d681SAndroid Build Coastguard Workerfor.cond1:                                        ; preds = %for.cond1.loopexit, %for.cond1.preheader
459*9880d681SAndroid Build Coastguard Worker  br i1 false, label %for.body2, label %for.cond3
460*9880d681SAndroid Build Coastguard Worker
461*9880d681SAndroid Build Coastguard Workerfor.body2:                                        ; preds = %for.cond1
462*9880d681SAndroid Build Coastguard Worker  br label %for.cond.i
463*9880d681SAndroid Build Coastguard Worker
464*9880d681SAndroid Build Coastguard Workerfor.cond.i:                                       ; preds = %for.cond.i, %for.body2
465*9880d681SAndroid Build Coastguard Worker  br i1 %tobool.i, label %for.cond.i, label %for.cond1.loopexit
466*9880d681SAndroid Build Coastguard Worker
467*9880d681SAndroid Build Coastguard Workerfor.cond3:                                        ; preds = %for.cond1
468*9880d681SAndroid Build Coastguard Worker  br i1 false, label %for.cond, label %if.end
469*9880d681SAndroid Build Coastguard Worker
470*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %for.cond3
471*9880d681SAndroid Build Coastguard Worker  ret void
472*9880d681SAndroid Build Coastguard Worker}
473