llvm.org GIT mirror llvm / f3a2f4a
[LoopUnrollRuntime] Support multiple exit blocks unrolling when prolog remainder generated With the NFC refactoring in rL307417 (git SHA 987dd01), all the logic is in place to support multiple exit/exiting blocks when prolog remainder is generated. This patch removed the assert that multiple exit blocks unrolling is only supported when epilog remainder is generated. Also, added test runs and checks with PROLOG prefix in runtime-loop-multiple-exits.ll test cases. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307435 91177308-0d34-0410-b5e6-96231b3b80d8 Anna Thomas 2 years ago
2 changed file(s) with 166 addition(s) and 82 deletion(s). Raw diff Collapse all Expand all
496496 // Support runtime unrolling for multiple exit blocks and multiple exiting
497497 // blocks.
498498 if (!LatchExit) {
499 assert(UseEpilogRemainder && "Multi exit unrolling is currently supported "
500 "unrolling with epilog remainder only!");
501499 LatchExit = LatchBR->getSuccessor(ExitIndex);
502500 // We rely on LCSSA form being preserved when the exit blocks are
503501 // transformed.
None ; RUN: opt < %s -loop-unroll -unroll-runtime=true -unroll-runtime-epilog=true -unroll-runtime-multi-exit=true -verify-dom-info -verify-loop-info -instcombine -S| FileCheck %s
0 ; RUN: opt < %s -loop-unroll -unroll-runtime=true -unroll-runtime-epilog=true -unroll-runtime-multi-exit=true -verify-dom-info -verify-loop-info -instcombine -S | FileCheck %s -check-prefix=EPILOG
11 ; RUN: opt < %s -loop-unroll -unroll-runtime -unroll-count=2 -unroll-runtime-epilog=true -unroll-runtime-multi-exit=true -verify-dom-info -verify-loop-info -instcombine
2
3 ; the second RUN generates an epilog remainder block for all the test
2 ; RUN: opt < %s -loop-unroll -unroll-runtime=true -unroll-runtime-epilog=false -unroll-runtime-multi-exit=true -verify-dom-info -verify-loop-info -instcombine -S | FileCheck %s -check-prefix=PROLOG
3 ; RUN: opt < %s -loop-unroll -unroll-runtime -unroll-runtime-epilog=false -unroll-count=2 -unroll-runtime-multi-exit=true -verify-dom-info -verify-loop-info -instcombine
4
5 ; the second and fourth RUNs generate an epilog/prolog remainder block for all the test
46 ; cases below (it does not generate a loop).
57
68 ; test with three exiting and three exit blocks.
79 ; none of the exit blocks have successors
810 define void @test1(i64 %trip, i1 %cond) {
9 ; CHECK-LABEL: test1
10 ; CHECK-NEXT: entry:
11 ; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1
12 ; CHECK-NEXT: [[XTRAITER:%.*]] = and i64 [[TRIP]], 7
13 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i64 [[TMP0]], 7
14 ; CHECK-NEXT: br i1 [[TMP1]], label %exit2.loopexit.unr-lcssa, label [[ENTRY_NEW:%.*]]
15 ; CHECK: entry.new:
16 ; CHECK-NEXT: [[UNROLL_ITER:%.*]] = sub i64 [[TRIP]], [[XTRAITER]]
17 ; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
18 ; CHECK-LABEL: loop_latch.epil:
19 ; CHECK-NEXT: %epil.iter.sub = add i64 %epil.iter, -1
20 ; CHECK-NEXT: %epil.iter.cmp = icmp eq i64 %epil.iter.sub, 0
21 ; CHECK-NEXT: br i1 %epil.iter.cmp, label %exit2.loopexit.epilog-lcssa, label %loop_header.epil
22 ; CHECK-LABEL: loop_latch.7:
23 ; CHECK-NEXT: %niter.nsub.7 = add i64 %niter, -8
24 ; CHECK-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
25 ; CHECK-NEXT: br i1 %niter.ncmp.7, label %exit2.loopexit.unr-lcssa.loopexit, label %loop_header
11 ; EPILOG: test1(
12 ; EPILOG-NEXT: entry:
13 ; EPILOG-NEXT: [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1
14 ; EPILOG-NEXT: [[XTRAITER:%.*]] = and i64 [[TRIP]], 7
15 ; EPILOG-NEXT: [[TMP1:%.*]] = icmp ult i64 [[TMP0]], 7
16 ; EPILOG-NEXT: br i1 [[TMP1]], label %exit2.loopexit.unr-lcssa, label [[ENTRY_NEW:%.*]]
17 ; EPILOG: entry.new:
18 ; EPILOG-NEXT: [[UNROLL_ITER:%.*]] = sub i64 [[TRIP]], [[XTRAITER]]
19 ; EPILOG-NEXT: br label [[LOOP_HEADER:%.*]]
20 ; EPILOG: loop_latch.epil:
21 ; EPILOG-NEXT: %epil.iter.sub = add i64 %epil.iter, -1
22 ; EPILOG-NEXT: %epil.iter.cmp = icmp eq i64 %epil.iter.sub, 0
23 ; EPILOG-NEXT: br i1 %epil.iter.cmp, label %exit2.loopexit.epilog-lcssa, label %loop_header.epil
24 ; EPILOG: loop_latch.7:
25 ; EPILOG-NEXT: %niter.nsub.7 = add i64 %niter, -8
26 ; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
27 ; EPILOG-NEXT: br i1 %niter.ncmp.7, label %exit2.loopexit.unr-lcssa.loopexit, label %loop_header
28
29 ; PROLOG: test1(
30 ; PROLOG-NEXT: entry:
31 ; PROLOG-NEXT: [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1
32 ; PROLOG-NEXT: [[XTRAITER:%.*]] = and i64 [[TRIP]], 7
33 ; PROLOG-NEXT: [[TMP1:%.*]] = icmp eq i64 [[XTRAITER]], 0
34 ; PROLOG-NEXT: br i1 [[TMP1]], label %loop_header.prol.loopexit, label %loop_header.prol.preheader
35 ; PROLOG: loop_header.prol:
36 ; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
37 ; PROLOG-NEXT: %prol.iter = phi i64 [ [[XTRAITER]], %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ]
38 ; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol
39 ; PROLOG: loop_latch.prol:
40 ; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1
41 ; PROLOG-NEXT: %prol.iter.sub = add i64 %prol.iter, -1
42 ; PROLOG-NEXT: %prol.iter.cmp = icmp eq i64 %prol.iter.sub, 0
43 ; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol.loopexit.unr-lcssa, label %loop_header.prol
44 ; PROLOG: loop_latch.7:
45 ; PROLOG-NEXT: %iv_next.7 = add i64 %iv, 8
46 ; PROLOG-NEXT: %cmp.7 = icmp eq i64 %iv_next.7, %trip
47 ; PROLOG-NEXT: br i1 %cmp.7, label %exit2.loopexit.unr-lcssa, label %loop_header
2648 entry:
2749 br label %loop_header
2850
5880 ; %sum.02 and %add. Both of these are incoming values for phi from every exiting
5981 ; unrolled block.
6082 define i32 @test2(i32* nocapture %a, i64 %n) {
61 ; CHECK-LABEL: test2
62 ; CHECK-LABEL: for.exit2.loopexit:
63 ; CHECK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ], [ %add.1, %for.body.1 ], [ 42, %for.exiting_block.2 ], [ %add.2, %for.body.2 ], [ 42, %for.exiting_block.3 ],
64 ; CHECK-NEXT: br label %for.exit2
65 ; CHECK-LABEL: for.exit2.loopexit2:
66 ; CHECK-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
67 ; CHECK-NEXT: br label %for.exit2
68 ; CHECK-LABEL: for.exit2:
69 ; CHECK-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
70 ; CHECK-NEXT: ret i32 %retval
71 ; CHECK: %niter.nsub.7 = add i64 %niter, -8
83 ; EPILOG: test2(
84 ; EPILOG: for.exit2.loopexit:
85 ; EPILOG-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ], [ %add.1, %for.body.1 ], [ 42, %for.exiting_block.2 ], [ %add.2, %for.body.2 ], [ 42, %for.exiting_block.3 ],
86 ; EPILOG-NEXT: br label %for.exit2
87 ; EPILOG: for.exit2.loopexit2:
88 ; EPILOG-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
89 ; EPILOG-NEXT: br label %for.exit2
90 ; EPILOG: for.exit2:
91 ; EPILOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
92 ; EPILOG-NEXT: ret i32 %retval
93 ; EPILOG: %niter.nsub.7 = add i64 %niter, -8
94
95 ; PROLOG: test2(
96 ; PROLOG: for.exit2.loopexit:
97 ; PROLOG-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ], [ %add.1, %for.body.1 ], [ 42, %for.exiting_block.2 ], [ %add.2, %for.body.2 ], [ 42, %for.exiting_block.3 ],
98 ; PROLOG-NEXT: br label %for.exit2
99 ; PROLOG: for.exit2.loopexit1:
100 ; PROLOG-NEXT: %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
101 ; PROLOG-NEXT: br label %for.exit2
102 ; PROLOG: for.exit2:
103 ; PROLOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
104 ; PROLOG-NEXT: ret i32 %retval
105 ; PROLOG: %indvars.iv.next.7 = add i64 %indvars.iv, 8
106
72107 entry:
73108 br label %header
74109
101136 ; test with two exiting and three exit blocks.
102137 ; the non-latch exiting block has a switch.
103138 define void @test3(i64 %trip, i64 %add) {
104 ; CHECK-LABEL: test3
105 ; CHECK-NEXT: entry:
106 ; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1
107 ; CHECK-NEXT: [[XTRAITER:%.*]] = and i64 [[TRIP]], 7
108 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i64 [[TMP0]], 7
109 ; CHECK-NEXT: br i1 [[TMP1]], label %exit2.loopexit.unr-lcssa, label [[ENTRY_NEW:%.*]]
110 ; CHECK: entry.new:
111 ; CHECK-NEXT: %unroll_iter = sub i64 [[TRIP]], [[XTRAITER]]
112 ; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
113 ; CHECK-LABEL: loop_header:
114 ; CHECK-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
115 ; CHECK-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ]
116 ; CHECK-LABEL: loop_exiting_bb1.7:
117 ; CHECK-NEXT: switch i64 %sum.next.6, label %loop_latch.7
118 ; CHECK-LABEL: loop_latch.7:
119 ; CHECK-NEXT: %sum.next.7 = add i64 %sum.next.6, %add
120 ; CHECK-NEXT: %niter.nsub.7 = add i64 %niter, -8
121 ; CHECK-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
122 ; CHECK-NEXT: br i1 %niter.ncmp.7, label %exit2.loopexit.unr-lcssa.loopexit, label %loop_header
139 ; EPILOG: test3(
140 ; EPILOG-NEXT: entry:
141 ; EPILOG-NEXT: [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1
142 ; EPILOG-NEXT: [[XTRAITER:%.*]] = and i64 [[TRIP]], 7
143 ; EPILOG-NEXT: [[TMP1:%.*]] = icmp ult i64 [[TMP0]], 7
144 ; EPILOG-NEXT: br i1 [[TMP1]], label %exit2.loopexit.unr-lcssa, label [[ENTRY_NEW:%.*]]
145 ; EPILOG: entry.new:
146 ; EPILOG-NEXT: %unroll_iter = sub i64 [[TRIP]], [[XTRAITER]]
147 ; EPILOG-NEXT: br label [[LOOP_HEADER:%.*]]
148 ; EPILOG: loop_header:
149 ; EPILOG-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
150 ; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ]
151 ; EPILOG: loop_exiting_bb1.7:
152 ; EPILOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7
153 ; EPILOG: loop_latch.7:
154 ; EPILOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add
155 ; EPILOG-NEXT: %niter.nsub.7 = add i64 %niter, -8
156 ; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
157 ; EPILOG-NEXT: br i1 %niter.ncmp.7, label %exit2.loopexit.unr-lcssa.loopexit, label %loop_header
158
159 ; PROLOG: test3(
160 ; PROLOG-NEXT: entry:
161 ; PROLOG-NEXT: [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1
162 ; PROLOG-NEXT: [[XTRAITER:%.*]] = and i64 [[TRIP]], 7
163 ; PROLOG-NEXT: [[TMP1:%.*]] = icmp eq i64 [[XTRAITER]], 0
164 ; PROLOG-NEXT: br i1 [[TMP1]], label %loop_header.prol.loopexit, label %loop_header.prol.preheader
165 ; PROLOG: loop_header:
166 ; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
167 ; PROLOG-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
168 ; PROLOG: loop_exiting_bb1.7:
169 ; PROLOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7
170 ; PROLOG: loop_latch.7:
171 ; PROLOG-NEXT: %iv_next.7 = add nsw i64 %iv, 8
172 ; PROLOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add
173 ; PROLOG-NEXT: %cmp.7 = icmp eq i64 %iv_next.7, %trip
174 ; PROLOG-NEXT: br i1 %cmp.7, label %exit2.loopexit.unr-lcssa, label %loop_header
123175 entry:
124176 br label %loop_header
125177
152204
153205 ; FIXME: Support multiple exiting blocks to the same latch exit block.
154206 define i32 @test4(i32* nocapture %a, i64 %n, i1 %cond) {
155 ; CHECK-LABEL: test4
156 ; CHECK-NOT: .unr
157 ; CHECK-NOT: .epil
207 ; EPILOG: test4(
208 ; EPILOG-NOT: .unr
209 ; EPILOG-NOT: .epil
210
211 ; PROLOG: test4(
212 ; PROLOG-NOT: .unr
213 ; PROLOG-NOT: .prol
158214 entry:
159215 br label %header
160216
185241
186242 ; FIXME: Support multiple exiting blocks to the unique exit block.
187243 define void @unique_exit(i32 %arg) {
188 ; CHECK-LABEL: unique_exit
189 ; CHECK-NOT: .unr
190 ; CHECK-NOT: .epil
244 ; EPILOG: unique_exit(
245 ; EPILOG-NOT: .unr
246 ; EPILOG-NOT: .epil
247
248 ; PROLOG: unique_exit(
249 ; PROLOG-NOT: .unr
250 ; PROLOG-NOT: .prol
191251 entry:
192252 %tmp = icmp sgt i32 undef, %arg
193253 br i1 %tmp, label %preheader, label %returnblock
216276 ; two exiting and two exit blocks.
217277 ; the non-latch exiting block has duplicate edges to the non-latch exit block.
218278 define i64 @test5(i64 %trip, i64 %add, i1 %cond) {
219 ; CHECK-LABEL: test5
220 ; CHECK-LABEL: exit1.loopexit:
221 ; CHECK-NEXT: %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.2, %loop_exiting.2 ],
222 ; CHECK-NEXT: br label %exit1
223 ; CHECK-LABEL: exit1.loopexit2:
224 ; CHECK-NEXT: %ivy.epil = add i64 %iv.epil, %add
225 ; CHECK-NEXT: br label %exit1
226 ; CHECK-LABEL: exit1:
227 ; CHECK-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %ivy.epil, %exit1.loopexit2 ]
228 ; CHECK-NEXT: ret i64 %result
229 ; CHECK-LABEL: loop_latch.7:
230 ; CHECK: %niter.nsub.7 = add i64 %niter, -8
279 ; EPILOG: test5(
280 ; EPILOG: exit1.loopexit:
281 ; EPILOG-NEXT: %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.2, %loop_exiting.2 ],
282 ; EPILOG-NEXT: br label %exit1
283 ; EPILOG: exit1.loopexit2:
284 ; EPILOG-NEXT: %ivy.epil = add i64 %iv.epil, %add
285 ; EPILOG-NEXT: br label %exit1
286 ; EPILOG: exit1:
287 ; EPILOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %ivy.epil, %exit1.loopexit2 ]
288 ; EPILOG-NEXT: ret i64 %result
289 ; EPILOG: loop_latch.7:
290 ; EPILOG: %niter.nsub.7 = add i64 %niter, -8
291
292 ; PROLOG: test5(
293 ; PROLOG: exit1.loopexit:
294 ; PROLOG-NEXT: %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.2, %loop_exiting.2 ],
295 ; PROLOG-NEXT: br label %exit1
296 ; PROLOG: exit1.loopexit1:
297 ; PROLOG-NEXT: %ivy.prol = add i64 %iv.prol, %add
298 ; PROLOG-NEXT: br label %exit1
299 ; PROLOG: exit1:
300 ; PROLOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %ivy.prol, %exit1.loopexit1 ]
301 ; PROLOG-NEXT: ret i64 %result
302 ; PROLOG: loop_latch.7:
303 ; PROLOG: %iv_next.7 = add nsw i64 %iv, 8
231304 entry:
232305 br label %loop_header
233306
259332
260333 ; test when exit blocks have successors.
261334 define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) {
262 ; CHECK-LABEL: test6
263 ; CHECK-LABEL: for.exit2.loopexit:
264 ; CHECK-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ], [ %add.1, %latch.1 ], [ 42, %for.exiting_block.2 ], [ %add.2, %latch.2 ],
265 ; CHECK-NEXT: br label %for.exit2
266 ; CHECK-LABEL: for.exit2.loopexit2:
267 ; CHECK-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
268 ; CHECK-NEXT: br label %for.exit2
269 ; CHECK-LABEL: for.exit2:
270 ; CHECK-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
271 ; CHECK-NEXT: br i1 %cond, label %exit_true, label %exit_false
272 ; CHECK-LABEL: latch.7:
273 ; CHECK: %niter.nsub.7 = add i64 %niter, -8
335 ; EPILOG: test6(
336 ; EPILOG: for.exit2.loopexit:
337 ; EPILOG-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ], [ %add.1, %latch.1 ], [ 42, %for.exiting_block.2 ], [ %add.2, %latch.2 ],
338 ; EPILOG-NEXT: br label %for.exit2
339 ; EPILOG: for.exit2.loopexit2:
340 ; EPILOG-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
341 ; EPILOG-NEXT: br label %for.exit2
342 ; EPILOG: for.exit2:
343 ; EPILOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
344 ; EPILOG-NEXT: br i1 %cond, label %exit_true, label %exit_false
345 ; EPILOG: latch.7:
346 ; EPILOG: %niter.nsub.7 = add i64 %niter, -8
347
348 ; PROLOG: test6(
349 ; PROLOG: for.exit2.loopexit:
350 ; PROLOG-NEXT: %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ], [ %add.1, %latch.1 ], [ 42, %for.exiting_block.2 ], [ %add.2, %latch.2 ],
351 ; PROLOG-NEXT: br label %for.exit2
352 ; PROLOG: for.exit2.loopexit1:
353 ; PROLOG-NEXT: %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
354 ; PROLOG-NEXT: br label %for.exit2
355 ; PROLOG: for.exit2:
356 ; PROLOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
357 ; PROLOG-NEXT: br i1 %cond, label %exit_true, label %exit_false
358 ; PROLOG: latch.7:
359 ; PROLOG: %indvars.iv.next.7 = add i64 %indvars.iv, 8
274360 entry:
275361 br label %header
276362