[sanitizer] Improve FreeBSD ASLR detection
[llvm-project.git] / llvm / test / Transforms / IndVarSimplify / scev-expander-preserve-lcssa.ll
blob6c275f3bca48eebc6c379081cc1fc54623aba344
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -aa-pipeline=basic-aa -passes=indvars,indvars -S -verify-loop-lcssa %s | FileCheck %s
4 ; Make sure SCEVExpander does not crash and introduce unnecessary LCSSA PHI nodes.
5 ; The tests are a collection of cases with crashes when preserving LCSSA PHI
6 ; nodes directly in SCEVExpander.
8 declare i1 @cond() readnone
10 define void @test1(i8 %x, [512 x i8]* %ptr) {
11 ; CHECK-LABEL: @test1(
12 ; CHECK-NEXT:  entry:
13 ; CHECK-NEXT:    br label [[LAND_LHS_TRUE:%.*]]
14 ; CHECK:       land.lhs.true:
15 ; CHECK-NEXT:    br label [[WHILE_COND22:%.*]]
16 ; CHECK:       while.cond22:
17 ; CHECK-NEXT:    [[C_1:%.*]] = call i1 @cond()
18 ; CHECK-NEXT:    br i1 [[C_1]], label [[WHILE_COND22]], label [[WHILE_COND29_PREHEADER:%.*]]
19 ; CHECK:       while.cond29.preheader:
20 ; CHECK-NEXT:    br label [[WHILE_BODY35:%.*]]
21 ; CHECK:       while.body35:
22 ; CHECK-NEXT:    [[I_1107:%.*]] = phi i32 [ [[I_9:%.*]], [[IF_END224:%.*]] ], [ 0, [[WHILE_COND29_PREHEADER]] ]
23 ; CHECK-NEXT:    br label [[WHILE_COND192:%.*]]
24 ; CHECK:       while.cond192:
25 ; CHECK-NEXT:    switch i8 [[X:%.*]], label [[WHILE_BODY205:%.*]] [
26 ; CHECK-NEXT:    i8 59, label [[WHILE_COND215_PREHEADER:%.*]]
27 ; CHECK-NEXT:    i8 10, label [[IF_END224_LOOPEXIT1:%.*]]
28 ; CHECK-NEXT:    ]
29 ; CHECK:       while.cond215.preheader:
30 ; CHECK-NEXT:    br label [[WHILE_COND215:%.*]]
31 ; CHECK:       while.body205:
32 ; CHECK-NEXT:    br label [[WHILE_COND192]]
33 ; CHECK:       while.cond215:
34 ; CHECK-NEXT:    [[I_8_IN:%.*]] = phi i32 [ [[I_8:%.*]], [[WHILE_COND215]] ], [ [[I_1107]], [[WHILE_COND215_PREHEADER]] ]
35 ; CHECK-NEXT:    [[I_8]] = add nsw i32 [[I_8_IN]], 1
36 ; CHECK-NEXT:    [[IDXPROM216:%.*]] = sext i32 [[I_8]] to i64
37 ; CHECK-NEXT:    [[ARRAYIDX217:%.*]] = getelementptr inbounds [512 x i8], [512 x i8]* [[PTR:%.*]], i64 0, i64 [[IDXPROM216]]
38 ; CHECK-NEXT:    [[C_2:%.*]] = call i1 @cond()
39 ; CHECK-NEXT:    br i1 [[C_2]], label [[WHILE_COND215]], label [[IF_END224_LOOPEXIT:%.*]]
40 ; CHECK:       if.end224.loopexit:
41 ; CHECK-NEXT:    [[I_8_LCSSA:%.*]] = phi i32 [ [[I_8]], [[WHILE_COND215]] ]
42 ; CHECK-NEXT:    br label [[IF_END224]]
43 ; CHECK:       if.end224.loopexit1:
44 ; CHECK-NEXT:    br label [[IF_END224]]
45 ; CHECK:       if.end224:
46 ; CHECK-NEXT:    [[I_9]] = phi i32 [ [[I_8_LCSSA]], [[IF_END224_LOOPEXIT]] ], [ [[I_1107]], [[IF_END224_LOOPEXIT1]] ]
47 ; CHECK-NEXT:    [[C_3:%.*]] = call i1 @cond()
48 ; CHECK-NEXT:    br i1 [[C_3]], label [[WHILE_END225:%.*]], label [[WHILE_BODY35]]
49 ; CHECK:       while.end225:
50 ; CHECK-NEXT:    br label [[LAND_LHS_TRUE]]
52 entry:
53   br label %land.lhs.true
55 land.lhs.true:                                    ; preds = %while.end225, %entry
56   br label %while.cond22
58 while.cond22:                                     ; preds = %while.cond22, %land.lhs.true
59   %c.1 = call i1 @cond()
60   br i1 %c.1, label %while.cond22, label %while.cond29.preheader
62 while.cond29.preheader:                           ; preds = %while.cond22
63   br label %while.body35
65 while.body35:                                     ; preds = %if.end224, %while.cond29.preheader
66   %i.1107 = phi i32 [ %i.9, %if.end224 ], [ 0, %while.cond29.preheader ]
67   br label %while.cond192
69 while.cond192:                                    ; preds = %while.body205, %while.body35
70   %i.7 = phi i32 [ %i.1107, %while.body35 ], [ %inc206, %while.body205 ]
71   switch i8 %x, label %while.body205 [
72   i8 59, label %while.cond215
73   i8 10, label %if.end224
74   ]
76 while.body205:                                    ; preds = %while.cond192
77   %inc206 = add nsw i32 %i.7, 1
78   br label %while.cond192
80 while.cond215:                                    ; preds = %while.cond215, %while.cond192
81   %i.8.in = phi i32 [ %i.8, %while.cond215 ], [ %i.7, %while.cond192 ]
82   %i.8 = add nsw i32 %i.8.in, 1
83   %idxprom216 = sext i32 %i.8 to i64
84   %arrayidx217 = getelementptr inbounds [512 x i8], [512 x i8]* %ptr, i64 0, i64 %idxprom216
85   %c.2 = call i1 @cond()
86   br i1 %c.2, label %while.cond215, label %if.end224
88 if.end224:                                        ; preds = %while.cond215, %while.cond192
89   %i.9 = phi i32 [ %i.8, %while.cond215 ], [ %i.7, %while.cond192 ]
90   %c.3 = call i1 @cond()
91   br i1 %c.3, label %while.end225, label %while.body35
93 while.end225:                                     ; preds = %if.end224
94   br label %land.lhs.true
97 define void @test2(i16 %x)  {
98 ; CHECK-LABEL: @test2(
99 ; CHECK-NEXT:  entry:
100 ; CHECK-NEXT:    [[C_1:%.*]] = call i1 @cond()
101 ; CHECK-NEXT:    br i1 [[C_1]], label [[FOR_COND_PREHEADER:%.*]], label [[RETURN:%.*]]
102 ; CHECK:       for.cond.preheader:
103 ; CHECK-NEXT:    br label [[FOR_COND:%.*]]
104 ; CHECK:       for.cond:
105 ; CHECK-NEXT:    switch i16 [[X:%.*]], label [[RETURN_LOOPEXIT1:%.*]] [
106 ; CHECK-NEXT:    i16 41, label [[FOR_END:%.*]]
107 ; CHECK-NEXT:    i16 43, label [[FOR_COND]]
108 ; CHECK-NEXT:    ]
109 ; CHECK:       for.end:
110 ; CHECK-NEXT:    [[I_0_LCSSA2:%.*]] = phi i32 [ 0, [[FOR_COND]] ]
111 ; CHECK-NEXT:    [[CMP8243:%.*]] = icmp sgt i32 [[I_0_LCSSA2]], 0
112 ; CHECK-NEXT:    br i1 [[CMP8243]], label [[FOR_BODY84_PREHEADER:%.*]], label [[RETURN]]
113 ; CHECK:       for.body84.preheader:
114 ; CHECK-NEXT:    br label [[FOR_BODY84:%.*]]
115 ; CHECK:       for.body84:
116 ; CHECK-NEXT:    [[C_2:%.*]] = call i1 @cond()
117 ; CHECK-NEXT:    br i1 [[C_2]], label [[IF_END106:%.*]], label [[RETURN_LOOPEXIT:%.*]]
118 ; CHECK:       if.end106:
119 ; CHECK-NEXT:    br i1 false, label [[FOR_BODY84]], label [[RETURN_LOOPEXIT]]
120 ; CHECK:       return.loopexit:
121 ; CHECK-NEXT:    br label [[RETURN]]
122 ; CHECK:       return.loopexit1:
123 ; CHECK-NEXT:    br label [[RETURN]]
124 ; CHECK:       return:
125 ; CHECK-NEXT:    ret void
127 entry:
128   %c.1 = call i1 @cond()
129   br i1 %c.1, label %for.cond, label %return
131 for.cond:                                         ; preds = %for.cond, %entry
132   %i.0 = phi i32 [ %sub, %for.cond ], [ 0, %entry ]
133   %sub = add nsw i32 %i.0, -1
134   switch i16 %x, label %return [
135   i16 41, label %for.end
136   i16 43, label %for.cond
137   ]
139 for.end:                                          ; preds = %for.cond
140   %cmp8243 = icmp sgt i32 %i.0, 0
141   br i1 %cmp8243, label %for.body84, label %return
143 for.body84:                                       ; preds = %if.end106, %for.end
144   %i.144 = phi i32 [ %inc, %if.end106 ], [ 0, %for.end ]
145   %c.2 = call i1 @cond()
146   br i1 %c.2, label %if.end106, label %return
148 if.end106:                                        ; preds = %for.body84
149   %inc = add nuw nsw i32 %i.144, 1
150   %cmp82 = icmp slt i32 %inc, %i.0
151   br i1 %cmp82, label %for.body84, label %return
153 return:                                           ; preds = %if.end106, %for.body84, %for.end, %for.cond, %entry
154   ret void
157 declare i32 @get.i32() readnone
159 define void @test3(i32* %ptr) {
160 ; CHECK-LABEL: @test3(
161 ; CHECK-NEXT:  entry:
162 ; CHECK-NEXT:    br label [[WHILE_BODY:%.*]]
163 ; CHECK:       while.body:
164 ; CHECK-NEXT:    br label [[FOR_BODY1208:%.*]]
165 ; CHECK:       for.body1208:
166 ; CHECK-NEXT:    [[M_0804:%.*]] = phi i32 [ 1, [[WHILE_BODY]] ], [ [[INC1499:%.*]], [[FOR_INC1498:%.*]] ]
167 ; CHECK-NEXT:    [[V:%.*]] = call i32 @get.i32()
168 ; CHECK-NEXT:    [[CMP1358:%.*]] = icmp eq i32 [[V]], 0
169 ; CHECK-NEXT:    br i1 [[CMP1358]], label [[IF_THEN1360:%.*]], label [[FOR_INC1498]]
170 ; CHECK:       if.then1360:
171 ; CHECK-NEXT:    [[M_0804_LCSSA:%.*]] = phi i32 [ [[M_0804]], [[FOR_BODY1208]] ]
172 ; CHECK-NEXT:    br label [[FOR_COND1390:%.*]]
173 ; CHECK:       for.cond1390:
174 ; CHECK-NEXT:    [[M_2_IN:%.*]] = phi i32 [ [[M_0804_LCSSA]], [[IF_THEN1360]] ], [ 0, [[FOR_BODY1394:%.*]] ]
175 ; CHECK-NEXT:    [[C_2:%.*]] = call i1 @cond()
176 ; CHECK-NEXT:    br i1 [[C_2]], label [[FOR_BODY1394]], label [[FOR_END1469:%.*]]
177 ; CHECK:       for.body1394:
178 ; CHECK-NEXT:    br label [[FOR_COND1390]]
179 ; CHECK:       for.end1469:
180 ; CHECK-NEXT:    [[M_2_IN_LCSSA:%.*]] = phi i32 [ [[M_2_IN]], [[FOR_COND1390]] ]
181 ; CHECK-NEXT:    store i32 [[M_2_IN_LCSSA]], i32* [[PTR:%.*]], align 4
182 ; CHECK-NEXT:    br label [[WHILE_BODY]]
183 ; CHECK:       for.inc1498:
184 ; CHECK-NEXT:    [[INC1499]] = add nuw nsw i32 [[M_0804]], 1
185 ; CHECK-NEXT:    br label [[FOR_BODY1208]]
187 entry:
188   br label %while.body
190 while.body:                                       ; preds = %for.end1469, %entry
191   br label %for.body1208
193 for.body1208:                                     ; preds = %for.inc1498, %while.body
194   %m.0804 = phi i32 [ 1, %while.body ], [ %inc1499, %for.inc1498 ]
195   %v = call i32 @get.i32()
196   %cmp1358 = icmp eq i32 %v, 0
197   br i1 %cmp1358, label %if.then1360, label %for.inc1498
199 if.then1360:                                      ; preds = %for.body1208
200   br label %for.cond1390
202 for.cond1390:                                     ; preds = %for.body1394, %if.then1360
203   %m.2.in = phi i32 [ %m.0804, %if.then1360 ], [ 0, %for.body1394 ]
204   %c.2 = call i1 @cond()
205   br i1 %c.2, label %for.body1394, label %for.end1469
207 for.body1394:                                     ; preds = %for.cond1390
208   br label %for.cond1390
210 for.end1469:                                      ; preds = %for.cond1390
211   store i32 %m.2.in, i32* %ptr, align 4
212   br label %while.body
214 for.inc1498:                                      ; preds = %for.body1208
215   %inc1499 = add nuw nsw i32 %m.0804, 1
216   br label %for.body1208
219 define void @test4(i32* %ptr) {
220 ; CHECK-LABEL: @test4(
221 ; CHECK-NEXT:  entry:
222 ; CHECK-NEXT:    br label [[WHILE_BODY:%.*]]
223 ; CHECK:       while.body:
224 ; CHECK-NEXT:    br label [[FOR_COND1204_PREHEADER:%.*]]
225 ; CHECK:       for.cond1204.preheader:
226 ; CHECK-NEXT:    [[C_1:%.*]] = call i1 @cond()
227 ; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN1504:%.*]], label [[FOR_BODY1208_LR_PH:%.*]]
228 ; CHECK:       for.body1208.lr.ph:
229 ; CHECK-NEXT:    br label [[FOR_BODY1208:%.*]]
230 ; CHECK:       for.body1208:
231 ; CHECK-NEXT:    [[TMP0:%.*]] = phi i32 [ 0, [[FOR_BODY1208_LR_PH]] ], [ [[TMP1:%.*]], [[FOR_INC1498:%.*]] ]
232 ; CHECK-NEXT:    [[M_0804:%.*]] = phi i32 [ 1, [[FOR_BODY1208_LR_PH]] ], [ [[INC1499:%.*]], [[FOR_INC1498]] ]
233 ; CHECK-NEXT:    [[IDXPROM1212:%.*]] = zext i32 [[M_0804]] to i64
234 ; CHECK-NEXT:    [[V:%.*]] = call i32 @get.i32()
235 ; CHECK-NEXT:    [[CMP1215:%.*]] = icmp eq i32 0, [[V]]
236 ; CHECK-NEXT:    [[YPOS1223:%.*]] = getelementptr inbounds i32, i32* [[PTR:%.*]], i64 [[IDXPROM1212]]
237 ; CHECK-NEXT:    br i1 [[CMP1215]], label [[IF_THEN1217:%.*]], label [[IF_ELSE1351:%.*]]
238 ; CHECK:       if.then1217:
239 ; CHECK-NEXT:    [[M_0804_LCSSA:%.*]] = phi i32 [ [[M_0804]], [[FOR_BODY1208]] ]
240 ; CHECK-NEXT:    br label [[FOR_COND1247:%.*]]
241 ; CHECK:       for.cond1247:
242 ; CHECK-NEXT:    [[M_1_IN:%.*]] = phi i32 [ [[M_0804_LCSSA]], [[IF_THEN1217]] ], [ [[M_1:%.*]], [[IF_THEN1260:%.*]] ]
243 ; CHECK-NEXT:    [[M_1]] = add nuw nsw i32 [[M_1_IN]], 1
244 ; CHECK-NEXT:    br label [[FOR_BODY1251:%.*]]
245 ; CHECK:       for.body1251:
246 ; CHECK-NEXT:    [[IDXPROM1255:%.*]] = zext i32 [[M_1]] to i64
247 ; CHECK-NEXT:    [[XPOS1257:%.*]] = getelementptr inbounds i32, i32* [[PTR]], i64 [[IDXPROM1255]]
248 ; CHECK-NEXT:    [[C_2:%.*]] = call i1 @cond()
249 ; CHECK-NEXT:    br i1 [[C_2]], label [[IF_THEN1260]], label [[FOR_END1326:%.*]]
250 ; CHECK:       if.then1260:
251 ; CHECK-NEXT:    br label [[FOR_COND1247]]
252 ; CHECK:       for.end1326:
253 ; CHECK-NEXT:    br label [[IF_END1824:%.*]]
254 ; CHECK:       if.else1351:
255 ; CHECK-NEXT:    [[V_2:%.*]] = call i32 @get.i32()
256 ; CHECK-NEXT:    [[CMP1358:%.*]] = icmp eq i32 [[V_2]], 0
257 ; CHECK-NEXT:    br i1 [[CMP1358]], label [[IF_THEN1360:%.*]], label [[FOR_INC1498]]
258 ; CHECK:       if.then1360:
259 ; CHECK-NEXT:    [[DOTLCSSA2:%.*]] = phi i32 [ [[TMP0]], [[IF_ELSE1351]] ]
260 ; CHECK-NEXT:    [[M_0804_LCSSA1:%.*]] = phi i32 [ [[M_0804]], [[IF_ELSE1351]] ]
261 ; CHECK-NEXT:    [[CMP1392:%.*]] = icmp slt i32 [[M_0804_LCSSA1]], [[DOTLCSSA2]]
262 ; CHECK-NEXT:    unreachable
263 ; CHECK:       for.inc1498:
264 ; CHECK-NEXT:    [[INC1499]] = add nuw nsw i32 [[M_0804]], 1
265 ; CHECK-NEXT:    [[TMP1]] = load i32, i32* [[PTR]], align 8
266 ; CHECK-NEXT:    br label [[FOR_BODY1208]]
267 ; CHECK:       if.then1504:
268 ; CHECK-NEXT:    unreachable
269 ; CHECK:       if.end1824:
270 ; CHECK-NEXT:    br label [[WHILE_BODY]]
272 entry:
273   br label %while.body
275 while.body:                                       ; preds = %if.end1824, %entry
276   br label %for.cond1204.preheader
278 for.cond1204.preheader:                           ; preds = %while.body
279   %c.1 = call i1 @cond()
280   br i1 %c.1, label %if.then1504, label %for.body1208.lr.ph
282 for.body1208.lr.ph:                               ; preds = %for.cond1204.preheader
283   br label %for.body1208
285 for.body1208:                                     ; preds = %for.inc1498, %for.body1208.lr.ph
286   %0 = phi i32 [ 0, %for.body1208.lr.ph ], [ %1, %for.inc1498 ]
287   %m.0804 = phi i32 [ 1, %for.body1208.lr.ph ], [ %inc1499, %for.inc1498 ]
288   %idxprom1212 = zext i32 %m.0804 to i64
289   %v = call i32 @get.i32()
290   %cmp1215 = icmp eq i32 0, %v
291   %ypos1223 = getelementptr inbounds i32, i32* %ptr , i64 %idxprom1212
292   br i1 %cmp1215, label %if.then1217, label %if.else1351
294 if.then1217:                                      ; preds = %for.body1208
295   br label %for.cond1247
297 for.cond1247:                                     ; preds = %if.then1260, %if.then1217
298   %m.1.in = phi i32 [ %m.0804, %if.then1217 ], [ %m.1, %if.then1260 ]
299   %m.1 = add nuw nsw i32 %m.1.in, 1
300   %cmp1249 = icmp slt i32 %m.1.in, %0
301   br label %for.body1251
303 for.body1251:                                     ; preds = %for.cond1247
304   %idxprom1255 = zext i32 %m.1 to i64
305   %xpos1257 = getelementptr inbounds i32, i32* %ptr, i64 %idxprom1255
306   %c.2 = call i1 @cond()
307   br i1 %c.2, label %if.then1260, label %for.end1326
309 if.then1260:                                      ; preds = %for.body1251
310   br label %for.cond1247
312 for.end1326:                                      ; preds = %for.body1251
313   br label %if.end1824
315 if.else1351:                                      ; preds = %for.body1208
316   %v.2 = call i32 @get.i32()
317   %cmp1358 = icmp eq i32 %v.2, 0
318   br i1 %cmp1358, label %if.then1360, label %for.inc1498
320 if.then1360:                                      ; preds = %if.else1351
321   %cmp1392 = icmp slt i32 %m.0804, %0
322   unreachable
324 for.inc1498:                                      ; preds = %if.else1351
325   %inc1499 = add nuw nsw i32 %m.0804, 1
326   %1 = load i32, i32* %ptr, align 8
327   br label %for.body1208
329 if.then1504:                                      ; preds = %for.cond1204.preheader
330   unreachable
332 if.end1824:                                       ; preds = %for.end1326
333   br label %while.body
336 define void @test5(i8* %header, i32 %conv, i8 %n) {
337 ; CHECK-LABEL: @test5(
338 ; CHECK-NEXT:  entry:
339 ; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
340 ; CHECK:       for.body:
341 ; CHECK-NEXT:    [[POS_42:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[ADD85:%.*]], [[FOR_INC:%.*]] ]
342 ; CHECK-NEXT:    br label [[FOR_INNER:%.*]]
343 ; CHECK:       for.inner:
344 ; CHECK-NEXT:    [[I_0_I:%.*]] = phi i32 [ 0, [[FOR_BODY]] ], [ [[INC_I:%.*]], [[FOR_INNER]] ]
345 ; CHECK-NEXT:    [[INC_I]] = add nuw nsw i32 [[I_0_I]], 1
346 ; CHECK-NEXT:    [[CMP7_I:%.*]] = icmp slt i8 [[N:%.*]], 0
347 ; CHECK-NEXT:    br i1 [[CMP7_I]], label [[FOR_INNER]], label [[FOR_INNER_EXIT:%.*]]
348 ; CHECK:       for.inner.exit:
349 ; CHECK-NEXT:    [[INC_I_LCSSA:%.*]] = phi i32 [ [[INC_I]], [[FOR_INNER]] ]
350 ; CHECK-NEXT:    br label [[FOR_INNER_2:%.*]]
351 ; CHECK:       for.inner.2:
352 ; CHECK-NEXT:    [[I_0_I1:%.*]] = phi i32 [ 0, [[FOR_INNER_EXIT]] ], [ [[INC_I3:%.*]], [[FOR_INNER_2]] ]
353 ; CHECK-NEXT:    [[INC_I3]] = add nuw nsw i32 [[I_0_I1]], 1
354 ; CHECK-NEXT:    [[CMP7_I4:%.*]] = icmp slt i8 [[N]], 0
355 ; CHECK-NEXT:    br i1 [[CMP7_I4]], label [[FOR_INNER_2]], label [[FOR_INC]]
356 ; CHECK:       for.inc:
357 ; CHECK-NEXT:    [[INC_I3_LCSSA:%.*]] = phi i32 [ [[INC_I3]], [[FOR_INNER_2]] ]
358 ; CHECK-NEXT:    [[ADD71:%.*]] = add i32 [[POS_42]], [[INC_I_LCSSA]]
359 ; CHECK-NEXT:    [[ADD85]] = add i32 [[ADD71]], [[INC_I3_LCSSA]]
360 ; CHECK-NEXT:    br i1 false, label [[FOR_BODY]], label [[WHILE_COND_PREHEADER:%.*]]
361 ; CHECK:       while.cond.preheader:
362 ; CHECK-NEXT:    [[ADD85_LCSSA:%.*]] = phi i32 [ [[ADD85]], [[FOR_INC]] ]
363 ; CHECK-NEXT:    [[SHL:%.*]] = shl nuw nsw i32 [[CONV:%.*]], 2
364 ; CHECK-NEXT:    br label [[WHILE_COND:%.*]]
365 ; CHECK:       while.cond:
366 ; CHECK-NEXT:    [[POS_8:%.*]] = phi i32 [ [[INC114:%.*]], [[WHILE_BODY:%.*]] ], [ [[ADD85_LCSSA]], [[WHILE_COND_PREHEADER]] ]
367 ; CHECK-NEXT:    [[CMP112:%.*]] = icmp ult i32 [[POS_8]], [[SHL]]
368 ; CHECK-NEXT:    br i1 [[CMP112]], label [[WHILE_BODY]], label [[CLEANUP122:%.*]]
369 ; CHECK:       while.body:
370 ; CHECK-NEXT:    [[INC114]] = add nuw i32 [[POS_8]], 1
371 ; CHECK-NEXT:    [[C_1:%.*]] = call i1 @cond()
372 ; CHECK-NEXT:    br i1 [[C_1]], label [[WHILE_COND]], label [[CLEANUP122]]
373 ; CHECK:       cleanup122:
374 ; CHECK-NEXT:    ret void
376 entry:
377   %shl = shl nuw nsw i32 %conv, 2
378   br label %for.body
380 for.body:                                         ; preds = %entry, %for.inc
381   %pos.42 = phi i32 [ 0, %entry ], [ %add85, %for.inc ]
382   br label %for.inner
384 for.inner:                                       ; preds = %for.body.i, %for.body
385   %i.0.i = phi i32 [ 0, %for.body ], [ %inc.i, %for.inner ]
386   %inc.i = add nuw nsw i32 %i.0.i, 1
387   %cmp7.i = icmp slt i8 %n, 0
388   br i1 %cmp7.i, label %for.inner, label %for.inner.exit
390 for.inner.exit:                                   ; preds = %for.body.i
391   %add71 = add i32 %pos.42, %inc.i
392   br label %for.inner.2
394 for.inner.2:                                      ; preds = %for.body.i6, %cleanup.cont74
395   %i.0.i1 = phi i32 [ 0, %for.inner.exit ], [ %inc.i3, %for.inner.2]
396   %inc.i3 = add nuw nsw i32 %i.0.i1, 1
397   %cmp7.i4 = icmp slt i8 %n, 0
398   br i1 %cmp7.i4, label %for.inner.2, label %for.inc
400 for.inc:                                          ; preds = %for.body.i6
401   %add85 = add i32 %add71, %inc.i3
402   br i1 false, label %for.body, label %while.cond.preheader
404 while.cond.preheader:                             ; preds = %for.inc
405   br label %while.cond
407 while.cond:                                       ; preds = %while.cond.preheader, %while.body
408   %pos.8 = phi i32 [ %inc114, %while.body ], [ %add85, %while.cond.preheader ]
409   %cmp112 = icmp ult i32 %pos.8, %shl
410   br i1 %cmp112, label %while.body, label %cleanup122
412 while.body:                                       ; preds = %while.cond
413   %inc114 = add nuw i32 %pos.8, 1
414   %c.1 = call i1 @cond()
415   br i1 %c.1, label %while.cond, label %cleanup122
417 cleanup122:                                       ; preds = %while.body, %while.cond
418   ret void
421 define void @test6(i8 %x) {
422 ; CHECK-LABEL: @test6(
423 ; CHECK-NEXT:  entry:
424 ; CHECK-NEXT:    [[C_1:%.*]] = call i1 @cond()
425 ; CHECK-NEXT:    br i1 [[C_1]], label [[LAND_RHS:%.*]], label [[WHILE_END316:%.*]]
426 ; CHECK:       land.rhs:
427 ; CHECK-NEXT:    br label [[WHILE_BODY35:%.*]]
428 ; CHECK:       while.body35:
429 ; CHECK-NEXT:    br label [[WHILE_COND192:%.*]]
430 ; CHECK:       while.cond192:
431 ; CHECK-NEXT:    switch i8 [[X:%.*]], label [[WHILE_BODY205:%.*]] [
432 ; CHECK-NEXT:    i8 59, label [[WHILE_COND215_PREHEADER:%.*]]
433 ; CHECK-NEXT:    i8 10, label [[IF_END224:%.*]]
434 ; CHECK-NEXT:    ]
435 ; CHECK:       while.cond215.preheader:
436 ; CHECK-NEXT:    [[I_7_LCSSA:%.*]] = phi i32 [ 0, [[WHILE_COND192]] ]
437 ; CHECK-NEXT:    br label [[WHILE_COND215:%.*]]
438 ; CHECK:       while.body205:
439 ; CHECK-NEXT:    br label [[WHILE_COND192]]
440 ; CHECK:       while.cond215:
441 ; CHECK-NEXT:    [[I_8_IN:%.*]] = phi i32 [ [[I_8:%.*]], [[WHILE_COND215]] ], [ [[I_7_LCSSA]], [[WHILE_COND215_PREHEADER]] ]
442 ; CHECK-NEXT:    [[I_8]] = add nuw nsw i32 [[I_8_IN]], 1
443 ; CHECK-NEXT:    [[IDXPROM216:%.*]] = sext i32 [[I_8]] to i64
444 ; CHECK-NEXT:    [[ARRAYIDX217:%.*]] = getelementptr inbounds [512 x i8], [512 x i8]* null, i64 0, i64 [[IDXPROM216]]
445 ; CHECK-NEXT:    br label [[WHILE_COND215]]
446 ; CHECK:       if.end224:
447 ; CHECK-NEXT:    [[C_2:%.*]] = call i1 @cond()
448 ; CHECK-NEXT:    br i1 [[C_2]], label [[WHILE_END225:%.*]], label [[WHILE_BODY35]]
449 ; CHECK:       while.end225:
450 ; CHECK-NEXT:    unreachable
451 ; CHECK:       while.end316:
452 ; CHECK-NEXT:    ret void
454 entry:
455   %c.1 = call i1 @cond()
456   br i1 %c.1, label %land.rhs, label %while.end316
458 land.rhs:                                         ; preds = %entry
459   br label %while.body35
461 while.body35:                                     ; preds = %if.end224, %land.rhs
462   br label %while.cond192
464 while.cond192:                                    ; preds = %while.body205, %while.body35
465   %i.7 = phi i32 [ 0, %while.body35 ], [ %inc206, %while.body205 ]
466   switch i8 %x, label %while.body205 [
467   i8 59, label %while.cond215
468   i8 10, label %if.end224
469   ]
471 while.body205:                                    ; preds = %while.cond192
472   %inc206 = add nsw i32 %i.7, 1
473   br label %while.cond192
475 while.cond215:                                    ; preds = %while.cond215, %while.cond192
476   %i.8.in = phi i32 [ %i.8, %while.cond215 ], [ %i.7, %while.cond192 ]
477   %i.8 = add nsw i32 %i.8.in, 1
478   %idxprom216 = sext i32 %i.8 to i64
479   %arrayidx217 = getelementptr inbounds [512 x i8], [512 x i8]* null, i64 0, i64 %idxprom216
480   br label %while.cond215
482 if.end224:                                        ; preds = %while.cond192
483   %c.2 = call i1 @cond()
484   br i1 %c.2, label %while.end225, label %while.body35
486 while.end225:                                     ; preds = %if.end224
487   unreachable
489 while.end316:                                     ; preds = %entry
490   ret void
493 define void @test7(i32* %ptr) {
494 ; CHECK-LABEL: @test7(
495 ; CHECK-NEXT:  entry:
496 ; CHECK-NEXT:    br label [[WHILE_BODY:%.*]]
497 ; CHECK:       while.body:
498 ; CHECK-NEXT:    br label [[FOR_BODY1208:%.*]]
499 ; CHECK:       for.body1208:
500 ; CHECK-NEXT:    [[TMP0:%.*]] = phi i32 [ undef, [[WHILE_BODY]] ], [ [[TMP1:%.*]], [[FOR_INC1498:%.*]] ]
501 ; CHECK-NEXT:    [[M_048:%.*]] = phi i32 [ 1, [[WHILE_BODY]] ], [ [[INC1499:%.*]], [[FOR_INC1498]] ]
502 ; CHECK-NEXT:    [[IDXPROM1212:%.*]] = zext i32 [[M_048]] to i64
503 ; CHECK-NEXT:    [[XPOS1214:%.*]] = getelementptr inbounds i32, i32* [[PTR:%.*]], i64 [[IDXPROM1212]]
504 ; CHECK-NEXT:    [[V_1:%.*]] = call i32 @get.i32()
505 ; CHECK-NEXT:    [[CMP1215:%.*]] = icmp eq i32 0, [[V_1]]
506 ; CHECK-NEXT:    br i1 [[CMP1215]], label [[IF_THEN1217:%.*]], label [[IF_ELSE1351:%.*]]
507 ; CHECK:       if.then1217:
508 ; CHECK-NEXT:    [[DOTLCSSA:%.*]] = phi i32 [ [[TMP0]], [[FOR_BODY1208]] ]
509 ; CHECK-NEXT:    [[M_048_LCSSA:%.*]] = phi i32 [ [[M_048]], [[FOR_BODY1208]] ]
510 ; CHECK-NEXT:    [[CMP1249_NOT_NOT:%.*]] = icmp slt i32 [[M_048_LCSSA]], [[DOTLCSSA]]
511 ; CHECK-NEXT:    unreachable
512 ; CHECK:       if.else1351:
513 ; CHECK-NEXT:    [[CMP1358:%.*]] = icmp eq i32 0, undef
514 ; CHECK-NEXT:    br i1 [[CMP1358]], label [[IF_THEN1360:%.*]], label [[FOR_INC1498]]
515 ; CHECK:       if.then1360:
516 ; CHECK-NEXT:    [[M_048_LCSSA1:%.*]] = phi i32 [ [[M_048]], [[IF_ELSE1351]] ]
517 ; CHECK-NEXT:    br label [[FOR_COND1390:%.*]]
518 ; CHECK:       for.cond1390:
519 ; CHECK-NEXT:    [[M_2_IN:%.*]] = phi i32 [ [[M_048_LCSSA1]], [[IF_THEN1360]] ], [ [[M_2:%.*]], [[IF_THEN1403:%.*]] ]
520 ; CHECK-NEXT:    [[M_2]] = add nuw nsw i32 [[M_2_IN]], 1
521 ; CHECK-NEXT:    [[IDXPROM1398:%.*]] = zext i32 [[M_2]] to i64
522 ; CHECK-NEXT:    br label [[IF_THEN1403]]
523 ; CHECK:       if.then1403:
524 ; CHECK-NEXT:    [[XPOS1409:%.*]] = getelementptr inbounds i32, i32* [[PTR]], i64 [[IDXPROM1398]]
525 ; CHECK-NEXT:    [[C_1:%.*]] = call i1 @cond()
526 ; CHECK-NEXT:    br i1 [[C_1]], label [[FOR_COND1390]], label [[FOR_END1469:%.*]]
527 ; CHECK:       for.end1469:
528 ; CHECK-NEXT:    br label [[IF_END1824:%.*]]
529 ; CHECK:       for.inc1498:
530 ; CHECK-NEXT:    [[INC1499]] = add nuw nsw i32 [[M_048]], 1
531 ; CHECK-NEXT:    [[TMP1]] = load i32, i32* undef, align 8
532 ; CHECK-NEXT:    br label [[FOR_BODY1208]]
533 ; CHECK:       if.end1824:
534 ; CHECK-NEXT:    br label [[WHILE_BODY]]
536 entry:
537   br label %while.body
539 while.body:                                       ; preds = %if.end1824, %entry
540   br label %for.body1208
542 for.body1208:                                     ; preds = %for.inc1498, %while.body
543   %0 = phi i32 [ undef, %while.body ], [ %1, %for.inc1498 ]
544   %m.048 = phi i32 [ 1, %while.body ], [ %inc1499, %for.inc1498 ]
545   %idxprom1212 = zext i32 %m.048 to i64
546   %xpos1214 = getelementptr inbounds i32, i32* %ptr, i64 %idxprom1212
547   %v.1 = call i32 @get.i32()
548   %cmp1215 = icmp eq i32 0, %v.1
549   br i1 %cmp1215, label %if.then1217, label %if.else1351
551 if.then1217:                                      ; preds = %for.body1208
552   %cmp1249.not.not = icmp slt i32 %m.048, %0
553   unreachable
555 if.else1351:                                      ; preds = %for.body1208
556   %cmp1358 = icmp eq i32 0, undef
557   br i1 %cmp1358, label %if.then1360, label %for.inc1498
559 if.then1360:                                      ; preds = %if.else1351
560   br label %for.cond1390
562 for.cond1390:                                     ; preds = %if.then1403, %if.then1360
563   %m.2.in = phi i32 [ %m.048, %if.then1360 ], [ %m.2, %if.then1403 ]
564   %m.2 = add nuw nsw i32 %m.2.in, 1
565   %cmp1392.not.not = icmp slt i32 %m.2.in, %0
566   %idxprom1398 = zext i32 %m.2 to i64
567   br label %if.then1403
569 if.then1403:                                      ; preds = %for.cond1390
570   %xpos1409 = getelementptr inbounds i32, i32* %ptr, i64 %idxprom1398
571   %c.1 = call i1 @cond()
572   br i1 %c.1, label %for.cond1390, label %for.end1469
574 for.end1469:                                      ; preds = %if.then1403
575   br label %if.end1824
577 for.inc1498:                                      ; preds = %if.else1351
578   %inc1499 = add nuw nsw i32 %m.048, 1
579   %1 = load i32, i32* undef, align 8
580   br label %for.body1208
582 if.end1824:                                       ; preds = %for.end1469
583   br label %while.body