xref: /llvm-project/llvm/test/Transforms/IndVarSimplify/scev-expander-preserve-lcssa.ll (revision 3ce360f15b5a790a5fd9dcab716bbed7b4d3a347)
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
3
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.
7
8declare i1 @cond() readnone
9
10define void @test1(i8 %x, ptr %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], ptr [[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]]
51;
52entry:
53  br label %land.lhs.true
54
55land.lhs.true:                                    ; preds = %while.end225, %entry
56  br label %while.cond22
57
58while.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
61
62while.cond29.preheader:                           ; preds = %while.cond22
63  br label %while.body35
64
65while.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
68
69while.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  ]
75
76while.body205:                                    ; preds = %while.cond192
77  %inc206 = add nsw i32 %i.7, 1
78  br label %while.cond192
79
80while.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], ptr %ptr, i64 0, i64 %idxprom216
85  %c.2 = call i1 @cond()
86  br i1 %c.2, label %while.cond215, label %if.end224
87
88if.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
92
93while.end225:                                     ; preds = %if.end224
94  br label %land.lhs.true
95}
96
97define 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
126;
127entry:
128  %c.1 = call i1 @cond()
129  br i1 %c.1, label %for.cond, label %return
130
131for.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  ]
138
139for.end:                                          ; preds = %for.cond
140  %cmp8243 = icmp sgt i32 %i.0, 0
141  br i1 %cmp8243, label %for.body84, label %return
142
143for.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
147
148if.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
152
153return:                                           ; preds = %if.end106, %for.body84, %for.end, %for.cond, %entry
154  ret void
155}
156
157declare i32 @get.i32() readnone
158
159define void @test3(ptr %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]], ptr [[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]]
186;
187entry:
188  br label %while.body
189
190while.body:                                       ; preds = %for.end1469, %entry
191  br label %for.body1208
192
193for.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
198
199if.then1360:                                      ; preds = %for.body1208
200  br label %for.cond1390
201
202for.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
206
207for.body1394:                                     ; preds = %for.cond1390
208  br label %for.cond1390
209
210for.end1469:                                      ; preds = %for.cond1390
211  store i32 %m.2.in, ptr %ptr, align 4
212  br label %while.body
213
214for.inc1498:                                      ; preds = %for.body1208
215  %inc1499 = add nuw nsw i32 %m.0804, 1
216  br label %for.body1208
217}
218
219define void @test4(ptr %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, ptr [[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, ptr [[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, ptr [[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]]
271;
272entry:
273  br label %while.body
274
275while.body:                                       ; preds = %if.end1824, %entry
276  br label %for.cond1204.preheader
277
278for.cond1204.preheader:                           ; preds = %while.body
279  %c.1 = call i1 @cond()
280  br i1 %c.1, label %if.then1504, label %for.body1208.lr.ph
281
282for.body1208.lr.ph:                               ; preds = %for.cond1204.preheader
283  br label %for.body1208
284
285for.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, ptr %ptr , i64 %idxprom1212
292  br i1 %cmp1215, label %if.then1217, label %if.else1351
293
294if.then1217:                                      ; preds = %for.body1208
295  br label %for.cond1247
296
297for.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
302
303for.body1251:                                     ; preds = %for.cond1247
304  %idxprom1255 = zext i32 %m.1 to i64
305  %xpos1257 = getelementptr inbounds i32, ptr %ptr, i64 %idxprom1255
306  %c.2 = call i1 @cond()
307  br i1 %c.2, label %if.then1260, label %for.end1326
308
309if.then1260:                                      ; preds = %for.body1251
310  br label %for.cond1247
311
312for.end1326:                                      ; preds = %for.body1251
313  br label %if.end1824
314
315if.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
319
320if.then1360:                                      ; preds = %if.else1351
321  %cmp1392 = icmp slt i32 %m.0804, %0
322  unreachable
323
324for.inc1498:                                      ; preds = %if.else1351
325  %inc1499 = add nuw nsw i32 %m.0804, 1
326  %1 = load i32, ptr %ptr, align 8
327  br label %for.body1208
328
329if.then1504:                                      ; preds = %for.cond1204.preheader
330  unreachable
331
332if.end1824:                                       ; preds = %for.end1326
333  br label %while.body
334}
335
336define void @test5(ptr %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:    br label [[FOR_INNER:%.*]]
342; CHECK:       for.inner:
343; CHECK-NEXT:    [[I_0_I:%.*]] = phi i32 [ 0, [[FOR_BODY]] ], [ [[INC_I:%.*]], [[FOR_INNER]] ]
344; CHECK-NEXT:    [[INC_I]] = add nuw nsw i32 [[I_0_I]], 1
345; CHECK-NEXT:    [[CMP7_I:%.*]] = icmp slt i8 [[N:%.*]], 0
346; CHECK-NEXT:    br i1 [[CMP7_I]], label [[FOR_INNER]], label [[FOR_INNER_EXIT:%.*]]
347; CHECK:       for.inner.exit:
348; CHECK-NEXT:    [[INC_I_LCSSA:%.*]] = phi i32 [ [[INC_I]], [[FOR_INNER]] ]
349; CHECK-NEXT:    br label [[FOR_INNER_2:%.*]]
350; CHECK:       for.inner.2:
351; CHECK-NEXT:    [[I_0_I1:%.*]] = phi i32 [ 0, [[FOR_INNER_EXIT]] ], [ [[INC_I3:%.*]], [[FOR_INNER_2]] ]
352; CHECK-NEXT:    [[INC_I3]] = add nuw nsw i32 [[I_0_I1]], 1
353; CHECK-NEXT:    [[CMP7_I4:%.*]] = icmp slt i8 [[N]], 0
354; CHECK-NEXT:    br i1 [[CMP7_I4]], label [[FOR_INNER_2]], label [[FOR_INC:%.*]]
355; CHECK:       for.inc:
356; CHECK-NEXT:    [[INC_I3_LCSSA:%.*]] = phi i32 [ [[INC_I3]], [[FOR_INNER_2]] ]
357; CHECK-NEXT:    [[ADD85:%.*]] = add i32 [[INC_I_LCSSA]], [[INC_I3_LCSSA]]
358; CHECK-NEXT:    br i1 false, label [[FOR_BODY]], label [[WHILE_COND_PREHEADER:%.*]]
359; CHECK:       while.cond.preheader:
360; CHECK-NEXT:    [[ADD85_LCSSA:%.*]] = phi i32 [ [[ADD85]], [[FOR_INC]] ]
361; CHECK-NEXT:    [[SHL:%.*]] = shl nuw nsw i32 [[CONV:%.*]], 2
362; CHECK-NEXT:    br label [[WHILE_COND:%.*]]
363; CHECK:       while.cond:
364; CHECK-NEXT:    [[POS_8:%.*]] = phi i32 [ [[INC114:%.*]], [[WHILE_BODY:%.*]] ], [ [[ADD85_LCSSA]], [[WHILE_COND_PREHEADER]] ]
365; CHECK-NEXT:    [[CMP112:%.*]] = icmp ult i32 [[POS_8]], [[SHL]]
366; CHECK-NEXT:    br i1 [[CMP112]], label [[WHILE_BODY]], label [[CLEANUP122:%.*]]
367; CHECK:       while.body:
368; CHECK-NEXT:    [[INC114]] = add nuw i32 [[POS_8]], 1
369; CHECK-NEXT:    [[C_1:%.*]] = call i1 @cond()
370; CHECK-NEXT:    br i1 [[C_1]], label [[WHILE_COND]], label [[CLEANUP122]]
371; CHECK:       cleanup122:
372; CHECK-NEXT:    ret void
373;
374entry:
375  %shl = shl nuw nsw i32 %conv, 2
376  br label %for.body
377
378for.body:                                         ; preds = %entry, %for.inc
379  %pos.42 = phi i32 [ 0, %entry ], [ %add85, %for.inc ]
380  br label %for.inner
381
382for.inner:                                       ; preds = %for.body.i, %for.body
383  %i.0.i = phi i32 [ 0, %for.body ], [ %inc.i, %for.inner ]
384  %inc.i = add nuw nsw i32 %i.0.i, 1
385  %cmp7.i = icmp slt i8 %n, 0
386  br i1 %cmp7.i, label %for.inner, label %for.inner.exit
387
388for.inner.exit:                                   ; preds = %for.body.i
389  %add71 = add i32 %pos.42, %inc.i
390  br label %for.inner.2
391
392for.inner.2:                                      ; preds = %for.body.i6, %cleanup.cont74
393  %i.0.i1 = phi i32 [ 0, %for.inner.exit ], [ %inc.i3, %for.inner.2]
394  %inc.i3 = add nuw nsw i32 %i.0.i1, 1
395  %cmp7.i4 = icmp slt i8 %n, 0
396  br i1 %cmp7.i4, label %for.inner.2, label %for.inc
397
398for.inc:                                          ; preds = %for.body.i6
399  %add85 = add i32 %add71, %inc.i3
400  br i1 false, label %for.body, label %while.cond.preheader
401
402while.cond.preheader:                             ; preds = %for.inc
403  br label %while.cond
404
405while.cond:                                       ; preds = %while.cond.preheader, %while.body
406  %pos.8 = phi i32 [ %inc114, %while.body ], [ %add85, %while.cond.preheader ]
407  %cmp112 = icmp ult i32 %pos.8, %shl
408  br i1 %cmp112, label %while.body, label %cleanup122
409
410while.body:                                       ; preds = %while.cond
411  %inc114 = add nuw i32 %pos.8, 1
412  %c.1 = call i1 @cond()
413  br i1 %c.1, label %while.cond, label %cleanup122
414
415cleanup122:                                       ; preds = %while.body, %while.cond
416  ret void
417}
418
419define void @test6(i8 %x) {
420; CHECK-LABEL: @test6(
421; CHECK-NEXT:  entry:
422; CHECK-NEXT:    [[C_1:%.*]] = call i1 @cond()
423; CHECK-NEXT:    br i1 [[C_1]], label [[LAND_RHS:%.*]], label [[WHILE_END316:%.*]]
424; CHECK:       land.rhs:
425; CHECK-NEXT:    br label [[WHILE_BODY35:%.*]]
426; CHECK:       while.body35:
427; CHECK-NEXT:    br label [[WHILE_COND192:%.*]]
428; CHECK:       while.cond192:
429; CHECK-NEXT:    switch i8 [[X:%.*]], label [[WHILE_BODY205:%.*]] [
430; CHECK-NEXT:    i8 59, label [[WHILE_COND215_PREHEADER:%.*]]
431; CHECK-NEXT:    i8 10, label [[IF_END224:%.*]]
432; CHECK-NEXT:    ]
433; CHECK:       while.cond215.preheader:
434; CHECK-NEXT:    [[I_7_LCSSA:%.*]] = phi i32 [ 0, [[WHILE_COND192]] ]
435; CHECK-NEXT:    br label [[WHILE_COND215:%.*]]
436; CHECK:       while.body205:
437; CHECK-NEXT:    br label [[WHILE_COND192]]
438; CHECK:       while.cond215:
439; CHECK-NEXT:    [[I_8_IN:%.*]] = phi i32 [ [[I_8:%.*]], [[WHILE_COND215]] ], [ [[I_7_LCSSA]], [[WHILE_COND215_PREHEADER]] ]
440; CHECK-NEXT:    [[I_8]] = add nuw nsw i32 [[I_8_IN]], 1
441; CHECK-NEXT:    [[IDXPROM216:%.*]] = sext i32 [[I_8]] to i64
442; CHECK-NEXT:    [[ARRAYIDX217:%.*]] = getelementptr inbounds [512 x i8], ptr null, i64 0, i64 [[IDXPROM216]]
443; CHECK-NEXT:    br label [[WHILE_COND215]]
444; CHECK:       if.end224:
445; CHECK-NEXT:    [[C_2:%.*]] = call i1 @cond()
446; CHECK-NEXT:    br i1 [[C_2]], label [[WHILE_END225:%.*]], label [[WHILE_BODY35]]
447; CHECK:       while.end225:
448; CHECK-NEXT:    unreachable
449; CHECK:       while.end316:
450; CHECK-NEXT:    ret void
451;
452entry:
453  %c.1 = call i1 @cond()
454  br i1 %c.1, label %land.rhs, label %while.end316
455
456land.rhs:                                         ; preds = %entry
457  br label %while.body35
458
459while.body35:                                     ; preds = %if.end224, %land.rhs
460  br label %while.cond192
461
462while.cond192:                                    ; preds = %while.body205, %while.body35
463  %i.7 = phi i32 [ 0, %while.body35 ], [ %inc206, %while.body205 ]
464  switch i8 %x, label %while.body205 [
465  i8 59, label %while.cond215
466  i8 10, label %if.end224
467  ]
468
469while.body205:                                    ; preds = %while.cond192
470  %inc206 = add nsw i32 %i.7, 1
471  br label %while.cond192
472
473while.cond215:                                    ; preds = %while.cond215, %while.cond192
474  %i.8.in = phi i32 [ %i.8, %while.cond215 ], [ %i.7, %while.cond192 ]
475  %i.8 = add nsw i32 %i.8.in, 1
476  %idxprom216 = sext i32 %i.8 to i64
477  %arrayidx217 = getelementptr inbounds [512 x i8], ptr null, i64 0, i64 %idxprom216
478  br label %while.cond215
479
480if.end224:                                        ; preds = %while.cond192
481  %c.2 = call i1 @cond()
482  br i1 %c.2, label %while.end225, label %while.body35
483
484while.end225:                                     ; preds = %if.end224
485  unreachable
486
487while.end316:                                     ; preds = %entry
488  ret void
489}
490
491define void @test7(ptr %ptr) {
492; CHECK-LABEL: @test7(
493; CHECK-NEXT:  entry:
494; CHECK-NEXT:    br label [[WHILE_BODY:%.*]]
495; CHECK:       while.body:
496; CHECK-NEXT:    br label [[FOR_BODY1208:%.*]]
497; CHECK:       for.body1208:
498; CHECK-NEXT:    [[TMP0:%.*]] = phi i32 [ undef, [[WHILE_BODY]] ], [ [[TMP1:%.*]], [[FOR_INC1498:%.*]] ]
499; CHECK-NEXT:    [[M_048:%.*]] = phi i32 [ 1, [[WHILE_BODY]] ], [ [[INC1499:%.*]], [[FOR_INC1498]] ]
500; CHECK-NEXT:    [[IDXPROM1212:%.*]] = zext i32 [[M_048]] to i64
501; CHECK-NEXT:    [[XPOS1214:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 [[IDXPROM1212]]
502; CHECK-NEXT:    [[V_1:%.*]] = call i32 @get.i32()
503; CHECK-NEXT:    [[CMP1215:%.*]] = icmp eq i32 0, [[V_1]]
504; CHECK-NEXT:    br i1 [[CMP1215]], label [[IF_THEN1217:%.*]], label [[IF_ELSE1351:%.*]]
505; CHECK:       if.then1217:
506; CHECK-NEXT:    [[DOTLCSSA:%.*]] = phi i32 [ [[TMP0]], [[FOR_BODY1208]] ]
507; CHECK-NEXT:    [[M_048_LCSSA:%.*]] = phi i32 [ [[M_048]], [[FOR_BODY1208]] ]
508; CHECK-NEXT:    [[CMP1249_NOT_NOT:%.*]] = icmp slt i32 [[M_048_LCSSA]], [[DOTLCSSA]]
509; CHECK-NEXT:    unreachable
510; CHECK:       if.else1351:
511; CHECK-NEXT:    [[CMP1358:%.*]] = icmp eq i32 0, undef
512; CHECK-NEXT:    br i1 [[CMP1358]], label [[IF_THEN1360:%.*]], label [[FOR_INC1498]]
513; CHECK:       if.then1360:
514; CHECK-NEXT:    [[M_048_LCSSA1:%.*]] = phi i32 [ [[M_048]], [[IF_ELSE1351]] ]
515; CHECK-NEXT:    br label [[FOR_COND1390:%.*]]
516; CHECK:       for.cond1390:
517; CHECK-NEXT:    [[M_2_IN:%.*]] = phi i32 [ [[M_048_LCSSA1]], [[IF_THEN1360]] ], [ [[M_2:%.*]], [[IF_THEN1403:%.*]] ]
518; CHECK-NEXT:    [[M_2]] = add nuw nsw i32 [[M_2_IN]], 1
519; CHECK-NEXT:    [[IDXPROM1398:%.*]] = zext i32 [[M_2]] to i64
520; CHECK-NEXT:    br label [[IF_THEN1403]]
521; CHECK:       if.then1403:
522; CHECK-NEXT:    [[XPOS1409:%.*]] = getelementptr inbounds i32, ptr [[PTR]], i64 [[IDXPROM1398]]
523; CHECK-NEXT:    [[C_1:%.*]] = call i1 @cond()
524; CHECK-NEXT:    br i1 [[C_1]], label [[FOR_COND1390]], label [[FOR_END1469:%.*]]
525; CHECK:       for.end1469:
526; CHECK-NEXT:    br label [[IF_END1824:%.*]]
527; CHECK:       for.inc1498:
528; CHECK-NEXT:    [[INC1499]] = add nuw nsw i32 [[M_048]], 1
529; CHECK-NEXT:    [[TMP1]] = load i32, ptr undef, align 8
530; CHECK-NEXT:    br label [[FOR_BODY1208]]
531; CHECK:       if.end1824:
532; CHECK-NEXT:    br label [[WHILE_BODY]]
533;
534entry:
535  br label %while.body
536
537while.body:                                       ; preds = %if.end1824, %entry
538  br label %for.body1208
539
540for.body1208:                                     ; preds = %for.inc1498, %while.body
541  %0 = phi i32 [ undef, %while.body ], [ %1, %for.inc1498 ]
542  %m.048 = phi i32 [ 1, %while.body ], [ %inc1499, %for.inc1498 ]
543  %idxprom1212 = zext i32 %m.048 to i64
544  %xpos1214 = getelementptr inbounds i32, ptr %ptr, i64 %idxprom1212
545  %v.1 = call i32 @get.i32()
546  %cmp1215 = icmp eq i32 0, %v.1
547  br i1 %cmp1215, label %if.then1217, label %if.else1351
548
549if.then1217:                                      ; preds = %for.body1208
550  %cmp1249.not.not = icmp slt i32 %m.048, %0
551  unreachable
552
553if.else1351:                                      ; preds = %for.body1208
554  %cmp1358 = icmp eq i32 0, undef
555  br i1 %cmp1358, label %if.then1360, label %for.inc1498
556
557if.then1360:                                      ; preds = %if.else1351
558  br label %for.cond1390
559
560for.cond1390:                                     ; preds = %if.then1403, %if.then1360
561  %m.2.in = phi i32 [ %m.048, %if.then1360 ], [ %m.2, %if.then1403 ]
562  %m.2 = add nuw nsw i32 %m.2.in, 1
563  %cmp1392.not.not = icmp slt i32 %m.2.in, %0
564  %idxprom1398 = zext i32 %m.2 to i64
565  br label %if.then1403
566
567if.then1403:                                      ; preds = %for.cond1390
568  %xpos1409 = getelementptr inbounds i32, ptr %ptr, i64 %idxprom1398
569  %c.1 = call i1 @cond()
570  br i1 %c.1, label %for.cond1390, label %for.end1469
571
572for.end1469:                                      ; preds = %if.then1403
573  br label %if.end1824
574
575for.inc1498:                                      ; preds = %if.else1351
576  %inc1499 = add nuw nsw i32 %m.048, 1
577  %1 = load i32, ptr undef, align 8
578  br label %for.body1208
579
580if.end1824:                                       ; preds = %for.end1469
581  br label %while.body
582}
583