xref: /llvm-project/llvm/test/Transforms/LoopUnroll/runtime-loop-multiple-exits.ll (revision abb9f9fa06ef22be2b0287b9047d5cfed71d91d4)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: -p
2; RUN: opt < %s -passes=loop-unroll -unroll-runtime=true -unroll-runtime-epilog=true -unroll-runtime-multi-exit=true -verify-loop-lcssa -verify-dom-info -verify-loop-info -S | FileCheck %s -check-prefixes=CHECK,EPILOG
3; RUN: opt < %s -passes=loop-unroll -unroll-runtime -unroll-count=2 -unroll-runtime-epilog=true -unroll-runtime-multi-exit=true -verify-loop-lcssa -verify-dom-info -verify-loop-info -S | FileCheck %s -check-prefixes=CHECK,EPILOG-BLOCK
4; RUN: opt < %s -passes=loop-unroll -unroll-runtime=true -unroll-runtime-epilog=false -unroll-runtime-multi-exit=true -verify-loop-lcssa -verify-dom-info -verify-loop-info -S | FileCheck %s -check-prefixes=CHECK,PROLOG
5; RUN: opt < %s -passes=loop-unroll -unroll-runtime -unroll-runtime-epilog=false -unroll-count=2 -unroll-runtime-multi-exit=true -verify-loop-lcssa -verify-dom-info -verify-loop-info -S | FileCheck %s -check-prefixes=CHECK,PROLOG-BLOCK
6
7; REQUIRES: asserts
8
9; test with three exiting and three exit blocks.
10; none of the exit blocks have successors
11define void @test1(i64 %trip, i1 %cond) {
12; EPILOG-LABEL: @test1(
13; EPILOG-NEXT:  entry:
14; EPILOG-NEXT:    %0 = freeze i64 %trip
15; EPILOG-NEXT:    %1 = add i64 %0, -1
16; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
17; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
18; EPILOG-NEXT:    br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new
19; EPILOG:       entry.new:
20; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
21; EPILOG-NEXT:    br label %loop_header
22; EPILOG:       loop_header:
23; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
24; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
25; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
26; EPILOG:       loop_exiting_bb1:
27; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
28; EPILOG:       loop_exiting_bb2:
29; EPILOG-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
30; EPILOG:       exit3.loopexit:
31; EPILOG-NEXT:    br label %exit3
32; EPILOG:       exit3.loopexit2:
33; EPILOG-NEXT:    br label %exit3
34; EPILOG:       exit3:
35; EPILOG-NEXT:    ret void
36; EPILOG:       loop_latch:
37; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
38; EPILOG:       loop_exiting_bb1.1:
39; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
40; EPILOG:       loop_exiting_bb2.1:
41; EPILOG-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
42; EPILOG:       loop_latch.1:
43; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2
44; EPILOG:       loop_exiting_bb1.2:
45; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit
46; EPILOG:       loop_exiting_bb2.2:
47; EPILOG-NEXT:    br i1 false, label %loop_latch.2, label %exit3.loopexit
48; EPILOG:       loop_latch.2:
49; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3
50; EPILOG:       loop_exiting_bb1.3:
51; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit
52; EPILOG:       loop_exiting_bb2.3:
53; EPILOG-NEXT:    br i1 false, label %loop_latch.3, label %exit3.loopexit
54; EPILOG:       loop_latch.3:
55; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4
56; EPILOG:       loop_exiting_bb1.4:
57; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit
58; EPILOG:       loop_exiting_bb2.4:
59; EPILOG-NEXT:    br i1 false, label %loop_latch.4, label %exit3.loopexit
60; EPILOG:       loop_latch.4:
61; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5
62; EPILOG:       loop_exiting_bb1.5:
63; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit
64; EPILOG:       loop_exiting_bb2.5:
65; EPILOG-NEXT:    br i1 false, label %loop_latch.5, label %exit3.loopexit
66; EPILOG:       loop_latch.5:
67; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6
68; EPILOG:       loop_exiting_bb1.6:
69; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit
70; EPILOG:       loop_exiting_bb2.6:
71; EPILOG-NEXT:    br i1 false, label %loop_latch.6, label %exit3.loopexit
72; EPILOG:       loop_latch.6:
73; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7
74; EPILOG:       loop_exiting_bb1.7:
75; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit
76; EPILOG:       loop_exiting_bb2.7:
77; EPILOG-NEXT:    br i1 false, label %loop_latch.7, label %exit3.loopexit
78; EPILOG:       loop_latch.7:
79; EPILOG-NEXT:    %iv_next.7 = add i64 %iv, 8
80; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 8
81; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
82; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit
83; EPILOG:       exit1.loopexit:
84; EPILOG-NEXT:    br label %exit1
85; EPILOG:       exit1.loopexit1:
86; EPILOG-NEXT:    br label %exit1
87; EPILOG:       exit1:
88; EPILOG-NEXT:    ret void
89; EPILOG:       exit2.loopexit.unr-lcssa.loopexit:
90; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
91; EPILOG-NEXT:    br label %exit2.loopexit.unr-lcssa
92; EPILOG:       exit2.loopexit.unr-lcssa:
93; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
94; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
95; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
96; EPILOG:       loop_header.epil.preheader:
97; EPILOG-NEXT:    br label %loop_header.epil
98; EPILOG:       loop_header.epil:
99; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
100; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
101; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil
102; EPILOG:       loop_exiting_bb1.epil:
103; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.epil, label %exit1.loopexit1
104; EPILOG:       loop_exiting_bb2.epil:
105; EPILOG-NEXT:    br i1 false, label %loop_latch.epil, label %exit3.loopexit2
106; EPILOG:       loop_latch.epil:
107; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
108; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
109; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
110; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
111; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !0
112; EPILOG:       exit2.loopexit.epilog-lcssa:
113; EPILOG-NEXT:    br label %exit2.loopexit
114; EPILOG:       exit2.loopexit:
115; EPILOG-NEXT:    ret void
116;
117; EPILOG-BLOCK-LABEL: @test1(
118; EPILOG-BLOCK-NEXT:  entry:
119; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
120; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
121; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
122; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
123; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new
124; EPILOG-BLOCK:       entry.new:
125; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
126; EPILOG-BLOCK-NEXT:    br label %loop_header
127; EPILOG-BLOCK:       loop_header:
128; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
129; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
130; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
131; EPILOG-BLOCK:       loop_exiting_bb1:
132; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
133; EPILOG-BLOCK:       loop_exiting_bb2:
134; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
135; EPILOG-BLOCK:       exit3.loopexit:
136; EPILOG-BLOCK-NEXT:    br label %exit3
137; EPILOG-BLOCK:       exit3:
138; EPILOG-BLOCK-NEXT:    ret void
139; EPILOG-BLOCK:       loop_latch:
140; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
141; EPILOG-BLOCK:       loop_exiting_bb1.1:
142; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
143; EPILOG-BLOCK:       loop_exiting_bb2.1:
144; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
145; EPILOG-BLOCK:       loop_latch.1:
146; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 2
147; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 2
148; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
149; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !0
150; EPILOG-BLOCK:       exit1.loopexit:
151; EPILOG-BLOCK-NEXT:    br label %exit1
152; EPILOG-BLOCK:       exit1:
153; EPILOG-BLOCK-NEXT:    ret void
154; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa.loopexit:
155; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit.unr-lcssa
156; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa:
157; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
158; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
159; EPILOG-BLOCK:       loop_header.epil.preheader:
160; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
161; EPILOG-BLOCK:       loop_header.epil:
162; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil
163; EPILOG-BLOCK:       loop_exiting_bb1.epil:
164; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.epil, label %exit1
165; EPILOG-BLOCK:       loop_exiting_bb2.epil:
166; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch.epil, label %exit3
167; EPILOG-BLOCK:       loop_latch.epil:
168; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit
169; EPILOG-BLOCK:       exit2.loopexit:
170; EPILOG-BLOCK-NEXT:    ret void
171;
172; PROLOG-LABEL: @test1(
173; PROLOG-NEXT:  entry:
174; PROLOG-NEXT:    %0 = freeze i64 %trip
175; PROLOG-NEXT:    %1 = add i64 %0, -1
176; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
177; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
178; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
179; PROLOG:       loop_header.prol.preheader:
180; PROLOG-NEXT:    br label %loop_header.prol
181; PROLOG:       loop_header.prol:
182; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
183; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
184; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol
185; PROLOG:       loop_exiting_bb1.prol:
186; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.prol, label %exit1.loopexit1
187; PROLOG:       loop_exiting_bb2.prol:
188; PROLOG-NEXT:    br i1 false, label %loop_latch.prol, label %exit3.loopexit2
189; PROLOG:       loop_latch.prol:
190; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
191; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
192; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
193; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
194; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !0
195; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
196; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
197; PROLOG-NEXT:    br label %loop_header.prol.loopexit
198; PROLOG:       loop_header.prol.loopexit:
199; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
200; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
201; PROLOG-NEXT:    br i1 %2, label %exit2.loopexit, label %entry.new
202; PROLOG:       entry.new:
203; PROLOG-NEXT:    br label %loop_header
204; PROLOG:       loop_header:
205; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
206; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
207; PROLOG:       loop_exiting_bb1:
208; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
209; PROLOG:       loop_exiting_bb2:
210; PROLOG-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
211; PROLOG:       exit3.loopexit:
212; PROLOG-NEXT:    br label %exit3
213; PROLOG:       exit3.loopexit2:
214; PROLOG-NEXT:    br label %exit3
215; PROLOG:       exit3:
216; PROLOG-NEXT:    ret void
217; PROLOG:       loop_latch:
218; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
219; PROLOG:       loop_exiting_bb1.1:
220; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
221; PROLOG:       loop_exiting_bb2.1:
222; PROLOG-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
223; PROLOG:       loop_latch.1:
224; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2
225; PROLOG:       loop_exiting_bb1.2:
226; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit
227; PROLOG:       loop_exiting_bb2.2:
228; PROLOG-NEXT:    br i1 false, label %loop_latch.2, label %exit3.loopexit
229; PROLOG:       loop_latch.2:
230; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3
231; PROLOG:       loop_exiting_bb1.3:
232; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit
233; PROLOG:       loop_exiting_bb2.3:
234; PROLOG-NEXT:    br i1 false, label %loop_latch.3, label %exit3.loopexit
235; PROLOG:       loop_latch.3:
236; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4
237; PROLOG:       loop_exiting_bb1.4:
238; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit
239; PROLOG:       loop_exiting_bb2.4:
240; PROLOG-NEXT:    br i1 false, label %loop_latch.4, label %exit3.loopexit
241; PROLOG:       loop_latch.4:
242; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5
243; PROLOG:       loop_exiting_bb1.5:
244; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit
245; PROLOG:       loop_exiting_bb2.5:
246; PROLOG-NEXT:    br i1 false, label %loop_latch.5, label %exit3.loopexit
247; PROLOG:       loop_latch.5:
248; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6
249; PROLOG:       loop_exiting_bb1.6:
250; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit
251; PROLOG:       loop_exiting_bb2.6:
252; PROLOG-NEXT:    br i1 false, label %loop_latch.6, label %exit3.loopexit
253; PROLOG:       loop_latch.6:
254; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7
255; PROLOG:       loop_exiting_bb1.7:
256; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit
257; PROLOG:       loop_exiting_bb2.7:
258; PROLOG-NEXT:    br i1 false, label %loop_latch.7, label %exit3.loopexit
259; PROLOG:       loop_latch.7:
260; PROLOG-NEXT:    %iv_next.7 = add i64 %iv, 8
261; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
262; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa
263; PROLOG:       exit1.loopexit:
264; PROLOG-NEXT:    br label %exit1
265; PROLOG:       exit1.loopexit1:
266; PROLOG-NEXT:    br label %exit1
267; PROLOG:       exit1:
268; PROLOG-NEXT:    ret void
269; PROLOG:       exit2.loopexit.unr-lcssa:
270; PROLOG-NEXT:    br label %exit2.loopexit
271; PROLOG:       exit2.loopexit:
272; PROLOG-NEXT:    ret void
273;
274; PROLOG-BLOCK-LABEL: @test1(
275; PROLOG-BLOCK-NEXT:  entry:
276; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
277; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
278; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
279; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
280; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
281; PROLOG-BLOCK:       loop_header.prol.preheader:
282; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
283; PROLOG-BLOCK:       loop_header.prol:
284; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol
285; PROLOG-BLOCK:       loop_exiting_bb1.prol:
286; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.prol, label %exit1
287; PROLOG-BLOCK:       loop_exiting_bb2.prol:
288; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch.prol, label %exit3
289; PROLOG-BLOCK:       loop_latch.prol:
290; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
291; PROLOG-BLOCK:       loop_header.prol.loopexit:
292; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
293; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
294; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit2.loopexit, label %entry.new
295; PROLOG-BLOCK:       entry.new:
296; PROLOG-BLOCK-NEXT:    br label %loop_header
297; PROLOG-BLOCK:       loop_header:
298; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
299; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
300; PROLOG-BLOCK:       loop_exiting_bb1:
301; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
302; PROLOG-BLOCK:       loop_exiting_bb2:
303; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
304; PROLOG-BLOCK:       exit3.loopexit:
305; PROLOG-BLOCK-NEXT:    br label %exit3
306; PROLOG-BLOCK:       exit3:
307; PROLOG-BLOCK-NEXT:    ret void
308; PROLOG-BLOCK:       loop_latch:
309; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
310; PROLOG-BLOCK:       loop_exiting_bb1.1:
311; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
312; PROLOG-BLOCK:       loop_exiting_bb2.1:
313; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
314; PROLOG-BLOCK:       loop_latch.1:
315; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 2
316; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
317; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !0
318; PROLOG-BLOCK:       exit1.loopexit:
319; PROLOG-BLOCK-NEXT:    br label %exit1
320; PROLOG-BLOCK:       exit1:
321; PROLOG-BLOCK-NEXT:    ret void
322; PROLOG-BLOCK:       exit2.loopexit.unr-lcssa:
323; PROLOG-BLOCK-NEXT:    br label %exit2.loopexit
324; PROLOG-BLOCK:       exit2.loopexit:
325; PROLOG-BLOCK-NEXT:    ret void
326;
327
328entry:
329  br label %loop_header
330
331loop_header:
332  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
333  br i1 %cond, label %loop_latch, label %loop_exiting_bb1
334
335loop_exiting_bb1:
336  br i1 false, label %loop_exiting_bb2, label %exit1
337
338loop_exiting_bb2:
339  br i1 false, label %loop_latch, label %exit3
340
341exit3:
342  ret void
343
344loop_latch:
345  %iv_next = add i64 %iv, 1
346  %cmp = icmp ne i64 %iv_next, %trip
347  br i1 %cmp, label %loop_header, label %exit2.loopexit
348
349exit1:
350  ret void
351
352exit2.loopexit:
353  ret void
354}
355
356
357; test with three exiting and two exit blocks.
358; The non-latch exit block has 2 unique predecessors.
359; There are 2 values passed to the exit blocks that are calculated at every iteration.
360; %sum.02 and %add. Both of these are incoming values for phi from every exiting
361; unrolled block.
362define i32 @test2(ptr nocapture %a, i64 %n) {
363; EPILOG-LABEL: @test2(
364; EPILOG-NEXT:  entry:
365; EPILOG-NEXT:    %0 = freeze i64 %n
366; EPILOG-NEXT:    %1 = add i64 %0, -1
367; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
368; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
369; EPILOG-NEXT:    br i1 %2, label %for.end.unr-lcssa, label %entry.new
370; EPILOG:       entry.new:
371; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
372; EPILOG-NEXT:    br label %header
373; EPILOG:       header:
374; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ]
375; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %for.body.7 ]
376; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %for.body.7 ]
377; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
378; EPILOG:       for.exiting_block:
379; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
380; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
381; EPILOG:       for.body:
382; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
383; EPILOG-NEXT:    %3 = load i32, ptr %arrayidx, align 4
384; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.02
385; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
386; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
387; EPILOG:       for.exiting_block.1:
388; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
389; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
390; EPILOG:       for.body.1:
391; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
392; EPILOG-NEXT:    %4 = load i32, ptr %arrayidx.1, align 4
393; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
394; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2
395; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
396; EPILOG:       for.exiting_block.2:
397; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
398; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2
399; EPILOG:       for.body.2:
400; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1
401; EPILOG-NEXT:    %5 = load i32, ptr %arrayidx.2, align 4
402; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
403; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 3
404; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
405; EPILOG:       for.exiting_block.3:
406; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
407; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3
408; EPILOG:       for.body.3:
409; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2
410; EPILOG-NEXT:    %6 = load i32, ptr %arrayidx.3, align 4
411; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
412; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4
413; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
414; EPILOG:       for.exiting_block.4:
415; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
416; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4
417; EPILOG:       for.body.4:
418; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3
419; EPILOG-NEXT:    %7 = load i32, ptr %arrayidx.4, align 4
420; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
421; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv, 5
422; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
423; EPILOG:       for.exiting_block.5:
424; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
425; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5
426; EPILOG:       for.body.5:
427; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4
428; EPILOG-NEXT:    %8 = load i32, ptr %arrayidx.5, align 4
429; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
430; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv, 6
431; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
432; EPILOG:       for.exiting_block.6:
433; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
434; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6
435; EPILOG:       for.body.6:
436; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5
437; EPILOG-NEXT:    %9 = load i32, ptr %arrayidx.6, align 4
438; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
439; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv, 7
440; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
441; EPILOG:       for.exiting_block.7:
442; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
443; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7
444; EPILOG:       for.body.7:
445; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6
446; EPILOG-NEXT:    %10 = load i32, ptr %arrayidx.7, align 4
447; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
448; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 8
449; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 8
450; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
451; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %for.end.unr-lcssa.loopexit, label %header
452; EPILOG:       for.end.unr-lcssa.loopexit:
453; EPILOG-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %for.body.7 ]
454; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %for.body.7 ]
455; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %for.body.7 ]
456; EPILOG-NEXT:    br label %for.end.unr-lcssa
457; EPILOG:       for.end.unr-lcssa:
458; EPILOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ poison, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ]
459; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ]
460; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ]
461; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
462; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %for.end
463; EPILOG:       header.epil.preheader:
464; EPILOG-NEXT:    br label %header.epil
465; EPILOG:       header.epil:
466; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %for.body.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
467; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %for.body.epil ], [ %sum.02.unr, %header.epil.preheader ]
468; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %for.body.epil ]
469; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil
470; EPILOG:       for.exiting_block.epil:
471; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
472; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit2, label %for.body.epil
473; EPILOG:       for.body.epil:
474; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil
475; EPILOG-NEXT:    %11 = load i32, ptr %arrayidx.epil, align 4
476; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil
477; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
478; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
479; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
480; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
481; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %for.end.epilog-lcssa, !llvm.loop !2
482; EPILOG:       for.end.epilog-lcssa:
483; EPILOG-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %for.body.epil ]
484; EPILOG-NEXT:    br label %for.end
485; EPILOG:       for.end:
486; EPILOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %sum.0.lcssa.ph1, %for.end.epilog-lcssa ]
487; EPILOG-NEXT:    ret i32 %sum.0.lcssa
488; EPILOG:       for.exit2.loopexit:
489; 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 ], [ %add.3, %for.body.3 ], [ 42, %for.exiting_block.4 ], [ %add.4, %for.body.4 ], [ 42, %for.exiting_block.5 ], [ %add.5, %for.body.5 ], [ 42, %for.exiting_block.6 ], [ %add.6, %for.body.6 ], [ 42, %for.exiting_block.7 ]
490; EPILOG-NEXT:    br label %for.exit2
491; EPILOG:       for.exit2.loopexit2:
492; EPILOG-NEXT:    %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
493; EPILOG-NEXT:    br label %for.exit2
494; EPILOG:       for.exit2:
495; EPILOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
496; EPILOG-NEXT:    ret i32 %retval
497;
498; EPILOG-BLOCK-LABEL: @test2(
499; EPILOG-BLOCK-NEXT:  entry:
500; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n
501; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
502; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
503; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
504; EPILOG-BLOCK-NEXT:    br i1 %2, label %for.end.unr-lcssa, label %entry.new
505; EPILOG-BLOCK:       entry.new:
506; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
507; EPILOG-BLOCK-NEXT:    br label %header
508; EPILOG-BLOCK:       header:
509; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ]
510; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %for.body.1 ]
511; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %for.body.1 ]
512; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
513; EPILOG-BLOCK:       for.exiting_block:
514; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
515; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
516; EPILOG-BLOCK:       for.body:
517; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
518; EPILOG-BLOCK-NEXT:    %3 = load i32, ptr %arrayidx, align 4
519; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
520; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
521; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
522; EPILOG-BLOCK:       for.exiting_block.1:
523; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
524; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
525; EPILOG-BLOCK:       for.body.1:
526; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
527; EPILOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx.1, align 4
528; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
529; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2
530; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 2
531; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
532; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %for.end.unr-lcssa.loopexit, label %header, !llvm.loop !2
533; EPILOG-BLOCK:       for.end.unr-lcssa.loopexit:
534; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %for.body.1 ]
535; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %for.body.1 ]
536; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %for.body.1 ]
537; EPILOG-BLOCK-NEXT:    br label %for.end.unr-lcssa
538; EPILOG-BLOCK:       for.end.unr-lcssa:
539; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ poison, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ]
540; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ]
541; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ]
542; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
543; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %for.end
544; EPILOG-BLOCK:       header.epil.preheader:
545; EPILOG-BLOCK-NEXT:    br label %header.epil
546; EPILOG-BLOCK:       header.epil:
547; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.epil
548; EPILOG-BLOCK:       for.exiting_block.epil:
549; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
550; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %for.body.epil
551; EPILOG-BLOCK:       for.body.epil:
552; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.unr
553; EPILOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.epil, align 4
554; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.unr
555; EPILOG-BLOCK-NEXT:    br label %for.end
556; EPILOG-BLOCK:       for.end:
557; EPILOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %add.epil, %for.body.epil ]
558; EPILOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
559; EPILOG-BLOCK:       for.exit2.loopexit:
560; EPILOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ]
561; EPILOG-BLOCK-NEXT:    br label %for.exit2
562; EPILOG-BLOCK:       for.exit2:
563; EPILOG-BLOCK-NEXT:    %retval = phi i32 [ %sum.02.unr, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ]
564; EPILOG-BLOCK-NEXT:    ret i32 %retval
565;
566; PROLOG-LABEL: @test2(
567; PROLOG-NEXT:  entry:
568; PROLOG-NEXT:    %0 = freeze i64 %n
569; PROLOG-NEXT:    %1 = add i64 %0, -1
570; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
571; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
572; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
573; PROLOG:       header.prol.preheader:
574; PROLOG-NEXT:    br label %header.prol
575; PROLOG:       header.prol:
576; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %for.body.prol ], [ 0, %header.prol.preheader ]
577; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %for.body.prol ], [ 0, %header.prol.preheader ]
578; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %for.body.prol ]
579; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol
580; PROLOG:       for.exiting_block.prol:
581; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
582; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit1, label %for.body.prol
583; PROLOG:       for.body.prol:
584; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.prol
585; PROLOG-NEXT:    %2 = load i32, ptr %arrayidx.prol, align 4
586; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol
587; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
588; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
589; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
590; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
591; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !2
592; PROLOG:       header.prol.loopexit.unr-lcssa:
593; PROLOG-NEXT:    %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %for.body.prol ]
594; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %for.body.prol ]
595; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %for.body.prol ]
596; PROLOG-NEXT:    br label %header.prol.loopexit
597; PROLOG:       header.prol.loopexit:
598; PROLOG-NEXT:    %sum.0.lcssa.unr = phi i32 [ poison, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ]
599; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
600; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
601; PROLOG-NEXT:    %3 = icmp ult i64 %1, 7
602; PROLOG-NEXT:    br i1 %3, label %for.end, label %entry.new
603; PROLOG:       entry.new:
604; PROLOG-NEXT:    br label %header
605; PROLOG:       header:
606; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ]
607; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %for.body.7 ]
608; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
609; PROLOG:       for.exiting_block:
610; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
611; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
612; PROLOG:       for.body:
613; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
614; PROLOG-NEXT:    %4 = load i32, ptr %arrayidx, align 4
615; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.02
616; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
617; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
618; PROLOG:       for.exiting_block.1:
619; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
620; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
621; PROLOG:       for.body.1:
622; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
623; PROLOG-NEXT:    %5 = load i32, ptr %arrayidx.1, align 4
624; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add
625; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2
626; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
627; PROLOG:       for.exiting_block.2:
628; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
629; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2
630; PROLOG:       for.body.2:
631; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1
632; PROLOG-NEXT:    %6 = load i32, ptr %arrayidx.2, align 4
633; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.1
634; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv, 3
635; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
636; PROLOG:       for.exiting_block.3:
637; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
638; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3
639; PROLOG:       for.body.3:
640; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2
641; PROLOG-NEXT:    %7 = load i32, ptr %arrayidx.3, align 4
642; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.2
643; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv, 4
644; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
645; PROLOG:       for.exiting_block.4:
646; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
647; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4
648; PROLOG:       for.body.4:
649; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3
650; PROLOG-NEXT:    %8 = load i32, ptr %arrayidx.4, align 4
651; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.3
652; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv, 5
653; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
654; PROLOG:       for.exiting_block.5:
655; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
656; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5
657; PROLOG:       for.body.5:
658; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4
659; PROLOG-NEXT:    %9 = load i32, ptr %arrayidx.5, align 4
660; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.4
661; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv, 6
662; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
663; PROLOG:       for.exiting_block.6:
664; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
665; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6
666; PROLOG:       for.body.6:
667; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5
668; PROLOG-NEXT:    %10 = load i32, ptr %arrayidx.6, align 4
669; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.5
670; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv, 7
671; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
672; PROLOG:       for.exiting_block.7:
673; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
674; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7
675; PROLOG:       for.body.7:
676; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6
677; PROLOG-NEXT:    %11 = load i32, ptr %arrayidx.7, align 4
678; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.6
679; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 8
680; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
681; PROLOG-NEXT:    br i1 %exitcond.7, label %for.end.unr-lcssa, label %header
682; PROLOG:       for.end.unr-lcssa:
683; PROLOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %for.body.7 ]
684; PROLOG-NEXT:    br label %for.end
685; PROLOG:       for.end:
686; PROLOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ]
687; PROLOG-NEXT:    ret i32 %sum.0.lcssa
688; PROLOG:       for.exit2.loopexit:
689; 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 ], [ %add.3, %for.body.3 ], [ 42, %for.exiting_block.4 ], [ %add.4, %for.body.4 ], [ 42, %for.exiting_block.5 ], [ %add.5, %for.body.5 ], [ 42, %for.exiting_block.6 ], [ %add.6, %for.body.6 ], [ 42, %for.exiting_block.7 ]
690; PROLOG-NEXT:    br label %for.exit2
691; PROLOG:       for.exit2.loopexit1:
692; PROLOG-NEXT:    %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
693; PROLOG-NEXT:    br label %for.exit2
694; PROLOG:       for.exit2:
695; PROLOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
696; PROLOG-NEXT:    ret i32 %retval
697;
698; PROLOG-BLOCK-LABEL: @test2(
699; PROLOG-BLOCK-NEXT:  entry:
700; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n
701; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
702; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
703; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
704; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
705; PROLOG-BLOCK:       header.prol.preheader:
706; PROLOG-BLOCK-NEXT:    br label %header.prol
707; PROLOG-BLOCK:       header.prol:
708; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.prol
709; PROLOG-BLOCK:       for.exiting_block.prol:
710; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
711; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %for.body.prol
712; PROLOG-BLOCK:       for.body.prol:
713; PROLOG-BLOCK-NEXT:    %2 = load i32, ptr %a, align 4
714; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
715; PROLOG-BLOCK:       header.prol.loopexit:
716; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.unr = phi i32 [ poison, %entry ], [ %2, %for.body.prol ]
717; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %for.body.prol ]
718; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %for.body.prol ]
719; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 1
720; PROLOG-BLOCK-NEXT:    br i1 %3, label %for.end, label %entry.new
721; PROLOG-BLOCK:       entry.new:
722; PROLOG-BLOCK-NEXT:    br label %header
723; PROLOG-BLOCK:       header:
724; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ]
725; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %for.body.1 ]
726; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
727; PROLOG-BLOCK:       for.exiting_block:
728; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
729; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
730; PROLOG-BLOCK:       for.body:
731; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
732; PROLOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx, align 4
733; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.02
734; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
735; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
736; PROLOG-BLOCK:       for.exiting_block.1:
737; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
738; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
739; PROLOG-BLOCK:       for.body.1:
740; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
741; PROLOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.1, align 4
742; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add
743; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2
744; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
745; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %for.end.unr-lcssa, label %header, !llvm.loop !2
746; PROLOG-BLOCK:       for.end.unr-lcssa:
747; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %for.body.1 ]
748; PROLOG-BLOCK-NEXT:    br label %for.end
749; PROLOG-BLOCK:       for.end:
750; PROLOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ]
751; PROLOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
752; PROLOG-BLOCK:       for.exit2.loopexit:
753; PROLOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ]
754; PROLOG-BLOCK-NEXT:    br label %for.exit2
755; PROLOG-BLOCK:       for.exit2:
756; PROLOG-BLOCK-NEXT:    %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ]
757; PROLOG-BLOCK-NEXT:    ret i32 %retval
758;
759
760
761entry:
762  br label %header
763
764header:
765  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
766  %sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ]
767  br i1 false, label %for.exit2, label %for.exiting_block
768
769for.exiting_block:
770  %cmp = icmp eq i64 %n, 42
771  br i1 %cmp, label %for.exit2, label %for.body
772
773for.body:
774  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
775  %0 = load i32, ptr %arrayidx, align 4
776  %add = add nsw i32 %0, %sum.02
777  %indvars.iv.next = add i64 %indvars.iv, 1
778  %exitcond = icmp eq i64 %indvars.iv.next, %n
779  br i1 %exitcond, label %for.end, label %header
780
781for.end:                                          ; preds = %for.body
782  %sum.0.lcssa = phi i32 [ %add, %for.body ]
783  ret i32 %sum.0.lcssa
784
785for.exit2:
786  %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ]
787  ret i32 %retval
788}
789
790; test with two exiting and three exit blocks.
791; the non-latch exiting block has a switch.
792define void @test3(i64 %trip, i64 %add, i1 %arg) {
793; EPILOG-LABEL: @test3(
794; EPILOG-NEXT:  entry:
795; EPILOG-NEXT:    %0 = freeze i64 %trip
796; EPILOG-NEXT:    %1 = add i64 %0, -1
797; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
798; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
799; EPILOG-NEXT:    br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new
800; EPILOG:       entry.new:
801; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
802; EPILOG-NEXT:    br label %loop_header
803; EPILOG:       loop_header:
804; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
805; EPILOG-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
806; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
807; EPILOG-NEXT:    br i1 %arg, label %loop_latch, label %loop_exiting_bb1
808; EPILOG:       loop_exiting_bb1:
809; EPILOG-NEXT:    switch i64 %sum, label %loop_latch [
810; EPILOG-NEXT:      i64 24, label %exit1.loopexit
811; EPILOG-NEXT:      i64 42, label %exit3.loopexit
812; EPILOG-NEXT:    ]
813; EPILOG:       exit3.loopexit:
814; EPILOG-NEXT:    br label %exit3
815; EPILOG:       exit3.loopexit2:
816; EPILOG-NEXT:    br label %exit3
817; EPILOG:       exit3:
818; EPILOG-NEXT:    ret void
819; EPILOG:       loop_latch:
820; EPILOG-NEXT:    %sum.next = add i64 %sum, %add
821; EPILOG-NEXT:    br i1 %arg, label %loop_latch.1, label %loop_exiting_bb1.1
822; EPILOG:       loop_exiting_bb1.1:
823; EPILOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
824; EPILOG-NEXT:      i64 24, label %exit1.loopexit
825; EPILOG-NEXT:      i64 42, label %exit3.loopexit
826; EPILOG-NEXT:    ]
827; EPILOG:       loop_latch.1:
828; EPILOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
829; EPILOG-NEXT:    br i1 %arg, label %loop_latch.2, label %loop_exiting_bb1.2
830; EPILOG:       loop_exiting_bb1.2:
831; EPILOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
832; EPILOG-NEXT:      i64 24, label %exit1.loopexit
833; EPILOG-NEXT:      i64 42, label %exit3.loopexit
834; EPILOG-NEXT:    ]
835; EPILOG:       loop_latch.2:
836; EPILOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
837; EPILOG-NEXT:    br i1 %arg, label %loop_latch.3, label %loop_exiting_bb1.3
838; EPILOG:       loop_exiting_bb1.3:
839; EPILOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
840; EPILOG-NEXT:      i64 24, label %exit1.loopexit
841; EPILOG-NEXT:      i64 42, label %exit3.loopexit
842; EPILOG-NEXT:    ]
843; EPILOG:       loop_latch.3:
844; EPILOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
845; EPILOG-NEXT:    br i1 %arg, label %loop_latch.4, label %loop_exiting_bb1.4
846; EPILOG:       loop_exiting_bb1.4:
847; EPILOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
848; EPILOG-NEXT:      i64 24, label %exit1.loopexit
849; EPILOG-NEXT:      i64 42, label %exit3.loopexit
850; EPILOG-NEXT:    ]
851; EPILOG:       loop_latch.4:
852; EPILOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
853; EPILOG-NEXT:    br i1 %arg, label %loop_latch.5, label %loop_exiting_bb1.5
854; EPILOG:       loop_exiting_bb1.5:
855; EPILOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
856; EPILOG-NEXT:      i64 24, label %exit1.loopexit
857; EPILOG-NEXT:      i64 42, label %exit3.loopexit
858; EPILOG-NEXT:    ]
859; EPILOG:       loop_latch.5:
860; EPILOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
861; EPILOG-NEXT:    br i1 %arg, label %loop_latch.6, label %loop_exiting_bb1.6
862; EPILOG:       loop_exiting_bb1.6:
863; EPILOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
864; EPILOG-NEXT:      i64 24, label %exit1.loopexit
865; EPILOG-NEXT:      i64 42, label %exit3.loopexit
866; EPILOG-NEXT:    ]
867; EPILOG:       loop_latch.6:
868; EPILOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
869; EPILOG-NEXT:    br i1 %arg, label %loop_latch.7, label %loop_exiting_bb1.7
870; EPILOG:       loop_exiting_bb1.7:
871; EPILOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
872; EPILOG-NEXT:      i64 24, label %exit1.loopexit
873; EPILOG-NEXT:      i64 42, label %exit3.loopexit
874; EPILOG-NEXT:    ]
875; EPILOG:       loop_latch.7:
876; EPILOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv, 8
877; EPILOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
878; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 8
879; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
880; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit
881; EPILOG:       exit1.loopexit:
882; EPILOG-NEXT:    br label %exit1
883; EPILOG:       exit1.loopexit1:
884; EPILOG-NEXT:    br label %exit1
885; EPILOG:       exit1:
886; EPILOG-NEXT:    ret void
887; EPILOG:       exit2.loopexit.unr-lcssa.loopexit:
888; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
889; EPILOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
890; EPILOG-NEXT:    br label %exit2.loopexit.unr-lcssa
891; EPILOG:       exit2.loopexit.unr-lcssa:
892; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
893; EPILOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
894; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
895; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
896; EPILOG:       loop_header.epil.preheader:
897; EPILOG-NEXT:    br label %loop_header.epil
898; EPILOG:       loop_header.epil:
899; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
900; EPILOG-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]
901; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
902; EPILOG-NEXT:    br i1 %arg, label %loop_latch.epil, label %loop_exiting_bb1.epil
903; EPILOG:       loop_exiting_bb1.epil:
904; EPILOG-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
905; EPILOG-NEXT:      i64 24, label %exit1.loopexit1
906; EPILOG-NEXT:      i64 42, label %exit3.loopexit2
907; EPILOG-NEXT:    ]
908; EPILOG:       loop_latch.epil:
909; EPILOG-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
910; EPILOG-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
911; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
912; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
913; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
914; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !3
915; EPILOG:       exit2.loopexit.epilog-lcssa:
916; EPILOG-NEXT:    br label %exit2.loopexit
917; EPILOG:       exit2.loopexit:
918; EPILOG-NEXT:    ret void
919;
920; EPILOG-BLOCK-LABEL: @test3(
921; EPILOG-BLOCK-NEXT:  entry:
922; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
923; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
924; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
925; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
926; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new
927; EPILOG-BLOCK:       entry.new:
928; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
929; EPILOG-BLOCK-NEXT:    br label %loop_header
930; EPILOG-BLOCK:       loop_header:
931; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
932; EPILOG-BLOCK-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
933; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
934; EPILOG-BLOCK-NEXT:    br i1 %arg, label %loop_latch, label %loop_exiting_bb1
935; EPILOG-BLOCK:       loop_exiting_bb1:
936; EPILOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
937; EPILOG-BLOCK-NEXT:      i64 24, label %exit1.loopexit
938; EPILOG-BLOCK-NEXT:      i64 42, label %exit3.loopexit
939; EPILOG-BLOCK-NEXT:    ]
940; EPILOG-BLOCK:       exit3.loopexit:
941; EPILOG-BLOCK-NEXT:    br label %exit3
942; EPILOG-BLOCK:       exit3:
943; EPILOG-BLOCK-NEXT:    ret void
944; EPILOG-BLOCK:       loop_latch:
945; EPILOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
946; EPILOG-BLOCK-NEXT:    br i1 %arg, label %loop_latch.1, label %loop_exiting_bb1.1
947; EPILOG-BLOCK:       loop_exiting_bb1.1:
948; EPILOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
949; EPILOG-BLOCK-NEXT:      i64 24, label %exit1.loopexit
950; EPILOG-BLOCK-NEXT:      i64 42, label %exit3.loopexit
951; EPILOG-BLOCK-NEXT:    ]
952; EPILOG-BLOCK:       loop_latch.1:
953; EPILOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv, 2
954; EPILOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
955; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 2
956; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
957; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !3
958; EPILOG-BLOCK:       exit1.loopexit:
959; EPILOG-BLOCK-NEXT:    br label %exit1
960; EPILOG-BLOCK:       exit1:
961; EPILOG-BLOCK-NEXT:    ret void
962; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa.loopexit:
963; EPILOG-BLOCK-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
964; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit.unr-lcssa
965; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa:
966; EPILOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
967; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
968; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
969; EPILOG-BLOCK:       loop_header.epil.preheader:
970; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
971; EPILOG-BLOCK:       loop_header.epil:
972; EPILOG-BLOCK-NEXT:    br i1 %arg, label %loop_latch.epil, label %loop_exiting_bb1.epil
973; EPILOG-BLOCK:       loop_exiting_bb1.epil:
974; EPILOG-BLOCK-NEXT:    switch i64 %sum.unr, label %loop_latch.epil [
975; EPILOG-BLOCK-NEXT:      i64 24, label %exit1
976; EPILOG-BLOCK-NEXT:      i64 42, label %exit3
977; EPILOG-BLOCK-NEXT:    ]
978; EPILOG-BLOCK:       loop_latch.epil:
979; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit
980; EPILOG-BLOCK:       exit2.loopexit:
981; EPILOG-BLOCK-NEXT:    ret void
982;
983; PROLOG-LABEL: @test3(
984; PROLOG-NEXT:  entry:
985; PROLOG-NEXT:    %0 = freeze i64 %trip
986; PROLOG-NEXT:    %1 = add i64 %0, -1
987; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
988; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
989; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
990; PROLOG:       loop_header.prol.preheader:
991; PROLOG-NEXT:    br label %loop_header.prol
992; PROLOG:       loop_header.prol:
993; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
994; PROLOG-NEXT:    %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ]
995; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
996; PROLOG-NEXT:    br i1 %arg, label %loop_latch.prol, label %loop_exiting_bb1.prol
997; PROLOG:       loop_exiting_bb1.prol:
998; PROLOG-NEXT:    switch i64 %sum.prol, label %loop_latch.prol [
999; PROLOG-NEXT:      i64 24, label %exit1.loopexit1
1000; PROLOG-NEXT:      i64 42, label %exit3.loopexit2
1001; PROLOG-NEXT:    ]
1002; PROLOG:       loop_latch.prol:
1003; PROLOG-NEXT:    %iv_next.prol = add nuw nsw i64 %iv.prol, 1
1004; PROLOG-NEXT:    %sum.next.prol = add i64 %sum.prol, %add
1005; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
1006; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
1007; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
1008; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !3
1009; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
1010; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
1011; PROLOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
1012; PROLOG-NEXT:    br label %loop_header.prol.loopexit
1013; PROLOG:       loop_header.prol.loopexit:
1014; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
1015; PROLOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
1016; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
1017; PROLOG-NEXT:    br i1 %2, label %exit2.loopexit, label %entry.new
1018; PROLOG:       entry.new:
1019; PROLOG-NEXT:    br label %loop_header
1020; PROLOG:       loop_header:
1021; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
1022; PROLOG-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
1023; PROLOG-NEXT:    br i1 %arg, label %loop_latch, label %loop_exiting_bb1
1024; PROLOG:       loop_exiting_bb1:
1025; PROLOG-NEXT:    switch i64 %sum, label %loop_latch [
1026; PROLOG-NEXT:      i64 24, label %exit1.loopexit
1027; PROLOG-NEXT:      i64 42, label %exit3.loopexit
1028; PROLOG-NEXT:    ]
1029; PROLOG:       exit3.loopexit:
1030; PROLOG-NEXT:    br label %exit3
1031; PROLOG:       exit3.loopexit2:
1032; PROLOG-NEXT:    br label %exit3
1033; PROLOG:       exit3:
1034; PROLOG-NEXT:    ret void
1035; PROLOG:       loop_latch:
1036; PROLOG-NEXT:    %sum.next = add i64 %sum, %add
1037; PROLOG-NEXT:    br i1 %arg, label %loop_latch.1, label %loop_exiting_bb1.1
1038; PROLOG:       loop_exiting_bb1.1:
1039; PROLOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
1040; PROLOG-NEXT:      i64 24, label %exit1.loopexit
1041; PROLOG-NEXT:      i64 42, label %exit3.loopexit
1042; PROLOG-NEXT:    ]
1043; PROLOG:       loop_latch.1:
1044; PROLOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
1045; PROLOG-NEXT:    br i1 %arg, label %loop_latch.2, label %loop_exiting_bb1.2
1046; PROLOG:       loop_exiting_bb1.2:
1047; PROLOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
1048; PROLOG-NEXT:      i64 24, label %exit1.loopexit
1049; PROLOG-NEXT:      i64 42, label %exit3.loopexit
1050; PROLOG-NEXT:    ]
1051; PROLOG:       loop_latch.2:
1052; PROLOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
1053; PROLOG-NEXT:    br i1 %arg, label %loop_latch.3, label %loop_exiting_bb1.3
1054; PROLOG:       loop_exiting_bb1.3:
1055; PROLOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
1056; PROLOG-NEXT:      i64 24, label %exit1.loopexit
1057; PROLOG-NEXT:      i64 42, label %exit3.loopexit
1058; PROLOG-NEXT:    ]
1059; PROLOG:       loop_latch.3:
1060; PROLOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
1061; PROLOG-NEXT:    br i1 %arg, label %loop_latch.4, label %loop_exiting_bb1.4
1062; PROLOG:       loop_exiting_bb1.4:
1063; PROLOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
1064; PROLOG-NEXT:      i64 24, label %exit1.loopexit
1065; PROLOG-NEXT:      i64 42, label %exit3.loopexit
1066; PROLOG-NEXT:    ]
1067; PROLOG:       loop_latch.4:
1068; PROLOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
1069; PROLOG-NEXT:    br i1 %arg, label %loop_latch.5, label %loop_exiting_bb1.5
1070; PROLOG:       loop_exiting_bb1.5:
1071; PROLOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
1072; PROLOG-NEXT:      i64 24, label %exit1.loopexit
1073; PROLOG-NEXT:      i64 42, label %exit3.loopexit
1074; PROLOG-NEXT:    ]
1075; PROLOG:       loop_latch.5:
1076; PROLOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
1077; PROLOG-NEXT:    br i1 %arg, label %loop_latch.6, label %loop_exiting_bb1.6
1078; PROLOG:       loop_exiting_bb1.6:
1079; PROLOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
1080; PROLOG-NEXT:      i64 24, label %exit1.loopexit
1081; PROLOG-NEXT:      i64 42, label %exit3.loopexit
1082; PROLOG-NEXT:    ]
1083; PROLOG:       loop_latch.6:
1084; PROLOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
1085; PROLOG-NEXT:    br i1 %arg, label %loop_latch.7, label %loop_exiting_bb1.7
1086; PROLOG:       loop_exiting_bb1.7:
1087; PROLOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
1088; PROLOG-NEXT:      i64 24, label %exit1.loopexit
1089; PROLOG-NEXT:      i64 42, label %exit3.loopexit
1090; PROLOG-NEXT:    ]
1091; PROLOG:       loop_latch.7:
1092; PROLOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv, 8
1093; PROLOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
1094; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
1095; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa
1096; PROLOG:       exit1.loopexit:
1097; PROLOG-NEXT:    br label %exit1
1098; PROLOG:       exit1.loopexit1:
1099; PROLOG-NEXT:    br label %exit1
1100; PROLOG:       exit1:
1101; PROLOG-NEXT:    ret void
1102; PROLOG:       exit2.loopexit.unr-lcssa:
1103; PROLOG-NEXT:    br label %exit2.loopexit
1104; PROLOG:       exit2.loopexit:
1105; PROLOG-NEXT:    ret void
1106;
1107; PROLOG-BLOCK-LABEL: @test3(
1108; PROLOG-BLOCK-NEXT:  entry:
1109; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
1110; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
1111; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
1112; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1113; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
1114; PROLOG-BLOCK:       loop_header.prol.preheader:
1115; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
1116; PROLOG-BLOCK:       loop_header.prol:
1117; PROLOG-BLOCK-NEXT:    br i1 %arg, label %loop_latch.prol, label %loop_exiting_bb1.prol
1118; PROLOG-BLOCK:       loop_exiting_bb1.prol:
1119; PROLOG-BLOCK-NEXT:    switch i64 0, label %loop_latch.prol [
1120; PROLOG-BLOCK-NEXT:      i64 24, label %exit1
1121; PROLOG-BLOCK-NEXT:      i64 42, label %exit3
1122; PROLOG-BLOCK-NEXT:    ]
1123; PROLOG-BLOCK:       loop_latch.prol:
1124; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
1125; PROLOG-BLOCK:       loop_header.prol.loopexit:
1126; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
1127; PROLOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %add, %loop_latch.prol ]
1128; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
1129; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit2.loopexit, label %entry.new
1130; PROLOG-BLOCK:       entry.new:
1131; PROLOG-BLOCK-NEXT:    br label %loop_header
1132; PROLOG-BLOCK:       loop_header:
1133; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
1134; PROLOG-BLOCK-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
1135; PROLOG-BLOCK-NEXT:    br i1 %arg, label %loop_latch, label %loop_exiting_bb1
1136; PROLOG-BLOCK:       loop_exiting_bb1:
1137; PROLOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
1138; PROLOG-BLOCK-NEXT:      i64 24, label %exit1.loopexit
1139; PROLOG-BLOCK-NEXT:      i64 42, label %exit3.loopexit
1140; PROLOG-BLOCK-NEXT:    ]
1141; PROLOG-BLOCK:       exit3.loopexit:
1142; PROLOG-BLOCK-NEXT:    br label %exit3
1143; PROLOG-BLOCK:       exit3:
1144; PROLOG-BLOCK-NEXT:    ret void
1145; PROLOG-BLOCK:       loop_latch:
1146; PROLOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
1147; PROLOG-BLOCK-NEXT:    br i1 %arg, label %loop_latch.1, label %loop_exiting_bb1.1
1148; PROLOG-BLOCK:       loop_exiting_bb1.1:
1149; PROLOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
1150; PROLOG-BLOCK-NEXT:      i64 24, label %exit1.loopexit
1151; PROLOG-BLOCK-NEXT:      i64 42, label %exit3.loopexit
1152; PROLOG-BLOCK-NEXT:    ]
1153; PROLOG-BLOCK:       loop_latch.1:
1154; PROLOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv, 2
1155; PROLOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
1156; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
1157; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !3
1158; PROLOG-BLOCK:       exit1.loopexit:
1159; PROLOG-BLOCK-NEXT:    br label %exit1
1160; PROLOG-BLOCK:       exit1:
1161; PROLOG-BLOCK-NEXT:    ret void
1162; PROLOG-BLOCK:       exit2.loopexit.unr-lcssa:
1163; PROLOG-BLOCK-NEXT:    br label %exit2.loopexit
1164; PROLOG-BLOCK:       exit2.loopexit:
1165; PROLOG-BLOCK-NEXT:    ret void
1166;
1167
1168entry:
1169  br label %loop_header
1170
1171loop_header:
1172  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
1173  %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ]
1174  br i1 %arg, label %loop_latch, label %loop_exiting_bb1
1175
1176loop_exiting_bb1:
1177  switch i64 %sum, label %loop_latch [
1178  i64 24, label %exit1
1179  i64 42, label %exit3
1180  ]
1181
1182exit3:
1183  ret void
1184
1185loop_latch:
1186  %iv_next = add nuw nsw i64 %iv, 1
1187  %sum.next = add i64 %sum, %add
1188  %cmp = icmp ne i64 %iv_next, %trip
1189  br i1 %cmp, label %loop_header, label %exit2.loopexit
1190
1191exit1:
1192  ret void
1193
1194exit2.loopexit:
1195  ret void
1196}
1197
1198; FIXME: Support multiple exiting blocks to the same latch exit block.
1199; Three exiting blocks where header and latch exit to same LatchExit.
1200define i32 @hdr_latch_same_exit(ptr nocapture %a, i64 %n, i1 %cond) {
1201; EPILOG-LABEL: @hdr_latch_same_exit(
1202; EPILOG-NEXT:  entry:
1203; EPILOG-NEXT:    %0 = freeze i64 %n
1204; EPILOG-NEXT:    %1 = add i64 %0, -1
1205; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
1206; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
1207; EPILOG-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
1208; EPILOG:       entry.new:
1209; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
1210; EPILOG-NEXT:    br label %header
1211; EPILOG:       header:
1212; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
1213; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
1214; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
1215; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block
1216; EPILOG:       for.exiting_block:
1217; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
1218; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1219; EPILOG:       latch:
1220; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
1221; EPILOG-NEXT:    %3 = load i32, ptr %arrayidx, align 4
1222; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.02
1223; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1224; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.1
1225; EPILOG:       for.exiting_block.1:
1226; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1227; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1228; EPILOG:       latch.1:
1229; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
1230; EPILOG-NEXT:    %4 = load i32, ptr %arrayidx.1, align 4
1231; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
1232; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2
1233; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.2
1234; EPILOG:       for.exiting_block.2:
1235; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1236; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
1237; EPILOG:       latch.2:
1238; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1
1239; EPILOG-NEXT:    %5 = load i32, ptr %arrayidx.2, align 4
1240; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
1241; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 3
1242; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.3
1243; EPILOG:       for.exiting_block.3:
1244; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1245; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
1246; EPILOG:       latch.3:
1247; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2
1248; EPILOG-NEXT:    %6 = load i32, ptr %arrayidx.3, align 4
1249; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
1250; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4
1251; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.4
1252; EPILOG:       for.exiting_block.4:
1253; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1254; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
1255; EPILOG:       latch.4:
1256; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3
1257; EPILOG-NEXT:    %7 = load i32, ptr %arrayidx.4, align 4
1258; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
1259; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv, 5
1260; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.5
1261; EPILOG:       for.exiting_block.5:
1262; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1263; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
1264; EPILOG:       latch.5:
1265; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4
1266; EPILOG-NEXT:    %8 = load i32, ptr %arrayidx.5, align 4
1267; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
1268; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv, 6
1269; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.6
1270; EPILOG:       for.exiting_block.6:
1271; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
1272; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
1273; EPILOG:       latch.6:
1274; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5
1275; EPILOG-NEXT:    %9 = load i32, ptr %arrayidx.6, align 4
1276; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
1277; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv, 7
1278; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.7
1279; EPILOG:       for.exiting_block.7:
1280; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
1281; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
1282; EPILOG:       latch.7:
1283; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6
1284; EPILOG-NEXT:    %10 = load i32, ptr %arrayidx.7, align 4
1285; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
1286; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 8
1287; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 8
1288; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
1289; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
1290; EPILOG:       latchExit.unr-lcssa.loopexit:
1291; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
1292; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
1293; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
1294; EPILOG-NEXT:    br label %latchExit.unr-lcssa
1295; EPILOG:       latchExit.unr-lcssa:
1296; EPILOG-NEXT:    %result.ph = phi i32 [ poison, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1297; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1298; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1299; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1300; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1301; EPILOG:       header.epil.preheader:
1302; EPILOG-NEXT:    br label %header.epil
1303; EPILOG:       header.epil:
1304; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
1305; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
1306; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
1307; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit2, label %for.exiting_block.epil
1308; EPILOG:       for.exiting_block.epil:
1309; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1310; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit4, label %latch.epil
1311; EPILOG:       latch.epil:
1312; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil
1313; EPILOG-NEXT:    %11 = load i32, ptr %arrayidx.epil, align 4
1314; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil
1315; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
1316; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
1317; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
1318; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
1319; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit2, !llvm.loop !4
1320; EPILOG:       latchExit.epilog-lcssa.loopexit:
1321; EPILOG-NEXT:    %result.ph1.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ 0, %latch.1 ], [ 0, %latch.2 ], [ 0, %latch.3 ], [ 0, %latch.4 ], [ 0, %latch.5 ], [ 0, %latch.6 ]
1322; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1323; EPILOG:       latchExit.epilog-lcssa.loopexit2:
1324; EPILOG-NEXT:    %result.ph1.ph3 = phi i32 [ 0, %header.epil ], [ %add.epil, %latch.epil ]
1325; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1326; EPILOG:       latchExit.epilog-lcssa:
1327; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph3, %latchExit.epilog-lcssa.loopexit2 ]
1328; EPILOG-NEXT:    br label %latchExit
1329; EPILOG:       latchExit:
1330; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1331; EPILOG-NEXT:    ret i32 %result
1332; EPILOG:       for.exit2.loopexit:
1333; EPILOG-NEXT:    br label %for.exit2
1334; EPILOG:       for.exit2.loopexit4:
1335; EPILOG-NEXT:    br label %for.exit2
1336; EPILOG:       for.exit2:
1337; EPILOG-NEXT:    ret i32 42
1338;
1339; EPILOG-BLOCK-LABEL: @hdr_latch_same_exit(
1340; EPILOG-BLOCK-NEXT:  entry:
1341; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n
1342; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
1343; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
1344; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
1345; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
1346; EPILOG-BLOCK:       entry.new:
1347; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
1348; EPILOG-BLOCK-NEXT:    br label %header
1349; EPILOG-BLOCK:       header:
1350; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
1351; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
1352; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
1353; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block
1354; EPILOG-BLOCK:       for.exiting_block:
1355; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
1356; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1357; EPILOG-BLOCK:       latch:
1358; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
1359; EPILOG-BLOCK-NEXT:    %3 = load i32, ptr %arrayidx, align 4
1360; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
1361; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1362; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.1
1363; EPILOG-BLOCK:       for.exiting_block.1:
1364; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1365; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1366; EPILOG-BLOCK:       latch.1:
1367; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
1368; EPILOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx.1, align 4
1369; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
1370; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2
1371; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 2
1372; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
1373; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !4
1374; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
1375; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
1376; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
1377; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
1378; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
1379; EPILOG-BLOCK:       latchExit.unr-lcssa:
1380; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ poison, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1381; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1382; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1383; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1384; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1385; EPILOG-BLOCK:       header.epil.preheader:
1386; EPILOG-BLOCK-NEXT:    br label %header.epil
1387; EPILOG-BLOCK:       header.epil:
1388; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa, label %for.exiting_block.epil
1389; EPILOG-BLOCK:       for.exiting_block.epil:
1390; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1391; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %latch.epil
1392; EPILOG-BLOCK:       latch.epil:
1393; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.unr
1394; EPILOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.epil, align 4
1395; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.unr
1396; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1397; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
1398; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ 0, %header ], [ 0, %latch ]
1399; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1400; EPILOG-BLOCK:       latchExit.epilog-lcssa:
1401; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 0, %header.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
1402; EPILOG-BLOCK-NEXT:    br label %latchExit
1403; EPILOG-BLOCK:       latchExit:
1404; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1405; EPILOG-BLOCK-NEXT:    ret i32 %result
1406; EPILOG-BLOCK:       for.exit2.loopexit:
1407; EPILOG-BLOCK-NEXT:    br label %for.exit2
1408; EPILOG-BLOCK:       for.exit2:
1409; EPILOG-BLOCK-NEXT:    ret i32 42
1410;
1411; PROLOG-LABEL: @hdr_latch_same_exit(
1412; PROLOG-NEXT:  entry:
1413; PROLOG-NEXT:    %0 = freeze i64 %n
1414; PROLOG-NEXT:    %1 = add i64 %0, -1
1415; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
1416; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1417; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
1418; PROLOG:       header.prol.preheader:
1419; PROLOG-NEXT:    br label %header.prol
1420; PROLOG:       header.prol:
1421; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
1422; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
1423; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
1424; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit1, label %for.exiting_block.prol
1425; PROLOG:       for.exiting_block.prol:
1426; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
1427; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit3, label %latch.prol
1428; PROLOG:       latch.prol:
1429; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.prol
1430; PROLOG-NEXT:    %2 = load i32, ptr %arrayidx.prol, align 4
1431; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol
1432; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
1433; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
1434; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
1435; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
1436; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !4
1437; PROLOG:       header.prol.loopexit.unr-lcssa:
1438; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
1439; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
1440; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
1441; PROLOG-NEXT:    br label %header.prol.loopexit
1442; PROLOG:       header.prol.loopexit:
1443; PROLOG-NEXT:    %result.unr = phi i32 [ poison, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
1444; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
1445; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
1446; PROLOG-NEXT:    %3 = icmp ult i64 %1, 7
1447; PROLOG-NEXT:    br i1 %3, label %latchExit, label %entry.new
1448; PROLOG:       entry.new:
1449; PROLOG-NEXT:    br label %header
1450; PROLOG:       header:
1451; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
1452; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
1453; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block
1454; PROLOG:       for.exiting_block:
1455; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
1456; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1457; PROLOG:       latch:
1458; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
1459; PROLOG-NEXT:    %4 = load i32, ptr %arrayidx, align 4
1460; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.02
1461; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
1462; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.1
1463; PROLOG:       for.exiting_block.1:
1464; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1465; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1466; PROLOG:       latch.1:
1467; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
1468; PROLOG-NEXT:    %5 = load i32, ptr %arrayidx.1, align 4
1469; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add
1470; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2
1471; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.2
1472; PROLOG:       for.exiting_block.2:
1473; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1474; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
1475; PROLOG:       latch.2:
1476; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1
1477; PROLOG-NEXT:    %6 = load i32, ptr %arrayidx.2, align 4
1478; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.1
1479; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv, 3
1480; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.3
1481; PROLOG:       for.exiting_block.3:
1482; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1483; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
1484; PROLOG:       latch.3:
1485; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2
1486; PROLOG-NEXT:    %7 = load i32, ptr %arrayidx.3, align 4
1487; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.2
1488; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv, 4
1489; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.4
1490; PROLOG:       for.exiting_block.4:
1491; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1492; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
1493; PROLOG:       latch.4:
1494; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3
1495; PROLOG-NEXT:    %8 = load i32, ptr %arrayidx.4, align 4
1496; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.3
1497; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv, 5
1498; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.5
1499; PROLOG:       for.exiting_block.5:
1500; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1501; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
1502; PROLOG:       latch.5:
1503; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4
1504; PROLOG-NEXT:    %9 = load i32, ptr %arrayidx.5, align 4
1505; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.4
1506; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv, 6
1507; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.6
1508; PROLOG:       for.exiting_block.6:
1509; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
1510; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
1511; PROLOG:       latch.6:
1512; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5
1513; PROLOG-NEXT:    %10 = load i32, ptr %arrayidx.6, align 4
1514; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.5
1515; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv, 7
1516; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.7
1517; PROLOG:       for.exiting_block.7:
1518; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
1519; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
1520; PROLOG:       latch.7:
1521; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6
1522; PROLOG-NEXT:    %11 = load i32, ptr %arrayidx.7, align 4
1523; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.6
1524; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 8
1525; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
1526; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
1527; PROLOG:       latchExit.unr-lcssa.loopexit:
1528; PROLOG-NEXT:    %result.ph.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ 0, %latch.1 ], [ 0, %latch.2 ], [ 0, %latch.3 ], [ 0, %latch.4 ], [ 0, %latch.5 ], [ 0, %latch.6 ], [ %add.7, %latch.7 ]
1529; PROLOG-NEXT:    br label %latchExit.unr-lcssa
1530; PROLOG:       latchExit.unr-lcssa.loopexit1:
1531; PROLOG-NEXT:    %result.ph.ph2 = phi i32 [ 0, %header.prol ]
1532; PROLOG-NEXT:    br label %latchExit.unr-lcssa
1533; PROLOG:       latchExit.unr-lcssa:
1534; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph2, %latchExit.unr-lcssa.loopexit1 ]
1535; PROLOG-NEXT:    br label %latchExit
1536; PROLOG:       latchExit:
1537; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
1538; PROLOG-NEXT:    ret i32 %result
1539; PROLOG:       for.exit2.loopexit:
1540; PROLOG-NEXT:    br label %for.exit2
1541; PROLOG:       for.exit2.loopexit3:
1542; PROLOG-NEXT:    br label %for.exit2
1543; PROLOG:       for.exit2:
1544; PROLOG-NEXT:    ret i32 42
1545;
1546; PROLOG-BLOCK-LABEL: @hdr_latch_same_exit(
1547; PROLOG-BLOCK-NEXT:  entry:
1548; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n
1549; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
1550; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
1551; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1552; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
1553; PROLOG-BLOCK:       header.prol.preheader:
1554; PROLOG-BLOCK-NEXT:    br label %header.prol
1555; PROLOG-BLOCK:       header.prol:
1556; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.unr-lcssa, label %for.exiting_block.prol
1557; PROLOG-BLOCK:       for.exiting_block.prol:
1558; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
1559; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %latch.prol
1560; PROLOG-BLOCK:       latch.prol:
1561; PROLOG-BLOCK-NEXT:    %2 = load i32, ptr %a, align 4
1562; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
1563; PROLOG-BLOCK:       header.prol.loopexit:
1564; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ poison, %entry ], [ %2, %latch.prol ]
1565; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
1566; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ]
1567; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 1
1568; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchExit, label %entry.new
1569; PROLOG-BLOCK:       entry.new:
1570; PROLOG-BLOCK-NEXT:    br label %header
1571; PROLOG-BLOCK:       header:
1572; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
1573; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
1574; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block
1575; PROLOG-BLOCK:       for.exiting_block:
1576; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
1577; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1578; PROLOG-BLOCK:       latch:
1579; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
1580; PROLOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx, align 4
1581; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.02
1582; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
1583; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.1
1584; PROLOG-BLOCK:       for.exiting_block.1:
1585; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1586; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1587; PROLOG-BLOCK:       latch.1:
1588; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
1589; PROLOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.1, align 4
1590; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add
1591; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2
1592; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
1593; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !4
1594; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
1595; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ %add.1, %latch.1 ]
1596; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
1597; PROLOG-BLOCK:       latchExit.unr-lcssa:
1598; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %header.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1599; PROLOG-BLOCK-NEXT:    br label %latchExit
1600; PROLOG-BLOCK:       latchExit:
1601; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
1602; PROLOG-BLOCK-NEXT:    ret i32 %result
1603; PROLOG-BLOCK:       for.exit2.loopexit:
1604; PROLOG-BLOCK-NEXT:    br label %for.exit2
1605; PROLOG-BLOCK:       for.exit2:
1606; PROLOG-BLOCK-NEXT:    ret i32 42
1607;
1608
1609entry:
1610  br label %header
1611
1612header:
1613  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
1614  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
1615  br i1 %cond, label %latchExit, label %for.exiting_block
1616
1617for.exiting_block:
1618  %cmp = icmp eq i64 %n, 42
1619  br i1 %cmp, label %for.exit2, label %latch
1620
1621latch:                                         ; preds = %latch, %entry
1622  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
1623  %0 = load i32, ptr %arrayidx, align 4
1624  %add = add nsw i32 %0, %sum.02
1625  %indvars.iv.next = add i64 %indvars.iv, 1
1626  %exitcond = icmp eq i64 %indvars.iv.next, %n
1627  br i1 %exitcond, label %latchExit, label %header
1628
1629latchExit:                                          ; preds = %latch, %entry
1630  %result = phi i32 [ 0, %header ], [ %add, %latch ]
1631  ret i32 %result
1632
1633for.exit2:
1634  ret i32 42
1635}
1636
1637; Two exiting blocks to latch where the exiting blocks are Latch and a
1638; non-header
1639; FIXME: We should unroll this loop.
1640define i32 @otherblock_latch_same_exit(ptr nocapture %a, i64 %n, i1 %cond) {
1641; EPILOG-LABEL: @otherblock_latch_same_exit(
1642; EPILOG-NEXT:  entry:
1643; EPILOG-NEXT:    %0 = freeze i64 %n
1644; EPILOG-NEXT:    %1 = add i64 %0, -1
1645; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
1646; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
1647; EPILOG-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
1648; EPILOG:       entry.new:
1649; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
1650; EPILOG-NEXT:    br label %header
1651; EPILOG:       header:
1652; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
1653; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
1654; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
1655; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
1656; EPILOG:       for.exiting_block:
1657; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
1658; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
1659; EPILOG:       latch:
1660; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
1661; EPILOG-NEXT:    %3 = load i32, ptr %arrayidx, align 4
1662; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.02
1663; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1664; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
1665; EPILOG:       for.exiting_block.1:
1666; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1667; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
1668; EPILOG:       latch.1:
1669; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
1670; EPILOG-NEXT:    %4 = load i32, ptr %arrayidx.1, align 4
1671; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
1672; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2
1673; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
1674; EPILOG:       for.exiting_block.2:
1675; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1676; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
1677; EPILOG:       latch.2:
1678; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1
1679; EPILOG-NEXT:    %5 = load i32, ptr %arrayidx.2, align 4
1680; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
1681; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 3
1682; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
1683; EPILOG:       for.exiting_block.3:
1684; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1685; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
1686; EPILOG:       latch.3:
1687; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2
1688; EPILOG-NEXT:    %6 = load i32, ptr %arrayidx.3, align 4
1689; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
1690; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4
1691; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
1692; EPILOG:       for.exiting_block.4:
1693; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1694; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
1695; EPILOG:       latch.4:
1696; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3
1697; EPILOG-NEXT:    %7 = load i32, ptr %arrayidx.4, align 4
1698; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
1699; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv, 5
1700; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
1701; EPILOG:       for.exiting_block.5:
1702; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1703; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
1704; EPILOG:       latch.5:
1705; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4
1706; EPILOG-NEXT:    %8 = load i32, ptr %arrayidx.5, align 4
1707; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
1708; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv, 6
1709; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
1710; EPILOG:       for.exiting_block.6:
1711; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
1712; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
1713; EPILOG:       latch.6:
1714; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5
1715; EPILOG-NEXT:    %9 = load i32, ptr %arrayidx.6, align 4
1716; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
1717; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv, 7
1718; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
1719; EPILOG:       for.exiting_block.7:
1720; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
1721; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
1722; EPILOG:       latch.7:
1723; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6
1724; EPILOG-NEXT:    %10 = load i32, ptr %arrayidx.7, align 4
1725; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
1726; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 8
1727; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 8
1728; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
1729; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
1730; EPILOG:       latchExit.unr-lcssa.loopexit:
1731; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
1732; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
1733; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
1734; EPILOG-NEXT:    br label %latchExit.unr-lcssa
1735; EPILOG:       latchExit.unr-lcssa:
1736; EPILOG-NEXT:    %result.ph = phi i32 [ poison, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1737; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1738; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1739; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1740; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1741; EPILOG:       header.epil.preheader:
1742; EPILOG-NEXT:    br label %header.epil
1743; EPILOG:       header.epil:
1744; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
1745; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
1746; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
1747; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
1748; EPILOG:       for.exiting_block.epil:
1749; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1750; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
1751; EPILOG:       latch.epil:
1752; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil
1753; EPILOG-NEXT:    %11 = load i32, ptr %arrayidx.epil, align 4
1754; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil
1755; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
1756; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
1757; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
1758; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
1759; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !5
1760; EPILOG:       latchExit.epilog-lcssa.loopexit:
1761; EPILOG-NEXT:    %result.ph1.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ 2, %for.exiting_block.2 ], [ 2, %for.exiting_block.3 ], [ 2, %for.exiting_block.4 ], [ 2, %for.exiting_block.5 ], [ 2, %for.exiting_block.6 ], [ 2, %for.exiting_block.7 ]
1762; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1763; EPILOG:       latchExit.epilog-lcssa.loopexit3:
1764; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ 2, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
1765; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1766; EPILOG:       latchExit.epilog-lcssa:
1767; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
1768; EPILOG-NEXT:    br label %latchExit
1769; EPILOG:       latchExit:
1770; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1771; EPILOG-NEXT:    ret i32 %result
1772; EPILOG:       for.exit2.loopexit:
1773; EPILOG-NEXT:    br label %for.exit2
1774; EPILOG:       for.exit2.loopexit2:
1775; EPILOG-NEXT:    br label %for.exit2
1776; EPILOG:       for.exit2:
1777; EPILOG-NEXT:    ret i32 42
1778;
1779; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit(
1780; EPILOG-BLOCK-NEXT:  entry:
1781; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n
1782; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
1783; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
1784; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
1785; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
1786; EPILOG-BLOCK:       entry.new:
1787; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
1788; EPILOG-BLOCK-NEXT:    br label %header
1789; EPILOG-BLOCK:       header:
1790; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
1791; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
1792; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
1793; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
1794; EPILOG-BLOCK:       for.exiting_block:
1795; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
1796; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
1797; EPILOG-BLOCK:       latch:
1798; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
1799; EPILOG-BLOCK-NEXT:    %3 = load i32, ptr %arrayidx, align 4
1800; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
1801; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1802; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
1803; EPILOG-BLOCK:       for.exiting_block.1:
1804; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1805; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
1806; EPILOG-BLOCK:       latch.1:
1807; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
1808; EPILOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx.1, align 4
1809; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
1810; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2
1811; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 2
1812; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
1813; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5
1814; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
1815; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
1816; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
1817; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
1818; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
1819; EPILOG-BLOCK:       latchExit.unr-lcssa:
1820; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ poison, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1821; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1822; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1823; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1824; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1825; EPILOG-BLOCK:       header.epil.preheader:
1826; EPILOG-BLOCK-NEXT:    br label %header.epil
1827; EPILOG-BLOCK:       header.epil:
1828; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
1829; EPILOG-BLOCK:       for.exiting_block.epil:
1830; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1831; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
1832; EPILOG-BLOCK:       latch.epil:
1833; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.unr
1834; EPILOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.epil, align 4
1835; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.unr
1836; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1837; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
1838; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ]
1839; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1840; EPILOG-BLOCK:       latchExit.epilog-lcssa:
1841; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 2, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
1842; EPILOG-BLOCK-NEXT:    br label %latchExit
1843; EPILOG-BLOCK:       latchExit:
1844; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1845; EPILOG-BLOCK-NEXT:    ret i32 %result
1846; EPILOG-BLOCK:       for.exit2.loopexit:
1847; EPILOG-BLOCK-NEXT:    br label %for.exit2
1848; EPILOG-BLOCK:       for.exit2:
1849; EPILOG-BLOCK-NEXT:    ret i32 42
1850;
1851; PROLOG-LABEL: @otherblock_latch_same_exit(
1852; PROLOG-NEXT:  entry:
1853; PROLOG-NEXT:    %0 = freeze i64 %n
1854; PROLOG-NEXT:    %1 = add i64 %0, -1
1855; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
1856; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1857; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
1858; PROLOG:       header.prol.preheader:
1859; PROLOG-NEXT:    br label %header.prol
1860; PROLOG:       header.prol:
1861; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
1862; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
1863; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
1864; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol
1865; PROLOG:       for.exiting_block.prol:
1866; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
1867; PROLOG-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol
1868; PROLOG:       latch.prol:
1869; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.prol
1870; PROLOG-NEXT:    %2 = load i32, ptr %arrayidx.prol, align 4
1871; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol
1872; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
1873; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
1874; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
1875; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
1876; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !5
1877; PROLOG:       header.prol.loopexit.unr-lcssa:
1878; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
1879; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
1880; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
1881; PROLOG-NEXT:    br label %header.prol.loopexit
1882; PROLOG:       header.prol.loopexit:
1883; PROLOG-NEXT:    %result.unr = phi i32 [ poison, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
1884; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
1885; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
1886; PROLOG-NEXT:    %3 = icmp ult i64 %1, 7
1887; PROLOG-NEXT:    br i1 %3, label %latchExit, label %entry.new
1888; PROLOG:       entry.new:
1889; PROLOG-NEXT:    br label %header
1890; PROLOG:       header:
1891; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
1892; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
1893; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
1894; PROLOG:       for.exiting_block:
1895; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
1896; PROLOG-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
1897; PROLOG:       latch:
1898; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
1899; PROLOG-NEXT:    %4 = load i32, ptr %arrayidx, align 4
1900; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.02
1901; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
1902; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
1903; PROLOG:       for.exiting_block.1:
1904; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1905; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
1906; PROLOG:       latch.1:
1907; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
1908; PROLOG-NEXT:    %5 = load i32, ptr %arrayidx.1, align 4
1909; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add
1910; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2
1911; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
1912; PROLOG:       for.exiting_block.2:
1913; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1914; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2
1915; PROLOG:       latch.2:
1916; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1
1917; PROLOG-NEXT:    %6 = load i32, ptr %arrayidx.2, align 4
1918; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.1
1919; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv, 3
1920; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
1921; PROLOG:       for.exiting_block.3:
1922; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1923; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3
1924; PROLOG:       latch.3:
1925; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2
1926; PROLOG-NEXT:    %7 = load i32, ptr %arrayidx.3, align 4
1927; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.2
1928; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv, 4
1929; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
1930; PROLOG:       for.exiting_block.4:
1931; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1932; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4
1933; PROLOG:       latch.4:
1934; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3
1935; PROLOG-NEXT:    %8 = load i32, ptr %arrayidx.4, align 4
1936; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.3
1937; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv, 5
1938; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
1939; PROLOG:       for.exiting_block.5:
1940; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1941; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5
1942; PROLOG:       latch.5:
1943; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4
1944; PROLOG-NEXT:    %9 = load i32, ptr %arrayidx.5, align 4
1945; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.4
1946; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv, 6
1947; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
1948; PROLOG:       for.exiting_block.6:
1949; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
1950; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6
1951; PROLOG:       latch.6:
1952; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5
1953; PROLOG-NEXT:    %10 = load i32, ptr %arrayidx.6, align 4
1954; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.5
1955; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv, 7
1956; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
1957; PROLOG:       for.exiting_block.7:
1958; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
1959; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7
1960; PROLOG:       latch.7:
1961; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6
1962; PROLOG-NEXT:    %11 = load i32, ptr %arrayidx.7, align 4
1963; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.6
1964; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 8
1965; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
1966; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
1967; PROLOG:       latchExit.unr-lcssa.loopexit:
1968; PROLOG-NEXT:    %result.ph.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ 2, %for.exiting_block.2 ], [ 2, %for.exiting_block.3 ], [ 2, %for.exiting_block.4 ], [ 2, %for.exiting_block.5 ], [ 2, %for.exiting_block.6 ], [ 2, %for.exiting_block.7 ], [ %add.7, %latch.7 ]
1969; PROLOG-NEXT:    br label %latchExit.unr-lcssa
1970; PROLOG:       latchExit.unr-lcssa.loopexit2:
1971; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ 2, %for.exiting_block.prol ]
1972; PROLOG-NEXT:    br label %latchExit.unr-lcssa
1973; PROLOG:       latchExit.unr-lcssa:
1974; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]
1975; PROLOG-NEXT:    br label %latchExit
1976; PROLOG:       latchExit:
1977; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
1978; PROLOG-NEXT:    ret i32 %result
1979; PROLOG:       for.exit2.loopexit:
1980; PROLOG-NEXT:    br label %for.exit2
1981; PROLOG:       for.exit2.loopexit1:
1982; PROLOG-NEXT:    br label %for.exit2
1983; PROLOG:       for.exit2:
1984; PROLOG-NEXT:    ret i32 42
1985;
1986; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit(
1987; PROLOG-BLOCK-NEXT:  entry:
1988; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n
1989; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
1990; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
1991; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1992; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
1993; PROLOG-BLOCK:       header.prol.preheader:
1994; PROLOG-BLOCK-NEXT:    br label %header.prol
1995; PROLOG-BLOCK:       header.prol:
1996; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.prol
1997; PROLOG-BLOCK:       for.exiting_block.prol:
1998; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
1999; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol
2000; PROLOG-BLOCK:       latch.prol:
2001; PROLOG-BLOCK-NEXT:    %2 = load i32, ptr %a, align 4
2002; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
2003; PROLOG-BLOCK:       header.prol.loopexit:
2004; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ poison, %entry ], [ %2, %latch.prol ]
2005; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
2006; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ]
2007; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 1
2008; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchExit, label %entry.new
2009; PROLOG-BLOCK:       entry.new:
2010; PROLOG-BLOCK-NEXT:    br label %header
2011; PROLOG-BLOCK:       header:
2012; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2013; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
2014; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2015; PROLOG-BLOCK:       for.exiting_block:
2016; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2017; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2018; PROLOG-BLOCK:       latch:
2019; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
2020; PROLOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx, align 4
2021; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.02
2022; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2023; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2024; PROLOG-BLOCK:       for.exiting_block.1:
2025; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2026; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2027; PROLOG-BLOCK:       latch.1:
2028; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
2029; PROLOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.1, align 4
2030; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add
2031; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2
2032; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
2033; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5
2034; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2035; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
2036; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2037; PROLOG-BLOCK:       latchExit.unr-lcssa:
2038; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 2, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2039; PROLOG-BLOCK-NEXT:    br label %latchExit
2040; PROLOG-BLOCK:       latchExit:
2041; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2042; PROLOG-BLOCK-NEXT:    ret i32 %result
2043; PROLOG-BLOCK:       for.exit2.loopexit:
2044; PROLOG-BLOCK-NEXT:    br label %for.exit2
2045; PROLOG-BLOCK:       for.exit2:
2046; PROLOG-BLOCK-NEXT:    ret i32 42
2047;
2048
2049entry:
2050  br label %header
2051
2052header:
2053  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
2054  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
2055  br i1 %cond, label %for.exit2, label %for.exiting_block
2056
2057for.exiting_block:
2058  %cmp = icmp eq i64 %n, 42
2059  br i1 %cmp, label %latchExit, label %latch
2060
2061latch:                                         ; preds = %latch, %entry
2062  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
2063  %0 = load i32, ptr %arrayidx, align 4
2064  %add = add nsw i32 %0, %sum.02
2065  %indvars.iv.next = add i64 %indvars.iv, 1
2066  %exitcond = icmp eq i64 %indvars.iv.next, %n
2067  br i1 %exitcond, label %latchExit, label %header
2068
2069latchExit:                                          ; preds = %latch, %entry
2070  %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ]
2071  ret i32 %result
2072
2073for.exit2:
2074  ret i32 42
2075}
2076
2077; Two exiting blocks to latch where the exiting blocks are Latch and a
2078; non-header
2079; Same as above test except the incoming value for latch Phi is from the header
2080; FIXME: We should be able to runtime unroll.
2081define i32 @otherblock_latch_same_exit2(ptr nocapture %a, i64 %n, i1 %cond) {
2082; EPILOG-LABEL: @otherblock_latch_same_exit2(
2083; EPILOG-NEXT:  entry:
2084; EPILOG-NEXT:    %0 = freeze i64 %n
2085; EPILOG-NEXT:    %1 = add i64 %0, -1
2086; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
2087; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
2088; EPILOG-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
2089; EPILOG:       entry.new:
2090; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
2091; EPILOG-NEXT:    br label %header
2092; EPILOG:       header:
2093; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
2094; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
2095; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
2096; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2097; EPILOG:       for.exiting_block:
2098; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
2099; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2100; EPILOG:       latch:
2101; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
2102; EPILOG-NEXT:    %3 = load i32, ptr %arrayidx, align 4
2103; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.02
2104; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2105; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2106; EPILOG:       for.exiting_block.1:
2107; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2108; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2109; EPILOG:       latch.1:
2110; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
2111; EPILOG-NEXT:    %4 = load i32, ptr %arrayidx.1, align 4
2112; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
2113; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2
2114; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2115; EPILOG:       for.exiting_block.2:
2116; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2117; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
2118; EPILOG:       latch.2:
2119; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1
2120; EPILOG-NEXT:    %5 = load i32, ptr %arrayidx.2, align 4
2121; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
2122; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 3
2123; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2124; EPILOG:       for.exiting_block.3:
2125; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2126; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
2127; EPILOG:       latch.3:
2128; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2
2129; EPILOG-NEXT:    %6 = load i32, ptr %arrayidx.3, align 4
2130; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
2131; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4
2132; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2133; EPILOG:       for.exiting_block.4:
2134; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2135; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
2136; EPILOG:       latch.4:
2137; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3
2138; EPILOG-NEXT:    %7 = load i32, ptr %arrayidx.4, align 4
2139; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2140; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv, 5
2141; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2142; EPILOG:       for.exiting_block.5:
2143; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2144; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
2145; EPILOG:       latch.5:
2146; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4
2147; EPILOG-NEXT:    %8 = load i32, ptr %arrayidx.5, align 4
2148; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2149; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv, 6
2150; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2151; EPILOG:       for.exiting_block.6:
2152; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2153; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
2154; EPILOG:       latch.6:
2155; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5
2156; EPILOG-NEXT:    %9 = load i32, ptr %arrayidx.6, align 4
2157; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2158; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv, 7
2159; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2160; EPILOG:       for.exiting_block.7:
2161; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2162; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
2163; EPILOG:       latch.7:
2164; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6
2165; EPILOG-NEXT:    %10 = load i32, ptr %arrayidx.7, align 4
2166; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2167; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 8
2168; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 8
2169; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
2170; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
2171; EPILOG:       latchExit.unr-lcssa.loopexit:
2172; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
2173; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
2174; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
2175; EPILOG-NEXT:    br label %latchExit.unr-lcssa
2176; EPILOG:       latchExit.unr-lcssa:
2177; EPILOG-NEXT:    %result.ph = phi i32 [ poison, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2178; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2179; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2180; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2181; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2182; EPILOG:       header.epil.preheader:
2183; EPILOG-NEXT:    br label %header.epil
2184; EPILOG:       header.epil:
2185; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
2186; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
2187; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
2188; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
2189; EPILOG:       for.exiting_block.epil:
2190; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2191; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
2192; EPILOG:       latch.epil:
2193; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil
2194; EPILOG-NEXT:    %11 = load i32, ptr %arrayidx.epil, align 4
2195; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil
2196; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
2197; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
2198; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
2199; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
2200; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !6
2201; EPILOG:       latchExit.epilog-lcssa.loopexit:
2202; EPILOG-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %for.exiting_block.2 ], [ %add.2, %for.exiting_block.3 ], [ %add.3, %for.exiting_block.4 ], [ %add.4, %for.exiting_block.5 ], [ %add.5, %for.exiting_block.6 ], [ %add.6, %for.exiting_block.7 ]
2203; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2204; EPILOG:       latchExit.epilog-lcssa.loopexit3:
2205; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
2206; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2207; EPILOG:       latchExit.epilog-lcssa:
2208; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
2209; EPILOG-NEXT:    br label %latchExit
2210; EPILOG:       latchExit:
2211; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2212; EPILOG-NEXT:    ret i32 %result
2213; EPILOG:       for.exit2.loopexit:
2214; EPILOG-NEXT:    br label %for.exit2
2215; EPILOG:       for.exit2.loopexit2:
2216; EPILOG-NEXT:    br label %for.exit2
2217; EPILOG:       for.exit2:
2218; EPILOG-NEXT:    ret i32 42
2219;
2220; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit2(
2221; EPILOG-BLOCK-NEXT:  entry:
2222; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n
2223; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
2224; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
2225; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
2226; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
2227; EPILOG-BLOCK:       entry.new:
2228; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
2229; EPILOG-BLOCK-NEXT:    br label %header
2230; EPILOG-BLOCK:       header:
2231; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2232; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
2233; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
2234; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2235; EPILOG-BLOCK:       for.exiting_block:
2236; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2237; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2238; EPILOG-BLOCK:       latch:
2239; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
2240; EPILOG-BLOCK-NEXT:    %3 = load i32, ptr %arrayidx, align 4
2241; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
2242; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2243; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2244; EPILOG-BLOCK:       for.exiting_block.1:
2245; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2246; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2247; EPILOG-BLOCK:       latch.1:
2248; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
2249; EPILOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx.1, align 4
2250; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2251; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2
2252; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 2
2253; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
2254; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6
2255; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2256; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
2257; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
2258; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
2259; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2260; EPILOG-BLOCK:       latchExit.unr-lcssa:
2261; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ poison, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2262; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2263; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2264; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2265; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2266; EPILOG-BLOCK:       header.epil.preheader:
2267; EPILOG-BLOCK-NEXT:    br label %header.epil
2268; EPILOG-BLOCK:       header.epil:
2269; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
2270; EPILOG-BLOCK:       for.exiting_block.epil:
2271; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2272; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
2273; EPILOG-BLOCK:       latch.epil:
2274; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.unr
2275; EPILOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.epil, align 4
2276; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.unr
2277; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2278; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
2279; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ]
2280; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2281; EPILOG-BLOCK:       latchExit.epilog-lcssa:
2282; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
2283; EPILOG-BLOCK-NEXT:    br label %latchExit
2284; EPILOG-BLOCK:       latchExit:
2285; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2286; EPILOG-BLOCK-NEXT:    ret i32 %result
2287; EPILOG-BLOCK:       for.exit2.loopexit:
2288; EPILOG-BLOCK-NEXT:    br label %for.exit2
2289; EPILOG-BLOCK:       for.exit2:
2290; EPILOG-BLOCK-NEXT:    ret i32 42
2291;
2292; PROLOG-LABEL: @otherblock_latch_same_exit2(
2293; PROLOG-NEXT:  entry:
2294; PROLOG-NEXT:    %0 = freeze i64 %n
2295; PROLOG-NEXT:    %1 = add i64 %0, -1
2296; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
2297; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2298; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
2299; PROLOG:       header.prol.preheader:
2300; PROLOG-NEXT:    br label %header.prol
2301; PROLOG:       header.prol:
2302; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
2303; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
2304; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
2305; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol
2306; PROLOG:       for.exiting_block.prol:
2307; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
2308; PROLOG-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol
2309; PROLOG:       latch.prol:
2310; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.prol
2311; PROLOG-NEXT:    %2 = load i32, ptr %arrayidx.prol, align 4
2312; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol
2313; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
2314; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
2315; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
2316; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
2317; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !6
2318; PROLOG:       header.prol.loopexit.unr-lcssa:
2319; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
2320; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
2321; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
2322; PROLOG-NEXT:    br label %header.prol.loopexit
2323; PROLOG:       header.prol.loopexit:
2324; PROLOG-NEXT:    %result.unr = phi i32 [ poison, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
2325; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
2326; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
2327; PROLOG-NEXT:    %3 = icmp ult i64 %1, 7
2328; PROLOG-NEXT:    br i1 %3, label %latchExit, label %entry.new
2329; PROLOG:       entry.new:
2330; PROLOG-NEXT:    br label %header
2331; PROLOG:       header:
2332; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
2333; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
2334; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2335; PROLOG:       for.exiting_block:
2336; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
2337; PROLOG-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2338; PROLOG:       latch:
2339; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
2340; PROLOG-NEXT:    %4 = load i32, ptr %arrayidx, align 4
2341; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.02
2342; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2343; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2344; PROLOG:       for.exiting_block.1:
2345; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2346; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2347; PROLOG:       latch.1:
2348; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
2349; PROLOG-NEXT:    %5 = load i32, ptr %arrayidx.1, align 4
2350; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add
2351; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2
2352; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2353; PROLOG:       for.exiting_block.2:
2354; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2355; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2
2356; PROLOG:       latch.2:
2357; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1
2358; PROLOG-NEXT:    %6 = load i32, ptr %arrayidx.2, align 4
2359; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.1
2360; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv, 3
2361; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2362; PROLOG:       for.exiting_block.3:
2363; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2364; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3
2365; PROLOG:       latch.3:
2366; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2
2367; PROLOG-NEXT:    %7 = load i32, ptr %arrayidx.3, align 4
2368; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.2
2369; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv, 4
2370; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2371; PROLOG:       for.exiting_block.4:
2372; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2373; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4
2374; PROLOG:       latch.4:
2375; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3
2376; PROLOG-NEXT:    %8 = load i32, ptr %arrayidx.4, align 4
2377; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.3
2378; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv, 5
2379; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2380; PROLOG:       for.exiting_block.5:
2381; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2382; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5
2383; PROLOG:       latch.5:
2384; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4
2385; PROLOG-NEXT:    %9 = load i32, ptr %arrayidx.5, align 4
2386; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.4
2387; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv, 6
2388; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2389; PROLOG:       for.exiting_block.6:
2390; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2391; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6
2392; PROLOG:       latch.6:
2393; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5
2394; PROLOG-NEXT:    %10 = load i32, ptr %arrayidx.6, align 4
2395; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.5
2396; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv, 7
2397; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2398; PROLOG:       for.exiting_block.7:
2399; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2400; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7
2401; PROLOG:       latch.7:
2402; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6
2403; PROLOG-NEXT:    %11 = load i32, ptr %arrayidx.7, align 4
2404; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.6
2405; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 8
2406; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
2407; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
2408; PROLOG:       latchExit.unr-lcssa.loopexit:
2409; PROLOG-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %for.exiting_block.2 ], [ %add.2, %for.exiting_block.3 ], [ %add.3, %for.exiting_block.4 ], [ %add.4, %for.exiting_block.5 ], [ %add.5, %for.exiting_block.6 ], [ %add.6, %for.exiting_block.7 ], [ %add.7, %latch.7 ]
2410; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2411; PROLOG:       latchExit.unr-lcssa.loopexit2:
2412; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ]
2413; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2414; PROLOG:       latchExit.unr-lcssa:
2415; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]
2416; PROLOG-NEXT:    br label %latchExit
2417; PROLOG:       latchExit:
2418; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2419; PROLOG-NEXT:    ret i32 %result
2420; PROLOG:       for.exit2.loopexit:
2421; PROLOG-NEXT:    br label %for.exit2
2422; PROLOG:       for.exit2.loopexit1:
2423; PROLOG-NEXT:    br label %for.exit2
2424; PROLOG:       for.exit2:
2425; PROLOG-NEXT:    ret i32 42
2426;
2427; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit2(
2428; PROLOG-BLOCK-NEXT:  entry:
2429; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n
2430; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
2431; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
2432; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2433; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
2434; PROLOG-BLOCK:       header.prol.preheader:
2435; PROLOG-BLOCK-NEXT:    br label %header.prol
2436; PROLOG-BLOCK:       header.prol:
2437; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.prol
2438; PROLOG-BLOCK:       for.exiting_block.prol:
2439; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
2440; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol
2441; PROLOG-BLOCK:       latch.prol:
2442; PROLOG-BLOCK-NEXT:    %2 = load i32, ptr %a, align 4
2443; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
2444; PROLOG-BLOCK:       header.prol.loopexit:
2445; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ poison, %entry ], [ %2, %latch.prol ]
2446; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
2447; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ]
2448; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 1
2449; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchExit, label %entry.new
2450; PROLOG-BLOCK:       entry.new:
2451; PROLOG-BLOCK-NEXT:    br label %header
2452; PROLOG-BLOCK:       header:
2453; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2454; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
2455; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2456; PROLOG-BLOCK:       for.exiting_block:
2457; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2458; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2459; PROLOG-BLOCK:       latch:
2460; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
2461; PROLOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx, align 4
2462; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.02
2463; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2464; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2465; PROLOG-BLOCK:       for.exiting_block.1:
2466; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2467; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2468; PROLOG-BLOCK:       latch.1:
2469; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
2470; PROLOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.1, align 4
2471; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add
2472; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2
2473; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
2474; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6
2475; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2476; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
2477; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2478; PROLOG-BLOCK:       latchExit.unr-lcssa:
2479; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2480; PROLOG-BLOCK-NEXT:    br label %latchExit
2481; PROLOG-BLOCK:       latchExit:
2482; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2483; PROLOG-BLOCK-NEXT:    ret i32 %result
2484; PROLOG-BLOCK:       for.exit2.loopexit:
2485; PROLOG-BLOCK-NEXT:    br label %for.exit2
2486; PROLOG-BLOCK:       for.exit2:
2487; PROLOG-BLOCK-NEXT:    ret i32 42
2488;
2489
2490entry:
2491  br label %header
2492
2493header:
2494  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
2495  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
2496  br i1 %cond, label %for.exit2, label %for.exiting_block
2497
2498for.exiting_block:
2499  %cmp = icmp eq i64 %n, 42
2500  br i1 %cmp, label %latchExit, label %latch
2501
2502latch:                                         ; preds = %latch, %entry
2503  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
2504  %0 = load i32, ptr %arrayidx, align 4
2505  %add = add nsw i32 %0, %sum.02
2506  %indvars.iv.next = add i64 %indvars.iv, 1
2507  %exitcond = icmp eq i64 %indvars.iv.next, %n
2508  br i1 %exitcond, label %latchExit, label %header
2509
2510latchExit:                                          ; preds = %latch, %entry
2511  %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
2512  ret i32 %result
2513
2514for.exit2:
2515  ret i32 42
2516}
2517
2518; Two exiting blocks to latch where the exiting blocks are Latch and a
2519; non-header
2520; Same as above test except the incoming value for cloned latch Phi is from the
2521; for.exiting_block.
2522; FIXME: We should be able to runtime unroll.
2523define i32 @otherblock_latch_same_exit3(ptr nocapture %a, i64 %n, i1 %cond) {
2524; EPILOG-LABEL: @otherblock_latch_same_exit3(
2525; EPILOG-NEXT:  entry:
2526; EPILOG-NEXT:    %0 = freeze i64 %n
2527; EPILOG-NEXT:    %1 = add i64 %0, -1
2528; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
2529; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
2530; EPILOG-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
2531; EPILOG:       entry.new:
2532; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
2533; EPILOG-NEXT:    br label %header
2534; EPILOG:       header:
2535; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
2536; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
2537; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
2538; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2539; EPILOG:       for.exiting_block:
2540; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
2541; EPILOG-NEXT:    %3 = load i32, ptr %arrayidx, align 4
2542; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.02
2543; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
2544; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2545; EPILOG:       latch:
2546; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2547; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2548; EPILOG:       for.exiting_block.1:
2549; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
2550; EPILOG-NEXT:    %4 = load i32, ptr %arrayidx.1, align 4
2551; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
2552; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2553; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2554; EPILOG:       latch.1:
2555; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2
2556; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2557; EPILOG:       for.exiting_block.2:
2558; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1
2559; EPILOG-NEXT:    %5 = load i32, ptr %arrayidx.2, align 4
2560; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
2561; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2562; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
2563; EPILOG:       latch.2:
2564; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 3
2565; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2566; EPILOG:       for.exiting_block.3:
2567; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2
2568; EPILOG-NEXT:    %6 = load i32, ptr %arrayidx.3, align 4
2569; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
2570; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2571; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
2572; EPILOG:       latch.3:
2573; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4
2574; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2575; EPILOG:       for.exiting_block.4:
2576; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3
2577; EPILOG-NEXT:    %7 = load i32, ptr %arrayidx.4, align 4
2578; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2579; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2580; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
2581; EPILOG:       latch.4:
2582; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv, 5
2583; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2584; EPILOG:       for.exiting_block.5:
2585; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4
2586; EPILOG-NEXT:    %8 = load i32, ptr %arrayidx.5, align 4
2587; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2588; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2589; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
2590; EPILOG:       latch.5:
2591; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv, 6
2592; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2593; EPILOG:       for.exiting_block.6:
2594; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5
2595; EPILOG-NEXT:    %9 = load i32, ptr %arrayidx.6, align 4
2596; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2597; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2598; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
2599; EPILOG:       latch.6:
2600; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv, 7
2601; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2602; EPILOG:       for.exiting_block.7:
2603; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6
2604; EPILOG-NEXT:    %10 = load i32, ptr %arrayidx.7, align 4
2605; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2606; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2607; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
2608; EPILOG:       latch.7:
2609; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 8
2610; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 8
2611; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
2612; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
2613; EPILOG:       latchExit.unr-lcssa.loopexit:
2614; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
2615; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
2616; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
2617; EPILOG-NEXT:    br label %latchExit.unr-lcssa
2618; EPILOG:       latchExit.unr-lcssa:
2619; EPILOG-NEXT:    %result.ph = phi i32 [ poison, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2620; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2621; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2622; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2623; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2624; EPILOG:       header.epil.preheader:
2625; EPILOG-NEXT:    br label %header.epil
2626; EPILOG:       header.epil:
2627; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
2628; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
2629; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
2630; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
2631; EPILOG:       for.exiting_block.epil:
2632; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil
2633; EPILOG-NEXT:    %11 = load i32, ptr %arrayidx.epil, align 4
2634; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil
2635; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2636; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
2637; EPILOG:       latch.epil:
2638; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
2639; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
2640; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
2641; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
2642; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !7
2643; EPILOG:       latchExit.epilog-lcssa.loopexit:
2644; EPILOG-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %for.exiting_block.2 ], [ %add.2, %for.exiting_block.3 ], [ %add.3, %for.exiting_block.4 ], [ %add.4, %for.exiting_block.5 ], [ %add.5, %for.exiting_block.6 ], [ %add.6, %for.exiting_block.7 ]
2645; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2646; EPILOG:       latchExit.epilog-lcssa.loopexit3:
2647; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
2648; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2649; EPILOG:       latchExit.epilog-lcssa:
2650; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
2651; EPILOG-NEXT:    br label %latchExit
2652; EPILOG:       latchExit:
2653; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2654; EPILOG-NEXT:    ret i32 %result
2655; EPILOG:       for.exit2.loopexit:
2656; EPILOG-NEXT:    br label %for.exit2
2657; EPILOG:       for.exit2.loopexit2:
2658; EPILOG-NEXT:    br label %for.exit2
2659; EPILOG:       for.exit2:
2660; EPILOG-NEXT:    ret i32 42
2661;
2662; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit3(
2663; EPILOG-BLOCK-NEXT:  entry:
2664; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n
2665; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
2666; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
2667; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
2668; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
2669; EPILOG-BLOCK:       entry.new:
2670; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
2671; EPILOG-BLOCK-NEXT:    br label %header
2672; EPILOG-BLOCK:       header:
2673; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2674; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
2675; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
2676; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2677; EPILOG-BLOCK:       for.exiting_block:
2678; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
2679; EPILOG-BLOCK-NEXT:    %3 = load i32, ptr %arrayidx, align 4
2680; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
2681; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2682; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2683; EPILOG-BLOCK:       latch:
2684; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2685; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2686; EPILOG-BLOCK:       for.exiting_block.1:
2687; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
2688; EPILOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx.1, align 4
2689; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2690; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2691; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2692; EPILOG-BLOCK:       latch.1:
2693; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2
2694; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 2
2695; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
2696; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7
2697; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2698; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
2699; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
2700; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
2701; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2702; EPILOG-BLOCK:       latchExit.unr-lcssa:
2703; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ poison, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2704; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2705; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2706; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2707; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2708; EPILOG-BLOCK:       header.epil.preheader:
2709; EPILOG-BLOCK-NEXT:    br label %header.epil
2710; EPILOG-BLOCK:       header.epil:
2711; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
2712; EPILOG-BLOCK:       for.exiting_block.epil:
2713; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.unr
2714; EPILOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.epil, align 4
2715; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.unr
2716; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2717; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
2718; EPILOG-BLOCK:       latch.epil:
2719; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2720; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
2721; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ]
2722; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2723; EPILOG-BLOCK:       latchExit.epilog-lcssa:
2724; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
2725; EPILOG-BLOCK-NEXT:    br label %latchExit
2726; EPILOG-BLOCK:       latchExit:
2727; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2728; EPILOG-BLOCK-NEXT:    ret i32 %result
2729; EPILOG-BLOCK:       for.exit2.loopexit:
2730; EPILOG-BLOCK-NEXT:    br label %for.exit2
2731; EPILOG-BLOCK:       for.exit2:
2732; EPILOG-BLOCK-NEXT:    ret i32 42
2733;
2734; PROLOG-LABEL: @otherblock_latch_same_exit3(
2735; PROLOG-NEXT:  entry:
2736; PROLOG-NEXT:    %0 = freeze i64 %n
2737; PROLOG-NEXT:    %1 = add i64 %0, -1
2738; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
2739; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2740; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
2741; PROLOG:       header.prol.preheader:
2742; PROLOG-NEXT:    br label %header.prol
2743; PROLOG:       header.prol:
2744; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
2745; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
2746; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
2747; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol
2748; PROLOG:       for.exiting_block.prol:
2749; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.prol
2750; PROLOG-NEXT:    %2 = load i32, ptr %arrayidx.prol, align 4
2751; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol
2752; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
2753; PROLOG-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol
2754; PROLOG:       latch.prol:
2755; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
2756; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
2757; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
2758; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
2759; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !7
2760; PROLOG:       header.prol.loopexit.unr-lcssa:
2761; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
2762; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
2763; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
2764; PROLOG-NEXT:    br label %header.prol.loopexit
2765; PROLOG:       header.prol.loopexit:
2766; PROLOG-NEXT:    %result.unr = phi i32 [ poison, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
2767; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
2768; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
2769; PROLOG-NEXT:    %3 = icmp ult i64 %1, 7
2770; PROLOG-NEXT:    br i1 %3, label %latchExit, label %entry.new
2771; PROLOG:       entry.new:
2772; PROLOG-NEXT:    br label %header
2773; PROLOG:       header:
2774; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
2775; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
2776; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2777; PROLOG:       for.exiting_block:
2778; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
2779; PROLOG-NEXT:    %4 = load i32, ptr %arrayidx, align 4
2780; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.02
2781; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
2782; PROLOG-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2783; PROLOG:       latch:
2784; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2785; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2786; PROLOG:       for.exiting_block.1:
2787; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
2788; PROLOG-NEXT:    %5 = load i32, ptr %arrayidx.1, align 4
2789; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add
2790; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2791; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2792; PROLOG:       latch.1:
2793; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2
2794; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2795; PROLOG:       for.exiting_block.2:
2796; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1
2797; PROLOG-NEXT:    %6 = load i32, ptr %arrayidx.2, align 4
2798; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.1
2799; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2800; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2
2801; PROLOG:       latch.2:
2802; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv, 3
2803; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2804; PROLOG:       for.exiting_block.3:
2805; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2
2806; PROLOG-NEXT:    %7 = load i32, ptr %arrayidx.3, align 4
2807; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.2
2808; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2809; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3
2810; PROLOG:       latch.3:
2811; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv, 4
2812; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2813; PROLOG:       for.exiting_block.4:
2814; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3
2815; PROLOG-NEXT:    %8 = load i32, ptr %arrayidx.4, align 4
2816; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.3
2817; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2818; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4
2819; PROLOG:       latch.4:
2820; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv, 5
2821; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2822; PROLOG:       for.exiting_block.5:
2823; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4
2824; PROLOG-NEXT:    %9 = load i32, ptr %arrayidx.5, align 4
2825; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.4
2826; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2827; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5
2828; PROLOG:       latch.5:
2829; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv, 6
2830; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2831; PROLOG:       for.exiting_block.6:
2832; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5
2833; PROLOG-NEXT:    %10 = load i32, ptr %arrayidx.6, align 4
2834; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.5
2835; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2836; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6
2837; PROLOG:       latch.6:
2838; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv, 7
2839; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2840; PROLOG:       for.exiting_block.7:
2841; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6
2842; PROLOG-NEXT:    %11 = load i32, ptr %arrayidx.7, align 4
2843; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.6
2844; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2845; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7
2846; PROLOG:       latch.7:
2847; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 8
2848; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
2849; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
2850; PROLOG:       latchExit.unr-lcssa.loopexit:
2851; PROLOG-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %for.exiting_block.2 ], [ %add.2, %for.exiting_block.3 ], [ %add.3, %for.exiting_block.4 ], [ %add.4, %for.exiting_block.5 ], [ %add.5, %for.exiting_block.6 ], [ %add.6, %for.exiting_block.7 ], [ %add.7, %latch.7 ]
2852; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2853; PROLOG:       latchExit.unr-lcssa.loopexit2:
2854; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ]
2855; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2856; PROLOG:       latchExit.unr-lcssa:
2857; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]
2858; PROLOG-NEXT:    br label %latchExit
2859; PROLOG:       latchExit:
2860; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2861; PROLOG-NEXT:    ret i32 %result
2862; PROLOG:       for.exit2.loopexit:
2863; PROLOG-NEXT:    br label %for.exit2
2864; PROLOG:       for.exit2.loopexit1:
2865; PROLOG-NEXT:    br label %for.exit2
2866; PROLOG:       for.exit2:
2867; PROLOG-NEXT:    ret i32 42
2868;
2869; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit3(
2870; PROLOG-BLOCK-NEXT:  entry:
2871; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n
2872; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
2873; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
2874; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2875; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
2876; PROLOG-BLOCK:       header.prol.preheader:
2877; PROLOG-BLOCK-NEXT:    br label %header.prol
2878; PROLOG-BLOCK:       header.prol:
2879; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.prol
2880; PROLOG-BLOCK:       for.exiting_block.prol:
2881; PROLOG-BLOCK-NEXT:    %2 = load i32, ptr %a, align 4
2882; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
2883; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol
2884; PROLOG-BLOCK:       latch.prol:
2885; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
2886; PROLOG-BLOCK:       header.prol.loopexit:
2887; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ poison, %entry ], [ %2, %latch.prol ]
2888; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
2889; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ]
2890; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 1
2891; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchExit, label %entry.new
2892; PROLOG-BLOCK:       entry.new:
2893; PROLOG-BLOCK-NEXT:    br label %header
2894; PROLOG-BLOCK:       header:
2895; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2896; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
2897; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2898; PROLOG-BLOCK:       for.exiting_block:
2899; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
2900; PROLOG-BLOCK-NEXT:    %4 = load i32, ptr %arrayidx, align 4
2901; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.02
2902; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2903; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2904; PROLOG-BLOCK:       latch:
2905; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2906; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2907; PROLOG-BLOCK:       for.exiting_block.1:
2908; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
2909; PROLOG-BLOCK-NEXT:    %5 = load i32, ptr %arrayidx.1, align 4
2910; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add
2911; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2912; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2913; PROLOG-BLOCK:       latch.1:
2914; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2
2915; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
2916; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7
2917; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2918; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
2919; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2920; PROLOG-BLOCK:       latchExit.unr-lcssa:
2921; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2922; PROLOG-BLOCK-NEXT:    br label %latchExit
2923; PROLOG-BLOCK:       latchExit:
2924; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2925; PROLOG-BLOCK-NEXT:    ret i32 %result
2926; PROLOG-BLOCK:       for.exit2.loopexit:
2927; PROLOG-BLOCK-NEXT:    br label %for.exit2
2928; PROLOG-BLOCK:       for.exit2:
2929; PROLOG-BLOCK-NEXT:    ret i32 42
2930;
2931
2932entry:
2933  br label %header
2934
2935header:
2936  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
2937  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
2938  br i1 %cond, label %for.exit2, label %for.exiting_block
2939
2940for.exiting_block:
2941  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
2942  %0 = load i32, ptr %arrayidx, align 4
2943  %add = add nsw i32 %0, %sum.02
2944  %cmp = icmp eq i64 %n, 42
2945  br i1 %cmp, label %latchExit, label %latch
2946
2947latch:                                         ; preds = %latch, %entry
2948  %indvars.iv.next = add i64 %indvars.iv, 1
2949  %exitcond = icmp eq i64 %indvars.iv.next, %n
2950  br i1 %exitcond, label %latchExit, label %header
2951
2952latchExit:                                          ; preds = %latch, %entry
2953  %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
2954  ret i32 %result
2955
2956for.exit2:
2957  ret i32 42
2958}
2959
2960; Show a case where we have multiple exits, but (provably) exit on the
2961; first iteration and thus have nothing to unroll
2962define void @non_loop(i32 %arg) {
2963; CHECK-LABEL: @non_loop(
2964; CHECK-NEXT:  entry:
2965; CHECK-NEXT:    %i = icmp sgt i32 undef, %arg
2966; CHECK-NEXT:    br i1 %i, label %preheader, label %returnblock
2967; CHECK:       preheader:
2968; CHECK-NEXT:    br label %header
2969; CHECK:       header:
2970; CHECK-NEXT:    br i1 true, label %latchExit, label %latch
2971; CHECK:       latch:
2972; CHECK-NEXT:    br label %latchExit
2973; CHECK:       latchExit:
2974; CHECK-NEXT:    %i2.ph = phi i32 [ %arg, %header ], [ -1, %latch ]
2975; CHECK-NEXT:    br label %returnblock
2976; CHECK:       returnblock:
2977; CHECK-NEXT:    %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ]
2978; CHECK-NEXT:    ret void
2979;
2980
2981entry:
2982  %i = icmp sgt i32 undef, %arg
2983  br i1 %i, label %preheader, label %returnblock
2984
2985preheader:                                 ; preds = %entry
2986  br label %header
2987
2988header:                                           ; preds = %preheader, %latch
2989  %i4 = phi i32 [ %inc, %latch ], [ %arg, %preheader ]
2990  %inc = add nsw i32 %i4, 1
2991  br i1 true, label %latchExit, label %latch
2992
2993latch:                                            ; preds = %header
2994  %cmp = icmp slt i32 %inc, undef
2995  br i1 %cmp, label %header, label %latchExit
2996
2997latchExit:                                ; preds = %header, %latch
2998  %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ]
2999  br label %returnblock
3000
3001returnblock:                                         ; preds = %latchExit, %entry
3002  %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ]
3003  ret void
3004}
3005
3006; Latch exit is shared by all exiting blocks
3007define void @unique_exit(i32 %N, i32 %M) {
3008; EPILOG-LABEL: @unique_exit(
3009; EPILOG-NEXT:  preheader:
3010; EPILOG-NEXT:    %M.shifted = shl i32 %M, 3
3011; EPILOG-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1)
3012; EPILOG-NEXT:    %0 = freeze i32 %umax
3013; EPILOG-NEXT:    %1 = add i32 %0, -1
3014; EPILOG-NEXT:    %xtraiter = and i32 %0, 7
3015; EPILOG-NEXT:    %2 = icmp ult i32 %1, 7
3016; EPILOG-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %preheader.new
3017; EPILOG:       preheader.new:
3018; EPILOG-NEXT:    %unroll_iter = sub i32 %0, %xtraiter
3019; EPILOG-NEXT:    br label %header
3020; EPILOG:       header:
3021; EPILOG-NEXT:    %i4 = phi i32 [ 0, %preheader.new ], [ %inc.7, %latch.7 ]
3022; EPILOG-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ]
3023; EPILOG-NEXT:    %inc = add nuw nsw i32 %i4, 1
3024; EPILOG-NEXT:    %cmp1 = icmp ult i32 %inc, %N
3025; EPILOG-NEXT:    br i1 %cmp1, label %latch, label %latchExit.epilog-lcssa.loopexit
3026; EPILOG:       latch:
3027; EPILOG-NEXT:    %inc.1 = add nuw nsw i32 %i4, 2
3028; EPILOG-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N
3029; EPILOG-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.epilog-lcssa.loopexit
3030; EPILOG:       latch.1:
3031; EPILOG-NEXT:    %inc.2 = add nuw nsw i32 %i4, 3
3032; EPILOG-NEXT:    %cmp1.2 = icmp ult i32 %inc.2, %N
3033; EPILOG-NEXT:    br i1 %cmp1.2, label %latch.2, label %latchExit.epilog-lcssa.loopexit
3034; EPILOG:       latch.2:
3035; EPILOG-NEXT:    %inc.3 = add nuw nsw i32 %i4, 4
3036; EPILOG-NEXT:    %cmp1.3 = icmp ult i32 %inc.3, %N
3037; EPILOG-NEXT:    br i1 %cmp1.3, label %latch.3, label %latchExit.epilog-lcssa.loopexit
3038; EPILOG:       latch.3:
3039; EPILOG-NEXT:    %inc.4 = add nuw nsw i32 %i4, 5
3040; EPILOG-NEXT:    %cmp1.4 = icmp ult i32 %inc.4, %N
3041; EPILOG-NEXT:    br i1 %cmp1.4, label %latch.4, label %latchExit.epilog-lcssa.loopexit
3042; EPILOG:       latch.4:
3043; EPILOG-NEXT:    %inc.5 = add nuw nsw i32 %i4, 6
3044; EPILOG-NEXT:    %cmp1.5 = icmp ult i32 %inc.5, %N
3045; EPILOG-NEXT:    br i1 %cmp1.5, label %latch.5, label %latchExit.epilog-lcssa.loopexit
3046; EPILOG:       latch.5:
3047; EPILOG-NEXT:    %inc.6 = add nuw nsw i32 %i4, 7
3048; EPILOG-NEXT:    %cmp1.6 = icmp ult i32 %inc.6, %N
3049; EPILOG-NEXT:    br i1 %cmp1.6, label %latch.6, label %latchExit.epilog-lcssa.loopexit
3050; EPILOG:       latch.6:
3051; EPILOG-NEXT:    %inc.7 = add nuw i32 %i4, 8
3052; EPILOG-NEXT:    %cmp1.7 = icmp ult i32 %inc.7, %N
3053; EPILOG-NEXT:    br i1 %cmp1.7, label %latch.7, label %latchExit.epilog-lcssa.loopexit
3054; EPILOG:       latch.7:
3055; EPILOG-NEXT:    %niter.next.7 = add nuw i32 %niter, 8
3056; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i32 %niter.next.7, %unroll_iter
3057; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %latchExit.unr-lcssa.loopexit
3058; EPILOG:       latchExit.unr-lcssa.loopexit:
3059; EPILOG-NEXT:    %i2.ph.ph.ph = phi i32 [ -1, %latch.7 ]
3060; EPILOG-NEXT:    %i4.unr.ph = phi i32 [ %inc.7, %latch.7 ]
3061; EPILOG-NEXT:    br label %latchExit.unr-lcssa
3062; EPILOG:       latchExit.unr-lcssa:
3063; EPILOG-NEXT:    %i2.ph.ph = phi i32 [ poison, %preheader ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ]
3064; EPILOG-NEXT:    %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %latchExit.unr-lcssa.loopexit ]
3065; EPILOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
3066; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
3067; EPILOG:       header.epil.preheader:
3068; EPILOG-NEXT:    br label %header.epil
3069; EPILOG:       header.epil:
3070; EPILOG-NEXT:    %i4.epil = phi i32 [ %inc.epil, %latch.epil ], [ %i4.unr, %header.epil.preheader ]
3071; EPILOG-NEXT:    %epil.iter = phi i32 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
3072; EPILOG-NEXT:    %inc.epil = add nuw i32 %i4.epil, 1
3073; EPILOG-NEXT:    %cmp1.epil = icmp ult i32 %inc.epil, %N
3074; EPILOG-NEXT:    br i1 %cmp1.epil, label %latch.epil, label %latchExit.epilog-lcssa.loopexit2
3075; EPILOG:       latch.epil:
3076; EPILOG-NEXT:    %cmp.epil = icmp ult i32 %inc.epil, %M.shifted
3077; EPILOG-NEXT:    %epil.iter.next = add i32 %epil.iter, 1
3078; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i32 %epil.iter.next, %xtraiter
3079; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit2, !llvm.loop !8
3080; EPILOG:       latchExit.epilog-lcssa.loopexit:
3081; EPILOG-NEXT:    %i2.ph.ph1.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ %inc.1, %latch.1 ], [ %inc.2, %latch.2 ], [ %inc.3, %latch.3 ], [ %inc.4, %latch.4 ], [ %inc.5, %latch.5 ], [ %inc.6, %latch.6 ]
3082; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
3083; EPILOG:       latchExit.epilog-lcssa.loopexit2:
3084; EPILOG-NEXT:    %i2.ph.ph1.ph3 = phi i32 [ %i4.epil, %header.epil ], [ -1, %latch.epil ]
3085; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
3086; EPILOG:       latchExit.epilog-lcssa:
3087; EPILOG-NEXT:    %i2.ph.ph1 = phi i32 [ %i2.ph.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %i2.ph.ph1.ph3, %latchExit.epilog-lcssa.loopexit2 ]
3088; EPILOG-NEXT:    br label %latchExit
3089; EPILOG:       latchExit:
3090; EPILOG-NEXT:    %i2.ph = phi i32 [ %i2.ph.ph, %latchExit.unr-lcssa ], [ %i2.ph.ph1, %latchExit.epilog-lcssa ]
3091; EPILOG-NEXT:    ret void
3092;
3093; EPILOG-BLOCK-LABEL: @unique_exit(
3094; EPILOG-BLOCK-NEXT:  preheader:
3095; EPILOG-BLOCK-NEXT:    %M.shifted = shl i32 %M, 3
3096; EPILOG-BLOCK-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1)
3097; EPILOG-BLOCK-NEXT:    %0 = freeze i32 %umax
3098; EPILOG-BLOCK-NEXT:    %1 = add i32 %0, -1
3099; EPILOG-BLOCK-NEXT:    %xtraiter = and i32 %0, 1
3100; EPILOG-BLOCK-NEXT:    %2 = icmp ult i32 %1, 1
3101; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %preheader.new
3102; EPILOG-BLOCK:       preheader.new:
3103; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i32 %0, %xtraiter
3104; EPILOG-BLOCK-NEXT:    br label %header
3105; EPILOG-BLOCK:       header:
3106; EPILOG-BLOCK-NEXT:    %i4 = phi i32 [ 0, %preheader.new ], [ %inc.1, %latch.1 ]
3107; EPILOG-BLOCK-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ]
3108; EPILOG-BLOCK-NEXT:    %inc = add nuw nsw i32 %i4, 1
3109; EPILOG-BLOCK-NEXT:    %cmp1 = icmp ult i32 %inc, %N
3110; EPILOG-BLOCK-NEXT:    br i1 %cmp1, label %latch, label %latchExit.epilog-lcssa.loopexit
3111; EPILOG-BLOCK:       latch:
3112; EPILOG-BLOCK-NEXT:    %inc.1 = add nuw i32 %i4, 2
3113; EPILOG-BLOCK-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N
3114; EPILOG-BLOCK-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.epilog-lcssa.loopexit
3115; EPILOG-BLOCK:       latch.1:
3116; EPILOG-BLOCK-NEXT:    %niter.next.1 = add nuw i32 %niter, 2
3117; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i32 %niter.next.1, %unroll_iter
3118; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %latchExit.unr-lcssa.loopexit, !llvm.loop !8
3119; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
3120; EPILOG-BLOCK-NEXT:    %i2.ph.ph.ph = phi i32 [ -1, %latch.1 ]
3121; EPILOG-BLOCK-NEXT:    %i4.unr.ph = phi i32 [ %inc.1, %latch.1 ]
3122; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
3123; EPILOG-BLOCK:       latchExit.unr-lcssa:
3124; EPILOG-BLOCK-NEXT:    %i2.ph.ph = phi i32 [ poison, %preheader ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ]
3125; EPILOG-BLOCK-NEXT:    %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %latchExit.unr-lcssa.loopexit ]
3126; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
3127; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
3128; EPILOG-BLOCK:       header.epil.preheader:
3129; EPILOG-BLOCK-NEXT:    br label %header.epil
3130; EPILOG-BLOCK:       header.epil:
3131; EPILOG-BLOCK-NEXT:    %inc.epil = add nuw i32 %i4.unr, 1
3132; EPILOG-BLOCK-NEXT:    %cmp1.epil = icmp ult i32 %inc.epil, %N
3133; EPILOG-BLOCK-NEXT:    br i1 %cmp1.epil, label %latch.epil, label %latchExit.epilog-lcssa
3134; EPILOG-BLOCK:       latch.epil:
3135; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
3136; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
3137; EPILOG-BLOCK-NEXT:    %i2.ph.ph1.ph = phi i32 [ %i4, %header ], [ %inc, %latch ]
3138; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
3139; EPILOG-BLOCK:       latchExit.epilog-lcssa:
3140; EPILOG-BLOCK-NEXT:    %i2.ph.ph1 = phi i32 [ -1, %latch.epil ], [ %i4.unr, %header.epil ], [ %i2.ph.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
3141; EPILOG-BLOCK-NEXT:    br label %latchExit
3142; EPILOG-BLOCK:       latchExit:
3143; EPILOG-BLOCK-NEXT:    %i2.ph = phi i32 [ %i2.ph.ph, %latchExit.unr-lcssa ], [ %i2.ph.ph1, %latchExit.epilog-lcssa ]
3144; EPILOG-BLOCK-NEXT:    ret void
3145;
3146; PROLOG-LABEL: @unique_exit(
3147; PROLOG-NEXT:  preheader:
3148; PROLOG-NEXT:    %M.shifted = shl i32 %M, 3
3149; PROLOG-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1)
3150; PROLOG-NEXT:    %0 = freeze i32 %umax
3151; PROLOG-NEXT:    %1 = add i32 %0, -1
3152; PROLOG-NEXT:    %xtraiter = and i32 %0, 7
3153; PROLOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
3154; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
3155; PROLOG:       header.prol.preheader:
3156; PROLOG-NEXT:    br label %header.prol
3157; PROLOG:       header.prol:
3158; PROLOG-NEXT:    %i4.prol = phi i32 [ %inc.prol, %latch.prol ], [ 0, %header.prol.preheader ]
3159; PROLOG-NEXT:    %prol.iter = phi i32 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
3160; PROLOG-NEXT:    %inc.prol = add nuw i32 %i4.prol, 1
3161; PROLOG-NEXT:    %cmp1.prol = icmp ult i32 %inc.prol, %N
3162; PROLOG-NEXT:    br i1 %cmp1.prol, label %latch.prol, label %latchExit.unr-lcssa.loopexit1
3163; PROLOG:       latch.prol:
3164; PROLOG-NEXT:    %cmp.prol = icmp ult i32 %inc.prol, %M.shifted
3165; PROLOG-NEXT:    %prol.iter.next = add i32 %prol.iter, 1
3166; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i32 %prol.iter.next, %xtraiter
3167; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !8
3168; PROLOG:       header.prol.loopexit.unr-lcssa:
3169; PROLOG-NEXT:    %i4.unr.ph = phi i32 [ %inc.prol, %latch.prol ]
3170; PROLOG-NEXT:    %i2.ph.unr.ph = phi i32 [ -1, %latch.prol ]
3171; PROLOG-NEXT:    br label %header.prol.loopexit
3172; PROLOG:       header.prol.loopexit:
3173; PROLOG-NEXT:    %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %header.prol.loopexit.unr-lcssa ]
3174; PROLOG-NEXT:    %i2.ph.unr = phi i32 [ poison, %preheader ], [ %i2.ph.unr.ph, %header.prol.loopexit.unr-lcssa ]
3175; PROLOG-NEXT:    %2 = icmp ult i32 %1, 7
3176; PROLOG-NEXT:    br i1 %2, label %latchExit, label %preheader.new
3177; PROLOG:       preheader.new:
3178; PROLOG-NEXT:    br label %header
3179; PROLOG:       header:
3180; PROLOG-NEXT:    %i4 = phi i32 [ %i4.unr, %preheader.new ], [ %inc.7, %latch.7 ]
3181; PROLOG-NEXT:    %inc = add nuw i32 %i4, 1
3182; PROLOG-NEXT:    %cmp1 = icmp ult i32 %inc, %N
3183; PROLOG-NEXT:    br i1 %cmp1, label %latch, label %latchExit.unr-lcssa.loopexit
3184; PROLOG:       latch:
3185; PROLOG-NEXT:    %inc.1 = add nuw i32 %i4, 2
3186; PROLOG-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N
3187; PROLOG-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.unr-lcssa.loopexit
3188; PROLOG:       latch.1:
3189; PROLOG-NEXT:    %inc.2 = add nuw i32 %i4, 3
3190; PROLOG-NEXT:    %cmp1.2 = icmp ult i32 %inc.2, %N
3191; PROLOG-NEXT:    br i1 %cmp1.2, label %latch.2, label %latchExit.unr-lcssa.loopexit
3192; PROLOG:       latch.2:
3193; PROLOG-NEXT:    %inc.3 = add nuw i32 %i4, 4
3194; PROLOG-NEXT:    %cmp1.3 = icmp ult i32 %inc.3, %N
3195; PROLOG-NEXT:    br i1 %cmp1.3, label %latch.3, label %latchExit.unr-lcssa.loopexit
3196; PROLOG:       latch.3:
3197; PROLOG-NEXT:    %inc.4 = add nuw i32 %i4, 5
3198; PROLOG-NEXT:    %cmp1.4 = icmp ult i32 %inc.4, %N
3199; PROLOG-NEXT:    br i1 %cmp1.4, label %latch.4, label %latchExit.unr-lcssa.loopexit
3200; PROLOG:       latch.4:
3201; PROLOG-NEXT:    %inc.5 = add nuw i32 %i4, 6
3202; PROLOG-NEXT:    %cmp1.5 = icmp ult i32 %inc.5, %N
3203; PROLOG-NEXT:    br i1 %cmp1.5, label %latch.5, label %latchExit.unr-lcssa.loopexit
3204; PROLOG:       latch.5:
3205; PROLOG-NEXT:    %inc.6 = add nuw i32 %i4, 7
3206; PROLOG-NEXT:    %cmp1.6 = icmp ult i32 %inc.6, %N
3207; PROLOG-NEXT:    br i1 %cmp1.6, label %latch.6, label %latchExit.unr-lcssa.loopexit
3208; PROLOG:       latch.6:
3209; PROLOG-NEXT:    %inc.7 = add nuw i32 %i4, 8
3210; PROLOG-NEXT:    %cmp1.7 = icmp ult i32 %inc.7, %N
3211; PROLOG-NEXT:    br i1 %cmp1.7, label %latch.7, label %latchExit.unr-lcssa.loopexit
3212; PROLOG:       latch.7:
3213; PROLOG-NEXT:    %cmp.7 = icmp ult i32 %inc.7, %M.shifted
3214; PROLOG-NEXT:    br i1 %cmp.7, label %header, label %latchExit.unr-lcssa.loopexit
3215; PROLOG:       latchExit.unr-lcssa.loopexit:
3216; PROLOG-NEXT:    %i2.ph.ph.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ %inc.1, %latch.1 ], [ %inc.2, %latch.2 ], [ %inc.3, %latch.3 ], [ %inc.4, %latch.4 ], [ %inc.5, %latch.5 ], [ %inc.6, %latch.6 ], [ -1, %latch.7 ]
3217; PROLOG-NEXT:    br label %latchExit.unr-lcssa
3218; PROLOG:       latchExit.unr-lcssa.loopexit1:
3219; PROLOG-NEXT:    %i2.ph.ph.ph2 = phi i32 [ %i4.prol, %header.prol ]
3220; PROLOG-NEXT:    br label %latchExit.unr-lcssa
3221; PROLOG:       latchExit.unr-lcssa:
3222; PROLOG-NEXT:    %i2.ph.ph = phi i32 [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %i2.ph.ph.ph2, %latchExit.unr-lcssa.loopexit1 ]
3223; PROLOG-NEXT:    br label %latchExit
3224; PROLOG:       latchExit:
3225; PROLOG-NEXT:    %i2.ph = phi i32 [ %i2.ph.unr, %header.prol.loopexit ], [ %i2.ph.ph, %latchExit.unr-lcssa ]
3226; PROLOG-NEXT:    ret void
3227;
3228; PROLOG-BLOCK-LABEL: @unique_exit(
3229; PROLOG-BLOCK-NEXT:  preheader:
3230; PROLOG-BLOCK-NEXT:    %M.shifted = shl i32 %M, 3
3231; PROLOG-BLOCK-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1)
3232; PROLOG-BLOCK-NEXT:    %0 = freeze i32 %umax
3233; PROLOG-BLOCK-NEXT:    %1 = add i32 %0, -1
3234; PROLOG-BLOCK-NEXT:    %xtraiter = and i32 %0, 1
3235; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
3236; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
3237; PROLOG-BLOCK:       header.prol.preheader:
3238; PROLOG-BLOCK-NEXT:    br label %header.prol
3239; PROLOG-BLOCK:       header.prol:
3240; PROLOG-BLOCK-NEXT:    %cmp1.prol = icmp ult i32 1, %N
3241; PROLOG-BLOCK-NEXT:    br i1 %cmp1.prol, label %latch.prol, label %latchExit.unr-lcssa
3242; PROLOG-BLOCK:       latch.prol:
3243; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
3244; PROLOG-BLOCK:       header.prol.loopexit:
3245; PROLOG-BLOCK-NEXT:    %i4.unr = phi i32 [ 0, %preheader ], [ 1, %latch.prol ]
3246; PROLOG-BLOCK-NEXT:    %i2.ph.unr = phi i32 [ poison, %preheader ], [ -1, %latch.prol ]
3247; PROLOG-BLOCK-NEXT:    %2 = icmp ult i32 %1, 1
3248; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchExit, label %preheader.new
3249; PROLOG-BLOCK:       preheader.new:
3250; PROLOG-BLOCK-NEXT:    br label %header
3251; PROLOG-BLOCK:       header:
3252; PROLOG-BLOCK-NEXT:    %i4 = phi i32 [ %i4.unr, %preheader.new ], [ %inc.1, %latch.1 ]
3253; PROLOG-BLOCK-NEXT:    %inc = add nuw i32 %i4, 1
3254; PROLOG-BLOCK-NEXT:    %cmp1 = icmp ult i32 %inc, %N
3255; PROLOG-BLOCK-NEXT:    br i1 %cmp1, label %latch, label %latchExit.unr-lcssa.loopexit
3256; PROLOG-BLOCK:       latch:
3257; PROLOG-BLOCK-NEXT:    %inc.1 = add nuw i32 %i4, 2
3258; PROLOG-BLOCK-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N
3259; PROLOG-BLOCK-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.unr-lcssa.loopexit
3260; PROLOG-BLOCK:       latch.1:
3261; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ult i32 %inc.1, %M.shifted
3262; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %header, label %latchExit.unr-lcssa.loopexit, !llvm.loop !8
3263; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
3264; PROLOG-BLOCK-NEXT:    %i2.ph.ph.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ -1, %latch.1 ]
3265; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
3266; PROLOG-BLOCK:       latchExit.unr-lcssa:
3267; PROLOG-BLOCK-NEXT:    %i2.ph.ph = phi i32 [ 0, %header.prol ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ]
3268; PROLOG-BLOCK-NEXT:    br label %latchExit
3269; PROLOG-BLOCK:       latchExit:
3270; PROLOG-BLOCK-NEXT:    %i2.ph = phi i32 [ %i2.ph.unr, %header.prol.loopexit ], [ %i2.ph.ph, %latchExit.unr-lcssa ]
3271; PROLOG-BLOCK-NEXT:    ret void
3272;
3273
3274preheader:
3275  %M.shifted = shl nuw i32 %M, 3
3276  br label %header
3277
3278header:                                           ; preds = %preheader, %latch
3279  %i4 = phi i32 [ %inc, %latch ], [ 0, %preheader ]
3280  %inc = add nuw i32 %i4, 1
3281  %cmp1 = icmp ult i32 %inc, %N
3282  br i1 %cmp1, label %latch, label %latchExit
3283
3284latch:                                            ; preds = %header
3285  %cmp = icmp ult i32 %inc, %M.shifted
3286  br i1 %cmp, label %header, label %latchExit
3287
3288latchExit:                                ; preds = %header, %latch
3289  %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ]
3290  ret void
3291}
3292
3293
3294; two exiting and two exit blocks.
3295; the non-latch exiting block has duplicate edges to the non-latch exit block.
3296define i64 @test5(i64 %trip, i64 %add, i1 %cond) {
3297; EPILOG-LABEL: @test5(
3298; EPILOG-NEXT:  entry:
3299; EPILOG-NEXT:    %0 = freeze i64 %trip
3300; EPILOG-NEXT:    %1 = add i64 %0, -1
3301; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
3302; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
3303; EPILOG-NEXT:    br i1 %2, label %latchexit.unr-lcssa, label %entry.new
3304; EPILOG:       entry.new:
3305; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
3306; EPILOG-NEXT:    br label %loop_header
3307; EPILOG:       loop_header:
3308; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
3309; EPILOG-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
3310; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
3311; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3312; EPILOG:       loop_exiting:
3313; EPILOG-NEXT:    %ivy = add i64 %iv, %add
3314; EPILOG-NEXT:    switch i64 %sum, label %loop_latch [
3315; EPILOG-NEXT:      i64 24, label %exit1.loopexit
3316; EPILOG-NEXT:      i64 42, label %exit1.loopexit
3317; EPILOG-NEXT:    ]
3318; EPILOG:       loop_latch:
3319; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3320; EPILOG-NEXT:    %sum.next = add i64 %sum, %add
3321; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3322; EPILOG:       loop_exiting.1:
3323; EPILOG-NEXT:    %ivy.1 = add i64 %iv_next, %add
3324; EPILOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3325; EPILOG-NEXT:      i64 24, label %exit1.loopexit
3326; EPILOG-NEXT:      i64 42, label %exit1.loopexit
3327; EPILOG-NEXT:    ]
3328; EPILOG:       loop_latch.1:
3329; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv, 2
3330; EPILOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3331; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.2
3332; EPILOG:       loop_exiting.2:
3333; EPILOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add
3334; EPILOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
3335; EPILOG-NEXT:      i64 24, label %exit1.loopexit
3336; EPILOG-NEXT:      i64 42, label %exit1.loopexit
3337; EPILOG-NEXT:    ]
3338; EPILOG:       loop_latch.2:
3339; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv, 3
3340; EPILOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
3341; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.3
3342; EPILOG:       loop_exiting.3:
3343; EPILOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add
3344; EPILOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
3345; EPILOG-NEXT:      i64 24, label %exit1.loopexit
3346; EPILOG-NEXT:      i64 42, label %exit1.loopexit
3347; EPILOG-NEXT:    ]
3348; EPILOG:       loop_latch.3:
3349; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv, 4
3350; EPILOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
3351; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.4
3352; EPILOG:       loop_exiting.4:
3353; EPILOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add
3354; EPILOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
3355; EPILOG-NEXT:      i64 24, label %exit1.loopexit
3356; EPILOG-NEXT:      i64 42, label %exit1.loopexit
3357; EPILOG-NEXT:    ]
3358; EPILOG:       loop_latch.4:
3359; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv, 5
3360; EPILOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
3361; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.5
3362; EPILOG:       loop_exiting.5:
3363; EPILOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add
3364; EPILOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
3365; EPILOG-NEXT:      i64 24, label %exit1.loopexit
3366; EPILOG-NEXT:      i64 42, label %exit1.loopexit
3367; EPILOG-NEXT:    ]
3368; EPILOG:       loop_latch.5:
3369; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv, 6
3370; EPILOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
3371; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.6
3372; EPILOG:       loop_exiting.6:
3373; EPILOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add
3374; EPILOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
3375; EPILOG-NEXT:      i64 24, label %exit1.loopexit
3376; EPILOG-NEXT:      i64 42, label %exit1.loopexit
3377; EPILOG-NEXT:    ]
3378; EPILOG:       loop_latch.6:
3379; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv, 7
3380; EPILOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
3381; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.7
3382; EPILOG:       loop_exiting.7:
3383; EPILOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add
3384; EPILOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
3385; EPILOG-NEXT:      i64 24, label %exit1.loopexit
3386; EPILOG-NEXT:      i64 42, label %exit1.loopexit
3387; EPILOG-NEXT:    ]
3388; EPILOG:       loop_latch.7:
3389; EPILOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv, 8
3390; EPILOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
3391; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 8
3392; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
3393; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %latchexit.unr-lcssa.loopexit
3394; EPILOG:       exit1.loopexit:
3395; 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 ], [ %ivy.2, %loop_exiting.2 ], [ %ivy.3, %loop_exiting.3 ], [ %ivy.3, %loop_exiting.3 ], [ %ivy.4, %loop_exiting.4 ], [ %ivy.4, %loop_exiting.4 ], [ %ivy.5, %loop_exiting.5 ], [ %ivy.5, %loop_exiting.5 ], [ %ivy.6, %loop_exiting.6 ], [ %ivy.6, %loop_exiting.6 ], [ %ivy.7, %loop_exiting.7 ], [ %ivy.7, %loop_exiting.7 ]
3396; EPILOG-NEXT:    br label %exit1
3397; EPILOG:       exit1.loopexit2:
3398; EPILOG-NEXT:    %result.ph3 = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ]
3399; EPILOG-NEXT:    br label %exit1
3400; EPILOG:       exit1:
3401; EPILOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph3, %exit1.loopexit2 ]
3402; EPILOG-NEXT:    ret i64 %result
3403; EPILOG:       latchexit.unr-lcssa.loopexit:
3404; EPILOG-NEXT:    %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3405; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
3406; EPILOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3407; EPILOG-NEXT:    br label %latchexit.unr-lcssa
3408; EPILOG:       latchexit.unr-lcssa:
3409; EPILOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ poison, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ]
3410; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ]
3411; EPILOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ]
3412; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3413; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit
3414; EPILOG:       loop_header.epil.preheader:
3415; EPILOG-NEXT:    br label %loop_header.epil
3416; EPILOG:       loop_header.epil:
3417; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
3418; EPILOG-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]
3419; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
3420; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil
3421; EPILOG:       loop_exiting.epil:
3422; EPILOG-NEXT:    %ivy.epil = add i64 %iv.epil, %add
3423; EPILOG-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
3424; EPILOG-NEXT:      i64 24, label %exit1.loopexit2
3425; EPILOG-NEXT:      i64 42, label %exit1.loopexit2
3426; EPILOG-NEXT:    ]
3427; EPILOG:       loop_latch.epil:
3428; EPILOG-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
3429; EPILOG-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
3430; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
3431; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
3432; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
3433; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %latchexit.epilog-lcssa, !llvm.loop !9
3434; EPILOG:       latchexit.epilog-lcssa:
3435; EPILOG-NEXT:    %sum.next.lcssa.ph1 = phi i64 [ %sum.next.epil, %loop_latch.epil ]
3436; EPILOG-NEXT:    br label %latchexit
3437; EPILOG:       latchexit:
3438; EPILOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.lcssa.ph1, %latchexit.epilog-lcssa ]
3439; EPILOG-NEXT:    ret i64 %sum.next.lcssa
3440;
3441; EPILOG-BLOCK-LABEL: @test5(
3442; EPILOG-BLOCK-NEXT:  entry:
3443; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
3444; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
3445; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
3446; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
3447; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchexit.unr-lcssa, label %entry.new
3448; EPILOG-BLOCK:       entry.new:
3449; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
3450; EPILOG-BLOCK-NEXT:    br label %loop_header
3451; EPILOG-BLOCK:       loop_header:
3452; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
3453; EPILOG-BLOCK-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
3454; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
3455; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3456; EPILOG-BLOCK:       loop_exiting:
3457; EPILOG-BLOCK-NEXT:    %ivy = add i64 %iv, %add
3458; EPILOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
3459; EPILOG-BLOCK-NEXT:      i64 24, label %exit1.loopexit
3460; EPILOG-BLOCK-NEXT:      i64 42, label %exit1.loopexit
3461; EPILOG-BLOCK-NEXT:    ]
3462; EPILOG-BLOCK:       loop_latch:
3463; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3464; EPILOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
3465; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3466; EPILOG-BLOCK:       loop_exiting.1:
3467; EPILOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add
3468; EPILOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3469; EPILOG-BLOCK-NEXT:      i64 24, label %exit1.loopexit
3470; EPILOG-BLOCK-NEXT:      i64 42, label %exit1.loopexit
3471; EPILOG-BLOCK-NEXT:    ]
3472; EPILOG-BLOCK:       loop_latch.1:
3473; EPILOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv, 2
3474; EPILOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3475; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 2
3476; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
3477; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !9
3478; EPILOG-BLOCK:       exit1.loopexit:
3479; EPILOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]
3480; EPILOG-BLOCK-NEXT:    br label %exit1
3481; EPILOG-BLOCK:       exit1:
3482; EPILOG-BLOCK-NEXT:    %result = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ], [ %result.ph, %exit1.loopexit ]
3483; EPILOG-BLOCK-NEXT:    ret i64 %result
3484; EPILOG-BLOCK:       latchexit.unr-lcssa.loopexit:
3485; EPILOG-BLOCK-NEXT:    %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3486; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
3487; EPILOG-BLOCK-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3488; EPILOG-BLOCK-NEXT:    br label %latchexit.unr-lcssa
3489; EPILOG-BLOCK:       latchexit.unr-lcssa:
3490; EPILOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ poison, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ]
3491; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ]
3492; EPILOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ]
3493; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3494; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit
3495; EPILOG-BLOCK:       loop_header.epil.preheader:
3496; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
3497; EPILOG-BLOCK:       loop_header.epil:
3498; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil
3499; EPILOG-BLOCK:       loop_exiting.epil:
3500; EPILOG-BLOCK-NEXT:    %ivy.epil = add i64 %iv.unr, %add
3501; EPILOG-BLOCK-NEXT:    switch i64 %sum.unr, label %loop_latch.epil [
3502; EPILOG-BLOCK-NEXT:      i64 24, label %exit1
3503; EPILOG-BLOCK-NEXT:      i64 42, label %exit1
3504; EPILOG-BLOCK-NEXT:    ]
3505; EPILOG-BLOCK:       loop_latch.epil:
3506; EPILOG-BLOCK-NEXT:    %sum.next.epil = add i64 %sum.unr, %add
3507; EPILOG-BLOCK-NEXT:    br label %latchexit
3508; EPILOG-BLOCK:       latchexit:
3509; EPILOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.epil, %loop_latch.epil ]
3510; EPILOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa
3511;
3512; PROLOG-LABEL: @test5(
3513; PROLOG-NEXT:  entry:
3514; PROLOG-NEXT:    %0 = freeze i64 %trip
3515; PROLOG-NEXT:    %1 = add i64 %0, -1
3516; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
3517; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3518; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
3519; PROLOG:       loop_header.prol.preheader:
3520; PROLOG-NEXT:    br label %loop_header.prol
3521; PROLOG:       loop_header.prol:
3522; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
3523; PROLOG-NEXT:    %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ]
3524; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
3525; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol
3526; PROLOG:       loop_exiting.prol:
3527; PROLOG-NEXT:    %ivy.prol = add i64 %iv.prol, %add
3528; PROLOG-NEXT:    switch i64 %sum.prol, label %loop_latch.prol [
3529; PROLOG-NEXT:      i64 24, label %exit1.loopexit1
3530; PROLOG-NEXT:      i64 42, label %exit1.loopexit1
3531; PROLOG-NEXT:    ]
3532; PROLOG:       loop_latch.prol:
3533; PROLOG-NEXT:    %iv_next.prol = add nuw nsw i64 %iv.prol, 1
3534; PROLOG-NEXT:    %sum.next.prol = add i64 %sum.prol, %add
3535; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
3536; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
3537; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
3538; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !9
3539; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
3540; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
3541; PROLOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
3542; PROLOG-NEXT:    %sum.next.lcssa.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
3543; PROLOG-NEXT:    br label %loop_header.prol.loopexit
3544; PROLOG:       loop_header.prol.loopexit:
3545; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
3546; PROLOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
3547; PROLOG-NEXT:    %sum.next.lcssa.unr = phi i64 [ poison, %entry ], [ %sum.next.lcssa.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
3548; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
3549; PROLOG-NEXT:    br i1 %2, label %latchexit, label %entry.new
3550; PROLOG:       entry.new:
3551; PROLOG-NEXT:    br label %loop_header
3552; PROLOG:       loop_header:
3553; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
3554; PROLOG-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
3555; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3556; PROLOG:       loop_exiting:
3557; PROLOG-NEXT:    %ivy = add i64 %iv, %add
3558; PROLOG-NEXT:    switch i64 %sum, label %loop_latch [
3559; PROLOG-NEXT:      i64 24, label %exit1.loopexit
3560; PROLOG-NEXT:      i64 42, label %exit1.loopexit
3561; PROLOG-NEXT:    ]
3562; PROLOG:       loop_latch:
3563; PROLOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3564; PROLOG-NEXT:    %sum.next = add i64 %sum, %add
3565; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3566; PROLOG:       loop_exiting.1:
3567; PROLOG-NEXT:    %ivy.1 = add i64 %iv_next, %add
3568; PROLOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3569; PROLOG-NEXT:      i64 24, label %exit1.loopexit
3570; PROLOG-NEXT:      i64 42, label %exit1.loopexit
3571; PROLOG-NEXT:    ]
3572; PROLOG:       loop_latch.1:
3573; PROLOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv, 2
3574; PROLOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3575; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.2
3576; PROLOG:       loop_exiting.2:
3577; PROLOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add
3578; PROLOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
3579; PROLOG-NEXT:      i64 24, label %exit1.loopexit
3580; PROLOG-NEXT:      i64 42, label %exit1.loopexit
3581; PROLOG-NEXT:    ]
3582; PROLOG:       loop_latch.2:
3583; PROLOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv, 3
3584; PROLOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
3585; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.3
3586; PROLOG:       loop_exiting.3:
3587; PROLOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add
3588; PROLOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
3589; PROLOG-NEXT:      i64 24, label %exit1.loopexit
3590; PROLOG-NEXT:      i64 42, label %exit1.loopexit
3591; PROLOG-NEXT:    ]
3592; PROLOG:       loop_latch.3:
3593; PROLOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv, 4
3594; PROLOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
3595; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.4
3596; PROLOG:       loop_exiting.4:
3597; PROLOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add
3598; PROLOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
3599; PROLOG-NEXT:      i64 24, label %exit1.loopexit
3600; PROLOG-NEXT:      i64 42, label %exit1.loopexit
3601; PROLOG-NEXT:    ]
3602; PROLOG:       loop_latch.4:
3603; PROLOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv, 5
3604; PROLOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
3605; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.5
3606; PROLOG:       loop_exiting.5:
3607; PROLOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add
3608; PROLOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
3609; PROLOG-NEXT:      i64 24, label %exit1.loopexit
3610; PROLOG-NEXT:      i64 42, label %exit1.loopexit
3611; PROLOG-NEXT:    ]
3612; PROLOG:       loop_latch.5:
3613; PROLOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv, 6
3614; PROLOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
3615; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.6
3616; PROLOG:       loop_exiting.6:
3617; PROLOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add
3618; PROLOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
3619; PROLOG-NEXT:      i64 24, label %exit1.loopexit
3620; PROLOG-NEXT:      i64 42, label %exit1.loopexit
3621; PROLOG-NEXT:    ]
3622; PROLOG:       loop_latch.6:
3623; PROLOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv, 7
3624; PROLOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
3625; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.7
3626; PROLOG:       loop_exiting.7:
3627; PROLOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add
3628; PROLOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
3629; PROLOG-NEXT:      i64 24, label %exit1.loopexit
3630; PROLOG-NEXT:      i64 42, label %exit1.loopexit
3631; PROLOG-NEXT:    ]
3632; PROLOG:       loop_latch.7:
3633; PROLOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv, 8
3634; PROLOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
3635; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
3636; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %latchexit.unr-lcssa
3637; PROLOG:       exit1.loopexit:
3638; 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 ], [ %ivy.2, %loop_exiting.2 ], [ %ivy.3, %loop_exiting.3 ], [ %ivy.3, %loop_exiting.3 ], [ %ivy.4, %loop_exiting.4 ], [ %ivy.4, %loop_exiting.4 ], [ %ivy.5, %loop_exiting.5 ], [ %ivy.5, %loop_exiting.5 ], [ %ivy.6, %loop_exiting.6 ], [ %ivy.6, %loop_exiting.6 ], [ %ivy.7, %loop_exiting.7 ], [ %ivy.7, %loop_exiting.7 ]
3639; PROLOG-NEXT:    br label %exit1
3640; PROLOG:       exit1.loopexit1:
3641; PROLOG-NEXT:    %result.ph2 = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ]
3642; PROLOG-NEXT:    br label %exit1
3643; PROLOG:       exit1:
3644; PROLOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph2, %exit1.loopexit1 ]
3645; PROLOG-NEXT:    ret i64 %result
3646; PROLOG:       latchexit.unr-lcssa:
3647; PROLOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3648; PROLOG-NEXT:    br label %latchexit
3649; PROLOG:       latchexit:
3650; PROLOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]
3651; PROLOG-NEXT:    ret i64 %sum.next.lcssa
3652;
3653; PROLOG-BLOCK-LABEL: @test5(
3654; PROLOG-BLOCK-NEXT:  entry:
3655; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
3656; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
3657; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
3658; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3659; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
3660; PROLOG-BLOCK:       loop_header.prol.preheader:
3661; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
3662; PROLOG-BLOCK:       loop_header.prol:
3663; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol
3664; PROLOG-BLOCK:       loop_exiting.prol:
3665; PROLOG-BLOCK-NEXT:    switch i64 0, label %loop_latch.prol [
3666; PROLOG-BLOCK-NEXT:      i64 24, label %exit1
3667; PROLOG-BLOCK-NEXT:      i64 42, label %exit1
3668; PROLOG-BLOCK-NEXT:    ]
3669; PROLOG-BLOCK:       loop_latch.prol:
3670; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
3671; PROLOG-BLOCK:       loop_header.prol.loopexit:
3672; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
3673; PROLOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %add, %loop_latch.prol ]
3674; PROLOG-BLOCK-NEXT:    %sum.next.lcssa.unr = phi i64 [ poison, %entry ], [ %add, %loop_latch.prol ]
3675; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
3676; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchexit, label %entry.new
3677; PROLOG-BLOCK:       entry.new:
3678; PROLOG-BLOCK-NEXT:    br label %loop_header
3679; PROLOG-BLOCK:       loop_header:
3680; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
3681; PROLOG-BLOCK-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
3682; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3683; PROLOG-BLOCK:       loop_exiting:
3684; PROLOG-BLOCK-NEXT:    %ivy = add i64 %iv, %add
3685; PROLOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
3686; PROLOG-BLOCK-NEXT:      i64 24, label %exit1.loopexit
3687; PROLOG-BLOCK-NEXT:      i64 42, label %exit1.loopexit
3688; PROLOG-BLOCK-NEXT:    ]
3689; PROLOG-BLOCK:       loop_latch:
3690; PROLOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3691; PROLOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
3692; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3693; PROLOG-BLOCK:       loop_exiting.1:
3694; PROLOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add
3695; PROLOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3696; PROLOG-BLOCK-NEXT:      i64 24, label %exit1.loopexit
3697; PROLOG-BLOCK-NEXT:      i64 42, label %exit1.loopexit
3698; PROLOG-BLOCK-NEXT:    ]
3699; PROLOG-BLOCK:       loop_latch.1:
3700; PROLOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv, 2
3701; PROLOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3702; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
3703; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %latchexit.unr-lcssa, !llvm.loop !9
3704; PROLOG-BLOCK:       exit1.loopexit:
3705; PROLOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]
3706; PROLOG-BLOCK-NEXT:    br label %exit1
3707; PROLOG-BLOCK:       exit1:
3708; PROLOG-BLOCK-NEXT:    %result = phi i64 [ %add, %loop_exiting.prol ], [ %add, %loop_exiting.prol ], [ %result.ph, %exit1.loopexit ]
3709; PROLOG-BLOCK-NEXT:    ret i64 %result
3710; PROLOG-BLOCK:       latchexit.unr-lcssa:
3711; PROLOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3712; PROLOG-BLOCK-NEXT:    br label %latchexit
3713; PROLOG-BLOCK:       latchexit:
3714; PROLOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]
3715; PROLOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa
3716;
3717
3718entry:
3719  br label %loop_header
3720
3721loop_header:
3722  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
3723  %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ]
3724  br i1 %cond, label %loop_latch, label %loop_exiting
3725
3726loop_exiting:
3727  %ivy = add i64 %iv, %add
3728  switch i64 %sum, label %loop_latch [
3729  i64 24, label %exit1
3730  i64 42, label %exit1
3731  ]
3732
3733loop_latch:
3734  %iv_next = add nuw nsw i64 %iv, 1
3735  %sum.next = add i64 %sum, %add
3736  %cmp = icmp ne i64 %iv_next, %trip
3737  br i1 %cmp, label %loop_header, label %latchexit
3738
3739exit1:
3740  %result = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ]
3741  ret i64 %result
3742
3743latchexit:
3744  ret i64 %sum.next
3745}
3746
3747; test when exit blocks have successors.
3748define i32 @test6(ptr nocapture %a, i64 %n, i1 %cond, i32 %x) {
3749; EPILOG-LABEL: @test6(
3750; EPILOG-NEXT:  entry:
3751; EPILOG-NEXT:    %0 = freeze i64 %n
3752; EPILOG-NEXT:    %1 = add i64 %0, -1
3753; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
3754; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
3755; EPILOG-NEXT:    br i1 %2, label %latch_exit.unr-lcssa, label %entry.new
3756; EPILOG:       entry.new:
3757; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
3758; EPILOG-NEXT:    br label %header
3759; EPILOG:       header:
3760; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
3761; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
3762; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
3763; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
3764; EPILOG:       for.exiting_block:
3765; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
3766; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
3767; EPILOG:       latch:
3768; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
3769; EPILOG-NEXT:    %load = load i32, ptr %arrayidx, align 4
3770; EPILOG-NEXT:    %add = add nsw i32 %load, %sum.02
3771; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
3772; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
3773; EPILOG:       for.exiting_block.1:
3774; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3775; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3776; EPILOG:       latch.1:
3777; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
3778; EPILOG-NEXT:    %load.1 = load i32, ptr %arrayidx.1, align 4
3779; EPILOG-NEXT:    %add.1 = add nsw i32 %load.1, %add
3780; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2
3781; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
3782; EPILOG:       for.exiting_block.2:
3783; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
3784; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
3785; EPILOG:       latch.2:
3786; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1
3787; EPILOG-NEXT:    %load.2 = load i32, ptr %arrayidx.2, align 4
3788; EPILOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.1
3789; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 3
3790; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
3791; EPILOG:       for.exiting_block.3:
3792; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
3793; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
3794; EPILOG:       latch.3:
3795; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2
3796; EPILOG-NEXT:    %load.3 = load i32, ptr %arrayidx.3, align 4
3797; EPILOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.2
3798; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4
3799; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
3800; EPILOG:       for.exiting_block.4:
3801; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
3802; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
3803; EPILOG:       latch.4:
3804; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3
3805; EPILOG-NEXT:    %load.4 = load i32, ptr %arrayidx.4, align 4
3806; EPILOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.3
3807; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv, 5
3808; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
3809; EPILOG:       for.exiting_block.5:
3810; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
3811; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
3812; EPILOG:       latch.5:
3813; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4
3814; EPILOG-NEXT:    %load.5 = load i32, ptr %arrayidx.5, align 4
3815; EPILOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.4
3816; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv, 6
3817; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
3818; EPILOG:       for.exiting_block.6:
3819; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
3820; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
3821; EPILOG:       latch.6:
3822; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5
3823; EPILOG-NEXT:    %load.6 = load i32, ptr %arrayidx.6, align 4
3824; EPILOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.5
3825; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv, 7
3826; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
3827; EPILOG:       for.exiting_block.7:
3828; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
3829; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
3830; EPILOG:       latch.7:
3831; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6
3832; EPILOG-NEXT:    %load.7 = load i32, ptr %arrayidx.7, align 4
3833; EPILOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.6
3834; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 8
3835; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 8
3836; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
3837; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latch_exit.unr-lcssa.loopexit, label %header
3838; EPILOG:       latch_exit.unr-lcssa.loopexit:
3839; EPILOG-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %latch.7 ]
3840; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
3841; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
3842; EPILOG-NEXT:    br label %latch_exit.unr-lcssa
3843; EPILOG:       latch_exit.unr-lcssa:
3844; EPILOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ poison, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ]
3845; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3846; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3847; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3848; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit
3849; EPILOG:       header.epil.preheader:
3850; EPILOG-NEXT:    br label %header.epil
3851; EPILOG:       header.epil:
3852; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
3853; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
3854; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
3855; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil
3856; EPILOG:       for.exiting_block.epil:
3857; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
3858; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit2, label %latch.epil
3859; EPILOG:       latch.epil:
3860; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.epil
3861; EPILOG-NEXT:    %load.epil = load i32, ptr %arrayidx.epil, align 4
3862; EPILOG-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.epil
3863; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
3864; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
3865; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
3866; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
3867; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latch_exit.epilog-lcssa, !llvm.loop !10
3868; EPILOG:       latch_exit.epilog-lcssa:
3869; EPILOG-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %latch.epil ]
3870; EPILOG-NEXT:    br label %latch_exit
3871; EPILOG:       latch_exit:
3872; EPILOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %sum.0.lcssa.ph1, %latch_exit.epilog-lcssa ]
3873; EPILOG-NEXT:    ret i32 %sum.0.lcssa
3874; EPILOG:       for.exit2.loopexit:
3875; 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 ], [ 42, %for.exiting_block.3 ], [ %add.3, %latch.3 ], [ 42, %for.exiting_block.4 ], [ %add.4, %latch.4 ], [ 42, %for.exiting_block.5 ], [ %add.5, %latch.5 ], [ 42, %for.exiting_block.6 ], [ %add.6, %latch.6 ], [ 42, %for.exiting_block.7 ]
3876; EPILOG-NEXT:    br label %for.exit2
3877; EPILOG:       for.exit2.loopexit2:
3878; EPILOG-NEXT:    %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
3879; EPILOG-NEXT:    br label %for.exit2
3880; EPILOG:       for.exit2:
3881; EPILOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
3882; EPILOG-NEXT:    %addx = add i32 %retval, %x
3883; EPILOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3884; EPILOG:       exit_true:
3885; EPILOG-NEXT:    ret i32 %retval
3886; EPILOG:       exit_false:
3887; EPILOG-NEXT:    ret i32 %addx
3888;
3889; EPILOG-BLOCK-LABEL: @test6(
3890; EPILOG-BLOCK-NEXT:  entry:
3891; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n
3892; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
3893; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
3894; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
3895; EPILOG-BLOCK-NEXT:    br i1 %2, label %latch_exit.unr-lcssa, label %entry.new
3896; EPILOG-BLOCK:       entry.new:
3897; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
3898; EPILOG-BLOCK-NEXT:    br label %header
3899; EPILOG-BLOCK:       header:
3900; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
3901; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
3902; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
3903; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
3904; EPILOG-BLOCK:       for.exiting_block:
3905; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
3906; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
3907; EPILOG-BLOCK:       latch:
3908; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
3909; EPILOG-BLOCK-NEXT:    %load = load i32, ptr %arrayidx, align 4
3910; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %load, %sum.02
3911; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
3912; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
3913; EPILOG-BLOCK:       for.exiting_block.1:
3914; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3915; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3916; EPILOG-BLOCK:       latch.1:
3917; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
3918; EPILOG-BLOCK-NEXT:    %load.1 = load i32, ptr %arrayidx.1, align 4
3919; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add
3920; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2
3921; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 2
3922; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
3923; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latch_exit.unr-lcssa.loopexit, label %header, !llvm.loop !10
3924; EPILOG-BLOCK:       latch_exit.unr-lcssa.loopexit:
3925; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %latch.1 ]
3926; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
3927; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
3928; EPILOG-BLOCK-NEXT:    br label %latch_exit.unr-lcssa
3929; EPILOG-BLOCK:       latch_exit.unr-lcssa:
3930; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ poison, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ]
3931; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3932; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3933; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3934; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit
3935; EPILOG-BLOCK:       header.epil.preheader:
3936; EPILOG-BLOCK-NEXT:    br label %header.epil
3937; EPILOG-BLOCK:       header.epil:
3938; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.epil
3939; EPILOG-BLOCK:       for.exiting_block.epil:
3940; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
3941; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %latch.epil
3942; EPILOG-BLOCK:       latch.epil:
3943; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.unr
3944; EPILOG-BLOCK-NEXT:    %load.epil = load i32, ptr %arrayidx.epil, align 4
3945; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.unr
3946; EPILOG-BLOCK-NEXT:    br label %latch_exit
3947; EPILOG-BLOCK:       latch_exit:
3948; EPILOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %add.epil, %latch.epil ]
3949; EPILOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
3950; EPILOG-BLOCK:       for.exit2.loopexit:
3951; EPILOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]
3952; EPILOG-BLOCK-NEXT:    br label %for.exit2
3953; EPILOG-BLOCK:       for.exit2:
3954; EPILOG-BLOCK-NEXT:    %retval = phi i32 [ %sum.02.unr, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ]
3955; EPILOG-BLOCK-NEXT:    %addx = add i32 %retval, %x
3956; EPILOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3957; EPILOG-BLOCK:       exit_true:
3958; EPILOG-BLOCK-NEXT:    ret i32 %retval
3959; EPILOG-BLOCK:       exit_false:
3960; EPILOG-BLOCK-NEXT:    ret i32 %addx
3961;
3962; PROLOG-LABEL: @test6(
3963; PROLOG-NEXT:  entry:
3964; PROLOG-NEXT:    %0 = freeze i64 %n
3965; PROLOG-NEXT:    %1 = add i64 %0, -1
3966; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
3967; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3968; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
3969; PROLOG:       header.prol.preheader:
3970; PROLOG-NEXT:    br label %header.prol
3971; PROLOG:       header.prol:
3972; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
3973; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
3974; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
3975; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol
3976; PROLOG:       for.exiting_block.prol:
3977; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
3978; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit1, label %latch.prol
3979; PROLOG:       latch.prol:
3980; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.prol
3981; PROLOG-NEXT:    %load.prol = load i32, ptr %arrayidx.prol, align 4
3982; PROLOG-NEXT:    %add.prol = add nsw i32 %load.prol, %sum.02.prol
3983; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
3984; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
3985; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
3986; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
3987; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !10
3988; PROLOG:       header.prol.loopexit.unr-lcssa:
3989; PROLOG-NEXT:    %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %latch.prol ]
3990; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
3991; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
3992; PROLOG-NEXT:    br label %header.prol.loopexit
3993; PROLOG:       header.prol.loopexit:
3994; PROLOG-NEXT:    %sum.0.lcssa.unr = phi i32 [ poison, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ]
3995; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
3996; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
3997; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
3998; PROLOG-NEXT:    br i1 %2, label %latch_exit, label %entry.new
3999; PROLOG:       entry.new:
4000; PROLOG-NEXT:    br label %header
4001; PROLOG:       header:
4002; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
4003; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
4004; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
4005; PROLOG:       for.exiting_block:
4006; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
4007; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
4008; PROLOG:       latch:
4009; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
4010; PROLOG-NEXT:    %load = load i32, ptr %arrayidx, align 4
4011; PROLOG-NEXT:    %add = add nsw i32 %load, %sum.02
4012; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
4013; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
4014; PROLOG:       for.exiting_block.1:
4015; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
4016; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
4017; PROLOG:       latch.1:
4018; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
4019; PROLOG-NEXT:    %load.1 = load i32, ptr %arrayidx.1, align 4
4020; PROLOG-NEXT:    %add.1 = add nsw i32 %load.1, %add
4021; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2
4022; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
4023; PROLOG:       for.exiting_block.2:
4024; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
4025; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
4026; PROLOG:       latch.2:
4027; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.1
4028; PROLOG-NEXT:    %load.2 = load i32, ptr %arrayidx.2, align 4
4029; PROLOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.1
4030; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv, 3
4031; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
4032; PROLOG:       for.exiting_block.3:
4033; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
4034; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
4035; PROLOG:       latch.3:
4036; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.2
4037; PROLOG-NEXT:    %load.3 = load i32, ptr %arrayidx.3, align 4
4038; PROLOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.2
4039; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv, 4
4040; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
4041; PROLOG:       for.exiting_block.4:
4042; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
4043; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
4044; PROLOG:       latch.4:
4045; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.3
4046; PROLOG-NEXT:    %load.4 = load i32, ptr %arrayidx.4, align 4
4047; PROLOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.3
4048; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv, 5
4049; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
4050; PROLOG:       for.exiting_block.5:
4051; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
4052; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
4053; PROLOG:       latch.5:
4054; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.4
4055; PROLOG-NEXT:    %load.5 = load i32, ptr %arrayidx.5, align 4
4056; PROLOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.4
4057; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv, 6
4058; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
4059; PROLOG:       for.exiting_block.6:
4060; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
4061; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
4062; PROLOG:       latch.6:
4063; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.5
4064; PROLOG-NEXT:    %load.6 = load i32, ptr %arrayidx.6, align 4
4065; PROLOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.5
4066; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv, 7
4067; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
4068; PROLOG:       for.exiting_block.7:
4069; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
4070; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
4071; PROLOG:       latch.7:
4072; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next.6
4073; PROLOG-NEXT:    %load.7 = load i32, ptr %arrayidx.7, align 4
4074; PROLOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.6
4075; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv, 8
4076; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
4077; PROLOG-NEXT:    br i1 %exitcond.7, label %latch_exit.unr-lcssa, label %header
4078; PROLOG:       latch_exit.unr-lcssa:
4079; PROLOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %latch.7 ]
4080; PROLOG-NEXT:    br label %latch_exit
4081; PROLOG:       latch_exit:
4082; PROLOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]
4083; PROLOG-NEXT:    ret i32 %sum.0.lcssa
4084; PROLOG:       for.exit2.loopexit:
4085; 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 ], [ 42, %for.exiting_block.3 ], [ %add.3, %latch.3 ], [ 42, %for.exiting_block.4 ], [ %add.4, %latch.4 ], [ 42, %for.exiting_block.5 ], [ %add.5, %latch.5 ], [ 42, %for.exiting_block.6 ], [ %add.6, %latch.6 ], [ 42, %for.exiting_block.7 ]
4086; PROLOG-NEXT:    br label %for.exit2
4087; PROLOG:       for.exit2.loopexit1:
4088; PROLOG-NEXT:    %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
4089; PROLOG-NEXT:    br label %for.exit2
4090; PROLOG:       for.exit2:
4091; PROLOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
4092; PROLOG-NEXT:    %addx = add i32 %retval, %x
4093; PROLOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false
4094; PROLOG:       exit_true:
4095; PROLOG-NEXT:    ret i32 %retval
4096; PROLOG:       exit_false:
4097; PROLOG-NEXT:    ret i32 %addx
4098;
4099; PROLOG-BLOCK-LABEL: @test6(
4100; PROLOG-BLOCK-NEXT:  entry:
4101; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n
4102; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
4103; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4104; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4105; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4106; PROLOG-BLOCK:       header.prol.preheader:
4107; PROLOG-BLOCK-NEXT:    br label %header.prol
4108; PROLOG-BLOCK:       header.prol:
4109; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.prol
4110; PROLOG-BLOCK:       for.exiting_block.prol:
4111; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
4112; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %latch.prol
4113; PROLOG-BLOCK:       latch.prol:
4114; PROLOG-BLOCK-NEXT:    %load.prol = load i32, ptr %a, align 4
4115; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
4116; PROLOG-BLOCK:       header.prol.loopexit:
4117; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.unr = phi i32 [ poison, %entry ], [ %load.prol, %latch.prol ]
4118; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
4119; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %load.prol, %latch.prol ]
4120; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4121; PROLOG-BLOCK-NEXT:    br i1 %2, label %latch_exit, label %entry.new
4122; PROLOG-BLOCK:       entry.new:
4123; PROLOG-BLOCK-NEXT:    br label %header
4124; PROLOG-BLOCK:       header:
4125; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
4126; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
4127; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
4128; PROLOG-BLOCK:       for.exiting_block:
4129; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
4130; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
4131; PROLOG-BLOCK:       latch:
4132; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
4133; PROLOG-BLOCK-NEXT:    %load = load i32, ptr %arrayidx, align 4
4134; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %load, %sum.02
4135; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
4136; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
4137; PROLOG-BLOCK:       for.exiting_block.1:
4138; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
4139; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
4140; PROLOG-BLOCK:       latch.1:
4141; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, ptr %a, i64 %indvars.iv.next
4142; PROLOG-BLOCK-NEXT:    %load.1 = load i32, ptr %arrayidx.1, align 4
4143; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add
4144; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv, 2
4145; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
4146; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latch_exit.unr-lcssa, label %header, !llvm.loop !10
4147; PROLOG-BLOCK:       latch_exit.unr-lcssa:
4148; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %latch.1 ]
4149; PROLOG-BLOCK-NEXT:    br label %latch_exit
4150; PROLOG-BLOCK:       latch_exit:
4151; PROLOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]
4152; PROLOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
4153; PROLOG-BLOCK:       for.exit2.loopexit:
4154; PROLOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]
4155; PROLOG-BLOCK-NEXT:    br label %for.exit2
4156; PROLOG-BLOCK:       for.exit2:
4157; PROLOG-BLOCK-NEXT:    %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ]
4158; PROLOG-BLOCK-NEXT:    %addx = add i32 %retval, %x
4159; PROLOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false
4160; PROLOG-BLOCK:       exit_true:
4161; PROLOG-BLOCK-NEXT:    ret i32 %retval
4162; PROLOG-BLOCK:       exit_false:
4163; PROLOG-BLOCK-NEXT:    ret i32 %addx
4164;
4165
4166entry:
4167  br label %header
4168
4169header:
4170  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
4171  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
4172  br i1 false, label %for.exit2, label %for.exiting_block
4173
4174for.exiting_block:
4175  %cmp = icmp eq i64 %n, 42
4176  br i1 %cmp, label %for.exit2, label %latch
4177
4178latch:
4179  %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv
4180  %load = load i32, ptr %arrayidx, align 4
4181  %add = add nsw i32 %load, %sum.02
4182  %indvars.iv.next = add i64 %indvars.iv, 1
4183  %exitcond = icmp eq i64 %indvars.iv.next, %n
4184  br i1 %exitcond, label %latch_exit, label %header
4185
4186latch_exit:
4187  %sum.0.lcssa = phi i32 [ %add, %latch ]
4188  ret i32 %sum.0.lcssa
4189
4190for.exit2:
4191  %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ]
4192  %addx = add i32 %retval, %x
4193  br i1 %cond, label %exit_true, label %exit_false
4194
4195exit_true:
4196  ret i32 %retval
4197
4198exit_false:
4199  ret i32 %addx
4200}
4201
4202; test when value in exit block does not have VMap.
4203define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) {
4204; EPILOG-LABEL: @test7(
4205; EPILOG-NEXT:  bb:
4206; EPILOG-NEXT:    %i = icmp slt i32 undef, 2
4207; EPILOG-NEXT:    %sext = sext i32 undef to i64
4208; EPILOG-NEXT:    %shft = ashr exact i32 %arg, 16
4209; EPILOG-NEXT:    br i1 %i, label %loopexit2, label %preheader
4210; EPILOG:       preheader:
4211; EPILOG-NEXT:    %0 = add nsw i64 %sext, -1
4212; EPILOG-NEXT:    %1 = freeze i64 %0
4213; EPILOG-NEXT:    %2 = add i64 %1, -1
4214; EPILOG-NEXT:    %xtraiter = and i64 %1, 7
4215; EPILOG-NEXT:    %3 = icmp ult i64 %2, 7
4216; EPILOG-NEXT:    br i1 %3, label %latchexit.unr-lcssa, label %preheader.new
4217; EPILOG:       preheader.new:
4218; EPILOG-NEXT:    %unroll_iter = sub i64 %1, %xtraiter
4219; EPILOG-NEXT:    br label %header
4220; EPILOG:       header:
4221; EPILOG-NEXT:    %i6 = phi i64 [ 1, %preheader.new ], [ %add.7, %latch.7 ]
4222; EPILOG-NEXT:    %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ]
4223; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4224; EPILOG:       latch:
4225; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4226; EPILOG:       latch.1:
4227; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.2
4228; EPILOG:       latch.2:
4229; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.3
4230; EPILOG:       latch.3:
4231; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.4
4232; EPILOG:       latch.4:
4233; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.5
4234; EPILOG:       latch.5:
4235; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.6
4236; EPILOG:       latch.6:
4237; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.7
4238; EPILOG:       latch.7:
4239; EPILOG-NEXT:    %add.7 = add nuw nsw i64 %i6, 8
4240; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 8
4241; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
4242; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %latchexit.unr-lcssa.loopexit
4243; EPILOG:       latchexit.unr-lcssa.loopexit:
4244; EPILOG-NEXT:    %i6.unr.ph = phi i64 [ %add.7, %latch.7 ]
4245; EPILOG-NEXT:    br label %latchexit.unr-lcssa
4246; EPILOG:       latchexit.unr-lcssa:
4247; EPILOG-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ]
4248; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4249; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit
4250; EPILOG:       header.epil.preheader:
4251; EPILOG-NEXT:    br label %header.epil
4252; EPILOG:       header.epil:
4253; EPILOG-NEXT:    %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ], [ %add.epil, %latch.epil ]
4254; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
4255; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit1, label %latch.epil
4256; EPILOG:       latch.epil:
4257; EPILOG-NEXT:    %add.epil = add nuw nsw i64 %i6.epil, 1
4258; EPILOG-NEXT:    %i9.epil = icmp slt i64 %add.epil, %sext
4259; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
4260; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
4261; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchexit.epilog-lcssa, !llvm.loop !11
4262; EPILOG:       latchexit.epilog-lcssa:
4263; EPILOG-NEXT:    br label %latchexit
4264; EPILOG:       latchexit:
4265; EPILOG-NEXT:    unreachable
4266; EPILOG:       loopexit2:
4267; EPILOG-NEXT:    ret i32 %shft
4268; EPILOG:       loopexit1.loopexit:
4269; EPILOG-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 ]
4270; EPILOG-NEXT:    br label %loopexit1
4271; EPILOG:       loopexit1.loopexit1:
4272; EPILOG-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.epil ]
4273; EPILOG-NEXT:    br label %loopexit1
4274; EPILOG:       loopexit1:
4275; EPILOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
4276; EPILOG-NEXT:    ret i32 %sext3
4277;
4278; EPILOG-BLOCK-LABEL: @test7(
4279; EPILOG-BLOCK-NEXT:  bb:
4280; EPILOG-BLOCK-NEXT:    %i = icmp slt i32 undef, 2
4281; EPILOG-BLOCK-NEXT:    %sext = sext i32 undef to i64
4282; EPILOG-BLOCK-NEXT:    %shft = ashr exact i32 %arg, 16
4283; EPILOG-BLOCK-NEXT:    br i1 %i, label %loopexit2, label %preheader
4284; EPILOG-BLOCK:       preheader:
4285; EPILOG-BLOCK-NEXT:    %0 = add nsw i64 %sext, -1
4286; EPILOG-BLOCK-NEXT:    %1 = freeze i64 %0
4287; EPILOG-BLOCK-NEXT:    %2 = add i64 %1, -1
4288; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %1, 1
4289; EPILOG-BLOCK-NEXT:    %3 = icmp ult i64 %2, 1
4290; EPILOG-BLOCK-NEXT:    br i1 %3, label %latchexit.unr-lcssa, label %preheader.new
4291; EPILOG-BLOCK:       preheader.new:
4292; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %1, %xtraiter
4293; EPILOG-BLOCK-NEXT:    br label %header
4294; EPILOG-BLOCK:       header:
4295; EPILOG-BLOCK-NEXT:    %i6 = phi i64 [ 1, %preheader.new ], [ %add.1, %latch.1 ]
4296; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ]
4297; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4298; EPILOG-BLOCK:       latch:
4299; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4300; EPILOG-BLOCK:       latch.1:
4301; EPILOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %i6, 2
4302; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 2
4303; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
4304; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !11
4305; EPILOG-BLOCK:       latchexit.unr-lcssa.loopexit:
4306; EPILOG-BLOCK-NEXT:    br label %latchexit.unr-lcssa
4307; EPILOG-BLOCK:       latchexit.unr-lcssa:
4308; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4309; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit
4310; EPILOG-BLOCK:       header.epil.preheader:
4311; EPILOG-BLOCK-NEXT:    br label %header.epil
4312; EPILOG-BLOCK:       header.epil:
4313; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1, label %latch.epil
4314; EPILOG-BLOCK:       latch.epil:
4315; EPILOG-BLOCK-NEXT:    br label %latchexit
4316; EPILOG-BLOCK:       latchexit:
4317; EPILOG-BLOCK-NEXT:    unreachable
4318; EPILOG-BLOCK:       loopexit2:
4319; EPILOG-BLOCK-NEXT:    ret i32 %shft
4320; EPILOG-BLOCK:       loopexit1.loopexit:
4321; EPILOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]
4322; EPILOG-BLOCK-NEXT:    br label %loopexit1
4323; EPILOG-BLOCK:       loopexit1:
4324; EPILOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.epil ], [ %sext3.ph, %loopexit1.loopexit ]
4325; EPILOG-BLOCK-NEXT:    ret i32 %sext3
4326;
4327; PROLOG-LABEL: @test7(
4328; PROLOG-NEXT:  bb:
4329; PROLOG-NEXT:    %i = icmp slt i32 undef, 2
4330; PROLOG-NEXT:    %sext = sext i32 undef to i64
4331; PROLOG-NEXT:    %shft = ashr exact i32 %arg, 16
4332; PROLOG-NEXT:    br i1 %i, label %loopexit2, label %preheader
4333; PROLOG:       preheader:
4334; PROLOG-NEXT:    %0 = add nsw i64 %sext, -1
4335; PROLOG-NEXT:    %1 = freeze i64 %0
4336; PROLOG-NEXT:    %2 = add i64 %1, -1
4337; PROLOG-NEXT:    %xtraiter = and i64 %1, 7
4338; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4339; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4340; PROLOG:       header.prol.preheader:
4341; PROLOG-NEXT:    br label %header.prol
4342; PROLOG:       header.prol:
4343; PROLOG-NEXT:    %i6.prol = phi i64 [ 1, %header.prol.preheader ], [ %add.prol, %latch.prol ]
4344; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
4345; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit1, label %latch.prol
4346; PROLOG:       latch.prol:
4347; PROLOG-NEXT:    %add.prol = add nuw nsw i64 %i6.prol, 1
4348; PROLOG-NEXT:    %i9.prol = icmp slt i64 %add.prol, %sext
4349; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
4350; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
4351; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !11
4352; PROLOG:       header.prol.loopexit.unr-lcssa:
4353; PROLOG-NEXT:    %i6.unr.ph = phi i64 [ %add.prol, %latch.prol ]
4354; PROLOG-NEXT:    br label %header.prol.loopexit
4355; PROLOG:       header.prol.loopexit:
4356; PROLOG-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %header.prol.loopexit.unr-lcssa ]
4357; PROLOG-NEXT:    %3 = icmp ult i64 %2, 7
4358; PROLOG-NEXT:    br i1 %3, label %latchexit, label %preheader.new
4359; PROLOG:       preheader.new:
4360; PROLOG-NEXT:    br label %header
4361; PROLOG:       header:
4362; PROLOG-NEXT:    %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.7, %latch.7 ]
4363; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4364; PROLOG:       latch:
4365; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4366; PROLOG:       latch.1:
4367; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.2
4368; PROLOG:       latch.2:
4369; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.3
4370; PROLOG:       latch.3:
4371; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.4
4372; PROLOG:       latch.4:
4373; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.5
4374; PROLOG:       latch.5:
4375; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.6
4376; PROLOG:       latch.6:
4377; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.7
4378; PROLOG:       latch.7:
4379; PROLOG-NEXT:    %add.7 = add nuw nsw i64 %i6, 8
4380; PROLOG-NEXT:    %i9.7 = icmp slt i64 %add.7, %sext
4381; PROLOG-NEXT:    br i1 %i9.7, label %header, label %latchexit.unr-lcssa
4382; PROLOG:       latchexit.unr-lcssa:
4383; PROLOG-NEXT:    br label %latchexit
4384; PROLOG:       latchexit:
4385; PROLOG-NEXT:    unreachable
4386; PROLOG:       loopexit2:
4387; PROLOG-NEXT:    ret i32 %shft
4388; PROLOG:       loopexit1.loopexit:
4389; PROLOG-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 ]
4390; PROLOG-NEXT:    br label %loopexit1
4391; PROLOG:       loopexit1.loopexit1:
4392; PROLOG-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.prol ]
4393; PROLOG-NEXT:    br label %loopexit1
4394; PROLOG:       loopexit1:
4395; PROLOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
4396; PROLOG-NEXT:    ret i32 %sext3
4397;
4398; PROLOG-BLOCK-LABEL: @test7(
4399; PROLOG-BLOCK-NEXT:  bb:
4400; PROLOG-BLOCK-NEXT:    %i = icmp slt i32 undef, 2
4401; PROLOG-BLOCK-NEXT:    %sext = sext i32 undef to i64
4402; PROLOG-BLOCK-NEXT:    %shft = ashr exact i32 %arg, 16
4403; PROLOG-BLOCK-NEXT:    br i1 %i, label %loopexit2, label %preheader
4404; PROLOG-BLOCK:       preheader:
4405; PROLOG-BLOCK-NEXT:    %0 = add nsw i64 %sext, -1
4406; PROLOG-BLOCK-NEXT:    %1 = freeze i64 %0
4407; PROLOG-BLOCK-NEXT:    %2 = add i64 %1, -1
4408; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %1, 1
4409; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4410; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4411; PROLOG-BLOCK:       header.prol.preheader:
4412; PROLOG-BLOCK-NEXT:    br label %header.prol
4413; PROLOG-BLOCK:       header.prol:
4414; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1, label %latch.prol
4415; PROLOG-BLOCK:       latch.prol:
4416; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
4417; PROLOG-BLOCK:       header.prol.loopexit:
4418; PROLOG-BLOCK-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ 2, %latch.prol ]
4419; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %2, 1
4420; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchexit, label %preheader.new
4421; PROLOG-BLOCK:       preheader.new:
4422; PROLOG-BLOCK-NEXT:    br label %header
4423; PROLOG-BLOCK:       header:
4424; PROLOG-BLOCK-NEXT:    %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.1, %latch.1 ]
4425; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4426; PROLOG-BLOCK:       latch:
4427; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4428; PROLOG-BLOCK:       latch.1:
4429; PROLOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %i6, 2
4430; PROLOG-BLOCK-NEXT:    %i9.1 = icmp slt i64 %add.1, %sext
4431; PROLOG-BLOCK-NEXT:    br i1 %i9.1, label %header, label %latchexit.unr-lcssa, !llvm.loop !11
4432; PROLOG-BLOCK:       latchexit.unr-lcssa:
4433; PROLOG-BLOCK-NEXT:    br label %latchexit
4434; PROLOG-BLOCK:       latchexit:
4435; PROLOG-BLOCK-NEXT:    unreachable
4436; PROLOG-BLOCK:       loopexit2:
4437; PROLOG-BLOCK-NEXT:    ret i32 %shft
4438; PROLOG-BLOCK:       loopexit1.loopexit:
4439; PROLOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]
4440; PROLOG-BLOCK-NEXT:    br label %loopexit1
4441; PROLOG-BLOCK:       loopexit1:
4442; PROLOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.prol ], [ %sext3.ph, %loopexit1.loopexit ]
4443; PROLOG-BLOCK-NEXT:    ret i32 %sext3
4444;
4445bb:
4446  %i = icmp slt i32 undef, 2
4447  %sext = sext i32 undef to i64
4448  %shft = ashr exact i32 %arg, 16
4449  br i1 %i, label %loopexit2, label %preheader
4450
4451preheader:                                              ; preds = %bb2
4452  br label %header
4453
4454header:                                              ; preds = %latch, %preheader
4455  %i6 = phi i64 [ 1, %preheader ], [ %add, %latch ]
4456  br i1 false, label %loopexit1, label %latch
4457
4458latch:                                              ; preds = %header
4459  %add = add nuw nsw i64 %i6, 1
4460  %i9 = icmp slt i64 %add, %sext
4461  br i1 %i9, label %header, label %latchexit
4462
4463latchexit:                                             ; preds = %latch
4464  unreachable
4465
4466loopexit2:                                             ; preds = %bb2
4467  ret i32 %shft
4468
4469loopexit1:                                             ; preds = %header
4470  %sext3 = phi i32 [ %shft, %header ]
4471  ret i32 %sext3
4472}
4473
4474; Nested loop and inner loop is unrolled.  The tricky bit here is that
4475; several blocks in the inner loop fall out of the outer block when we
4476; use the epilogue block remainder strategy.
4477define void @test8() {
4478; EPILOG-LABEL: @test8(
4479; EPILOG-NEXT:  bb:
4480; EPILOG-NEXT:    br label %outerloop
4481; EPILOG:       outerloop.loopexit.loopexit:
4482; EPILOG-NEXT:    br label %outerloop.loopexit
4483; EPILOG:       outerloop.loopexit.loopexit1:
4484; EPILOG-NEXT:    br label %outerloop.loopexit
4485; EPILOG:       outerloop.loopexit:
4486; EPILOG-NEXT:    br label %outerloop
4487; EPILOG:       outerloop:
4488; EPILOG-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]
4489; EPILOG-NEXT:    %0 = sub i64 100, %i
4490; EPILOG-NEXT:    %1 = sub i64 99, %i
4491; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
4492; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
4493; EPILOG-NEXT:    br i1 %2, label %exit.unr-lcssa, label %outerloop.new
4494; EPILOG:       outerloop.new:
4495; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
4496; EPILOG-NEXT:    br label %innerH
4497; EPILOG:       innerH:
4498; EPILOG-NEXT:    %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.7, %latch.7 ]
4499; EPILOG-NEXT:    %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.7, %latch.7 ]
4500; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4501; EPILOG:       latch:
4502; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4503; EPILOG:       latch.1:
4504; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.2
4505; EPILOG:       latch.2:
4506; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.3
4507; EPILOG:       latch.3:
4508; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.4
4509; EPILOG:       latch.4:
4510; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.5
4511; EPILOG:       latch.5:
4512; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.6
4513; EPILOG:       latch.6:
4514; EPILOG-NEXT:    %i4.7 = add nuw nsw i64 %i3, 8
4515; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.7
4516; EPILOG:       latch.7:
4517; EPILOG-NEXT:    %niter.next.7 = add nuw nsw i64 %niter, 8
4518; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
4519; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %innerH, label %exit.unr-lcssa.loopexit
4520; EPILOG:       exit.unr-lcssa.loopexit:
4521; EPILOG-NEXT:    %i3.unr.ph = phi i64 [ %i4.7, %latch.7 ]
4522; EPILOG-NEXT:    br label %exit.unr-lcssa
4523; EPILOG:       exit.unr-lcssa:
4524; EPILOG-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %exit.unr-lcssa.loopexit ]
4525; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4526; EPILOG-NEXT:    br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit
4527; EPILOG:       innerH.epil.preheader:
4528; EPILOG-NEXT:    br label %innerH.epil
4529; EPILOG:       innerH.epil:
4530; EPILOG-NEXT:    %i3.epil = phi i64 [ %i4.epil, %latch.epil ], [ %i3.unr, %innerH.epil.preheader ]
4531; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %innerH.epil.preheader ], [ %epil.iter.next, %latch.epil ]
4532; EPILOG-NEXT:    %i4.epil = add nuw nsw i64 %i3.epil, 1
4533; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit1, label %latch.epil
4534; EPILOG:       latch.epil:
4535; EPILOG-NEXT:    %i6.epil = icmp ult i64 %i4.epil, 100
4536; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
4537; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
4538; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %innerH.epil, label %exit.epilog-lcssa, !llvm.loop !12
4539; EPILOG:       exit.epilog-lcssa:
4540; EPILOG-NEXT:    br label %exit
4541; EPILOG:       exit.loopexit:
4542; EPILOG-NEXT:    br label %exit
4543; EPILOG:       exit:
4544; EPILOG-NEXT:    ret void
4545;
4546; EPILOG-BLOCK-LABEL: @test8(
4547; EPILOG-BLOCK-NEXT:  bb:
4548; EPILOG-BLOCK-NEXT:    br label %outerloop
4549; EPILOG-BLOCK:       outerloop.loopexit.loopexit:
4550; EPILOG-BLOCK-NEXT:    br label %outerloop.loopexit
4551; EPILOG-BLOCK:       outerloop.loopexit:
4552; EPILOG-BLOCK-NEXT:    br i1 false, label %exit.unr-lcssa.1, label %outerloop.new.1
4553; EPILOG-BLOCK:       outerloop.new.1:
4554; EPILOG-BLOCK-NEXT:    br label %innerH.1
4555; EPILOG-BLOCK:       innerH.1:
4556; EPILOG-BLOCK-NEXT:    %i3.1 = phi i64 [ 0, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ]
4557; EPILOG-BLOCK-NEXT:    %niter.1 = phi i64 [ 0, %outerloop.new.1 ], [ %niter.next.1.1, %latch.1.1 ]
4558; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.12
4559; EPILOG-BLOCK:       latch.12:
4560; EPILOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i3.1, 2
4561; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1
4562; EPILOG-BLOCK:       latch.1.1:
4563; EPILOG-BLOCK-NEXT:    %niter.next.1.1 = add i64 %niter.1, 2
4564; EPILOG-BLOCK-NEXT:    %niter.ncmp.1.1 = icmp ne i64 %niter.next.1.1, 100
4565; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit.1, !llvm.loop !12
4566; EPILOG-BLOCK:       exit.unr-lcssa.loopexit.1:
4567; EPILOG-BLOCK-NEXT:    br label %exit.unr-lcssa.1
4568; EPILOG-BLOCK:       outerloop.loopexit.loopexit.1:
4569; EPILOG-BLOCK-NEXT:    br label %outerloop.loopexit.1
4570; EPILOG-BLOCK:       exit.unr-lcssa.1:
4571; EPILOG-BLOCK-NEXT:    br i1 false, label %innerH.epil.preheader.1, label %exit.loopexit
4572; EPILOG-BLOCK:       innerH.epil.preheader.1:
4573; EPILOG-BLOCK-NEXT:    br label %innerH.epil.1
4574; EPILOG-BLOCK:       innerH.epil.1:
4575; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.epil
4576; EPILOG-BLOCK:       outerloop.loopexit.1:
4577; EPILOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !13
4578; EPILOG-BLOCK:       outerloop:
4579; EPILOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]
4580; EPILOG-BLOCK-NEXT:    %0 = sub i64 100, %i
4581; EPILOG-BLOCK-NEXT:    %1 = sub i64 99, %i
4582; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4583; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4584; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit.unr-lcssa, label %outerloop.new
4585; EPILOG-BLOCK:       outerloop.new:
4586; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
4587; EPILOG-BLOCK-NEXT:    br label %innerH
4588; EPILOG-BLOCK:       innerH:
4589; EPILOG-BLOCK-NEXT:    %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.1, %latch.1 ]
4590; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.1, %latch.1 ]
4591; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4592; EPILOG-BLOCK:       latch:
4593; EPILOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i3, 2
4594; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4595; EPILOG-BLOCK:       latch.1:
4596; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 2
4597; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
4598; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !12
4599; EPILOG-BLOCK:       exit.unr-lcssa.loopexit:
4600; EPILOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4601; EPILOG-BLOCK:       exit.unr-lcssa:
4602; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4603; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit
4604; EPILOG-BLOCK:       innerH.epil.preheader:
4605; EPILOG-BLOCK-NEXT:    br label %innerH.epil
4606; EPILOG-BLOCK:       innerH.epil:
4607; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.epil
4608; EPILOG-BLOCK:       latch.epil:
4609; EPILOG-BLOCK-NEXT:    br label %exit
4610; EPILOG-BLOCK:       exit.loopexit:
4611; EPILOG-BLOCK-NEXT:    br label %exit
4612; EPILOG-BLOCK:       exit:
4613; EPILOG-BLOCK-NEXT:    ret void
4614;
4615; PROLOG-LABEL: @test8(
4616; PROLOG-NEXT:  bb:
4617; PROLOG-NEXT:    br label %outerloop
4618; PROLOG:       outerloop.loopexit.loopexit:
4619; PROLOG-NEXT:    br label %outerloop.loopexit
4620; PROLOG:       outerloop.loopexit.loopexit1:
4621; PROLOG-NEXT:    br label %outerloop.loopexit
4622; PROLOG:       outerloop.loopexit:
4623; PROLOG-NEXT:    br label %outerloop
4624; PROLOG:       outerloop:
4625; PROLOG-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]
4626; PROLOG-NEXT:    %0 = sub i64 100, %i
4627; PROLOG-NEXT:    %1 = sub i64 99, %i
4628; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
4629; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4630; PROLOG-NEXT:    br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit
4631; PROLOG:       innerH.prol.preheader:
4632; PROLOG-NEXT:    br label %innerH.prol
4633; PROLOG:       innerH.prol:
4634; PROLOG-NEXT:    %i3.prol = phi i64 [ %i4.prol, %latch.prol ], [ %i, %innerH.prol.preheader ]
4635; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %innerH.prol.preheader ], [ %prol.iter.next, %latch.prol ]
4636; PROLOG-NEXT:    %i4.prol = add nuw nsw i64 %i3.prol, 1
4637; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit1, label %latch.prol
4638; PROLOG:       latch.prol:
4639; PROLOG-NEXT:    %i6.prol = icmp ult i64 %i4.prol, 100
4640; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
4641; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
4642; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %innerH.prol, label %innerH.prol.loopexit.unr-lcssa, !llvm.loop !12
4643; PROLOG:       innerH.prol.loopexit.unr-lcssa:
4644; PROLOG-NEXT:    %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ]
4645; PROLOG-NEXT:    br label %innerH.prol.loopexit
4646; PROLOG:       innerH.prol.loopexit:
4647; PROLOG-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %innerH.prol.loopexit.unr-lcssa ]
4648; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
4649; PROLOG-NEXT:    br i1 %2, label %exit.loopexit, label %outerloop.new
4650; PROLOG:       outerloop.new:
4651; PROLOG-NEXT:    br label %innerH
4652; PROLOG:       innerH:
4653; PROLOG-NEXT:    %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.7, %latch.7 ]
4654; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4655; PROLOG:       latch:
4656; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4657; PROLOG:       latch.1:
4658; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.2
4659; PROLOG:       latch.2:
4660; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.3
4661; PROLOG:       latch.3:
4662; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.4
4663; PROLOG:       latch.4:
4664; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.5
4665; PROLOG:       latch.5:
4666; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.6
4667; PROLOG:       latch.6:
4668; PROLOG-NEXT:    %i4.7 = add nuw nsw i64 %i3, 8
4669; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.7
4670; PROLOG:       latch.7:
4671; PROLOG-NEXT:    %i6.7 = icmp ult i64 %i4.7, 100
4672; PROLOG-NEXT:    br i1 %i6.7, label %innerH, label %exit.unr-lcssa
4673; PROLOG:       exit.unr-lcssa:
4674; PROLOG-NEXT:    br label %exit
4675; PROLOG:       exit.loopexit:
4676; PROLOG-NEXT:    br label %exit
4677; PROLOG:       exit:
4678; PROLOG-NEXT:    ret void
4679;
4680; PROLOG-BLOCK-LABEL: @test8(
4681; PROLOG-BLOCK-NEXT:  bb:
4682; PROLOG-BLOCK-NEXT:    br label %outerloop
4683; PROLOG-BLOCK:       outerloop.loopexit.loopexit:
4684; PROLOG-BLOCK-NEXT:    br label %outerloop.loopexit
4685; PROLOG-BLOCK:       outerloop.loopexit:
4686; PROLOG-BLOCK-NEXT:    br i1 false, label %innerH.prol.preheader.1, label %innerH.prol.loopexit.1
4687; PROLOG-BLOCK:       innerH.prol.preheader.1:
4688; PROLOG-BLOCK-NEXT:    br label %innerH.prol.1
4689; PROLOG-BLOCK:       innerH.prol.1:
4690; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.prol.1
4691; PROLOG-BLOCK:       latch.prol.1:
4692; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit.1
4693; PROLOG-BLOCK:       innerH.prol.loopexit.1:
4694; PROLOG-BLOCK-NEXT:    %i3.unr.1 = phi i64 [ 0, %outerloop.loopexit ], [ 1, %latch.prol.1 ]
4695; PROLOG-BLOCK-NEXT:    br i1 false, label %exit.loopexit, label %outerloop.new.1
4696; PROLOG-BLOCK:       outerloop.new.1:
4697; PROLOG-BLOCK-NEXT:    br label %innerH.1
4698; PROLOG-BLOCK:       innerH.1:
4699; PROLOG-BLOCK-NEXT:    %i3.1 = phi i64 [ %i3.unr.1, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ]
4700; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.11
4701; PROLOG-BLOCK:       latch.11:
4702; PROLOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i3.1, 2
4703; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1
4704; PROLOG-BLOCK:       latch.1.1:
4705; PROLOG-BLOCK-NEXT:    %i6.1.1 = icmp ult i64 %i4.1.1, 100
4706; PROLOG-BLOCK-NEXT:    br i1 %i6.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit2, !llvm.loop !12
4707; PROLOG-BLOCK:       outerloop.loopexit.loopexit.1:
4708; PROLOG-BLOCK-NEXT:    br label %outerloop.loopexit.1
4709; PROLOG-BLOCK:       outerloop.loopexit.1:
4710; PROLOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !13
4711; PROLOG-BLOCK:       outerloop:
4712; PROLOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]
4713; PROLOG-BLOCK-NEXT:    %0 = sub i64 100, %i
4714; PROLOG-BLOCK-NEXT:    %1 = sub i64 99, %i
4715; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4716; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4717; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit
4718; PROLOG-BLOCK:       innerH.prol.preheader:
4719; PROLOG-BLOCK-NEXT:    br label %innerH.prol
4720; PROLOG-BLOCK:       innerH.prol:
4721; PROLOG-BLOCK-NEXT:    %i4.prol = add nuw nsw i64 %i, 1
4722; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.prol
4723; PROLOG-BLOCK:       latch.prol:
4724; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit
4725; PROLOG-BLOCK:       innerH.prol.loopexit:
4726; PROLOG-BLOCK-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i4.prol, %latch.prol ]
4727; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4728; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit.loopexit, label %outerloop.new
4729; PROLOG-BLOCK:       outerloop.new:
4730; PROLOG-BLOCK-NEXT:    br label %innerH
4731; PROLOG-BLOCK:       innerH:
4732; PROLOG-BLOCK-NEXT:    %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.1, %latch.1 ]
4733; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4734; PROLOG-BLOCK:       latch:
4735; PROLOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i3, 2
4736; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4737; PROLOG-BLOCK:       latch.1:
4738; PROLOG-BLOCK-NEXT:    %i6.1 = icmp ult i64 %i4.1, 100
4739; PROLOG-BLOCK-NEXT:    br i1 %i6.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !12
4740; PROLOG-BLOCK:       exit.unr-lcssa.loopexit:
4741; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4742; PROLOG-BLOCK:       exit.unr-lcssa.loopexit2:
4743; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4744; PROLOG-BLOCK:       exit.unr-lcssa:
4745; PROLOG-BLOCK-NEXT:    br label %exit
4746; PROLOG-BLOCK:       exit.loopexit:
4747; PROLOG-BLOCK-NEXT:    br label %exit
4748; PROLOG-BLOCK:       exit:
4749; PROLOG-BLOCK-NEXT:    ret void
4750;
4751
4752bb:
4753  br label %outerloop
4754
4755outerloop:                                              ; preds = %innerH, %bb
4756  %i = phi i64 [ 3, %bb ], [ 0, %innerH ]
4757  br label %innerH
4758
4759innerH:                                              ; preds = %latch, %outerloop
4760  %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ]
4761  %i4 = add nuw nsw i64 %i3, 1
4762  br i1 false, label %outerloop, label %latch
4763
4764latch:                                              ; preds = %innerH
4765  %i6 = icmp ult i64 %i4, 100
4766  br i1 %i6, label %innerH, label %exit
4767
4768exit:                                              ; preds = %latch
4769  ret void
4770}
4771
4772declare ptr addrspace(1) @foo(i32)
4773; inner loop prolog unrolled
4774; a value from outer loop is used in exit block of inner loop.
4775; Don't create VMap entries for such values (%trip).
4776define ptr addrspace(1) @test9(ptr nocapture readonly %arg, i32 %n) {
4777; EPILOG-LABEL: @test9(
4778; EPILOG-NEXT:  bb:
4779; EPILOG-NEXT:    %0 = add i32 %n, -1
4780; EPILOG-NEXT:    br label %outerloopHdr
4781; EPILOG:       outerloopHdr:
4782; EPILOG-NEXT:    %trip = add i32 %n, -1
4783; EPILOG-NEXT:    %outercnd = icmp slt i32 0, %trip
4784; EPILOG-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
4785; EPILOG:       preheader:
4786; EPILOG-NEXT:    %i4 = zext i32 0 to i64
4787; EPILOG-NEXT:    %1 = freeze i32 %0
4788; EPILOG-NEXT:    %2 = add i32 %1, -1
4789; EPILOG-NEXT:    %xtraiter = and i32 %1, 7
4790; EPILOG-NEXT:    %3 = icmp ult i32 %2, 7
4791; EPILOG-NEXT:    br i1 %3, label %outerLatch.loopexit.unr-lcssa, label %preheader.new
4792; EPILOG:       preheader.new:
4793; EPILOG-NEXT:    %unroll_iter = sub i32 %1, %xtraiter
4794; EPILOG-NEXT:    br label %header
4795; EPILOG:       header:
4796; EPILOG-NEXT:    %phi = phi i64 [ %i4, %preheader.new ], [ %iv.next.7, %latch.7 ]
4797; EPILOG-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ]
4798; EPILOG-NEXT:    br i1 true, label %latch, label %innerexit.loopexit
4799; EPILOG:       innerexit.loopexit:
4800; EPILOG-NEXT:    %trip.lcssa.ph = phi i32 [ %trip, %header ], [ %trip, %latch ], [ %trip, %latch.1 ], [ %trip, %latch.2 ], [ %trip, %latch.3 ], [ %trip, %latch.4 ], [ %trip, %latch.5 ], [ %trip, %latch.6 ]
4801; EPILOG-NEXT:    br label %innerexit
4802; EPILOG:       innerexit.loopexit1:
4803; EPILOG-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.epil ]
4804; EPILOG-NEXT:    br label %innerexit
4805; EPILOG:       innerexit:
4806; EPILOG-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
4807; EPILOG-NEXT:    %i9 = call ptr addrspace(1) @foo(i32 %trip.lcssa)
4808; EPILOG-NEXT:    ret ptr addrspace(1) %i9
4809; EPILOG:       latch:
4810; EPILOG-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit
4811; EPILOG:       latch.1:
4812; EPILOG-NEXT:    br i1 true, label %latch.2, label %innerexit.loopexit
4813; EPILOG:       latch.2:
4814; EPILOG-NEXT:    br i1 true, label %latch.3, label %innerexit.loopexit
4815; EPILOG:       latch.3:
4816; EPILOG-NEXT:    br i1 true, label %latch.4, label %innerexit.loopexit
4817; EPILOG:       latch.4:
4818; EPILOG-NEXT:    br i1 true, label %latch.5, label %innerexit.loopexit
4819; EPILOG:       latch.5:
4820; EPILOG-NEXT:    br i1 true, label %latch.6, label %innerexit.loopexit
4821; EPILOG:       latch.6:
4822; EPILOG-NEXT:    br i1 true, label %latch.7, label %innerexit.loopexit
4823; EPILOG:       latch.7:
4824; EPILOG-NEXT:    %iv.next.7 = add nuw nsw i64 %phi, 8
4825; EPILOG-NEXT:    %niter.next.7 = add i32 %niter, 8
4826; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i32 %niter.next.7, %unroll_iter
4827; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit
4828; EPILOG:       outerLatch.loopexit.unr-lcssa.loopexit:
4829; EPILOG-NEXT:    %phi.unr.ph = phi i64 [ %iv.next.7, %latch.7 ]
4830; EPILOG-NEXT:    br label %outerLatch.loopexit.unr-lcssa
4831; EPILOG:       outerLatch.loopexit.unr-lcssa:
4832; EPILOG-NEXT:    %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %outerLatch.loopexit.unr-lcssa.loopexit ]
4833; EPILOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
4834; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit
4835; EPILOG:       header.epil.preheader:
4836; EPILOG-NEXT:    br label %header.epil
4837; EPILOG:       header.epil:
4838; EPILOG-NEXT:    %phi.epil = phi i64 [ %phi.unr, %header.epil.preheader ], [ %iv.next.epil, %latch.epil ]
4839; EPILOG-NEXT:    %epil.iter = phi i32 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
4840; EPILOG-NEXT:    %i7.epil = trunc i64 %phi.epil to i32
4841; EPILOG-NEXT:    br i1 true, label %latch.epil, label %innerexit.loopexit1
4842; EPILOG:       latch.epil:
4843; EPILOG-NEXT:    %i11.epil = add nsw i32 %i7.epil, 1
4844; EPILOG-NEXT:    %innercnd.epil = icmp slt i32 %i11.epil, %trip
4845; EPILOG-NEXT:    %iv.next.epil = add nuw nsw i64 %phi.epil, 1
4846; EPILOG-NEXT:    %epil.iter.next = add i32 %epil.iter, 1
4847; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i32 %epil.iter.next, %xtraiter
4848; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %outerLatch.loopexit.epilog-lcssa, !llvm.loop !13
4849; EPILOG:       outerLatch.loopexit.epilog-lcssa:
4850; EPILOG-NEXT:    br label %outerLatch.loopexit
4851; EPILOG:       outerLatch.loopexit:
4852; EPILOG-NEXT:    br label %outerLatch
4853; EPILOG:       outerLatch:
4854; EPILOG-NEXT:    br label %outerloopHdr
4855;
4856; EPILOG-BLOCK-LABEL: @test9(
4857; EPILOG-BLOCK-NEXT:  bb:
4858; EPILOG-BLOCK-NEXT:    %0 = add i32 %n, -1
4859; EPILOG-BLOCK-NEXT:    br label %outerloopHdr
4860; EPILOG-BLOCK:       outerloopHdr:
4861; EPILOG-BLOCK-NEXT:    %trip = add i32 %n, -1
4862; EPILOG-BLOCK-NEXT:    %outercnd = icmp slt i32 0, %trip
4863; EPILOG-BLOCK-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
4864; EPILOG-BLOCK:       preheader:
4865; EPILOG-BLOCK-NEXT:    %1 = freeze i32 %0
4866; EPILOG-BLOCK-NEXT:    %2 = add i32 %1, -1
4867; EPILOG-BLOCK-NEXT:    %xtraiter = and i32 %1, 1
4868; EPILOG-BLOCK-NEXT:    %3 = icmp ult i32 %2, 1
4869; EPILOG-BLOCK-NEXT:    br i1 %3, label %outerLatch.loopexit.unr-lcssa, label %preheader.new
4870; EPILOG-BLOCK:       preheader.new:
4871; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i32 %1, %xtraiter
4872; EPILOG-BLOCK-NEXT:    br label %header
4873; EPILOG-BLOCK:       header:
4874; EPILOG-BLOCK-NEXT:    %phi = phi i64 [ 0, %preheader.new ], [ %iv.next.1, %latch.1 ]
4875; EPILOG-BLOCK-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ]
4876; EPILOG-BLOCK-NEXT:    br i1 true, label %latch, label %innerexit.loopexit.loopexit
4877; EPILOG-BLOCK:       innerexit.loopexit.loopexit:
4878; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ]
4879; EPILOG-BLOCK-NEXT:    br label %innerexit.loopexit
4880; EPILOG-BLOCK:       innerexit.loopexit.loopexit4:
4881; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph.ph5 = phi i32 [ %trip.1, %latch.13 ], [ %trip.1, %header.1 ]
4882; EPILOG-BLOCK-NEXT:    br label %innerexit.loopexit
4883; EPILOG-BLOCK:       innerexit.loopexit:
4884; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph5, %innerexit.loopexit.loopexit4 ]
4885; EPILOG-BLOCK-NEXT:    br label %innerexit
4886; EPILOG-BLOCK:       innerexit.loopexit1:
4887; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.epil ], [ %trip.1, %header.epil.1 ]
4888; EPILOG-BLOCK-NEXT:    br label %innerexit
4889; EPILOG-BLOCK:       innerexit:
4890; EPILOG-BLOCK-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
4891; EPILOG-BLOCK-NEXT:    %i9 = call ptr addrspace(1) @foo(i32 %trip.lcssa)
4892; EPILOG-BLOCK-NEXT:    ret ptr addrspace(1) %i9
4893; EPILOG-BLOCK:       latch:
4894; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit.loopexit
4895; EPILOG-BLOCK:       latch.1:
4896; EPILOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %phi, 2
4897; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i32 %niter, 2
4898; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i32 %niter.next.1, %unroll_iter
4899; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit, !llvm.loop !14
4900; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa.loopexit:
4901; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit.unr-lcssa
4902; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa:
4903; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
4904; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit
4905; EPILOG-BLOCK:       header.epil.preheader:
4906; EPILOG-BLOCK-NEXT:    br label %header.epil
4907; EPILOG-BLOCK:       header.epil:
4908; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.epil, label %innerexit.loopexit1
4909; EPILOG-BLOCK:       latch.epil:
4910; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit
4911; EPILOG-BLOCK:       outerLatch.loopexit:
4912; EPILOG-BLOCK-NEXT:    br label %outerLatch
4913; EPILOG-BLOCK:       outerLatch:
4914; EPILOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -1
4915; EPILOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.1
4916; EPILOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.1
4917; EPILOG-BLOCK:       preheader.1:
4918; EPILOG-BLOCK-NEXT:    %4 = freeze i32 %0
4919; EPILOG-BLOCK-NEXT:    %5 = add i32 %4, -1
4920; EPILOG-BLOCK-NEXT:    %xtraiter.1 = and i32 %4, 1
4921; EPILOG-BLOCK-NEXT:    %6 = icmp ult i32 %5, 1
4922; EPILOG-BLOCK-NEXT:    br i1 %6, label %outerLatch.loopexit.unr-lcssa.1, label %preheader.new.1
4923; EPILOG-BLOCK:       preheader.new.1:
4924; EPILOG-BLOCK-NEXT:    %unroll_iter.1 = sub i32 %4, %xtraiter.1
4925; EPILOG-BLOCK-NEXT:    br label %header.1
4926; EPILOG-BLOCK:       header.1:
4927; EPILOG-BLOCK-NEXT:    %phi.1 = phi i64 [ 0, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ]
4928; EPILOG-BLOCK-NEXT:    %niter.1 = phi i32 [ 0, %preheader.new.1 ], [ %niter.next.1.1, %latch.1.1 ]
4929; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.13, label %innerexit.loopexit.loopexit4
4930; EPILOG-BLOCK:       latch.13:
4931; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit4
4932; EPILOG-BLOCK:       latch.1.1:
4933; EPILOG-BLOCK-NEXT:    %iv.next.1.1 = add nuw nsw i64 %phi.1, 2
4934; EPILOG-BLOCK-NEXT:    %niter.next.1.1 = add i32 %niter.1, 2
4935; EPILOG-BLOCK-NEXT:    %niter.ncmp.1.1 = icmp ne i32 %niter.next.1.1, %unroll_iter.1
4936; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.loopexit.1, !llvm.loop !14
4937; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa.loopexit.1:
4938; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit.unr-lcssa.1
4939; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa.1:
4940; EPILOG-BLOCK-NEXT:    %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0
4941; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod.1, label %header.epil.preheader.1, label %outerLatch.loopexit.1
4942; EPILOG-BLOCK:       header.epil.preheader.1:
4943; EPILOG-BLOCK-NEXT:    br label %header.epil.1
4944; EPILOG-BLOCK:       header.epil.1:
4945; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.epil.1, label %innerexit.loopexit1
4946; EPILOG-BLOCK:       latch.epil.1:
4947; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit.1
4948; EPILOG-BLOCK:       outerLatch.loopexit.1:
4949; EPILOG-BLOCK-NEXT:    br label %outerLatch.1
4950; EPILOG-BLOCK:       outerLatch.1:
4951; EPILOG-BLOCK-NEXT:    br label %outerloopHdr, !llvm.loop !15
4952;
4953; PROLOG-LABEL: @test9(
4954; PROLOG-NEXT:  bb:
4955; PROLOG-NEXT:    %0 = add i32 %n, -1
4956; PROLOG-NEXT:    br label %outerloopHdr
4957; PROLOG:       outerloopHdr:
4958; PROLOG-NEXT:    %trip = add i32 %n, -1
4959; PROLOG-NEXT:    %outercnd = icmp slt i32 0, %trip
4960; PROLOG-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
4961; PROLOG:       preheader:
4962; PROLOG-NEXT:    %i4 = zext i32 0 to i64
4963; PROLOG-NEXT:    %1 = freeze i32 %0
4964; PROLOG-NEXT:    %2 = add i32 %1, -1
4965; PROLOG-NEXT:    %xtraiter = and i32 %1, 7
4966; PROLOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
4967; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4968; PROLOG:       header.prol.preheader:
4969; PROLOG-NEXT:    br label %header.prol
4970; PROLOG:       header.prol:
4971; PROLOG-NEXT:    %phi.prol = phi i64 [ %i4, %header.prol.preheader ], [ %iv.next.prol, %latch.prol ]
4972; PROLOG-NEXT:    %prol.iter = phi i32 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
4973; PROLOG-NEXT:    %i7.prol = trunc i64 %phi.prol to i32
4974; PROLOG-NEXT:    br i1 true, label %latch.prol, label %innerexit.loopexit1
4975; PROLOG:       latch.prol:
4976; PROLOG-NEXT:    %i11.prol = add nsw i32 %i7.prol, 1
4977; PROLOG-NEXT:    %innercnd.prol = icmp slt i32 %i11.prol, %trip
4978; PROLOG-NEXT:    %iv.next.prol = add nuw nsw i64 %phi.prol, 1
4979; PROLOG-NEXT:    %prol.iter.next = add i32 %prol.iter, 1
4980; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i32 %prol.iter.next, %xtraiter
4981; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !13
4982; PROLOG:       header.prol.loopexit.unr-lcssa:
4983; PROLOG-NEXT:    %phi.unr.ph = phi i64 [ %iv.next.prol, %latch.prol ]
4984; PROLOG-NEXT:    br label %header.prol.loopexit
4985; PROLOG:       header.prol.loopexit:
4986; PROLOG-NEXT:    %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %header.prol.loopexit.unr-lcssa ]
4987; PROLOG-NEXT:    %3 = icmp ult i32 %2, 7
4988; PROLOG-NEXT:    br i1 %3, label %outerLatch.loopexit, label %preheader.new
4989; PROLOG:       preheader.new:
4990; PROLOG-NEXT:    br label %header
4991; PROLOG:       header:
4992; PROLOG-NEXT:    %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.7, %latch.7 ]
4993; PROLOG-NEXT:    br i1 true, label %latch, label %innerexit.loopexit
4994; PROLOG:       innerexit.loopexit:
4995; PROLOG-NEXT:    %trip.lcssa.ph = phi i32 [ %trip, %header ], [ %trip, %latch ], [ %trip, %latch.1 ], [ %trip, %latch.2 ], [ %trip, %latch.3 ], [ %trip, %latch.4 ], [ %trip, %latch.5 ], [ %trip, %latch.6 ]
4996; PROLOG-NEXT:    br label %innerexit
4997; PROLOG:       innerexit.loopexit1:
4998; PROLOG-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ]
4999; PROLOG-NEXT:    br label %innerexit
5000; PROLOG:       innerexit:
5001; PROLOG-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
5002; PROLOG-NEXT:    %i9 = call ptr addrspace(1) @foo(i32 %trip.lcssa)
5003; PROLOG-NEXT:    ret ptr addrspace(1) %i9
5004; PROLOG:       latch:
5005; PROLOG-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit
5006; PROLOG:       latch.1:
5007; PROLOG-NEXT:    br i1 true, label %latch.2, label %innerexit.loopexit
5008; PROLOG:       latch.2:
5009; PROLOG-NEXT:    br i1 true, label %latch.3, label %innerexit.loopexit
5010; PROLOG:       latch.3:
5011; PROLOG-NEXT:    br i1 true, label %latch.4, label %innerexit.loopexit
5012; PROLOG:       latch.4:
5013; PROLOG-NEXT:    br i1 true, label %latch.5, label %innerexit.loopexit
5014; PROLOG:       latch.5:
5015; PROLOG-NEXT:    br i1 true, label %latch.6, label %innerexit.loopexit
5016; PROLOG:       latch.6:
5017; PROLOG-NEXT:    %iv.next.6 = add nuw nsw i64 %phi, 7
5018; PROLOG-NEXT:    %i7.7 = trunc i64 %iv.next.6 to i32
5019; PROLOG-NEXT:    br i1 true, label %latch.7, label %innerexit.loopexit
5020; PROLOG:       latch.7:
5021; PROLOG-NEXT:    %i11.7 = add nsw i32 %i7.7, 1
5022; PROLOG-NEXT:    %innercnd.7 = icmp slt i32 %i11.7, %trip
5023; PROLOG-NEXT:    %iv.next.7 = add nuw nsw i64 %phi, 8
5024; PROLOG-NEXT:    br i1 %innercnd.7, label %header, label %outerLatch.loopexit.unr-lcssa
5025; PROLOG:       outerLatch.loopexit.unr-lcssa:
5026; PROLOG-NEXT:    br label %outerLatch.loopexit
5027; PROLOG:       outerLatch.loopexit:
5028; PROLOG-NEXT:    br label %outerLatch
5029; PROLOG:       outerLatch:
5030; PROLOG-NEXT:    br label %outerloopHdr
5031;
5032; PROLOG-BLOCK-LABEL: @test9(
5033; PROLOG-BLOCK-NEXT:  bb:
5034; PROLOG-BLOCK-NEXT:    %0 = add i32 %n, -1
5035; PROLOG-BLOCK-NEXT:    br label %outerloopHdr
5036; PROLOG-BLOCK:       outerloopHdr:
5037; PROLOG-BLOCK-NEXT:    %trip = add i32 %n, -1
5038; PROLOG-BLOCK-NEXT:    %outercnd = icmp slt i32 0, %trip
5039; PROLOG-BLOCK-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
5040; PROLOG-BLOCK:       preheader:
5041; PROLOG-BLOCK-NEXT:    %1 = freeze i32 %0
5042; PROLOG-BLOCK-NEXT:    %2 = add i32 %1, -1
5043; PROLOG-BLOCK-NEXT:    %xtraiter = and i32 %1, 1
5044; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
5045; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
5046; PROLOG-BLOCK:       header.prol.preheader:
5047; PROLOG-BLOCK-NEXT:    br label %header.prol
5048; PROLOG-BLOCK:       header.prol:
5049; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.prol, label %innerexit.loopexit1
5050; PROLOG-BLOCK:       latch.prol:
5051; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
5052; PROLOG-BLOCK:       header.prol.loopexit:
5053; PROLOG-BLOCK-NEXT:    %phi.unr = phi i64 [ 0, %preheader ], [ 1, %latch.prol ]
5054; PROLOG-BLOCK-NEXT:    %3 = icmp ult i32 %2, 1
5055; PROLOG-BLOCK-NEXT:    br i1 %3, label %outerLatch.loopexit, label %preheader.new
5056; PROLOG-BLOCK:       preheader.new:
5057; PROLOG-BLOCK-NEXT:    br label %header
5058; PROLOG-BLOCK:       header:
5059; PROLOG-BLOCK-NEXT:    %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.1, %latch.1 ]
5060; PROLOG-BLOCK-NEXT:    br i1 true, label %latch, label %innerexit.loopexit.loopexit
5061; PROLOG-BLOCK:       innerexit.loopexit.loopexit:
5062; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ]
5063; PROLOG-BLOCK-NEXT:    br label %innerexit.loopexit
5064; PROLOG-BLOCK:       innerexit.loopexit.loopexit5:
5065; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph.ph6 = phi i32 [ %trip.1, %latch.14 ], [ %trip.1, %header.1 ]
5066; PROLOG-BLOCK-NEXT:    br label %innerexit.loopexit
5067; PROLOG-BLOCK:       innerexit.loopexit:
5068; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph6, %innerexit.loopexit.loopexit5 ]
5069; PROLOG-BLOCK-NEXT:    br label %innerexit
5070; PROLOG-BLOCK:       innerexit.loopexit1:
5071; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ], [ %trip.1, %header.prol.1 ]
5072; PROLOG-BLOCK-NEXT:    br label %innerexit
5073; PROLOG-BLOCK:       innerexit:
5074; PROLOG-BLOCK-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
5075; PROLOG-BLOCK-NEXT:    %i9 = call ptr addrspace(1) @foo(i32 %trip.lcssa)
5076; PROLOG-BLOCK-NEXT:    ret ptr addrspace(1) %i9
5077; PROLOG-BLOCK:       latch:
5078; PROLOG-BLOCK-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
5079; PROLOG-BLOCK-NEXT:    %i7.1 = trunc i64 %iv.next to i32
5080; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit.loopexit
5081; PROLOG-BLOCK:       latch.1:
5082; PROLOG-BLOCK-NEXT:    %i11.1 = add nsw i32 %i7.1, 1
5083; PROLOG-BLOCK-NEXT:    %innercnd.1 = icmp slt i32 %i11.1, %trip
5084; PROLOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %phi, 2
5085; PROLOG-BLOCK-NEXT:    br i1 %innercnd.1, label %header, label %outerLatch.loopexit.unr-lcssa, !llvm.loop !14
5086; PROLOG-BLOCK:       outerLatch.loopexit.unr-lcssa:
5087; PROLOG-BLOCK-NEXT:    br label %outerLatch.loopexit
5088; PROLOG-BLOCK:       outerLatch.loopexit:
5089; PROLOG-BLOCK-NEXT:    br label %outerLatch
5090; PROLOG-BLOCK:       outerLatch:
5091; PROLOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -1
5092; PROLOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.1
5093; PROLOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.1
5094; PROLOG-BLOCK:       preheader.1:
5095; PROLOG-BLOCK-NEXT:    %4 = freeze i32 %0
5096; PROLOG-BLOCK-NEXT:    %5 = add i32 %4, -1
5097; PROLOG-BLOCK-NEXT:    %xtraiter.1 = and i32 %4, 1
5098; PROLOG-BLOCK-NEXT:    %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0
5099; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod.1, label %header.prol.preheader.1, label %header.prol.loopexit.1
5100; PROLOG-BLOCK:       header.prol.preheader.1:
5101; PROLOG-BLOCK-NEXT:    br label %header.prol.1
5102; PROLOG-BLOCK:       header.prol.1:
5103; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.prol.1, label %innerexit.loopexit1
5104; PROLOG-BLOCK:       latch.prol.1:
5105; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit.1
5106; PROLOG-BLOCK:       header.prol.loopexit.1:
5107; PROLOG-BLOCK-NEXT:    %phi.unr.1 = phi i64 [ 0, %preheader.1 ], [ 1, %latch.prol.1 ]
5108; PROLOG-BLOCK-NEXT:    %6 = icmp ult i32 %5, 1
5109; PROLOG-BLOCK-NEXT:    br i1 %6, label %outerLatch.loopexit.1, label %preheader.new.1
5110; PROLOG-BLOCK:       preheader.new.1:
5111; PROLOG-BLOCK-NEXT:    br label %header.1
5112; PROLOG-BLOCK:       header.1:
5113; PROLOG-BLOCK-NEXT:    %phi.1 = phi i64 [ %phi.unr.1, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ]
5114; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.14, label %innerexit.loopexit.loopexit5
5115; PROLOG-BLOCK:       latch.14:
5116; PROLOG-BLOCK-NEXT:    %iv.next.13 = add nuw nsw i64 %phi.1, 1
5117; PROLOG-BLOCK-NEXT:    %i7.1.1 = trunc i64 %iv.next.13 to i32
5118; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit5
5119; PROLOG-BLOCK:       latch.1.1:
5120; PROLOG-BLOCK-NEXT:    %i11.1.1 = add nsw i32 %i7.1.1, 1
5121; PROLOG-BLOCK-NEXT:    %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.1
5122; PROLOG-BLOCK-NEXT:    %iv.next.1.1 = add nuw nsw i64 %phi.1, 2
5123; PROLOG-BLOCK-NEXT:    br i1 %innercnd.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.1, !llvm.loop !14
5124; PROLOG-BLOCK:       outerLatch.loopexit.unr-lcssa.1:
5125; PROLOG-BLOCK-NEXT:    br label %outerLatch.loopexit.1
5126; PROLOG-BLOCK:       outerLatch.loopexit.1:
5127; PROLOG-BLOCK-NEXT:    br label %outerLatch.1
5128; PROLOG-BLOCK:       outerLatch.1:
5129; PROLOG-BLOCK-NEXT:    br label %outerloopHdr, !llvm.loop !15
5130;
5131bb:
5132  br label %outerloopHdr
5133
5134outerloopHdr:                                              ; preds = %outerLatch, %bb
5135  %trip = add i32 %n, -1
5136  %outercnd = icmp slt i32 0, %trip
5137  br i1 %outercnd, label %preheader, label %outerLatch
5138
5139preheader:                                              ; preds = %outerloopHdr
5140  %i4 = zext i32 0 to i64
5141  br label %header
5142
5143header:                                              ; preds = %latch, %preheader
5144  %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ]
5145  %i7 = trunc i64 %phi to i32
5146  br i1 true, label %latch, label %innerexit
5147
5148innerexit:                                              ; preds = %header
5149  %i9 = call ptr addrspace(1) @foo(i32 %trip)
5150  ret ptr addrspace(1) %i9
5151
5152latch:                                             ; preds = %header
5153  %i11 = add nsw i32 %i7, 1
5154  %innercnd = icmp slt i32 %i11, %trip
5155  %iv.next = add nuw nsw i64 %phi, 1
5156  br i1 %innercnd, label %header, label %outerLatch
5157
5158outerLatch:                                             ; preds = %latch, %outerloopHdr
5159  br label %outerloopHdr
5160}
5161
5162declare void @bar()
5163
5164; This is a case where we should be able to eliminate N-1 copies
5165; of the early exit test in the main loop when runtime unrolling
5166; by N.
5167define void @test10(i64 %trip, i64 %trip2) {
5168; EPILOG-LABEL: @test10(
5169; EPILOG-NEXT:  entry:
5170; EPILOG-NEXT:    %0 = freeze i64 %trip
5171; EPILOG-NEXT:    %1 = add i64 %0, -1
5172; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
5173; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
5174; EPILOG-NEXT:    br i1 %2, label %exit2.unr-lcssa, label %entry.new
5175; EPILOG:       entry.new:
5176; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
5177; EPILOG-NEXT:    br label %loop_header
5178; EPILOG:       loop_header:
5179; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5180; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
5181; EPILOG-NEXT:    call void @bar()
5182; EPILOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5183; EPILOG-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5184; EPILOG:       loop_latch:
5185; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5186; EPILOG-NEXT:    call void @bar()
5187; EPILOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5188; EPILOG-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5189; EPILOG:       loop_latch.1:
5190; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv, 2
5191; EPILOG-NEXT:    call void @bar()
5192; EPILOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
5193; EPILOG-NEXT:    br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit
5194; EPILOG:       loop_latch.2:
5195; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv, 3
5196; EPILOG-NEXT:    call void @bar()
5197; EPILOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
5198; EPILOG-NEXT:    br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit
5199; EPILOG:       loop_latch.3:
5200; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv, 4
5201; EPILOG-NEXT:    call void @bar()
5202; EPILOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
5203; EPILOG-NEXT:    br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit
5204; EPILOG:       loop_latch.4:
5205; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv, 5
5206; EPILOG-NEXT:    call void @bar()
5207; EPILOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
5208; EPILOG-NEXT:    br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit
5209; EPILOG:       loop_latch.5:
5210; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv, 6
5211; EPILOG-NEXT:    call void @bar()
5212; EPILOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
5213; EPILOG-NEXT:    br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit
5214; EPILOG:       loop_latch.6:
5215; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv, 7
5216; EPILOG-NEXT:    call void @bar()
5217; EPILOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
5218; EPILOG-NEXT:    br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit
5219; EPILOG:       loop_latch.7:
5220; EPILOG-NEXT:    %iv_next.7 = add i64 %iv, 8
5221; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 8
5222; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
5223; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit
5224; EPILOG:       exit1.loopexit:
5225; EPILOG-NEXT:    br label %exit1
5226; EPILOG:       exit1.loopexit1:
5227; EPILOG-NEXT:    br label %exit1
5228; EPILOG:       exit1:
5229; EPILOG-NEXT:    ret void
5230; EPILOG:       exit2.unr-lcssa.loopexit:
5231; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
5232; EPILOG-NEXT:    br label %exit2.unr-lcssa
5233; EPILOG:       exit2.unr-lcssa:
5234; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ]
5235; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5236; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5237; EPILOG:       loop_header.epil.preheader:
5238; EPILOG-NEXT:    br label %loop_header.epil
5239; EPILOG:       loop_header.epil:
5240; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
5241; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
5242; EPILOG-NEXT:    call void @bar()
5243; EPILOG-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil, %trip2
5244; EPILOG-NEXT:    br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1.loopexit1
5245; EPILOG:       loop_latch.epil:
5246; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
5247; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
5248; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
5249; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
5250; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !14
5251; EPILOG:       exit2.epilog-lcssa:
5252; EPILOG-NEXT:    br label %exit2
5253; EPILOG:       exit2:
5254; EPILOG-NEXT:    ret void
5255;
5256; EPILOG-BLOCK-LABEL: @test10(
5257; EPILOG-BLOCK-NEXT:  entry:
5258; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
5259; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
5260; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
5261; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
5262; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit2.unr-lcssa, label %entry.new
5263; EPILOG-BLOCK:       entry.new:
5264; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
5265; EPILOG-BLOCK-NEXT:    br label %loop_header
5266; EPILOG-BLOCK:       loop_header:
5267; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5268; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
5269; EPILOG-BLOCK-NEXT:    call void @bar()
5270; EPILOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5271; EPILOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5272; EPILOG-BLOCK:       loop_latch:
5273; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5274; EPILOG-BLOCK-NEXT:    call void @bar()
5275; EPILOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5276; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5277; EPILOG-BLOCK:       loop_latch.1:
5278; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 2
5279; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 2
5280; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
5281; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !16
5282; EPILOG-BLOCK:       exit1.loopexit:
5283; EPILOG-BLOCK-NEXT:    br label %exit1
5284; EPILOG-BLOCK:       exit1:
5285; EPILOG-BLOCK-NEXT:    ret void
5286; EPILOG-BLOCK:       exit2.unr-lcssa.loopexit:
5287; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
5288; EPILOG-BLOCK-NEXT:    br label %exit2.unr-lcssa
5289; EPILOG-BLOCK:       exit2.unr-lcssa:
5290; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ]
5291; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5292; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5293; EPILOG-BLOCK:       loop_header.epil.preheader:
5294; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
5295; EPILOG-BLOCK:       loop_header.epil:
5296; EPILOG-BLOCK-NEXT:    call void @bar()
5297; EPILOG-BLOCK-NEXT:    %cmp_early.epil = icmp ne i64 %iv.unr, %trip2
5298; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1
5299; EPILOG-BLOCK:       loop_latch.epil:
5300; EPILOG-BLOCK-NEXT:    br label %exit2
5301; EPILOG-BLOCK:       exit2:
5302; EPILOG-BLOCK-NEXT:    ret void
5303;
5304; PROLOG-LABEL: @test10(
5305; PROLOG-NEXT:  entry:
5306; PROLOG-NEXT:    %0 = freeze i64 %trip
5307; PROLOG-NEXT:    %1 = add i64 %0, -1
5308; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
5309; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5310; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5311; PROLOG:       loop_header.prol.preheader:
5312; PROLOG-NEXT:    br label %loop_header.prol
5313; PROLOG:       loop_header.prol:
5314; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
5315; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
5316; PROLOG-NEXT:    call void @bar()
5317; PROLOG-NEXT:    %cmp_early.prol = icmp ne i64 %iv.prol, %trip2
5318; PROLOG-NEXT:    br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1.loopexit1
5319; PROLOG:       loop_latch.prol:
5320; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
5321; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
5322; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
5323; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
5324; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !14
5325; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
5326; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
5327; PROLOG-NEXT:    br label %loop_header.prol.loopexit
5328; PROLOG:       loop_header.prol.loopexit:
5329; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
5330; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
5331; PROLOG-NEXT:    br i1 %2, label %exit2, label %entry.new
5332; PROLOG:       entry.new:
5333; PROLOG-NEXT:    br label %loop_header
5334; PROLOG:       loop_header:
5335; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5336; PROLOG-NEXT:    call void @bar()
5337; PROLOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5338; PROLOG-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5339; PROLOG:       loop_latch:
5340; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
5341; PROLOG-NEXT:    call void @bar()
5342; PROLOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5343; PROLOG-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5344; PROLOG:       loop_latch.1:
5345; PROLOG-NEXT:    %iv_next.1 = add i64 %iv, 2
5346; PROLOG-NEXT:    call void @bar()
5347; PROLOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
5348; PROLOG-NEXT:    br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit
5349; PROLOG:       loop_latch.2:
5350; PROLOG-NEXT:    %iv_next.2 = add i64 %iv, 3
5351; PROLOG-NEXT:    call void @bar()
5352; PROLOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
5353; PROLOG-NEXT:    br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit
5354; PROLOG:       loop_latch.3:
5355; PROLOG-NEXT:    %iv_next.3 = add i64 %iv, 4
5356; PROLOG-NEXT:    call void @bar()
5357; PROLOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
5358; PROLOG-NEXT:    br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit
5359; PROLOG:       loop_latch.4:
5360; PROLOG-NEXT:    %iv_next.4 = add i64 %iv, 5
5361; PROLOG-NEXT:    call void @bar()
5362; PROLOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
5363; PROLOG-NEXT:    br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit
5364; PROLOG:       loop_latch.5:
5365; PROLOG-NEXT:    %iv_next.5 = add i64 %iv, 6
5366; PROLOG-NEXT:    call void @bar()
5367; PROLOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
5368; PROLOG-NEXT:    br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit
5369; PROLOG:       loop_latch.6:
5370; PROLOG-NEXT:    %iv_next.6 = add i64 %iv, 7
5371; PROLOG-NEXT:    call void @bar()
5372; PROLOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
5373; PROLOG-NEXT:    br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit
5374; PROLOG:       loop_latch.7:
5375; PROLOG-NEXT:    %iv_next.7 = add i64 %iv, 8
5376; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
5377; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa
5378; PROLOG:       exit1.loopexit:
5379; PROLOG-NEXT:    br label %exit1
5380; PROLOG:       exit1.loopexit1:
5381; PROLOG-NEXT:    br label %exit1
5382; PROLOG:       exit1:
5383; PROLOG-NEXT:    ret void
5384; PROLOG:       exit2.unr-lcssa:
5385; PROLOG-NEXT:    br label %exit2
5386; PROLOG:       exit2:
5387; PROLOG-NEXT:    ret void
5388;
5389; PROLOG-BLOCK-LABEL: @test10(
5390; PROLOG-BLOCK-NEXT:  entry:
5391; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
5392; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
5393; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
5394; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5395; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5396; PROLOG-BLOCK:       loop_header.prol.preheader:
5397; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
5398; PROLOG-BLOCK:       loop_header.prol:
5399; PROLOG-BLOCK-NEXT:    call void @bar()
5400; PROLOG-BLOCK-NEXT:    %cmp_early.prol = icmp ne i64 0, %trip2
5401; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1
5402; PROLOG-BLOCK:       loop_latch.prol:
5403; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
5404; PROLOG-BLOCK:       loop_header.prol.loopexit:
5405; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
5406; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
5407; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit2, label %entry.new
5408; PROLOG-BLOCK:       entry.new:
5409; PROLOG-BLOCK-NEXT:    br label %loop_header
5410; PROLOG-BLOCK:       loop_header:
5411; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5412; PROLOG-BLOCK-NEXT:    call void @bar()
5413; PROLOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5414; PROLOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5415; PROLOG-BLOCK:       loop_latch:
5416; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
5417; PROLOG-BLOCK-NEXT:    call void @bar()
5418; PROLOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5419; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5420; PROLOG-BLOCK:       loop_latch.1:
5421; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 2
5422; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
5423; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !16
5424; PROLOG-BLOCK:       exit1.loopexit:
5425; PROLOG-BLOCK-NEXT:    br label %exit1
5426; PROLOG-BLOCK:       exit1:
5427; PROLOG-BLOCK-NEXT:    ret void
5428; PROLOG-BLOCK:       exit2.unr-lcssa:
5429; PROLOG-BLOCK-NEXT:    br label %exit2
5430; PROLOG-BLOCK:       exit2:
5431; PROLOG-BLOCK-NEXT:    ret void
5432;
5433entry:
5434  br label %loop_header
5435
5436loop_header:
5437  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
5438  call void @bar()
5439  %cmp_early = icmp ne i64 %iv, %trip2
5440  br i1 %cmp_early, label %loop_latch, label %exit1
5441
5442loop_latch:
5443  %iv_next = add i64 %iv, 1
5444  %cmp = icmp ne i64 %iv_next, %trip
5445  br i1 %cmp, label %loop_header, label %exit2
5446
5447exit1:
5448  ret void
5449
5450exit2:
5451  ret void
5452}
5453
5454; With a loop invariant, we can eliminate the last N-1
5455; copies of the exit test in the unrolled main loop body.
5456define void @test11(i64 %trip, i1 %cond) {
5457; EPILOG-LABEL: @test11(
5458; EPILOG-NEXT:  entry:
5459; EPILOG-NEXT:    %0 = freeze i64 %trip
5460; EPILOG-NEXT:    %1 = add i64 %0, -1
5461; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
5462; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
5463; EPILOG-NEXT:    br i1 %2, label %exit2.unr-lcssa, label %entry.new
5464; EPILOG:       entry.new:
5465; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
5466; EPILOG-NEXT:    br label %loop_header
5467; EPILOG:       loop_header:
5468; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5469; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
5470; EPILOG-NEXT:    call void @bar()
5471; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5472; EPILOG:       loop_latch:
5473; EPILOG-NEXT:    call void @bar()
5474; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5475; EPILOG:       loop_latch.1:
5476; EPILOG-NEXT:    call void @bar()
5477; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.loopexit
5478; EPILOG:       loop_latch.2:
5479; EPILOG-NEXT:    call void @bar()
5480; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.loopexit
5481; EPILOG:       loop_latch.3:
5482; EPILOG-NEXT:    call void @bar()
5483; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.loopexit
5484; EPILOG:       loop_latch.4:
5485; EPILOG-NEXT:    call void @bar()
5486; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.loopexit
5487; EPILOG:       loop_latch.5:
5488; EPILOG-NEXT:    call void @bar()
5489; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.loopexit
5490; EPILOG:       loop_latch.6:
5491; EPILOG-NEXT:    call void @bar()
5492; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.loopexit
5493; EPILOG:       loop_latch.7:
5494; EPILOG-NEXT:    %iv_next.7 = add i64 %iv, 8
5495; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 8
5496; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
5497; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit
5498; EPILOG:       exit1.loopexit:
5499; EPILOG-NEXT:    br label %exit1
5500; EPILOG:       exit1.loopexit1:
5501; EPILOG-NEXT:    br label %exit1
5502; EPILOG:       exit1:
5503; EPILOG-NEXT:    ret void
5504; EPILOG:       exit2.unr-lcssa.loopexit:
5505; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
5506; EPILOG-NEXT:    br label %exit2.unr-lcssa
5507; EPILOG:       exit2.unr-lcssa:
5508; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ]
5509; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5510; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5511; EPILOG:       loop_header.epil.preheader:
5512; EPILOG-NEXT:    br label %loop_header.epil
5513; EPILOG:       loop_header.epil:
5514; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
5515; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
5516; EPILOG-NEXT:    call void @bar()
5517; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1.loopexit1
5518; EPILOG:       loop_latch.epil:
5519; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
5520; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
5521; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
5522; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
5523; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !15
5524; EPILOG:       exit2.epilog-lcssa:
5525; EPILOG-NEXT:    br label %exit2
5526; EPILOG:       exit2:
5527; EPILOG-NEXT:    ret void
5528;
5529; EPILOG-BLOCK-LABEL: @test11(
5530; EPILOG-BLOCK-NEXT:  entry:
5531; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
5532; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
5533; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
5534; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
5535; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit2.unr-lcssa, label %entry.new
5536; EPILOG-BLOCK:       entry.new:
5537; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
5538; EPILOG-BLOCK-NEXT:    br label %loop_header
5539; EPILOG-BLOCK:       loop_header:
5540; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5541; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
5542; EPILOG-BLOCK-NEXT:    call void @bar()
5543; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5544; EPILOG-BLOCK:       loop_latch:
5545; EPILOG-BLOCK-NEXT:    call void @bar()
5546; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5547; EPILOG-BLOCK:       loop_latch.1:
5548; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 2
5549; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 2
5550; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
5551; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !17
5552; EPILOG-BLOCK:       exit1.loopexit:
5553; EPILOG-BLOCK-NEXT:    br label %exit1
5554; EPILOG-BLOCK:       exit1:
5555; EPILOG-BLOCK-NEXT:    ret void
5556; EPILOG-BLOCK:       exit2.unr-lcssa.loopexit:
5557; EPILOG-BLOCK-NEXT:    br label %exit2.unr-lcssa
5558; EPILOG-BLOCK:       exit2.unr-lcssa:
5559; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5560; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5561; EPILOG-BLOCK:       loop_header.epil.preheader:
5562; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
5563; EPILOG-BLOCK:       loop_header.epil:
5564; EPILOG-BLOCK-NEXT:    call void @bar()
5565; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1
5566; EPILOG-BLOCK:       loop_latch.epil:
5567; EPILOG-BLOCK-NEXT:    br label %exit2
5568; EPILOG-BLOCK:       exit2:
5569; EPILOG-BLOCK-NEXT:    ret void
5570;
5571; PROLOG-LABEL: @test11(
5572; PROLOG-NEXT:  entry:
5573; PROLOG-NEXT:    %0 = freeze i64 %trip
5574; PROLOG-NEXT:    %1 = add i64 %0, -1
5575; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
5576; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5577; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5578; PROLOG:       loop_header.prol.preheader:
5579; PROLOG-NEXT:    br label %loop_header.prol
5580; PROLOG:       loop_header.prol:
5581; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
5582; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
5583; PROLOG-NEXT:    call void @bar()
5584; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1.loopexit1
5585; PROLOG:       loop_latch.prol:
5586; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
5587; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
5588; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
5589; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
5590; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !15
5591; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
5592; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
5593; PROLOG-NEXT:    br label %loop_header.prol.loopexit
5594; PROLOG:       loop_header.prol.loopexit:
5595; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
5596; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
5597; PROLOG-NEXT:    br i1 %2, label %exit2, label %entry.new
5598; PROLOG:       entry.new:
5599; PROLOG-NEXT:    br label %loop_header
5600; PROLOG:       loop_header:
5601; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5602; PROLOG-NEXT:    call void @bar()
5603; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5604; PROLOG:       loop_latch:
5605; PROLOG-NEXT:    call void @bar()
5606; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5607; PROLOG:       loop_latch.1:
5608; PROLOG-NEXT:    call void @bar()
5609; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.loopexit
5610; PROLOG:       loop_latch.2:
5611; PROLOG-NEXT:    call void @bar()
5612; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.loopexit
5613; PROLOG:       loop_latch.3:
5614; PROLOG-NEXT:    call void @bar()
5615; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.loopexit
5616; PROLOG:       loop_latch.4:
5617; PROLOG-NEXT:    call void @bar()
5618; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.loopexit
5619; PROLOG:       loop_latch.5:
5620; PROLOG-NEXT:    call void @bar()
5621; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.loopexit
5622; PROLOG:       loop_latch.6:
5623; PROLOG-NEXT:    call void @bar()
5624; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.loopexit
5625; PROLOG:       loop_latch.7:
5626; PROLOG-NEXT:    %iv_next.7 = add i64 %iv, 8
5627; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
5628; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa
5629; PROLOG:       exit1.loopexit:
5630; PROLOG-NEXT:    br label %exit1
5631; PROLOG:       exit1.loopexit1:
5632; PROLOG-NEXT:    br label %exit1
5633; PROLOG:       exit1:
5634; PROLOG-NEXT:    ret void
5635; PROLOG:       exit2.unr-lcssa:
5636; PROLOG-NEXT:    br label %exit2
5637; PROLOG:       exit2:
5638; PROLOG-NEXT:    ret void
5639;
5640; PROLOG-BLOCK-LABEL: @test11(
5641; PROLOG-BLOCK-NEXT:  entry:
5642; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
5643; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
5644; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
5645; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5646; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5647; PROLOG-BLOCK:       loop_header.prol.preheader:
5648; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
5649; PROLOG-BLOCK:       loop_header.prol:
5650; PROLOG-BLOCK-NEXT:    call void @bar()
5651; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1
5652; PROLOG-BLOCK:       loop_latch.prol:
5653; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
5654; PROLOG-BLOCK:       loop_header.prol.loopexit:
5655; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
5656; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
5657; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit2, label %entry.new
5658; PROLOG-BLOCK:       entry.new:
5659; PROLOG-BLOCK-NEXT:    br label %loop_header
5660; PROLOG-BLOCK:       loop_header:
5661; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5662; PROLOG-BLOCK-NEXT:    call void @bar()
5663; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5664; PROLOG-BLOCK:       loop_latch:
5665; PROLOG-BLOCK-NEXT:    call void @bar()
5666; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5667; PROLOG-BLOCK:       loop_latch.1:
5668; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 2
5669; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
5670; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !17
5671; PROLOG-BLOCK:       exit1.loopexit:
5672; PROLOG-BLOCK-NEXT:    br label %exit1
5673; PROLOG-BLOCK:       exit1:
5674; PROLOG-BLOCK-NEXT:    ret void
5675; PROLOG-BLOCK:       exit2.unr-lcssa:
5676; PROLOG-BLOCK-NEXT:    br label %exit2
5677; PROLOG-BLOCK:       exit2:
5678; PROLOG-BLOCK-NEXT:    ret void
5679;
5680entry:
5681  br label %loop_header
5682
5683loop_header:
5684  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
5685  call void @bar()
5686  br i1 %cond, label %loop_latch, label %exit1
5687
5688loop_latch:
5689  %iv_next = add i64 %iv, 1
5690  %cmp = icmp ne i64 %iv_next, %trip
5691  br i1 %cmp, label %loop_header, label %exit2
5692
5693exit1:
5694  ret void
5695
5696exit2:
5697  ret void
5698}
5699
5700; Combine a computeable and invariant test to make sure
5701; the interaction of both doesn't do anything weird
5702define void @test12(i64 %trip, i64 %trip2, i1 %cond) {
5703; EPILOG-LABEL: @test12(
5704; EPILOG-NEXT:  entry:
5705; EPILOG-NEXT:    %0 = freeze i64 %trip
5706; EPILOG-NEXT:    %1 = add i64 %0, -1
5707; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
5708; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
5709; EPILOG-NEXT:    br i1 %2, label %exit1.unr-lcssa, label %entry.new
5710; EPILOG:       entry.new:
5711; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
5712; EPILOG-NEXT:    br label %loop_header
5713; EPILOG:       loop_header:
5714; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5715; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
5716; EPILOG-NEXT:    call void @bar()
5717; EPILOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5718; EPILOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
5719; EPILOG:       loop_exiting_bb2:
5720; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit
5721; EPILOG:       loop_latch:
5722; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5723; EPILOG-NEXT:    call void @bar()
5724; EPILOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5725; EPILOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
5726; EPILOG:       loop_exiting_bb2.1:
5727; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
5728; EPILOG:       loop_latch.1:
5729; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv, 2
5730; EPILOG-NEXT:    call void @bar()
5731; EPILOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
5732; EPILOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit
5733; EPILOG:       loop_exiting_bb2.2:
5734; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit
5735; EPILOG:       loop_latch.2:
5736; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv, 3
5737; EPILOG-NEXT:    call void @bar()
5738; EPILOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
5739; EPILOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit
5740; EPILOG:       loop_exiting_bb2.3:
5741; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit
5742; EPILOG:       loop_latch.3:
5743; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv, 4
5744; EPILOG-NEXT:    call void @bar()
5745; EPILOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
5746; EPILOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit
5747; EPILOG:       loop_exiting_bb2.4:
5748; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit
5749; EPILOG:       loop_latch.4:
5750; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv, 5
5751; EPILOG-NEXT:    call void @bar()
5752; EPILOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
5753; EPILOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit
5754; EPILOG:       loop_exiting_bb2.5:
5755; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit
5756; EPILOG:       loop_latch.5:
5757; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv, 6
5758; EPILOG-NEXT:    call void @bar()
5759; EPILOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
5760; EPILOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit
5761; EPILOG:       loop_exiting_bb2.6:
5762; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit
5763; EPILOG:       loop_latch.6:
5764; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv, 7
5765; EPILOG-NEXT:    call void @bar()
5766; EPILOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
5767; EPILOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit
5768; EPILOG:       loop_exiting_bb2.7:
5769; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit
5770; EPILOG:       loop_latch.7:
5771; EPILOG-NEXT:    %iv_next.7 = add i64 %iv, 8
5772; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 8
5773; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
5774; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
5775; EPILOG:       exit1.unr-lcssa.loopexit:
5776; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
5777; EPILOG-NEXT:    br label %exit1.unr-lcssa
5778; EPILOG:       exit1.unr-lcssa:
5779; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
5780; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5781; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
5782; EPILOG:       loop_header.epil.preheader:
5783; EPILOG-NEXT:    br label %loop_header.epil
5784; EPILOG:       loop_header.epil:
5785; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
5786; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
5787; EPILOG-NEXT:    call void @bar()
5788; EPILOG-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil, %trip2
5789; EPILOG-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1
5790; EPILOG:       loop_exiting_bb2.epil:
5791; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1
5792; EPILOG:       loop_latch.epil:
5793; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
5794; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
5795; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
5796; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
5797; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !16
5798; EPILOG:       exit1.epilog-lcssa.loopexit:
5799; EPILOG-NEXT:    br label %exit1.epilog-lcssa
5800; EPILOG:       exit1.epilog-lcssa.loopexit1:
5801; EPILOG-NEXT:    br label %exit1.epilog-lcssa
5802; EPILOG:       exit1.epilog-lcssa:
5803; EPILOG-NEXT:    br label %exit1
5804; EPILOG:       exit1:
5805; EPILOG-NEXT:    ret void
5806;
5807; EPILOG-BLOCK-LABEL: @test12(
5808; EPILOG-BLOCK-NEXT:  entry:
5809; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
5810; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
5811; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
5812; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
5813; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit1.unr-lcssa, label %entry.new
5814; EPILOG-BLOCK:       entry.new:
5815; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
5816; EPILOG-BLOCK-NEXT:    br label %loop_header
5817; EPILOG-BLOCK:       loop_header:
5818; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5819; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
5820; EPILOG-BLOCK-NEXT:    call void @bar()
5821; EPILOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5822; EPILOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
5823; EPILOG-BLOCK:       loop_exiting_bb2:
5824; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit
5825; EPILOG-BLOCK:       loop_latch:
5826; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5827; EPILOG-BLOCK-NEXT:    call void @bar()
5828; EPILOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5829; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
5830; EPILOG-BLOCK:       loop_exiting_bb2.1:
5831; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
5832; EPILOG-BLOCK:       loop_latch.1:
5833; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 2
5834; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 2
5835; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
5836; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18
5837; EPILOG-BLOCK:       exit1.unr-lcssa.loopexit:
5838; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
5839; EPILOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
5840; EPILOG-BLOCK:       exit1.unr-lcssa:
5841; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
5842; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5843; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
5844; EPILOG-BLOCK:       loop_header.epil.preheader:
5845; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
5846; EPILOG-BLOCK:       loop_header.epil:
5847; EPILOG-BLOCK-NEXT:    call void @bar()
5848; EPILOG-BLOCK-NEXT:    %cmp_early.epil = icmp ne i64 %iv.unr, %trip2
5849; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa
5850; EPILOG-BLOCK:       loop_exiting_bb2.epil:
5851; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa
5852; EPILOG-BLOCK:       loop_latch.epil:
5853; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
5854; EPILOG-BLOCK:       exit1.epilog-lcssa.loopexit:
5855; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
5856; EPILOG-BLOCK:       exit1.epilog-lcssa:
5857; EPILOG-BLOCK-NEXT:    br label %exit1
5858; EPILOG-BLOCK:       exit1:
5859; EPILOG-BLOCK-NEXT:    ret void
5860;
5861; PROLOG-LABEL: @test12(
5862; PROLOG-NEXT:  entry:
5863; PROLOG-NEXT:    %0 = freeze i64 %trip
5864; PROLOG-NEXT:    %1 = add i64 %0, -1
5865; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
5866; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5867; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5868; PROLOG:       loop_header.prol.preheader:
5869; PROLOG-NEXT:    br label %loop_header.prol
5870; PROLOG:       loop_header.prol:
5871; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
5872; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
5873; PROLOG-NEXT:    call void @bar()
5874; PROLOG-NEXT:    %cmp_early.prol = icmp ne i64 %iv.prol, %trip2
5875; PROLOG-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1
5876; PROLOG:       loop_exiting_bb2.prol:
5877; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1
5878; PROLOG:       loop_latch.prol:
5879; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
5880; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
5881; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
5882; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
5883; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !16
5884; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
5885; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
5886; PROLOG-NEXT:    br label %loop_header.prol.loopexit
5887; PROLOG:       loop_header.prol.loopexit:
5888; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
5889; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
5890; PROLOG-NEXT:    br i1 %2, label %exit1, label %entry.new
5891; PROLOG:       entry.new:
5892; PROLOG-NEXT:    br label %loop_header
5893; PROLOG:       loop_header:
5894; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5895; PROLOG-NEXT:    call void @bar()
5896; PROLOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5897; PROLOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
5898; PROLOG:       loop_exiting_bb2:
5899; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit
5900; PROLOG:       loop_latch:
5901; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
5902; PROLOG-NEXT:    call void @bar()
5903; PROLOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5904; PROLOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
5905; PROLOG:       loop_exiting_bb2.1:
5906; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
5907; PROLOG:       loop_latch.1:
5908; PROLOG-NEXT:    %iv_next.1 = add i64 %iv, 2
5909; PROLOG-NEXT:    call void @bar()
5910; PROLOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
5911; PROLOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit
5912; PROLOG:       loop_exiting_bb2.2:
5913; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.unr-lcssa.loopexit
5914; PROLOG:       loop_latch.2:
5915; PROLOG-NEXT:    %iv_next.2 = add i64 %iv, 3
5916; PROLOG-NEXT:    call void @bar()
5917; PROLOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
5918; PROLOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit
5919; PROLOG:       loop_exiting_bb2.3:
5920; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.unr-lcssa.loopexit
5921; PROLOG:       loop_latch.3:
5922; PROLOG-NEXT:    %iv_next.3 = add i64 %iv, 4
5923; PROLOG-NEXT:    call void @bar()
5924; PROLOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
5925; PROLOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit
5926; PROLOG:       loop_exiting_bb2.4:
5927; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.unr-lcssa.loopexit
5928; PROLOG:       loop_latch.4:
5929; PROLOG-NEXT:    %iv_next.4 = add i64 %iv, 5
5930; PROLOG-NEXT:    call void @bar()
5931; PROLOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
5932; PROLOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit
5933; PROLOG:       loop_exiting_bb2.5:
5934; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.unr-lcssa.loopexit
5935; PROLOG:       loop_latch.5:
5936; PROLOG-NEXT:    %iv_next.5 = add i64 %iv, 6
5937; PROLOG-NEXT:    call void @bar()
5938; PROLOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
5939; PROLOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit
5940; PROLOG:       loop_exiting_bb2.6:
5941; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.unr-lcssa.loopexit
5942; PROLOG:       loop_latch.6:
5943; PROLOG-NEXT:    %iv_next.6 = add i64 %iv, 7
5944; PROLOG-NEXT:    call void @bar()
5945; PROLOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
5946; PROLOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit
5947; PROLOG:       loop_exiting_bb2.7:
5948; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.unr-lcssa.loopexit
5949; PROLOG:       loop_latch.7:
5950; PROLOG-NEXT:    %iv_next.7 = add i64 %iv, 8
5951; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
5952; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
5953; PROLOG:       exit1.unr-lcssa.loopexit:
5954; PROLOG-NEXT:    br label %exit1.unr-lcssa
5955; PROLOG:       exit1.unr-lcssa.loopexit1:
5956; PROLOG-NEXT:    br label %exit1.unr-lcssa
5957; PROLOG:       exit1.unr-lcssa:
5958; PROLOG-NEXT:    br label %exit1
5959; PROLOG:       exit1:
5960; PROLOG-NEXT:    ret void
5961;
5962; PROLOG-BLOCK-LABEL: @test12(
5963; PROLOG-BLOCK-NEXT:  entry:
5964; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
5965; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
5966; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
5967; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5968; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5969; PROLOG-BLOCK:       loop_header.prol.preheader:
5970; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
5971; PROLOG-BLOCK:       loop_header.prol:
5972; PROLOG-BLOCK-NEXT:    call void @bar()
5973; PROLOG-BLOCK-NEXT:    %cmp_early.prol = icmp ne i64 0, %trip2
5974; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa
5975; PROLOG-BLOCK:       loop_exiting_bb2.prol:
5976; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa
5977; PROLOG-BLOCK:       loop_latch.prol:
5978; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
5979; PROLOG-BLOCK:       loop_header.prol.loopexit:
5980; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
5981; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
5982; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit1, label %entry.new
5983; PROLOG-BLOCK:       entry.new:
5984; PROLOG-BLOCK-NEXT:    br label %loop_header
5985; PROLOG-BLOCK:       loop_header:
5986; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5987; PROLOG-BLOCK-NEXT:    call void @bar()
5988; PROLOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5989; PROLOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
5990; PROLOG-BLOCK:       loop_exiting_bb2:
5991; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit
5992; PROLOG-BLOCK:       loop_latch:
5993; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
5994; PROLOG-BLOCK-NEXT:    call void @bar()
5995; PROLOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5996; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
5997; PROLOG-BLOCK:       loop_exiting_bb2.1:
5998; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
5999; PROLOG-BLOCK:       loop_latch.1:
6000; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 2
6001; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
6002; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18
6003; PROLOG-BLOCK:       exit1.unr-lcssa.loopexit:
6004; PROLOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6005; PROLOG-BLOCK:       exit1.unr-lcssa:
6006; PROLOG-BLOCK-NEXT:    br label %exit1
6007; PROLOG-BLOCK:       exit1:
6008; PROLOG-BLOCK-NEXT:    ret void
6009;
6010entry:
6011  br label %loop_header
6012
6013loop_header:
6014  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
6015  call void @bar()
6016  %cmp_early = icmp ne i64 %iv, %trip2
6017  br i1 %cmp_early, label %loop_exiting_bb2, label %exit1
6018
6019loop_exiting_bb2:
6020  br i1 %cond, label %loop_latch, label %exit1
6021
6022loop_latch:
6023  %iv_next = add i64 %iv, 1
6024  %cmp = icmp ne i64 %iv_next, %trip
6025  br i1 %cmp, label %loop_header, label %exit1
6026
6027exit1:
6028  ret void
6029}
6030
6031declare i1 @unknown_cond()
6032
6033; Mix of computable and uncompatable exits
6034define void @test13(i64 %trip, i64 %trip2) {
6035; EPILOG-LABEL: @test13(
6036; EPILOG-NEXT:  entry:
6037; EPILOG-NEXT:    %0 = freeze i64 %trip
6038; EPILOG-NEXT:    %1 = add i64 %0, -1
6039; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
6040; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
6041; EPILOG-NEXT:    br i1 %2, label %exit1.unr-lcssa, label %entry.new
6042; EPILOG:       entry.new:
6043; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
6044; EPILOG-NEXT:    br label %loop_header
6045; EPILOG:       loop_header:
6046; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6047; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
6048; EPILOG-NEXT:    call void @bar()
6049; EPILOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6050; EPILOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6051; EPILOG:       loop_exiting_bb2:
6052; EPILOG-NEXT:    %unknown = call i1 @unknown_cond()
6053; EPILOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6054; EPILOG:       loop_latch:
6055; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
6056; EPILOG-NEXT:    call void @bar()
6057; EPILOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6058; EPILOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6059; EPILOG:       loop_exiting_bb2.1:
6060; EPILOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
6061; EPILOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6062; EPILOG:       loop_latch.1:
6063; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv, 2
6064; EPILOG-NEXT:    call void @bar()
6065; EPILOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
6066; EPILOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit
6067; EPILOG:       loop_exiting_bb2.2:
6068; EPILOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
6069; EPILOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit
6070; EPILOG:       loop_latch.2:
6071; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv, 3
6072; EPILOG-NEXT:    call void @bar()
6073; EPILOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
6074; EPILOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit
6075; EPILOG:       loop_exiting_bb2.3:
6076; EPILOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
6077; EPILOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit
6078; EPILOG:       loop_latch.3:
6079; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv, 4
6080; EPILOG-NEXT:    call void @bar()
6081; EPILOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
6082; EPILOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit
6083; EPILOG:       loop_exiting_bb2.4:
6084; EPILOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
6085; EPILOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit
6086; EPILOG:       loop_latch.4:
6087; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv, 5
6088; EPILOG-NEXT:    call void @bar()
6089; EPILOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
6090; EPILOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit
6091; EPILOG:       loop_exiting_bb2.5:
6092; EPILOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
6093; EPILOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit
6094; EPILOG:       loop_latch.5:
6095; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv, 6
6096; EPILOG-NEXT:    call void @bar()
6097; EPILOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
6098; EPILOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit
6099; EPILOG:       loop_exiting_bb2.6:
6100; EPILOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
6101; EPILOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit
6102; EPILOG:       loop_latch.6:
6103; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv, 7
6104; EPILOG-NEXT:    call void @bar()
6105; EPILOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
6106; EPILOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit
6107; EPILOG:       loop_exiting_bb2.7:
6108; EPILOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
6109; EPILOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit
6110; EPILOG:       loop_latch.7:
6111; EPILOG-NEXT:    %iv_next.7 = add i64 %iv, 8
6112; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 8
6113; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
6114; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6115; EPILOG:       exit1.unr-lcssa.loopexit:
6116; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
6117; EPILOG-NEXT:    br label %exit1.unr-lcssa
6118; EPILOG:       exit1.unr-lcssa:
6119; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
6120; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6121; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6122; EPILOG:       loop_header.epil.preheader:
6123; EPILOG-NEXT:    br label %loop_header.epil
6124; EPILOG:       loop_header.epil:
6125; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
6126; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
6127; EPILOG-NEXT:    call void @bar()
6128; EPILOG-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil, %trip2
6129; EPILOG-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1
6130; EPILOG:       loop_exiting_bb2.epil:
6131; EPILOG-NEXT:    %unknown.epil = call i1 @unknown_cond()
6132; EPILOG-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1
6133; EPILOG:       loop_latch.epil:
6134; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
6135; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
6136; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
6137; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
6138; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !17
6139; EPILOG:       exit1.epilog-lcssa.loopexit:
6140; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6141; EPILOG:       exit1.epilog-lcssa.loopexit1:
6142; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6143; EPILOG:       exit1.epilog-lcssa:
6144; EPILOG-NEXT:    br label %exit1
6145; EPILOG:       exit1:
6146; EPILOG-NEXT:    ret void
6147;
6148; EPILOG-BLOCK-LABEL: @test13(
6149; EPILOG-BLOCK-NEXT:  entry:
6150; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
6151; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
6152; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
6153; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
6154; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit1.unr-lcssa, label %entry.new
6155; EPILOG-BLOCK:       entry.new:
6156; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
6157; EPILOG-BLOCK-NEXT:    br label %loop_header
6158; EPILOG-BLOCK:       loop_header:
6159; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6160; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
6161; EPILOG-BLOCK-NEXT:    call void @bar()
6162; EPILOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6163; EPILOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6164; EPILOG-BLOCK:       loop_exiting_bb2:
6165; EPILOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6166; EPILOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6167; EPILOG-BLOCK:       loop_latch:
6168; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
6169; EPILOG-BLOCK-NEXT:    call void @bar()
6170; EPILOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6171; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6172; EPILOG-BLOCK:       loop_exiting_bb2.1:
6173; EPILOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6174; EPILOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6175; EPILOG-BLOCK:       loop_latch.1:
6176; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 2
6177; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 2
6178; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
6179; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19
6180; EPILOG-BLOCK:       exit1.unr-lcssa.loopexit:
6181; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
6182; EPILOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6183; EPILOG-BLOCK:       exit1.unr-lcssa:
6184; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
6185; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6186; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6187; EPILOG-BLOCK:       loop_header.epil.preheader:
6188; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
6189; EPILOG-BLOCK:       loop_header.epil:
6190; EPILOG-BLOCK-NEXT:    call void @bar()
6191; EPILOG-BLOCK-NEXT:    %cmp_early.epil = icmp ne i64 %iv.unr, %trip2
6192; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa
6193; EPILOG-BLOCK:       loop_exiting_bb2.epil:
6194; EPILOG-BLOCK-NEXT:    %unknown.epil = call i1 @unknown_cond()
6195; EPILOG-BLOCK-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa
6196; EPILOG-BLOCK:       loop_latch.epil:
6197; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6198; EPILOG-BLOCK:       exit1.epilog-lcssa.loopexit:
6199; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6200; EPILOG-BLOCK:       exit1.epilog-lcssa:
6201; EPILOG-BLOCK-NEXT:    br label %exit1
6202; EPILOG-BLOCK:       exit1:
6203; EPILOG-BLOCK-NEXT:    ret void
6204;
6205; PROLOG-LABEL: @test13(
6206; PROLOG-NEXT:  entry:
6207; PROLOG-NEXT:    %0 = freeze i64 %trip
6208; PROLOG-NEXT:    %1 = add i64 %0, -1
6209; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
6210; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6211; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6212; PROLOG:       loop_header.prol.preheader:
6213; PROLOG-NEXT:    br label %loop_header.prol
6214; PROLOG:       loop_header.prol:
6215; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
6216; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
6217; PROLOG-NEXT:    call void @bar()
6218; PROLOG-NEXT:    %cmp_early.prol = icmp ne i64 %iv.prol, %trip2
6219; PROLOG-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1
6220; PROLOG:       loop_exiting_bb2.prol:
6221; PROLOG-NEXT:    %unknown.prol = call i1 @unknown_cond()
6222; PROLOG-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1
6223; PROLOG:       loop_latch.prol:
6224; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
6225; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
6226; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
6227; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
6228; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !17
6229; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
6230; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
6231; PROLOG-NEXT:    br label %loop_header.prol.loopexit
6232; PROLOG:       loop_header.prol.loopexit:
6233; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
6234; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
6235; PROLOG-NEXT:    br i1 %2, label %exit1, label %entry.new
6236; PROLOG:       entry.new:
6237; PROLOG-NEXT:    br label %loop_header
6238; PROLOG:       loop_header:
6239; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6240; PROLOG-NEXT:    call void @bar()
6241; PROLOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6242; PROLOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6243; PROLOG:       loop_exiting_bb2:
6244; PROLOG-NEXT:    %unknown = call i1 @unknown_cond()
6245; PROLOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6246; PROLOG:       loop_latch:
6247; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
6248; PROLOG-NEXT:    call void @bar()
6249; PROLOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6250; PROLOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6251; PROLOG:       loop_exiting_bb2.1:
6252; PROLOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
6253; PROLOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6254; PROLOG:       loop_latch.1:
6255; PROLOG-NEXT:    %iv_next.1 = add i64 %iv, 2
6256; PROLOG-NEXT:    call void @bar()
6257; PROLOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
6258; PROLOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit
6259; PROLOG:       loop_exiting_bb2.2:
6260; PROLOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
6261; PROLOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit
6262; PROLOG:       loop_latch.2:
6263; PROLOG-NEXT:    %iv_next.2 = add i64 %iv, 3
6264; PROLOG-NEXT:    call void @bar()
6265; PROLOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
6266; PROLOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit
6267; PROLOG:       loop_exiting_bb2.3:
6268; PROLOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
6269; PROLOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit
6270; PROLOG:       loop_latch.3:
6271; PROLOG-NEXT:    %iv_next.3 = add i64 %iv, 4
6272; PROLOG-NEXT:    call void @bar()
6273; PROLOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
6274; PROLOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit
6275; PROLOG:       loop_exiting_bb2.4:
6276; PROLOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
6277; PROLOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit
6278; PROLOG:       loop_latch.4:
6279; PROLOG-NEXT:    %iv_next.4 = add i64 %iv, 5
6280; PROLOG-NEXT:    call void @bar()
6281; PROLOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
6282; PROLOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit
6283; PROLOG:       loop_exiting_bb2.5:
6284; PROLOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
6285; PROLOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit
6286; PROLOG:       loop_latch.5:
6287; PROLOG-NEXT:    %iv_next.5 = add i64 %iv, 6
6288; PROLOG-NEXT:    call void @bar()
6289; PROLOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
6290; PROLOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit
6291; PROLOG:       loop_exiting_bb2.6:
6292; PROLOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
6293; PROLOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit
6294; PROLOG:       loop_latch.6:
6295; PROLOG-NEXT:    %iv_next.6 = add i64 %iv, 7
6296; PROLOG-NEXT:    call void @bar()
6297; PROLOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
6298; PROLOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit
6299; PROLOG:       loop_exiting_bb2.7:
6300; PROLOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
6301; PROLOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit
6302; PROLOG:       loop_latch.7:
6303; PROLOG-NEXT:    %iv_next.7 = add i64 %iv, 8
6304; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
6305; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6306; PROLOG:       exit1.unr-lcssa.loopexit:
6307; PROLOG-NEXT:    br label %exit1.unr-lcssa
6308; PROLOG:       exit1.unr-lcssa.loopexit1:
6309; PROLOG-NEXT:    br label %exit1.unr-lcssa
6310; PROLOG:       exit1.unr-lcssa:
6311; PROLOG-NEXT:    br label %exit1
6312; PROLOG:       exit1:
6313; PROLOG-NEXT:    ret void
6314;
6315; PROLOG-BLOCK-LABEL: @test13(
6316; PROLOG-BLOCK-NEXT:  entry:
6317; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
6318; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
6319; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
6320; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6321; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6322; PROLOG-BLOCK:       loop_header.prol.preheader:
6323; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
6324; PROLOG-BLOCK:       loop_header.prol:
6325; PROLOG-BLOCK-NEXT:    call void @bar()
6326; PROLOG-BLOCK-NEXT:    %cmp_early.prol = icmp ne i64 0, %trip2
6327; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa
6328; PROLOG-BLOCK:       loop_exiting_bb2.prol:
6329; PROLOG-BLOCK-NEXT:    %unknown.prol = call i1 @unknown_cond()
6330; PROLOG-BLOCK-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa
6331; PROLOG-BLOCK:       loop_latch.prol:
6332; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
6333; PROLOG-BLOCK:       loop_header.prol.loopexit:
6334; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
6335; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
6336; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit1, label %entry.new
6337; PROLOG-BLOCK:       entry.new:
6338; PROLOG-BLOCK-NEXT:    br label %loop_header
6339; PROLOG-BLOCK:       loop_header:
6340; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6341; PROLOG-BLOCK-NEXT:    call void @bar()
6342; PROLOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6343; PROLOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6344; PROLOG-BLOCK:       loop_exiting_bb2:
6345; PROLOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6346; PROLOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6347; PROLOG-BLOCK:       loop_latch:
6348; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
6349; PROLOG-BLOCK-NEXT:    call void @bar()
6350; PROLOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6351; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6352; PROLOG-BLOCK:       loop_exiting_bb2.1:
6353; PROLOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6354; PROLOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6355; PROLOG-BLOCK:       loop_latch.1:
6356; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 2
6357; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
6358; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19
6359; PROLOG-BLOCK:       exit1.unr-lcssa.loopexit:
6360; PROLOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6361; PROLOG-BLOCK:       exit1.unr-lcssa:
6362; PROLOG-BLOCK-NEXT:    br label %exit1
6363; PROLOG-BLOCK:       exit1:
6364; PROLOG-BLOCK-NEXT:    ret void
6365;
6366entry:
6367  br label %loop_header
6368
6369loop_header:
6370  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
6371  call void @bar()
6372  %cmp_early = icmp ne i64 %iv, %trip2
6373  br i1 %cmp_early, label %loop_exiting_bb2, label %exit1
6374
6375loop_exiting_bb2:
6376  %unknown = call i1 @unknown_cond()
6377  br i1 %unknown, label %loop_latch, label %exit1
6378
6379loop_latch:
6380  %iv_next = add i64 %iv, 1
6381  %cmp = icmp ne i64 %iv_next, %trip
6382  br i1 %cmp, label %loop_header, label %exit1
6383
6384exit1:
6385  ret void
6386}
6387
6388; Mix of invariant and (even in theory) uncomputable exits
6389define void @test14(i64 %trip, i1 %cond) {
6390; EPILOG-LABEL: @test14(
6391; EPILOG-NEXT:  entry:
6392; EPILOG-NEXT:    %0 = freeze i64 %trip
6393; EPILOG-NEXT:    %1 = add i64 %0, -1
6394; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
6395; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
6396; EPILOG-NEXT:    br i1 %2, label %exit1.unr-lcssa, label %entry.new
6397; EPILOG:       entry.new:
6398; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
6399; EPILOG-NEXT:    br label %loop_header
6400; EPILOG:       loop_header:
6401; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6402; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
6403; EPILOG-NEXT:    call void @bar()
6404; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6405; EPILOG:       loop_exiting_bb2:
6406; EPILOG-NEXT:    %unknown = call i1 @unknown_cond()
6407; EPILOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6408; EPILOG:       loop_latch:
6409; EPILOG-NEXT:    call void @bar()
6410; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6411; EPILOG:       loop_exiting_bb2.1:
6412; EPILOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
6413; EPILOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6414; EPILOG:       loop_latch.1:
6415; EPILOG-NEXT:    call void @bar()
6416; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit
6417; EPILOG:       loop_exiting_bb2.2:
6418; EPILOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
6419; EPILOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit
6420; EPILOG:       loop_latch.2:
6421; EPILOG-NEXT:    call void @bar()
6422; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit
6423; EPILOG:       loop_exiting_bb2.3:
6424; EPILOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
6425; EPILOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit
6426; EPILOG:       loop_latch.3:
6427; EPILOG-NEXT:    call void @bar()
6428; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit
6429; EPILOG:       loop_exiting_bb2.4:
6430; EPILOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
6431; EPILOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit
6432; EPILOG:       loop_latch.4:
6433; EPILOG-NEXT:    call void @bar()
6434; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit
6435; EPILOG:       loop_exiting_bb2.5:
6436; EPILOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
6437; EPILOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit
6438; EPILOG:       loop_latch.5:
6439; EPILOG-NEXT:    call void @bar()
6440; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit
6441; EPILOG:       loop_exiting_bb2.6:
6442; EPILOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
6443; EPILOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit
6444; EPILOG:       loop_latch.6:
6445; EPILOG-NEXT:    call void @bar()
6446; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit
6447; EPILOG:       loop_exiting_bb2.7:
6448; EPILOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
6449; EPILOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit
6450; EPILOG:       loop_latch.7:
6451; EPILOG-NEXT:    %iv_next.7 = add i64 %iv, 8
6452; EPILOG-NEXT:    %niter.next.7 = add i64 %niter, 8
6453; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
6454; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6455; EPILOG:       exit1.unr-lcssa.loopexit:
6456; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
6457; EPILOG-NEXT:    br label %exit1.unr-lcssa
6458; EPILOG:       exit1.unr-lcssa:
6459; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
6460; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6461; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6462; EPILOG:       loop_header.epil.preheader:
6463; EPILOG-NEXT:    br label %loop_header.epil
6464; EPILOG:       loop_header.epil:
6465; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
6466; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
6467; EPILOG-NEXT:    call void @bar()
6468; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1
6469; EPILOG:       loop_exiting_bb2.epil:
6470; EPILOG-NEXT:    %unknown.epil = call i1 @unknown_cond()
6471; EPILOG-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1
6472; EPILOG:       loop_latch.epil:
6473; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
6474; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
6475; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
6476; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
6477; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !18
6478; EPILOG:       exit1.epilog-lcssa.loopexit:
6479; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6480; EPILOG:       exit1.epilog-lcssa.loopexit1:
6481; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6482; EPILOG:       exit1.epilog-lcssa:
6483; EPILOG-NEXT:    br label %exit1
6484; EPILOG:       exit1:
6485; EPILOG-NEXT:    ret void
6486;
6487; EPILOG-BLOCK-LABEL: @test14(
6488; EPILOG-BLOCK-NEXT:  entry:
6489; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
6490; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
6491; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
6492; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
6493; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit1.unr-lcssa, label %entry.new
6494; EPILOG-BLOCK:       entry.new:
6495; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
6496; EPILOG-BLOCK-NEXT:    br label %loop_header
6497; EPILOG-BLOCK:       loop_header:
6498; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6499; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
6500; EPILOG-BLOCK-NEXT:    call void @bar()
6501; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6502; EPILOG-BLOCK:       loop_exiting_bb2:
6503; EPILOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6504; EPILOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6505; EPILOG-BLOCK:       loop_latch:
6506; EPILOG-BLOCK-NEXT:    call void @bar()
6507; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6508; EPILOG-BLOCK:       loop_exiting_bb2.1:
6509; EPILOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6510; EPILOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6511; EPILOG-BLOCK:       loop_latch.1:
6512; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 2
6513; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter, 2
6514; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
6515; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !20
6516; EPILOG-BLOCK:       exit1.unr-lcssa.loopexit:
6517; EPILOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6518; EPILOG-BLOCK:       exit1.unr-lcssa:
6519; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6520; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6521; EPILOG-BLOCK:       loop_header.epil.preheader:
6522; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
6523; EPILOG-BLOCK:       loop_header.epil:
6524; EPILOG-BLOCK-NEXT:    call void @bar()
6525; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa
6526; EPILOG-BLOCK:       loop_exiting_bb2.epil:
6527; EPILOG-BLOCK-NEXT:    %unknown.epil = call i1 @unknown_cond()
6528; EPILOG-BLOCK-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa
6529; EPILOG-BLOCK:       loop_latch.epil:
6530; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6531; EPILOG-BLOCK:       exit1.epilog-lcssa.loopexit:
6532; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6533; EPILOG-BLOCK:       exit1.epilog-lcssa:
6534; EPILOG-BLOCK-NEXT:    br label %exit1
6535; EPILOG-BLOCK:       exit1:
6536; EPILOG-BLOCK-NEXT:    ret void
6537;
6538; PROLOG-LABEL: @test14(
6539; PROLOG-NEXT:  entry:
6540; PROLOG-NEXT:    %0 = freeze i64 %trip
6541; PROLOG-NEXT:    %1 = add i64 %0, -1
6542; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
6543; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6544; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6545; PROLOG:       loop_header.prol.preheader:
6546; PROLOG-NEXT:    br label %loop_header.prol
6547; PROLOG:       loop_header.prol:
6548; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
6549; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
6550; PROLOG-NEXT:    call void @bar()
6551; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1
6552; PROLOG:       loop_exiting_bb2.prol:
6553; PROLOG-NEXT:    %unknown.prol = call i1 @unknown_cond()
6554; PROLOG-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1
6555; PROLOG:       loop_latch.prol:
6556; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
6557; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
6558; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
6559; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
6560; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !18
6561; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
6562; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
6563; PROLOG-NEXT:    br label %loop_header.prol.loopexit
6564; PROLOG:       loop_header.prol.loopexit:
6565; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
6566; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
6567; PROLOG-NEXT:    br i1 %2, label %exit1, label %entry.new
6568; PROLOG:       entry.new:
6569; PROLOG-NEXT:    br label %loop_header
6570; PROLOG:       loop_header:
6571; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6572; PROLOG-NEXT:    call void @bar()
6573; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6574; PROLOG:       loop_exiting_bb2:
6575; PROLOG-NEXT:    %unknown = call i1 @unknown_cond()
6576; PROLOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6577; PROLOG:       loop_latch:
6578; PROLOG-NEXT:    call void @bar()
6579; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6580; PROLOG:       loop_exiting_bb2.1:
6581; PROLOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
6582; PROLOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6583; PROLOG:       loop_latch.1:
6584; PROLOG-NEXT:    call void @bar()
6585; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit
6586; PROLOG:       loop_exiting_bb2.2:
6587; PROLOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
6588; PROLOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit
6589; PROLOG:       loop_latch.2:
6590; PROLOG-NEXT:    call void @bar()
6591; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit
6592; PROLOG:       loop_exiting_bb2.3:
6593; PROLOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
6594; PROLOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit
6595; PROLOG:       loop_latch.3:
6596; PROLOG-NEXT:    call void @bar()
6597; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit
6598; PROLOG:       loop_exiting_bb2.4:
6599; PROLOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
6600; PROLOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit
6601; PROLOG:       loop_latch.4:
6602; PROLOG-NEXT:    call void @bar()
6603; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit
6604; PROLOG:       loop_exiting_bb2.5:
6605; PROLOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
6606; PROLOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit
6607; PROLOG:       loop_latch.5:
6608; PROLOG-NEXT:    call void @bar()
6609; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit
6610; PROLOG:       loop_exiting_bb2.6:
6611; PROLOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
6612; PROLOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit
6613; PROLOG:       loop_latch.6:
6614; PROLOG-NEXT:    call void @bar()
6615; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit
6616; PROLOG:       loop_exiting_bb2.7:
6617; PROLOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
6618; PROLOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit
6619; PROLOG:       loop_latch.7:
6620; PROLOG-NEXT:    %iv_next.7 = add i64 %iv, 8
6621; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
6622; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6623; PROLOG:       exit1.unr-lcssa.loopexit:
6624; PROLOG-NEXT:    br label %exit1.unr-lcssa
6625; PROLOG:       exit1.unr-lcssa.loopexit1:
6626; PROLOG-NEXT:    br label %exit1.unr-lcssa
6627; PROLOG:       exit1.unr-lcssa:
6628; PROLOG-NEXT:    br label %exit1
6629; PROLOG:       exit1:
6630; PROLOG-NEXT:    ret void
6631;
6632; PROLOG-BLOCK-LABEL: @test14(
6633; PROLOG-BLOCK-NEXT:  entry:
6634; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
6635; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
6636; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
6637; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6638; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6639; PROLOG-BLOCK:       loop_header.prol.preheader:
6640; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
6641; PROLOG-BLOCK:       loop_header.prol:
6642; PROLOG-BLOCK-NEXT:    call void @bar()
6643; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa
6644; PROLOG-BLOCK:       loop_exiting_bb2.prol:
6645; PROLOG-BLOCK-NEXT:    %unknown.prol = call i1 @unknown_cond()
6646; PROLOG-BLOCK-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa
6647; PROLOG-BLOCK:       loop_latch.prol:
6648; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
6649; PROLOG-BLOCK:       loop_header.prol.loopexit:
6650; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
6651; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
6652; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit1, label %entry.new
6653; PROLOG-BLOCK:       entry.new:
6654; PROLOG-BLOCK-NEXT:    br label %loop_header
6655; PROLOG-BLOCK:       loop_header:
6656; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6657; PROLOG-BLOCK-NEXT:    call void @bar()
6658; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6659; PROLOG-BLOCK:       loop_exiting_bb2:
6660; PROLOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6661; PROLOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6662; PROLOG-BLOCK:       loop_latch:
6663; PROLOG-BLOCK-NEXT:    call void @bar()
6664; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6665; PROLOG-BLOCK:       loop_exiting_bb2.1:
6666; PROLOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6667; PROLOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6668; PROLOG-BLOCK:       loop_latch.1:
6669; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv, 2
6670; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
6671; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !20
6672; PROLOG-BLOCK:       exit1.unr-lcssa.loopexit:
6673; PROLOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6674; PROLOG-BLOCK:       exit1.unr-lcssa:
6675; PROLOG-BLOCK-NEXT:    br label %exit1
6676; PROLOG-BLOCK:       exit1:
6677; PROLOG-BLOCK-NEXT:    ret void
6678;
6679entry:
6680  br label %loop_header
6681
6682loop_header:
6683  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
6684  call void @bar()
6685  br i1 %cond, label %loop_exiting_bb2, label %exit1
6686
6687loop_exiting_bb2:
6688  %unknown = call i1 @unknown_cond()
6689  br i1 %unknown, label %loop_latch, label %exit1
6690
6691loop_latch:
6692  %iv_next = add i64 %iv, 1
6693  %cmp = icmp ne i64 %iv_next, %trip
6694  br i1 %cmp, label %loop_header, label %exit1
6695
6696exit1:
6697  ret void
6698}
6699