1; 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
2; 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
3; 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
4; 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
6
7; the third and fifth RUNs generate an epilog/prolog remainder block for all the test
8; 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) {
13; 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
50entry:
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) {
85; 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
109entry:
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) {
141; 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
177entry:
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) {
209; EPILOG: test4(
210; EPILOG-NOT: .unr
211; EPILOG-NOT: .epil
212
213; PROLOG: test4(
214; PROLOG-NOT: .unr
215; PROLOG-NOT: .prol
216entry:
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
244; FIXME: Support multiple exiting blocks to the unique exit block.
245define void @unique_exit(i32 %arg) {
246; EPILOG: unique_exit(
247; EPILOG-NOT: .unr
248; EPILOG-NOT: .epil
249
250; PROLOG: unique_exit(
251; PROLOG-NOT: .unr
252; PROLOG-NOT: .prol
253entry:
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
278; 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) {
281; 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
306entry:
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) {
337; 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
362entry:
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}
397
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}
437
438; Nested loop and inner loop is unrolled
439; FIXME: we cannot unroll with epilog remainder currently, because
440; the outer loop does not contain the epilog preheader and epilog exit (while
441; infact it should). This causes us to choke up on LCSSA form being incorrect in
442; outer loop. However, the exit block where LCSSA fails, is infact still within
443; the outer loop. For now, we just bail out in presence of outer loop and epilog
444; loop is generated.
445; The outer loop header is the preheader for the inner loop and the inner header
446; branches back to the outer loop.
447define void @test8() {
448; EPILOG: test8(
449; EPILOG-NOT: niter
450
451; PROLOG: test8(
452; PROLOG: outerloop:
453; PROLOG-NEXT: phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]
454; PROLOG:      %lcmp.mod = icmp eq i64
455; PROLOG-NEXT: br i1 %lcmp.mod, label %innerH.prol.loopexit, label %innerH.prol.preheader
456; PROLOG: latch.6:
457; PROLOG-NEXT: %tmp4.7 = add nsw i64 %tmp3, 8
458; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.7
459; PROLOG: latch.7
460; PROLOG-NEXT: %tmp6.7 = icmp ult i64 %tmp4.7, 100
461; PROLOG-NEXT: br i1 %tmp6.7, label %innerH, label %exit.unr-lcssa
462bb:
463  br label %outerloop
464
465outerloop:                                              ; preds = %innerH, %bb
466  %tmp = phi i64 [ 3, %bb ], [ 0, %innerH ]
467  br label %innerH
468
469innerH:                                              ; preds = %latch, %outerloop
470  %tmp3 = phi i64 [ %tmp4, %latch ], [ %tmp, %outerloop ]
471  %tmp4 = add nuw nsw i64 %tmp3, 1
472  br i1 false, label %outerloop, label %latch
473
474latch:                                              ; preds = %innerH
475  %tmp6 = icmp ult i64 %tmp4, 100
476  br i1 %tmp6, label %innerH, label %exit
477
478exit:                                              ; preds = %latch
479  ret void
480}
481