blob: 18548c8af73596a38b6d63f51a0f5b2705f1de39 [file] [log] [blame]
Anna Thomas70ffd652017-07-10 15:29:38 +00001; RUN: opt < %s -loop-unroll -unroll-runtime=true -unroll-runtime-epilog=true -unroll-runtime-multi-exit=true -verify-dom-info -verify-loop-info -S | FileCheck %s -check-prefix=EPILOG-NO-IC
Anna Thomase3872002017-07-07 20:12:32 +00002; 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
Anna Thomase5e5e592017-06-30 17:57:07 +00003; 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
Anna Thomase3872002017-07-07 20:12:32 +00004; 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
5; 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
Anna Thomase5e5e592017-06-30 17:57:07 +00006
Anna Thomas70ffd652017-07-10 15:29:38 +00007; the third and fifth RUNs generate an epilog/prolog remainder block for all the test
Anna Thomase5e5e592017-06-30 17:57:07 +00008; cases below (it does not generate a loop).
9
10; test with three exiting and three exit blocks.
11; none of the exit blocks have successors
12define void @test1(i64 %trip, i1 %cond) {
Anna Thomase3872002017-07-07 20:12:32 +000013; EPILOG: test1(
14; EPILOG-NEXT: entry:
15; EPILOG-NEXT: [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1
16; EPILOG-NEXT: [[XTRAITER:%.*]] = and i64 [[TRIP]], 7
17; EPILOG-NEXT: [[TMP1:%.*]] = icmp ult i64 [[TMP0]], 7
18; EPILOG-NEXT: br i1 [[TMP1]], label %exit2.loopexit.unr-lcssa, label [[ENTRY_NEW:%.*]]
19; EPILOG: entry.new:
20; EPILOG-NEXT: [[UNROLL_ITER:%.*]] = sub i64 [[TRIP]], [[XTRAITER]]
21; EPILOG-NEXT: br label [[LOOP_HEADER:%.*]]
22; EPILOG: loop_latch.epil:
23; EPILOG-NEXT: %epil.iter.sub = add i64 %epil.iter, -1
24; EPILOG-NEXT: %epil.iter.cmp = icmp eq i64 %epil.iter.sub, 0
25; EPILOG-NEXT: br i1 %epil.iter.cmp, label %exit2.loopexit.epilog-lcssa, label %loop_header.epil
26; EPILOG: loop_latch.7:
27; EPILOG-NEXT: %niter.nsub.7 = add i64 %niter, -8
28; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
29; EPILOG-NEXT: br i1 %niter.ncmp.7, label %exit2.loopexit.unr-lcssa.loopexit, label %loop_header
30
31; PROLOG: test1(
32; PROLOG-NEXT: entry:
33; PROLOG-NEXT: [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1
34; PROLOG-NEXT: [[XTRAITER:%.*]] = and i64 [[TRIP]], 7
35; PROLOG-NEXT: [[TMP1:%.*]] = icmp eq i64 [[XTRAITER]], 0
36; PROLOG-NEXT: br i1 [[TMP1]], label %loop_header.prol.loopexit, label %loop_header.prol.preheader
37; PROLOG: loop_header.prol:
38; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
39; PROLOG-NEXT: %prol.iter = phi i64 [ [[XTRAITER]], %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ]
40; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol
41; PROLOG: loop_latch.prol:
42; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1
43; PROLOG-NEXT: %prol.iter.sub = add i64 %prol.iter, -1
44; PROLOG-NEXT: %prol.iter.cmp = icmp eq i64 %prol.iter.sub, 0
45; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol.loopexit.unr-lcssa, label %loop_header.prol
46; PROLOG: loop_latch.7:
47; PROLOG-NEXT: %iv_next.7 = add i64 %iv, 8
48; PROLOG-NEXT: %cmp.7 = icmp eq i64 %iv_next.7, %trip
49; PROLOG-NEXT: br i1 %cmp.7, label %exit2.loopexit.unr-lcssa, label %loop_header
Anna Thomase5e5e592017-06-30 17:57:07 +000050entry:
51 br label %loop_header
52
53loop_header:
54 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
55 br i1 %cond, label %loop_latch, label %loop_exiting_bb1
56
57loop_exiting_bb1:
58 br i1 false, label %loop_exiting_bb2, label %exit1
59
60loop_exiting_bb2:
61 br i1 false, label %loop_latch, label %exit3
62
63exit3:
64 ret void
65
66loop_latch:
67 %iv_next = add i64 %iv, 1
68 %cmp = icmp ne i64 %iv_next, %trip
69 br i1 %cmp, label %loop_header, label %exit2.loopexit
70
71exit1:
72 ret void
73
74exit2.loopexit:
75 ret void
76}
77
78
79; test with three exiting and two exit blocks.
80; The non-latch exit block has 2 unique predecessors.
81; There are 2 values passed to the exit blocks that are calculated at every iteration.
82; %sum.02 and %add. Both of these are incoming values for phi from every exiting
83; unrolled block.
84define i32 @test2(i32* nocapture %a, i64 %n) {
Anna Thomase3872002017-07-07 20:12:32 +000085; EPILOG: test2(
86; EPILOG: for.exit2.loopexit:
87; 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 ],
88; EPILOG-NEXT: br label %for.exit2
89; EPILOG: for.exit2.loopexit2:
90; EPILOG-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
91; EPILOG-NEXT: br label %for.exit2
92; EPILOG: for.exit2:
93; EPILOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
94; EPILOG-NEXT: ret i32 %retval
95; EPILOG: %niter.nsub.7 = add i64 %niter, -8
96
97; PROLOG: test2(
98; PROLOG: for.exit2.loopexit:
99; 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 ],
100; PROLOG-NEXT: br label %for.exit2
101; PROLOG: for.exit2.loopexit1:
102; PROLOG-NEXT: %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
103; PROLOG-NEXT: br label %for.exit2
104; PROLOG: for.exit2:
105; PROLOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
106; PROLOG-NEXT: ret i32 %retval
107; PROLOG: %indvars.iv.next.7 = add i64 %indvars.iv, 8
108
Anna Thomase5e5e592017-06-30 17:57:07 +0000109entry:
110 br label %header
111
112header:
113 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
114 %sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ]
115 br i1 false, label %for.exit2, label %for.exiting_block
116
117for.exiting_block:
118 %cmp = icmp eq i64 %n, 42
119 br i1 %cmp, label %for.exit2, label %for.body
120
121for.body:
122 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
123 %0 = load i32, i32* %arrayidx, align 4
124 %add = add nsw i32 %0, %sum.02
125 %indvars.iv.next = add i64 %indvars.iv, 1
126 %exitcond = icmp eq i64 %indvars.iv.next, %n
127 br i1 %exitcond, label %for.end, label %header
128
129for.end: ; preds = %for.body
130 %sum.0.lcssa = phi i32 [ %add, %for.body ]
131 ret i32 %sum.0.lcssa
132
133for.exit2:
134 %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ]
135 ret i32 %retval
136}
137
138; test with two exiting and three exit blocks.
139; the non-latch exiting block has a switch.
140define void @test3(i64 %trip, i64 %add) {
Anna Thomase3872002017-07-07 20:12:32 +0000141; EPILOG: test3(
142; EPILOG-NEXT: entry:
143; EPILOG-NEXT: [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1
144; EPILOG-NEXT: [[XTRAITER:%.*]] = and i64 [[TRIP]], 7
145; EPILOG-NEXT: [[TMP1:%.*]] = icmp ult i64 [[TMP0]], 7
146; EPILOG-NEXT: br i1 [[TMP1]], label %exit2.loopexit.unr-lcssa, label [[ENTRY_NEW:%.*]]
147; EPILOG: entry.new:
148; EPILOG-NEXT: %unroll_iter = sub i64 [[TRIP]], [[XTRAITER]]
149; EPILOG-NEXT: br label [[LOOP_HEADER:%.*]]
150; EPILOG: loop_header:
151; EPILOG-NEXT: %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
152; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ]
153; EPILOG: loop_exiting_bb1.7:
154; EPILOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7
155; EPILOG: loop_latch.7:
156; EPILOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add
157; EPILOG-NEXT: %niter.nsub.7 = add i64 %niter, -8
158; EPILOG-NEXT: %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
159; EPILOG-NEXT: br i1 %niter.ncmp.7, label %exit2.loopexit.unr-lcssa.loopexit, label %loop_header
160
161; PROLOG: test3(
162; PROLOG-NEXT: entry:
163; PROLOG-NEXT: [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1
164; PROLOG-NEXT: [[XTRAITER:%.*]] = and i64 [[TRIP]], 7
165; PROLOG-NEXT: [[TMP1:%.*]] = icmp eq i64 [[XTRAITER]], 0
166; PROLOG-NEXT: br i1 [[TMP1]], label %loop_header.prol.loopexit, label %loop_header.prol.preheader
167; PROLOG: loop_header:
168; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
169; PROLOG-NEXT: %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
170; PROLOG: loop_exiting_bb1.7:
171; PROLOG-NEXT: switch i64 %sum.next.6, label %loop_latch.7
172; PROLOG: loop_latch.7:
173; PROLOG-NEXT: %iv_next.7 = add nsw i64 %iv, 8
174; PROLOG-NEXT: %sum.next.7 = add i64 %sum.next.6, %add
175; PROLOG-NEXT: %cmp.7 = icmp eq i64 %iv_next.7, %trip
176; PROLOG-NEXT: br i1 %cmp.7, label %exit2.loopexit.unr-lcssa, label %loop_header
Anna Thomase5e5e592017-06-30 17:57:07 +0000177entry:
178 br label %loop_header
179
180loop_header:
181 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
182 %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ]
183 br i1 undef, label %loop_latch, label %loop_exiting_bb1
184
185loop_exiting_bb1:
186 switch i64 %sum, label %loop_latch [
187 i64 24, label %exit1
188 i64 42, label %exit3
189 ]
190
191exit3:
192 ret void
193
194loop_latch:
195 %iv_next = add nuw nsw i64 %iv, 1
196 %sum.next = add i64 %sum, %add
197 %cmp = icmp ne i64 %iv_next, %trip
198 br i1 %cmp, label %loop_header, label %exit2.loopexit
199
200exit1:
201 ret void
202
203exit2.loopexit:
204 ret void
205}
206
207; FIXME: Support multiple exiting blocks to the same latch exit block.
208define i32 @test4(i32* nocapture %a, i64 %n, i1 %cond) {
Anna Thomase3872002017-07-07 20:12:32 +0000209; EPILOG: test4(
210; EPILOG-NOT: .unr
211; EPILOG-NOT: .epil
212
213; PROLOG: test4(
214; PROLOG-NOT: .unr
215; PROLOG-NOT: .prol
Anna Thomase5e5e592017-06-30 17:57:07 +0000216entry:
217 br label %header
218
219header:
220 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
221 %sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ]
222 br i1 %cond, label %for.end, label %for.exiting_block
223
224for.exiting_block:
225 %cmp = icmp eq i64 %n, 42
226 br i1 %cmp, label %for.exit2, label %for.body
227
228for.body: ; preds = %for.body, %entry
229 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
230 %0 = load i32, i32* %arrayidx, align 4
231 %add = add nsw i32 %0, %sum.02
232 %indvars.iv.next = add i64 %indvars.iv, 1
233 %exitcond = icmp eq i64 %indvars.iv.next, %n
234 br i1 %exitcond, label %for.end, label %header
235
236for.end: ; preds = %for.body, %entry
237 %sum.0.lcssa = phi i32 [ 0, %header ], [ %add, %for.body ]
238 ret i32 %sum.0.lcssa
239
240for.exit2:
241 ret i32 42
242}
243
Anna Thomaseb6d5d12017-07-06 18:39:26 +0000244; FIXME: Support multiple exiting blocks to the unique exit block.
245define void @unique_exit(i32 %arg) {
Anna Thomase3872002017-07-07 20:12:32 +0000246; EPILOG: unique_exit(
247; EPILOG-NOT: .unr
248; EPILOG-NOT: .epil
249
250; PROLOG: unique_exit(
251; PROLOG-NOT: .unr
252; PROLOG-NOT: .prol
Anna Thomaseb6d5d12017-07-06 18:39:26 +0000253entry:
254 %tmp = icmp sgt i32 undef, %arg
255 br i1 %tmp, label %preheader, label %returnblock
256
257preheader: ; preds = %entry
258 br label %header
259
260LoopExit: ; preds = %header, %latch
261 %tmp2.ph = phi i32 [ %tmp4, %header ], [ -1, %latch ]
262 br label %returnblock
263
264returnblock: ; preds = %LoopExit, %entry
265 %tmp2 = phi i32 [ -1, %entry ], [ %tmp2.ph, %LoopExit ]
266 ret void
267
268header: ; preds = %preheader, %latch
269 %tmp4 = phi i32 [ %inc, %latch ], [ %arg, %preheader ]
270 %inc = add nsw i32 %tmp4, 1
271 br i1 true, label %LoopExit, label %latch
272
273latch: ; preds = %header
274 %cmp = icmp slt i32 %inc, undef
275 br i1 %cmp, label %header, label %LoopExit
276}
277
Anna Thomase5e5e592017-06-30 17:57:07 +0000278; two exiting and two exit blocks.
279; the non-latch exiting block has duplicate edges to the non-latch exit block.
280define i64 @test5(i64 %trip, i64 %add, i1 %cond) {
Anna Thomase3872002017-07-07 20:12:32 +0000281; EPILOG: test5(
282; EPILOG: exit1.loopexit:
283; 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 ],
284; EPILOG-NEXT: br label %exit1
285; EPILOG: exit1.loopexit2:
286; EPILOG-NEXT: %ivy.epil = add i64 %iv.epil, %add
287; EPILOG-NEXT: br label %exit1
288; EPILOG: exit1:
289; EPILOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %ivy.epil, %exit1.loopexit2 ]
290; EPILOG-NEXT: ret i64 %result
291; EPILOG: loop_latch.7:
292; EPILOG: %niter.nsub.7 = add i64 %niter, -8
293
294; PROLOG: test5(
295; PROLOG: exit1.loopexit:
296; 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 ],
297; PROLOG-NEXT: br label %exit1
298; PROLOG: exit1.loopexit1:
299; PROLOG-NEXT: %ivy.prol = add i64 %iv.prol, %add
300; PROLOG-NEXT: br label %exit1
301; PROLOG: exit1:
302; PROLOG-NEXT: %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %ivy.prol, %exit1.loopexit1 ]
303; PROLOG-NEXT: ret i64 %result
304; PROLOG: loop_latch.7:
305; PROLOG: %iv_next.7 = add nsw i64 %iv, 8
Anna Thomase5e5e592017-06-30 17:57:07 +0000306entry:
307 br label %loop_header
308
309loop_header:
310 %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
311 %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ]
312 br i1 %cond, label %loop_latch, label %loop_exiting
313
314loop_exiting:
315 %ivy = add i64 %iv, %add
316 switch i64 %sum, label %loop_latch [
317 i64 24, label %exit1
318 i64 42, label %exit1
319 ]
320
321loop_latch:
322 %iv_next = add nuw nsw i64 %iv, 1
323 %sum.next = add i64 %sum, %add
324 %cmp = icmp ne i64 %iv_next, %trip
325 br i1 %cmp, label %loop_header, label %latchexit
326
327exit1:
328 %result = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ]
329 ret i64 %result
330
331latchexit:
332 ret i64 %sum.next
333}
334
335; test when exit blocks have successors.
336define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) {
Anna Thomase3872002017-07-07 20:12:32 +0000337; EPILOG: test6(
338; EPILOG: for.exit2.loopexit:
339; 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 ],
340; EPILOG-NEXT: br label %for.exit2
341; EPILOG: for.exit2.loopexit2:
342; EPILOG-NEXT: %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
343; EPILOG-NEXT: br label %for.exit2
344; EPILOG: for.exit2:
345; EPILOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
346; EPILOG-NEXT: br i1 %cond, label %exit_true, label %exit_false
347; EPILOG: latch.7:
348; EPILOG: %niter.nsub.7 = add i64 %niter, -8
349
350; PROLOG: test6(
351; PROLOG: for.exit2.loopexit:
352; 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 ],
353; PROLOG-NEXT: br label %for.exit2
354; PROLOG: for.exit2.loopexit1:
355; PROLOG-NEXT: %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
356; PROLOG-NEXT: br label %for.exit2
357; PROLOG: for.exit2:
358; PROLOG-NEXT: %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
359; PROLOG-NEXT: br i1 %cond, label %exit_true, label %exit_false
360; PROLOG: latch.7:
361; PROLOG: %indvars.iv.next.7 = add i64 %indvars.iv, 8
Anna Thomase5e5e592017-06-30 17:57:07 +0000362entry:
363 br label %header
364
365header:
366 %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
367 %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
368 br i1 false, label %for.exit2, label %for.exiting_block
369
370for.exiting_block:
371 %cmp = icmp eq i64 %n, 42
372 br i1 %cmp, label %for.exit2, label %latch
373
374latch:
375 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
376 %load = load i32, i32* %arrayidx, align 4
377 %add = add nsw i32 %load, %sum.02
378 %indvars.iv.next = add i64 %indvars.iv, 1
379 %exitcond = icmp eq i64 %indvars.iv.next, %n
380 br i1 %exitcond, label %latch_exit, label %header
381
382latch_exit:
383 %sum.0.lcssa = phi i32 [ %add, %latch ]
384 ret i32 %sum.0.lcssa
385
386for.exit2:
387 %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ]
388 %addx = add i32 %retval, %x
389 br i1 %cond, label %exit_true, label %exit_false
390
391exit_true:
392 ret i32 %retval
393
394exit_false:
395 ret i32 %addx
396}
Anna Thomas70ffd652017-07-10 15:29:38 +0000397
398; test when value in exit block does not have VMap.
399define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) {
400; EPILOG-NO-IC: test7(
401; EPILOG-NO-IC: loopexit1.loopexit:
402; EPILOG-NO-IC-NEXT: %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ], [ %shft, %latch.1 ], [ %shft, %latch.2 ], [ %shft, %latch.3 ], [ %shft, %latch.4 ], [ %shft, %latch.5 ], [ %shft, %latch.6 ]
403; EPILOG-NO-IC-NEXT: br label %loopexit1
404; EPILOG-NO-IC: loopexit1.loopexit1:
405; EPILOG-NO-IC-NEXT: %sext3.ph2 = phi i32 [ %shft, %header.epil ]
406; EPILOG-NO-IC-NEXT: br label %loopexit1
407; EPILOG-NO-IC: loopexit1:
408; EPILOG-NO-IC-NEXT: %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
409bb:
410 %tmp = icmp slt i32 undef, 2
411 %sext = sext i32 undef to i64
412 %shft = ashr exact i32 %arg, 16
413 br i1 %tmp, label %loopexit2, label %preheader
414
415preheader: ; preds = %bb2
416 br label %header
417
418header: ; preds = %latch, %preheader
419 %tmp6 = phi i64 [ 1, %preheader ], [ %add, %latch ]
420 br i1 false, label %loopexit1, label %latch
421
422latch: ; preds = %header
423 %add = add nuw nsw i64 %tmp6, 1
424 %tmp9 = icmp slt i64 %add, %sext
425 br i1 %tmp9, label %header, label %latchexit
426
427latchexit: ; preds = %latch
428 unreachable
429
430loopexit2: ; preds = %bb2
431 ret i32 %shft
432
433loopexit1: ; preds = %header
434 %sext3 = phi i32 [ %shft, %header ]
435 ret i32 %sext3
436}