1 ; RUN: opt < %s -S -passes=loop-flatten -debug-only=loop-flatten 2>&1 | FileCheck %s
4 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
6 ; Every function in this file has a reason that it can't be transformed.
8 ; CHECK-NOT: Checks all passed, doing the transformation
10 ; Outer loop does not start at zero
11 define void @test_1(i32 %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) {
13 %cmp25 = icmp sgt i32 %N, 0
14 br i1 %cmp25, label %for.body4.lr.ph, label %for.cond.cleanup
17 %i.026 = phi i32 [ %inc10, %for.cond.cleanup3 ], [ 1, %entry ]
18 %mul = mul nsw i32 %i.026, %N
22 %j.024 = phi i32 [ 0, %for.body4.lr.ph ], [ %inc, %for.body4 ]
23 %add = add nsw i32 %j.024, %mul
24 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add
25 %0 = load i32, ptr %arrayidx, align 4
26 %mul5 = mul nsw i32 %0, %scale
27 %arrayidx8 = getelementptr inbounds i32, ptr %C, i32 %add
28 store i32 %mul5, ptr %arrayidx8, align 4
29 %inc = add nuw nsw i32 %j.024, 1
30 %exitcond = icmp eq i32 %inc, %N
31 br i1 %exitcond, label %for.cond.cleanup3, label %for.body4
34 %inc10 = add nuw nsw i32 %i.026, 1
35 %exitcond27 = icmp eq i32 %inc10, %N
36 br i1 %exitcond27, label %for.cond.cleanup, label %for.body4.lr.ph
42 ; Inner loop does not start at zero
43 define void @test_2(i32 %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) {
45 %cmp25 = icmp sgt i32 %N, 0
46 br i1 %cmp25, label %for.body4.lr.ph, label %for.cond.cleanup
49 %i.026 = phi i32 [ %inc10, %for.cond.cleanup3 ], [ 0, %entry ]
50 %mul = mul nsw i32 %i.026, %N
54 %j.024 = phi i32 [ 1, %for.body4.lr.ph ], [ %inc, %for.body4 ]
55 %add = add nsw i32 %j.024, %mul
56 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add
57 %0 = load i32, ptr %arrayidx, align 4
58 %mul5 = mul nsw i32 %0, %scale
59 %arrayidx8 = getelementptr inbounds i32, ptr %C, i32 %add
60 store i32 %mul5, ptr %arrayidx8, align 4
61 %inc = add nuw nsw i32 %j.024, 1
62 %exitcond = icmp eq i32 %inc, %N
63 br i1 %exitcond, label %for.cond.cleanup3, label %for.body4
66 %inc10 = add nuw nsw i32 %i.026, 1
67 %exitcond27 = icmp eq i32 %inc10, %N
68 br i1 %exitcond27, label %for.cond.cleanup, label %for.body4.lr.ph
74 ; Outer IV used directly
75 define hidden void @test_3(i16 zeroext %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) {
77 %conv = zext i16 %N to i32
78 %cmp25 = icmp eq i16 %N, 0
79 br i1 %cmp25, label %for.cond.cleanup, label %for.body.lr.ph.split.us
81 for.body.lr.ph.split.us: ; preds = %entry
84 for.body.us: ; preds = %for.cond2.for.cond.cleanup6_crit_edge.us, %for.body.lr.ph.split.us
85 %i.026.us = phi i32 [ 0, %for.body.lr.ph.split.us ], [ %inc12.us, %for.cond2.for.cond.cleanup6_crit_edge.us ]
86 %arrayidx.us = getelementptr inbounds i32, ptr %A, i32 %i.026.us
87 %mul9.us = mul nuw nsw i32 %i.026.us, %conv
88 br label %for.body7.us
90 for.body7.us: ; preds = %for.body.us, %for.body7.us
91 %j.024.us = phi i32 [ 0, %for.body.us ], [ %inc.us, %for.body7.us ]
92 %0 = load i32, ptr %arrayidx.us, align 4
93 %mul.us = mul nsw i32 %0, %scale
94 %add.us = add nuw nsw i32 %j.024.us, %mul9.us
95 %arrayidx10.us = getelementptr inbounds i32, ptr %C, i32 %add.us
96 store i32 %mul.us, ptr %arrayidx10.us, align 4
97 %inc.us = add nuw nsw i32 %j.024.us, 1
98 %exitcond = icmp ne i32 %inc.us, %conv
99 br i1 %exitcond, label %for.body7.us, label %for.cond2.for.cond.cleanup6_crit_edge.us
101 for.cond2.for.cond.cleanup6_crit_edge.us: ; preds = %for.body7.us
102 %inc12.us = add nuw nsw i32 %i.026.us, 1
103 %exitcond27 = icmp ne i32 %inc12.us, %conv
104 br i1 %exitcond27, label %for.body.us, label %for.cond.cleanup.loopexit
106 for.cond.cleanup.loopexit: ; preds = %for.cond2.for.cond.cleanup6_crit_edge.us
107 br label %for.cond.cleanup
109 for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry
113 ; Inner IV used directly
114 define hidden void @test_4(i16 zeroext %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) {
116 %conv = zext i16 %N to i32
117 %cmp25 = icmp eq i16 %N, 0
118 br i1 %cmp25, label %for.cond.cleanup, label %for.body.lr.ph.split.us
120 for.body.lr.ph.split.us: ; preds = %entry
121 br label %for.body.us
123 for.body.us: ; preds = %for.cond2.for.cond.cleanup6_crit_edge.us, %for.body.lr.ph.split.us
124 %i.026.us = phi i32 [ 0, %for.body.lr.ph.split.us ], [ %inc12.us, %for.cond2.for.cond.cleanup6_crit_edge.us ]
125 %mul9.us = mul nuw nsw i32 %i.026.us, %conv
126 br label %for.body7.us
128 for.body7.us: ; preds = %for.body.us, %for.body7.us
129 %j.024.us = phi i32 [ 0, %for.body.us ], [ %inc.us, %for.body7.us ]
130 %arrayidx.us = getelementptr inbounds i32, ptr %A, i32 %j.024.us
131 %0 = load i32, ptr %arrayidx.us, align 4
132 %mul.us = mul nsw i32 %0, %scale
133 %add.us = add nuw nsw i32 %j.024.us, %mul9.us
134 %arrayidx10.us = getelementptr inbounds i32, ptr %C, i32 %add.us
135 store i32 %mul.us, ptr %arrayidx10.us, align 4
136 %inc.us = add nuw nsw i32 %j.024.us, 1
137 %exitcond = icmp ne i32 %inc.us, %conv
138 br i1 %exitcond, label %for.body7.us, label %for.cond2.for.cond.cleanup6_crit_edge.us
140 for.cond2.for.cond.cleanup6_crit_edge.us: ; preds = %for.body7.us
141 %inc12.us = add nuw nsw i32 %i.026.us, 1
142 %exitcond27 = icmp ne i32 %inc12.us, %conv
143 br i1 %exitcond27, label %for.body.us, label %for.cond.cleanup.loopexit
145 for.cond.cleanup.loopexit: ; preds = %for.cond2.for.cond.cleanup6_crit_edge.us
146 br label %for.cond.cleanup
148 for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry
152 ; Inner iteration count not invariant in outer loop
153 declare i32 @get_int() readonly
154 define void @test_5(i16 zeroext %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) {
156 %conv = zext i16 %N to i32
157 %cmp27 = icmp eq i16 %N, 0
158 br i1 %cmp27, label %for.cond.cleanup, label %for.body.lr.ph
160 for.body.lr.ph: ; preds = %entry
163 for.cond.cleanup.loopexit: ; preds = %for.cond.cleanup5
164 br label %for.cond.cleanup
166 for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry
169 for.body: ; preds = %for.body.lr.ph, %for.cond.cleanup5
170 %i.028 = phi i32 [ 0, %for.body.lr.ph ], [ %inc12, %for.cond.cleanup5 ]
171 %call = tail call i32 @get_int()
172 %cmp325 = icmp sgt i32 %call, 0
173 br i1 %cmp325, label %for.body6.lr.ph, label %for.cond.cleanup5
175 for.body6.lr.ph: ; preds = %for.body
176 %mul = mul nsw i32 %call, %i.028
179 for.cond.cleanup5.loopexit: ; preds = %for.body6
180 br label %for.cond.cleanup5
182 for.cond.cleanup5: ; preds = %for.cond.cleanup5.loopexit, %for.body
183 %inc12 = add nuw nsw i32 %i.028, 1
184 %exitcond29 = icmp ne i32 %inc12, %conv
185 br i1 %exitcond29, label %for.body, label %for.cond.cleanup.loopexit
187 for.body6: ; preds = %for.body6.lr.ph, %for.body6
188 %j.026 = phi i32 [ 0, %for.body6.lr.ph ], [ %inc, %for.body6 ]
189 %add = add nsw i32 %j.026, %mul
190 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add
191 %0 = load i32, ptr %arrayidx, align 4
192 %mul7 = mul nsw i32 %0, %scale
193 %arrayidx10 = getelementptr inbounds i32, ptr %C, i32 %add
194 store i32 %mul7, ptr %arrayidx10, align 4
195 %inc = add nuw nsw i32 %j.026, 1
196 %exitcond = icmp ne i32 %inc, %call
197 br i1 %exitcond, label %for.body6, label %for.cond.cleanup5.loopexit
200 ; Inner loop has an early exit
201 define hidden void @test_6(i16 zeroext %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) {
203 %conv = zext i16 %N to i32
204 %cmp39 = icmp eq i16 %N, 0
205 br i1 %cmp39, label %for.cond.cleanup, label %for.body.us.preheader
207 for.body.us.preheader: ; preds = %entry
208 br label %for.body.us
210 for.body.us: ; preds = %for.body.us.preheader, %cleanup.us
211 %i.040.us = phi i32 [ %inc19.us, %cleanup.us ], [ 0, %for.body.us.preheader ]
212 %mul.us = mul nuw nsw i32 %i.040.us, %conv
213 br label %for.body7.us
215 for.body7.us: ; preds = %for.body.us, %if.end.us
216 %j.038.us = phi i32 [ 0, %for.body.us ], [ %inc.us, %if.end.us ]
217 %add.us = add nuw nsw i32 %j.038.us, %mul.us
218 %arrayidx.us = getelementptr inbounds i32, ptr %A, i32 %add.us
219 %0 = load i32, ptr %arrayidx.us, align 4
220 %tobool.us = icmp eq i32 %0, 0
221 br i1 %tobool.us, label %if.end.us, label %cleanup.us
223 cleanup.us: ; preds = %if.end.us, %for.body7.us
224 %inc19.us = add nuw nsw i32 %i.040.us, 1
225 %exitcond = icmp eq i32 %inc19.us, %conv
226 br i1 %exitcond, label %for.cond.cleanup, label %for.body.us
228 if.end.us: ; preds = %for.body7.us
229 %arrayidx17.us = getelementptr inbounds i32, ptr %C, i32 %add.us
230 store i32 0, ptr %arrayidx17.us, align 4
231 %inc.us = add nuw nsw i32 %j.038.us, 1
232 %cmp4.us = icmp ult i32 %inc.us, %conv
233 br i1 %cmp4.us, label %for.body7.us, label %cleanup.us
235 for.cond.cleanup: ; preds = %cleanup.us, %entry
239 define hidden void @test_7(i16 zeroext %N, ptr nocapture %C, ptr nocapture readonly %A, i32 %scale) {
241 %conv = zext i16 %N to i32
242 %cmp30 = icmp eq i16 %N, 0
243 br i1 %cmp30, label %cleanup, label %for.body.us.preheader
245 for.body.us.preheader: ; preds = %entry
246 br label %for.body.us
248 for.body.us: ; preds = %for.body.us.preheader, %for.cond2.for.cond.cleanup6_crit_edge.us
249 %i.031.us = phi i32 [ %inc15.us, %for.cond2.for.cond.cleanup6_crit_edge.us ], [ 0, %for.body.us.preheader ]
250 %call.us = tail call i32 @get_int() #2
251 %tobool.us = icmp eq i32 %call.us, 0
252 br i1 %tobool.us, label %for.body7.lr.ph.us, label %cleanup
254 for.body7.us: ; preds = %for.body7.us, %for.body7.lr.ph.us
255 %j.029.us = phi i32 [ 0, %for.body7.lr.ph.us ], [ %inc.us, %for.body7.us ]
256 %add.us = add nuw nsw i32 %j.029.us, %mul.us
257 %arrayidx.us = getelementptr inbounds i32, ptr %A, i32 %add.us
258 %0 = load i32, ptr %arrayidx.us, align 4
259 %mul9.us = mul nsw i32 %0, %scale
260 %arrayidx13.us = getelementptr inbounds i32, ptr %C, i32 %add.us
261 store i32 %mul9.us, ptr %arrayidx13.us, align 4
262 %inc.us = add nuw nsw i32 %j.029.us, 1
263 %exitcond = icmp eq i32 %inc.us, %conv
264 br i1 %exitcond, label %for.cond2.for.cond.cleanup6_crit_edge.us, label %for.body7.us
266 for.body7.lr.ph.us: ; preds = %for.body.us
267 %mul.us = mul nuw nsw i32 %i.031.us, %conv
268 br label %for.body7.us
270 for.cond2.for.cond.cleanup6_crit_edge.us: ; preds = %for.body7.us
271 %inc15.us = add nuw nsw i32 %i.031.us, 1
272 %cmp.us = icmp ult i32 %inc15.us, %conv
273 br i1 %cmp.us, label %for.body.us, label %cleanup
275 cleanup: ; preds = %for.cond2.for.cond.cleanup6_crit_edge.us, %for.body.us, %entry
280 define i32 @test_8(i32 %val, ptr nocapture %A) {
284 for.body: ; preds = %entry, %for.inc6
285 %i.018 = phi i32 [ 0, %entry ], [ %inc7, %for.inc6 ]
286 %mul = mul nuw nsw i32 %i.018, 20
289 for.body3: ; preds = %for.body, %for.body3
290 %j.017 = phi i32 [ 0, %for.body ], [ %inc, %for.body3 ]
291 %add = add nuw nsw i32 %j.017, %mul
292 %arrayidx = getelementptr inbounds i16, ptr %A, i32 %add
293 %0 = load i16, ptr %arrayidx, align 2
294 %conv16 = zext i16 %0 to i32
295 %add4 = add i32 %conv16, %val
296 %conv5 = trunc i32 %add4 to i16
297 store i16 %conv5, ptr %arrayidx, align 2
298 %inc = add nuw nsw i32 %j.017, 1
299 %exitcond = icmp ne i32 %inc, 20
300 br i1 %exitcond, label %for.body3, label %for.inc6
302 for.inc6: ; preds = %for.body3
303 %inc7 = add nuw nsw i32 %i.018, 2
304 %exitcond19 = icmp ne i32 %inc7, 10
305 br i1 %exitcond19, label %for.body, label %for.end8
307 for.end8: ; preds = %for.inc6
313 define i32 @test_9(i32 %val, ptr nocapture %A) {
317 for.body: ; preds = %entry, %for.inc6
318 %i.018 = phi i32 [ 0, %entry ], [ %inc7, %for.inc6 ]
319 %mul = mul nuw nsw i32 %i.018, 20
322 for.body3: ; preds = %for.body, %for.body3
323 %j.017 = phi i32 [ 0, %for.body ], [ %inc, %for.body3 ]
324 %add = add nuw nsw i32 %j.017, %mul
325 %arrayidx = getelementptr inbounds i16, ptr %A, i32 %add
326 %0 = load i16, ptr %arrayidx, align 2
327 %conv16 = zext i16 %0 to i32
328 %add4 = add i32 %conv16, %val
329 %conv5 = trunc i32 %add4 to i16
330 store i16 %conv5, ptr %arrayidx, align 2
331 %inc = add nuw nsw i32 %j.017, 2
332 %exitcond = icmp ne i32 %inc, 20
333 br i1 %exitcond, label %for.body3, label %for.inc6
335 for.inc6: ; preds = %for.body3
336 %inc7 = add nuw nsw i32 %i.018, 1
337 %exitcond19 = icmp ne i32 %inc7, 10
338 br i1 %exitcond19, label %for.body, label %for.end8
340 for.end8: ; preds = %for.inc6
344 ; test_10, test_11 and test_12 are for the case when the
345 ; inner trip count is a constant, then the InstCombine pass
346 ; makes the transformation icmp ult i32 %inc, tripcount ->
347 ; icmp ult i32 %j, tripcount-step.
349 ; test_10: The step is not 1.
350 define i32 @test_10(ptr nocapture %A) {
352 br label %for.cond1.preheader
355 %i.017 = phi i32 [ 0, %entry ], [ %inc, %for.cond.cleanup3 ]
356 %mul = mul i32 %i.017, 20
360 %j.016 = phi i32 [ 0, %for.cond1.preheader ], [ %add5, %for.body4 ]
361 %add = add i32 %j.016, %mul
362 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add
363 store i32 30, ptr %arrayidx, align 4
364 %add5 = add nuw nsw i32 %j.016, 2
365 %cmp2 = icmp ult i32 %j.016, 18
366 br i1 %cmp2, label %for.body4, label %for.cond.cleanup3
369 %inc = add i32 %i.017, 1
370 %cmp = icmp ult i32 %inc, 11
371 br i1 %cmp, label %for.cond1.preheader, label %for.cond.cleanup
374 %0 = load i32, ptr %A, align 4
378 ; test_11: The inner inducation variable is used in a compare which
379 ; isn't the condition of the inner branch.
380 define i32 @test_11(ptr nocapture %A) {
382 br label %for.cond1.preheader
385 %i.020 = phi i32 [ 0, %entry ], [ %inc7, %for.cond.cleanup3 ]
386 %mul = mul i32 %i.020, 20
390 %j.019 = phi i32 [ 0, %for.cond1.preheader ], [ %inc, %for.body4 ]
391 %cmp5 = icmp ult i32 %j.019, 5
392 %cond = select i1 %cmp5, i32 30, i32 15
393 %add = add i32 %j.019, %mul
394 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add
395 store i32 %cond, ptr %arrayidx, align 4
396 %inc = add nuw nsw i32 %j.019, 1
397 %cmp2 = icmp ult i32 %j.019, 19
398 br i1 %cmp2, label %for.body4, label %for.cond.cleanup3
401 %inc7 = add i32 %i.020, 1
402 %cmp = icmp ult i32 %inc7, 11
403 br i1 %cmp, label %for.cond1.preheader, label %for.cond.cleanup
406 %0 = load i32, ptr %A, align 4
410 ; test_12: Incoming phi node value for preheader is a variable
411 define i32 @test_12(ptr %A) {
413 br label %while.cond1.preheader
415 while.cond1.preheader:
416 %j.017 = phi i32 [ 0, %entry ], [ %j.1, %while.end ]
417 %i.016 = phi i32 [ 0, %entry ], [ %inc4, %while.end ]
418 %mul = mul i32 %i.016, 20
419 %cmp214 = icmp ult i32 %j.017, 20
420 br i1 %cmp214, label %while.body3.preheader, label %while.end
422 while.body3.preheader:
423 br label %while.body3
426 %j.115 = phi i32 [ %inc, %while.body3 ], [ %j.017, %while.body3.preheader ]
427 %add = add i32 %j.115, %mul
428 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add
429 store i32 30, ptr %arrayidx, align 4
430 %inc = add nuw nsw i32 %j.115, 1
431 %cmp2 = icmp ult i32 %j.115, 19
432 br i1 %cmp2, label %while.body3, label %while.end.loopexit
435 %inc.lcssa = phi i32 [ %inc, %while.body3 ]
439 %j.1 = phi i32 [ %j.017, %while.cond1.preheader], [ %inc.lcssa, %while.end.loopexit ]
440 %inc4 = add i32 %i.016, 1
441 %cmp = icmp ult i32 %inc4, 11
442 br i1 %cmp, label %while.cond1.preheader, label %while.end5
445 %0 = load i32, ptr %A, align 4
449 ; Outer loop conditional phi
454 for.body: ; preds = %entry, %for.end16
455 %f.033 = phi i32 [ 0, %entry ], [ %inc18, %for.end16 ]
456 %g.032 = phi i32 [ undef, %entry ], [ %g.3.lcssa, %for.end16 ]
457 %.pr = add i32 10, 10
458 %tobool29 = icmp eq i32 %.pr, 0
459 br i1 %tobool29, label %for.end, label %for.body2.lr.ph
461 for.body2.lr.ph: ; preds = %for.body
462 br label %for.cond1.for.end_crit_edge
464 for.cond1.for.end_crit_edge: ; preds = %for.body2.lr.ph
467 for.end: ; preds = %for.cond1.for.end_crit_edge, %for.body
468 %g.1.lcssa = phi i32 [ 0, %for.cond1.for.end_crit_edge ], [ %g.032, %for.body ]
471 for.body5: ; preds = %for.end, %lor.end
472 %i.031 = phi i32 [ 0, %for.end ], [ %inc15, %lor.end ]
473 %g.230 = phi i32 [ %g.1.lcssa, %for.end ], [ %g.3, %lor.end ]
476 %tobool9 = icmp eq i32 %1, 0
477 br i1 %tobool9, label %lor.rhs, label %lor.end
479 lor.rhs: ; preds = %for.body5
481 %call11 = add i32 10, 10
482 %tobool12 = icmp ne i32 %call11, 0
485 lor.end: ; preds = %for.body5, %lor.rhs
486 %g.3 = phi i32 [ %g.230, %for.body5 ], [ %call11, %lor.rhs ]
487 %3 = phi i1 [ true, %for.body5 ], [ %tobool12, %lor.rhs ]
488 %lor.ext = zext i1 %3 to i32
489 %inc15 = add nuw nsw i32 %i.031, 1
490 %exitcond = icmp ne i32 %inc15, 9
491 br i1 %exitcond, label %for.body5, label %for.end16
493 for.end16: ; preds = %lor.end
494 %g.3.lcssa = phi i32 [ %g.3, %lor.end ]
495 %inc18 = add nuw nsw i32 %f.033, 1
496 %exitcond34 = icmp ne i32 %inc18, 7
497 br i1 %exitcond34, label %for.body, label %for.end19
499 for.end19: ; preds = %for.end16
503 ; A 3d loop corresponding to:
505 ; for (int i = 0; i < N; ++i)
506 ; for (int j = 0; j < N; ++j)
507 ; for (int k = 0; k < N; ++k)
508 ; f(&A[i + N * (j + N * k)]);
510 define void @d3_1(ptr %A, i32 %N) {
512 %cmp35 = icmp sgt i32 %N, 0
513 br i1 %cmp35, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
515 for.cond1.preheader.lr.ph:
516 br label %for.cond1.preheader.us
518 for.cond1.preheader.us:
519 %i.036.us = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc15.us, %for.cond1.for.cond.cleanup3_crit_edge.us ]
520 br i1 true, label %for.cond5.preheader.us.us.preheader, label %for.cond5.preheader.us52.preheader
522 for.cond5.preheader.us52.preheader:
523 br label %for.cond5.preheader.us52
525 for.cond5.preheader.us.us.preheader:
526 br label %for.cond5.preheader.us.us
528 for.cond5.preheader.us52:
529 br i1 false, label %for.cond5.preheader.us52, label %for.cond1.for.cond.cleanup3_crit_edge.us.loopexit58
531 for.cond1.for.cond.cleanup3_crit_edge.us.loopexit:
532 br label %for.cond1.for.cond.cleanup3_crit_edge.us
534 for.cond1.for.cond.cleanup3_crit_edge.us.loopexit58:
535 br label %for.cond1.for.cond.cleanup3_crit_edge.us
537 for.cond1.for.cond.cleanup3_crit_edge.us:
538 %inc15.us = add nuw nsw i32 %i.036.us, 1
539 %cmp.us = icmp slt i32 %inc15.us, %N
540 br i1 %cmp.us, label %for.cond1.preheader.us, label %for.cond.cleanup.loopexit
542 for.cond5.preheader.us.us:
543 %j.033.us.us = phi i32 [ %inc12.us.us, %for.cond5.for.cond.cleanup7_crit_edge.us.us ], [ 0, %for.cond5.preheader.us.us.preheader ]
544 br label %for.body8.us.us
546 for.cond5.for.cond.cleanup7_crit_edge.us.us:
547 %inc12.us.us = add nuw nsw i32 %j.033.us.us, 1
548 %cmp2.us.us = icmp slt i32 %inc12.us.us, %N
549 br i1 %cmp2.us.us, label %for.cond5.preheader.us.us, label %for.cond1.for.cond.cleanup3_crit_edge.us.loopexit
552 %k.031.us.us = phi i32 [ 0, %for.cond5.preheader.us.us ], [ %inc.us.us, %for.body8.us.us ]
553 %mul.us.us = mul nsw i32 %k.031.us.us, %N
554 %add.us.us = add nsw i32 %mul.us.us, %j.033.us.us
555 %mul9.us.us = mul nsw i32 %add.us.us, %N
556 %add10.us.us = add nsw i32 %mul9.us.us, %i.036.us
557 %idxprom.us.us = sext i32 %add10.us.us to i64
558 %arrayidx.us.us = getelementptr inbounds i32, ptr %A, i64 %idxprom.us.us
559 tail call void @f(ptr %arrayidx.us.us) #2
560 %inc.us.us = add nuw nsw i32 %k.031.us.us, 1
561 %cmp6.us.us = icmp slt i32 %inc.us.us, %N
562 br i1 %cmp6.us.us, label %for.body8.us.us, label %for.cond5.for.cond.cleanup7_crit_edge.us.us
564 for.cond.cleanup.loopexit:
565 br label %for.cond.cleanup
571 ; A 3d loop corresponding to:
573 ; for (int i = 0; i < N; ++i)
574 ; for (int j = 0; j < M; ++j) {
576 ; for (int k = 0; k < N; ++k)
580 define void @d3_3(ptr nocapture %A, i32 %N, i32 %M) {
582 %cmp29 = icmp sgt i32 %N, 0
583 br i1 %cmp29, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
585 for.cond1.preheader.lr.ph:
586 %cmp227 = icmp sgt i32 %M, 0
587 br i1 %cmp227, label %for.cond1.preheader.us.preheader, label %for.cond1.preheader.preheader
589 for.cond1.preheader.preheader:
590 br label %for.cond.cleanup.loopexit49
592 for.cond1.preheader.us.preheader:
593 br label %for.cond1.preheader.us
595 for.cond1.preheader.us:
596 %i.030.us = phi i32 [ %inc13.us, %for.cond1.for.cond.cleanup3_crit_edge.us ], [ 0, %for.cond1.preheader.us.preheader ]
597 %mul.us = mul nsw i32 %i.030.us, %M
598 br i1 true, label %for.body4.us.us.preheader, label %for.body4.us32.preheader
600 for.body4.us32.preheader:
601 br label %for.cond1.for.cond.cleanup3_crit_edge.us.loopexit48
603 for.body4.us.us.preheader:
604 br label %for.body4.us.us
606 for.cond1.for.cond.cleanup3_crit_edge.us.loopexit:
607 br label %for.cond1.for.cond.cleanup3_crit_edge.us
609 for.cond1.for.cond.cleanup3_crit_edge.us.loopexit48:
610 br label %for.cond1.for.cond.cleanup3_crit_edge.us
612 for.cond1.for.cond.cleanup3_crit_edge.us:
613 %inc13.us = add nuw nsw i32 %i.030.us, 1
614 %exitcond51 = icmp ne i32 %inc13.us, %N
615 br i1 %exitcond51, label %for.cond1.preheader.us, label %for.cond.cleanup.loopexit
618 %j.028.us.us = phi i32 [ %inc10.us.us, %for.cond5.for.cond.cleanup7_crit_edge.us.us ], [ 0, %for.body4.us.us.preheader ]
619 %add.us.us = add nsw i32 %j.028.us.us, %mul.us
620 %idxprom.us.us = sext i32 %add.us.us to i64
621 %arrayidx.us.us = getelementptr inbounds i32, ptr %A, i64 %idxprom.us.us
622 store i32 0, ptr %arrayidx.us.us, align 4
623 br label %for.body8.us.us
625 for.cond5.for.cond.cleanup7_crit_edge.us.us:
626 %inc10.us.us = add nuw nsw i32 %j.028.us.us, 1
627 %exitcond50 = icmp ne i32 %inc10.us.us, %M
628 br i1 %exitcond50, label %for.body4.us.us, label %for.cond1.for.cond.cleanup3_crit_edge.us.loopexit
631 %k.026.us.us = phi i32 [ 0, %for.body4.us.us ], [ %inc.us.us, %for.body8.us.us ]
632 tail call void @g() #2
633 %inc.us.us = add nuw nsw i32 %k.026.us.us, 1
634 %exitcond = icmp ne i32 %inc.us.us, %N
635 br i1 %exitcond, label %for.body8.us.us, label %for.cond5.for.cond.cleanup7_crit_edge.us.us
637 for.cond.cleanup.loopexit:
638 br label %for.cond.cleanup
640 for.cond.cleanup.loopexit49:
641 br label %for.cond.cleanup
647 ; Backedge-taken count is not predictable.
648 %struct.Limits = type { i16, i16 }
649 define void @backedge_count(ptr %lim) {
651 %M = getelementptr inbounds %struct.Limits, ptr %lim, i32 0, i32 1
652 %0 = load i16, ptr %lim, align 2
653 %cmp20 = icmp sgt i16 %0, 0
654 br i1 %cmp20, label %for.cond2.preheader.preheader, label %for.cond.cleanup
656 for.cond2.preheader.preheader:
657 %.pre = load i16, ptr %M, align 2
658 br label %for.cond2.preheader
661 %1 = phi i16 [ %3, %for.cond.cleanup6 ], [ %0, %for.cond2.preheader.preheader ]
662 %2 = phi i16 [ %4, %for.cond.cleanup6 ], [ %.pre, %for.cond2.preheader.preheader ]
663 %i.021 = phi i32 [ %inc9, %for.cond.cleanup6 ], [ 0, %for.cond2.preheader.preheader ]
664 %cmp417 = icmp sgt i16 %2, 0
665 br i1 %cmp417, label %for.body7, label %for.cond.cleanup6
670 for.cond.cleanup6.loopexit:
671 %.pre22 = load i16, ptr %lim, align 2
672 br label %for.cond.cleanup6
675 %3 = phi i16 [ %.pre22, %for.cond.cleanup6.loopexit ], [ %1, %for.cond2.preheader ]
676 %4 = phi i16 [ %5, %for.cond.cleanup6.loopexit ], [ %2, %for.cond2.preheader ]
677 %inc9 = add nuw nsw i32 %i.021, 1
678 %conv = sext i16 %3 to i32
679 %cmp = icmp slt i32 %inc9, %conv
680 br i1 %cmp, label %for.cond2.preheader, label %for.cond.cleanup
683 %j.018 = phi i32 [ %inc, %for.body7 ], [ 0, %for.cond2.preheader ]
685 %inc = add nuw nsw i32 %j.018, 1
686 %5 = load i16, ptr %M, align 2
687 %conv3 = sext i16 %5 to i32
688 %cmp4 = icmp slt i32 %inc, %conv3
689 br i1 %cmp4, label %for.body7, label %for.cond.cleanup6.loopexit
693 define void @invalid_tripCount(ptr %a, i32 %b, i32 %c, i32 %initial-mutations, i32 %statemutations) {
695 %iszero = icmp eq i32 %b, 0
696 br i1 %iszero, label %for.empty, label %for.loopinit
698 br label %for.loopbody.outer
700 %for.count.ph = phi i32 [ %c, %for.refetch ], [ %b, %for.loopinit ]
701 br label %for.loopbody
703 %for.index = phi i32 [ %1, %for.notmutated ], [ 0, %for.loopbody.outer ]
704 %0 = icmp eq i32 %statemutations, %initial-mutations
705 br i1 %0, label %for.notmutated, label %for.mutated
707 call void @objc_enumerationMutation(ptr %a)
708 br label %for.notmutated
710 %1 = add nuw i32 %for.index, 1
711 %2 = icmp ult i32 %1, %for.count.ph
712 br i1 %2, label %for.loopbody, label %for.refetch
714 %3 = icmp eq i32 %c, 0
715 br i1 %3, label %for.empty.loopexit, label %for.loopbody.outer
722 declare void @objc_enumerationMutation(ptr)
723 declare dso_local void @f(ptr)
724 declare dso_local void @g(...)