1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: -p
2; RUN: opt < %s -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 -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 -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 -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:    %iv_next = add nuw nsw i64 %iv, 1
38; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
39; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
40; EPILOG:       loop_exiting_bb1.1:
41; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
42; EPILOG:       loop_exiting_bb2.1:
43; EPILOG-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
44; EPILOG:       loop_latch.1:
45; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
46; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
47; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2
48; EPILOG:       loop_exiting_bb1.2:
49; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit
50; EPILOG:       loop_exiting_bb2.2:
51; EPILOG-NEXT:    br i1 false, label %loop_latch.2, label %exit3.loopexit
52; EPILOG:       loop_latch.2:
53; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
54; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
55; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3
56; EPILOG:       loop_exiting_bb1.3:
57; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit
58; EPILOG:       loop_exiting_bb2.3:
59; EPILOG-NEXT:    br i1 false, label %loop_latch.3, label %exit3.loopexit
60; EPILOG:       loop_latch.3:
61; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
62; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
63; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4
64; EPILOG:       loop_exiting_bb1.4:
65; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit
66; EPILOG:       loop_exiting_bb2.4:
67; EPILOG-NEXT:    br i1 false, label %loop_latch.4, label %exit3.loopexit
68; EPILOG:       loop_latch.4:
69; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
70; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
71; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5
72; EPILOG:       loop_exiting_bb1.5:
73; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit
74; EPILOG:       loop_exiting_bb2.5:
75; EPILOG-NEXT:    br i1 false, label %loop_latch.5, label %exit3.loopexit
76; EPILOG:       loop_latch.5:
77; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
78; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
79; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6
80; EPILOG:       loop_exiting_bb1.6:
81; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit
82; EPILOG:       loop_exiting_bb2.6:
83; EPILOG-NEXT:    br i1 false, label %loop_latch.6, label %exit3.loopexit
84; EPILOG:       loop_latch.6:
85; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
86; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
87; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7
88; EPILOG:       loop_exiting_bb1.7:
89; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit
90; EPILOG:       loop_exiting_bb2.7:
91; EPILOG-NEXT:    br i1 false, label %loop_latch.7, label %exit3.loopexit
92; EPILOG:       loop_latch.7:
93; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
94; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
95; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
96; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit
97; EPILOG:       exit1.loopexit:
98; EPILOG-NEXT:    br label %exit1
99; EPILOG:       exit1.loopexit1:
100; EPILOG-NEXT:    br label %exit1
101; EPILOG:       exit1:
102; EPILOG-NEXT:    ret void
103; EPILOG:       exit2.loopexit.unr-lcssa.loopexit:
104; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
105; EPILOG-NEXT:    br label %exit2.loopexit.unr-lcssa
106; EPILOG:       exit2.loopexit.unr-lcssa:
107; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
108; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
109; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
110; EPILOG:       loop_header.epil.preheader:
111; EPILOG-NEXT:    br label %loop_header.epil
112; EPILOG:       loop_header.epil:
113; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
114; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
115; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil
116; EPILOG:       loop_exiting_bb1.epil:
117; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.epil, label %exit1.loopexit1
118; EPILOG:       loop_exiting_bb2.epil:
119; EPILOG-NEXT:    br i1 false, label %loop_latch.epil, label %exit3.loopexit2
120; EPILOG:       loop_latch.epil:
121; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
122; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
123; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
124; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
125; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !0
126; EPILOG:       exit2.loopexit.epilog-lcssa:
127; EPILOG-NEXT:    br label %exit2.loopexit
128; EPILOG:       exit2.loopexit:
129; EPILOG-NEXT:    ret void
130;
131; EPILOG-BLOCK-LABEL: @test1(
132; EPILOG-BLOCK-NEXT:  entry:
133; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
134; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
135; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
136; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
137; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new
138; EPILOG-BLOCK:       entry.new:
139; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
140; EPILOG-BLOCK-NEXT:    br label %loop_header
141; EPILOG-BLOCK:       loop_header:
142; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
143; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
144; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
145; EPILOG-BLOCK:       loop_exiting_bb1:
146; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
147; EPILOG-BLOCK:       loop_exiting_bb2:
148; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
149; EPILOG-BLOCK:       exit3.loopexit:
150; EPILOG-BLOCK-NEXT:    br label %exit3
151; EPILOG-BLOCK:       exit3:
152; EPILOG-BLOCK-NEXT:    ret void
153; EPILOG-BLOCK:       loop_latch:
154; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
155; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
156; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
157; EPILOG-BLOCK:       loop_exiting_bb1.1:
158; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
159; EPILOG-BLOCK:       loop_exiting_bb2.1:
160; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
161; EPILOG-BLOCK:       loop_latch.1:
162; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
163; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
164; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
165; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !0
166; EPILOG-BLOCK:       exit1.loopexit:
167; EPILOG-BLOCK-NEXT:    br label %exit1
168; EPILOG-BLOCK:       exit1:
169; EPILOG-BLOCK-NEXT:    ret void
170; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa.loopexit:
171; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit.unr-lcssa
172; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa:
173; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
174; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
175; EPILOG-BLOCK:       loop_header.epil.preheader:
176; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
177; EPILOG-BLOCK:       loop_header.epil:
178; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil
179; EPILOG-BLOCK:       loop_exiting_bb1.epil:
180; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.epil, label %exit1
181; EPILOG-BLOCK:       loop_exiting_bb2.epil:
182; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch.epil, label %exit3
183; EPILOG-BLOCK:       loop_latch.epil:
184; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit
185; EPILOG-BLOCK:       exit2.loopexit:
186; EPILOG-BLOCK-NEXT:    ret void
187;
188; PROLOG-LABEL: @test1(
189; PROLOG-NEXT:  entry:
190; PROLOG-NEXT:    %0 = freeze i64 %trip
191; PROLOG-NEXT:    %1 = add i64 %0, -1
192; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
193; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
194; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
195; PROLOG:       loop_header.prol.preheader:
196; PROLOG-NEXT:    br label %loop_header.prol
197; PROLOG:       loop_header.prol:
198; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
199; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
200; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol
201; PROLOG:       loop_exiting_bb1.prol:
202; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.prol, label %exit1.loopexit1
203; PROLOG:       loop_exiting_bb2.prol:
204; PROLOG-NEXT:    br i1 false, label %loop_latch.prol, label %exit3.loopexit2
205; PROLOG:       loop_latch.prol:
206; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
207; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
208; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
209; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
210; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !0
211; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
212; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
213; PROLOG-NEXT:    br label %loop_header.prol.loopexit
214; PROLOG:       loop_header.prol.loopexit:
215; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
216; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
217; PROLOG-NEXT:    br i1 %2, label %exit2.loopexit, label %entry.new
218; PROLOG:       entry.new:
219; PROLOG-NEXT:    br label %loop_header
220; PROLOG:       loop_header:
221; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
222; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
223; PROLOG:       loop_exiting_bb1:
224; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
225; PROLOG:       loop_exiting_bb2:
226; PROLOG-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
227; PROLOG:       exit3.loopexit:
228; PROLOG-NEXT:    br label %exit3
229; PROLOG:       exit3.loopexit2:
230; PROLOG-NEXT:    br label %exit3
231; PROLOG:       exit3:
232; PROLOG-NEXT:    ret void
233; PROLOG:       loop_latch:
234; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
235; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
236; PROLOG:       loop_exiting_bb1.1:
237; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
238; PROLOG:       loop_exiting_bb2.1:
239; PROLOG-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
240; PROLOG:       loop_latch.1:
241; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
242; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2
243; PROLOG:       loop_exiting_bb1.2:
244; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit
245; PROLOG:       loop_exiting_bb2.2:
246; PROLOG-NEXT:    br i1 false, label %loop_latch.2, label %exit3.loopexit
247; PROLOG:       loop_latch.2:
248; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
249; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3
250; PROLOG:       loop_exiting_bb1.3:
251; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit
252; PROLOG:       loop_exiting_bb2.3:
253; PROLOG-NEXT:    br i1 false, label %loop_latch.3, label %exit3.loopexit
254; PROLOG:       loop_latch.3:
255; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
256; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4
257; PROLOG:       loop_exiting_bb1.4:
258; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit
259; PROLOG:       loop_exiting_bb2.4:
260; PROLOG-NEXT:    br i1 false, label %loop_latch.4, label %exit3.loopexit
261; PROLOG:       loop_latch.4:
262; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
263; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5
264; PROLOG:       loop_exiting_bb1.5:
265; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit
266; PROLOG:       loop_exiting_bb2.5:
267; PROLOG-NEXT:    br i1 false, label %loop_latch.5, label %exit3.loopexit
268; PROLOG:       loop_latch.5:
269; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
270; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6
271; PROLOG:       loop_exiting_bb1.6:
272; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit
273; PROLOG:       loop_exiting_bb2.6:
274; PROLOG-NEXT:    br i1 false, label %loop_latch.6, label %exit3.loopexit
275; PROLOG:       loop_latch.6:
276; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
277; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7
278; PROLOG:       loop_exiting_bb1.7:
279; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit
280; PROLOG:       loop_exiting_bb2.7:
281; PROLOG-NEXT:    br i1 false, label %loop_latch.7, label %exit3.loopexit
282; PROLOG:       loop_latch.7:
283; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
284; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
285; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa
286; PROLOG:       exit1.loopexit:
287; PROLOG-NEXT:    br label %exit1
288; PROLOG:       exit1.loopexit1:
289; PROLOG-NEXT:    br label %exit1
290; PROLOG:       exit1:
291; PROLOG-NEXT:    ret void
292; PROLOG:       exit2.loopexit.unr-lcssa:
293; PROLOG-NEXT:    br label %exit2.loopexit
294; PROLOG:       exit2.loopexit:
295; PROLOG-NEXT:    ret void
296;
297; PROLOG-BLOCK-LABEL: @test1(
298; PROLOG-BLOCK-NEXT:  entry:
299; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
300; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
301; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
302; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
303; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
304; PROLOG-BLOCK:       loop_header.prol.preheader:
305; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
306; PROLOG-BLOCK:       loop_header.prol:
307; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol
308; PROLOG-BLOCK:       loop_exiting_bb1.prol:
309; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.prol, label %exit1
310; PROLOG-BLOCK:       loop_exiting_bb2.prol:
311; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch.prol, label %exit3
312; PROLOG-BLOCK:       loop_latch.prol:
313; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
314; PROLOG-BLOCK:       loop_header.prol.loopexit:
315; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
316; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
317; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit2.loopexit, label %entry.new
318; PROLOG-BLOCK:       entry.new:
319; PROLOG-BLOCK-NEXT:    br label %loop_header
320; PROLOG-BLOCK:       loop_header:
321; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
322; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
323; PROLOG-BLOCK:       loop_exiting_bb1:
324; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
325; PROLOG-BLOCK:       loop_exiting_bb2:
326; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
327; PROLOG-BLOCK:       exit3.loopexit:
328; PROLOG-BLOCK-NEXT:    br label %exit3
329; PROLOG-BLOCK:       exit3:
330; PROLOG-BLOCK-NEXT:    ret void
331; PROLOG-BLOCK:       loop_latch:
332; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
333; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
334; PROLOG-BLOCK:       loop_exiting_bb1.1:
335; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
336; PROLOG-BLOCK:       loop_exiting_bb2.1:
337; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
338; PROLOG-BLOCK:       loop_latch.1:
339; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
340; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
341; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !0
342; PROLOG-BLOCK:       exit1.loopexit:
343; PROLOG-BLOCK-NEXT:    br label %exit1
344; PROLOG-BLOCK:       exit1:
345; PROLOG-BLOCK-NEXT:    ret void
346; PROLOG-BLOCK:       exit2.loopexit.unr-lcssa:
347; PROLOG-BLOCK-NEXT:    br label %exit2.loopexit
348; PROLOG-BLOCK:       exit2.loopexit:
349; PROLOG-BLOCK-NEXT:    ret void
350;
351
352entry:
353  br label %loop_header
354
355loop_header:
356  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
357  br i1 %cond, label %loop_latch, label %loop_exiting_bb1
358
359loop_exiting_bb1:
360  br i1 false, label %loop_exiting_bb2, label %exit1
361
362loop_exiting_bb2:
363  br i1 false, label %loop_latch, label %exit3
364
365exit3:
366  ret void
367
368loop_latch:
369  %iv_next = add i64 %iv, 1
370  %cmp = icmp ne i64 %iv_next, %trip
371  br i1 %cmp, label %loop_header, label %exit2.loopexit
372
373exit1:
374  ret void
375
376exit2.loopexit:
377  ret void
378}
379
380
381; test with three exiting and two exit blocks.
382; The non-latch exit block has 2 unique predecessors.
383; There are 2 values passed to the exit blocks that are calculated at every iteration.
384; %sum.02 and %add. Both of these are incoming values for phi from every exiting
385; unrolled block.
386define i32 @test2(i32* nocapture %a, i64 %n) {
387; EPILOG-LABEL: @test2(
388; EPILOG-NEXT:  entry:
389; EPILOG-NEXT:    %0 = freeze i64 %n
390; EPILOG-NEXT:    %1 = add i64 %0, -1
391; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
392; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
393; EPILOG-NEXT:    br i1 %2, label %for.end.unr-lcssa, label %entry.new
394; EPILOG:       entry.new:
395; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
396; EPILOG-NEXT:    br label %header
397; EPILOG:       header:
398; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ]
399; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %for.body.7 ]
400; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %for.body.7 ]
401; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
402; EPILOG:       for.exiting_block:
403; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
404; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
405; EPILOG:       for.body:
406; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
407; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
408; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.02
409; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
410; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
411; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
412; EPILOG:       for.exiting_block.1:
413; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
414; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
415; EPILOG:       for.body.1:
416; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
417; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
418; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
419; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
420; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
421; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
422; EPILOG:       for.exiting_block.2:
423; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
424; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2
425; EPILOG:       for.body.2:
426; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
427; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
428; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
429; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
430; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
431; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
432; EPILOG:       for.exiting_block.3:
433; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
434; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3
435; EPILOG:       for.body.3:
436; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
437; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
438; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
439; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
440; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
441; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
442; EPILOG:       for.exiting_block.4:
443; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
444; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4
445; EPILOG:       for.body.4:
446; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
447; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
448; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
449; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
450; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
451; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
452; EPILOG:       for.exiting_block.5:
453; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
454; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5
455; EPILOG:       for.body.5:
456; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
457; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
458; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
459; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
460; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
461; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
462; EPILOG:       for.exiting_block.6:
463; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
464; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6
465; EPILOG:       for.body.6:
466; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
467; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
468; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
469; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
470; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
471; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
472; EPILOG:       for.exiting_block.7:
473; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
474; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7
475; EPILOG:       for.body.7:
476; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
477; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
478; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
479; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
480; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
481; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
482; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %for.end.unr-lcssa.loopexit, label %header
483; EPILOG:       for.end.unr-lcssa.loopexit:
484; EPILOG-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %for.body.7 ]
485; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %for.body.7 ]
486; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %for.body.7 ]
487; EPILOG-NEXT:    br label %for.end.unr-lcssa
488; EPILOG:       for.end.unr-lcssa:
489; EPILOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ]
490; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ]
491; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ]
492; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
493; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %for.end
494; EPILOG:       header.epil.preheader:
495; EPILOG-NEXT:    br label %header.epil
496; EPILOG:       header.epil:
497; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %for.body.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
498; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %for.body.epil ], [ %sum.02.unr, %header.epil.preheader ]
499; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %for.body.epil ]
500; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil
501; EPILOG:       for.exiting_block.epil:
502; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
503; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit2, label %for.body.epil
504; EPILOG:       for.body.epil:
505; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
506; EPILOG-NEXT:    %11 = load i32, i32* %arrayidx.epil, align 4
507; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil
508; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
509; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
510; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
511; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
512; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %for.end.epilog-lcssa, !llvm.loop !2
513; EPILOG:       for.end.epilog-lcssa:
514; EPILOG-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %for.body.epil ]
515; EPILOG-NEXT:    br label %for.end
516; EPILOG:       for.end:
517; EPILOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %sum.0.lcssa.ph1, %for.end.epilog-lcssa ]
518; EPILOG-NEXT:    ret i32 %sum.0.lcssa
519; EPILOG:       for.exit2.loopexit:
520; 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 ]
521; EPILOG-NEXT:    br label %for.exit2
522; EPILOG:       for.exit2.loopexit2:
523; EPILOG-NEXT:    %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
524; EPILOG-NEXT:    br label %for.exit2
525; EPILOG:       for.exit2:
526; EPILOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
527; EPILOG-NEXT:    ret i32 %retval
528;
529; EPILOG-BLOCK-LABEL: @test2(
530; EPILOG-BLOCK-NEXT:  entry:
531; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n
532; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
533; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
534; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
535; EPILOG-BLOCK-NEXT:    br i1 %2, label %for.end.unr-lcssa, label %entry.new
536; EPILOG-BLOCK:       entry.new:
537; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
538; EPILOG-BLOCK-NEXT:    br label %header
539; EPILOG-BLOCK:       header:
540; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ]
541; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %for.body.1 ]
542; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %for.body.1 ]
543; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
544; EPILOG-BLOCK:       for.exiting_block:
545; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
546; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
547; EPILOG-BLOCK:       for.body:
548; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
549; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
550; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
551; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
552; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
553; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
554; EPILOG-BLOCK:       for.exiting_block.1:
555; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
556; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
557; EPILOG-BLOCK:       for.body.1:
558; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
559; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
560; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
561; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
562; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
563; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
564; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %for.end.unr-lcssa.loopexit, label %header, !llvm.loop !2
565; EPILOG-BLOCK:       for.end.unr-lcssa.loopexit:
566; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %for.body.1 ]
567; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %for.body.1 ]
568; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %for.body.1 ]
569; EPILOG-BLOCK-NEXT:    br label %for.end.unr-lcssa
570; EPILOG-BLOCK:       for.end.unr-lcssa:
571; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ]
572; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ]
573; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ]
574; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
575; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %for.end
576; EPILOG-BLOCK:       header.epil.preheader:
577; EPILOG-BLOCK-NEXT:    br label %header.epil
578; EPILOG-BLOCK:       header.epil:
579; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.epil
580; EPILOG-BLOCK:       for.exiting_block.epil:
581; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
582; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %for.body.epil
583; EPILOG-BLOCK:       for.body.epil:
584; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
585; EPILOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.epil, align 4
586; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.unr
587; EPILOG-BLOCK-NEXT:    br label %for.end
588; EPILOG-BLOCK:       for.end:
589; EPILOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %add.epil, %for.body.epil ]
590; EPILOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
591; EPILOG-BLOCK:       for.exit2.loopexit:
592; EPILOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ]
593; EPILOG-BLOCK-NEXT:    br label %for.exit2
594; EPILOG-BLOCK:       for.exit2:
595; EPILOG-BLOCK-NEXT:    %retval = phi i32 [ %sum.02.unr, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ]
596; EPILOG-BLOCK-NEXT:    ret i32 %retval
597;
598; PROLOG-LABEL: @test2(
599; PROLOG-NEXT:  entry:
600; PROLOG-NEXT:    %0 = freeze i64 %n
601; PROLOG-NEXT:    %1 = add i64 %0, -1
602; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
603; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
604; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
605; PROLOG:       header.prol.preheader:
606; PROLOG-NEXT:    br label %header.prol
607; PROLOG:       header.prol:
608; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %for.body.prol ], [ 0, %header.prol.preheader ]
609; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %for.body.prol ], [ 0, %header.prol.preheader ]
610; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %for.body.prol ]
611; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol
612; PROLOG:       for.exiting_block.prol:
613; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
614; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit1, label %for.body.prol
615; PROLOG:       for.body.prol:
616; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
617; PROLOG-NEXT:    %2 = load i32, i32* %arrayidx.prol, align 4
618; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol
619; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
620; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
621; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
622; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
623; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !2
624; PROLOG:       header.prol.loopexit.unr-lcssa:
625; PROLOG-NEXT:    %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %for.body.prol ]
626; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %for.body.prol ]
627; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %for.body.prol ]
628; PROLOG-NEXT:    br label %header.prol.loopexit
629; PROLOG:       header.prol.loopexit:
630; PROLOG-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ]
631; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
632; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
633; PROLOG-NEXT:    %3 = icmp ult i64 %1, 7
634; PROLOG-NEXT:    br i1 %3, label %for.end, label %entry.new
635; PROLOG:       entry.new:
636; PROLOG-NEXT:    br label %header
637; PROLOG:       header:
638; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ]
639; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %for.body.7 ]
640; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
641; PROLOG:       for.exiting_block:
642; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
643; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
644; PROLOG:       for.body:
645; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
646; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx, align 4
647; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.02
648; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
649; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
650; PROLOG:       for.exiting_block.1:
651; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
652; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
653; PROLOG:       for.body.1:
654; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
655; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
656; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add
657; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
658; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
659; PROLOG:       for.exiting_block.2:
660; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
661; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2
662; PROLOG:       for.body.2:
663; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
664; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.2, align 4
665; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.1
666; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
667; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
668; PROLOG:       for.exiting_block.3:
669; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
670; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3
671; PROLOG:       for.body.3:
672; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
673; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.3, align 4
674; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.2
675; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
676; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
677; PROLOG:       for.exiting_block.4:
678; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
679; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4
680; PROLOG:       for.body.4:
681; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
682; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.4, align 4
683; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.3
684; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
685; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
686; PROLOG:       for.exiting_block.5:
687; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
688; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5
689; PROLOG:       for.body.5:
690; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
691; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.5, align 4
692; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.4
693; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
694; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
695; PROLOG:       for.exiting_block.6:
696; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
697; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6
698; PROLOG:       for.body.6:
699; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
700; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.6, align 4
701; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.5
702; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
703; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
704; PROLOG:       for.exiting_block.7:
705; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
706; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7
707; PROLOG:       for.body.7:
708; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
709; PROLOG-NEXT:    %11 = load i32, i32* %arrayidx.7, align 4
710; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.6
711; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
712; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
713; PROLOG-NEXT:    br i1 %exitcond.7, label %for.end.unr-lcssa, label %header
714; PROLOG:       for.end.unr-lcssa:
715; PROLOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %for.body.7 ]
716; PROLOG-NEXT:    br label %for.end
717; PROLOG:       for.end:
718; PROLOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ]
719; PROLOG-NEXT:    ret i32 %sum.0.lcssa
720; PROLOG:       for.exit2.loopexit:
721; 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 ]
722; PROLOG-NEXT:    br label %for.exit2
723; PROLOG:       for.exit2.loopexit1:
724; PROLOG-NEXT:    %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
725; PROLOG-NEXT:    br label %for.exit2
726; PROLOG:       for.exit2:
727; PROLOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
728; PROLOG-NEXT:    ret i32 %retval
729;
730; PROLOG-BLOCK-LABEL: @test2(
731; PROLOG-BLOCK-NEXT:  entry:
732; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n
733; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
734; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
735; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
736; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
737; PROLOG-BLOCK:       header.prol.preheader:
738; PROLOG-BLOCK-NEXT:    br label %header.prol
739; PROLOG-BLOCK:       header.prol:
740; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.prol
741; PROLOG-BLOCK:       for.exiting_block.prol:
742; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
743; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %for.body.prol
744; PROLOG-BLOCK:       for.body.prol:
745; PROLOG-BLOCK-NEXT:    %2 = load i32, i32* %a, align 4
746; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
747; PROLOG-BLOCK:       header.prol.loopexit:
748; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %2, %for.body.prol ]
749; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %for.body.prol ]
750; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %for.body.prol ]
751; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 1
752; PROLOG-BLOCK-NEXT:    br i1 %3, label %for.end, label %entry.new
753; PROLOG-BLOCK:       entry.new:
754; PROLOG-BLOCK-NEXT:    br label %header
755; PROLOG-BLOCK:       header:
756; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ]
757; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %for.body.1 ]
758; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
759; PROLOG-BLOCK:       for.exiting_block:
760; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
761; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
762; PROLOG-BLOCK:       for.body:
763; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
764; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx, align 4
765; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.02
766; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
767; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
768; PROLOG-BLOCK:       for.exiting_block.1:
769; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
770; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
771; PROLOG-BLOCK:       for.body.1:
772; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
773; PROLOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
774; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add
775; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
776; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
777; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %for.end.unr-lcssa, label %header, !llvm.loop !2
778; PROLOG-BLOCK:       for.end.unr-lcssa:
779; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %for.body.1 ]
780; PROLOG-BLOCK-NEXT:    br label %for.end
781; PROLOG-BLOCK:       for.end:
782; PROLOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ]
783; PROLOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
784; PROLOG-BLOCK:       for.exit2.loopexit:
785; PROLOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ]
786; PROLOG-BLOCK-NEXT:    br label %for.exit2
787; PROLOG-BLOCK:       for.exit2:
788; PROLOG-BLOCK-NEXT:    %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ]
789; PROLOG-BLOCK-NEXT:    ret i32 %retval
790;
791
792
793entry:
794  br label %header
795
796header:
797  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
798  %sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ]
799  br i1 false, label %for.exit2, label %for.exiting_block
800
801for.exiting_block:
802  %cmp = icmp eq i64 %n, 42
803  br i1 %cmp, label %for.exit2, label %for.body
804
805for.body:
806  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
807  %0 = load i32, i32* %arrayidx, align 4
808  %add = add nsw i32 %0, %sum.02
809  %indvars.iv.next = add i64 %indvars.iv, 1
810  %exitcond = icmp eq i64 %indvars.iv.next, %n
811  br i1 %exitcond, label %for.end, label %header
812
813for.end:                                          ; preds = %for.body
814  %sum.0.lcssa = phi i32 [ %add, %for.body ]
815  ret i32 %sum.0.lcssa
816
817for.exit2:
818  %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ]
819  ret i32 %retval
820}
821
822; test with two exiting and three exit blocks.
823; the non-latch exiting block has a switch.
824define void @test3(i64 %trip, i64 %add) {
825; EPILOG-LABEL: @test3(
826; EPILOG-NEXT:  entry:
827; EPILOG-NEXT:    %0 = freeze i64 %trip
828; EPILOG-NEXT:    %1 = add i64 %0, -1
829; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
830; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
831; EPILOG-NEXT:    br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new
832; EPILOG:       entry.new:
833; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
834; EPILOG-NEXT:    br label %loop_header
835; EPILOG:       loop_header:
836; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
837; EPILOG-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
838; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
839; EPILOG-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
840; EPILOG:       loop_exiting_bb1:
841; EPILOG-NEXT:    switch i64 %sum, label %loop_latch [
842; EPILOG-NEXT:    i64 24, label %exit1.loopexit
843; EPILOG-NEXT:    i64 42, label %exit3.loopexit
844; EPILOG-NEXT:    ]
845; EPILOG:       exit3.loopexit:
846; EPILOG-NEXT:    br label %exit3
847; EPILOG:       exit3.loopexit2:
848; EPILOG-NEXT:    br label %exit3
849; EPILOG:       exit3:
850; EPILOG-NEXT:    ret void
851; EPILOG:       loop_latch:
852; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
853; EPILOG-NEXT:    %sum.next = add i64 %sum, %add
854; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
855; EPILOG-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
856; EPILOG:       loop_exiting_bb1.1:
857; EPILOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
858; EPILOG-NEXT:    i64 24, label %exit1.loopexit
859; EPILOG-NEXT:    i64 42, label %exit3.loopexit
860; EPILOG-NEXT:    ]
861; EPILOG:       loop_latch.1:
862; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
863; EPILOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
864; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
865; EPILOG-NEXT:    br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2
866; EPILOG:       loop_exiting_bb1.2:
867; EPILOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
868; EPILOG-NEXT:    i64 24, label %exit1.loopexit
869; EPILOG-NEXT:    i64 42, label %exit3.loopexit
870; EPILOG-NEXT:    ]
871; EPILOG:       loop_latch.2:
872; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
873; EPILOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
874; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
875; EPILOG-NEXT:    br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3
876; EPILOG:       loop_exiting_bb1.3:
877; EPILOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
878; EPILOG-NEXT:    i64 24, label %exit1.loopexit
879; EPILOG-NEXT:    i64 42, label %exit3.loopexit
880; EPILOG-NEXT:    ]
881; EPILOG:       loop_latch.3:
882; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
883; EPILOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
884; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
885; EPILOG-NEXT:    br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4
886; EPILOG:       loop_exiting_bb1.4:
887; EPILOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
888; EPILOG-NEXT:    i64 24, label %exit1.loopexit
889; EPILOG-NEXT:    i64 42, label %exit3.loopexit
890; EPILOG-NEXT:    ]
891; EPILOG:       loop_latch.4:
892; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
893; EPILOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
894; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
895; EPILOG-NEXT:    br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5
896; EPILOG:       loop_exiting_bb1.5:
897; EPILOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
898; EPILOG-NEXT:    i64 24, label %exit1.loopexit
899; EPILOG-NEXT:    i64 42, label %exit3.loopexit
900; EPILOG-NEXT:    ]
901; EPILOG:       loop_latch.5:
902; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
903; EPILOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
904; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
905; EPILOG-NEXT:    br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6
906; EPILOG:       loop_exiting_bb1.6:
907; EPILOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
908; EPILOG-NEXT:    i64 24, label %exit1.loopexit
909; EPILOG-NEXT:    i64 42, label %exit3.loopexit
910; EPILOG-NEXT:    ]
911; EPILOG:       loop_latch.6:
912; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
913; EPILOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
914; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
915; EPILOG-NEXT:    br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7
916; EPILOG:       loop_exiting_bb1.7:
917; EPILOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
918; EPILOG-NEXT:    i64 24, label %exit1.loopexit
919; EPILOG-NEXT:    i64 42, label %exit3.loopexit
920; EPILOG-NEXT:    ]
921; EPILOG:       loop_latch.7:
922; EPILOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
923; EPILOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
924; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
925; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
926; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit
927; EPILOG:       exit1.loopexit:
928; EPILOG-NEXT:    br label %exit1
929; EPILOG:       exit1.loopexit1:
930; EPILOG-NEXT:    br label %exit1
931; EPILOG:       exit1:
932; EPILOG-NEXT:    ret void
933; EPILOG:       exit2.loopexit.unr-lcssa.loopexit:
934; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
935; EPILOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
936; EPILOG-NEXT:    br label %exit2.loopexit.unr-lcssa
937; EPILOG:       exit2.loopexit.unr-lcssa:
938; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
939; EPILOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
940; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
941; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
942; EPILOG:       loop_header.epil.preheader:
943; EPILOG-NEXT:    br label %loop_header.epil
944; EPILOG:       loop_header.epil:
945; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
946; EPILOG-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]
947; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
948; EPILOG-NEXT:    br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil
949; EPILOG:       loop_exiting_bb1.epil:
950; EPILOG-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
951; EPILOG-NEXT:    i64 24, label %exit1.loopexit1
952; EPILOG-NEXT:    i64 42, label %exit3.loopexit2
953; EPILOG-NEXT:    ]
954; EPILOG:       loop_latch.epil:
955; EPILOG-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
956; EPILOG-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
957; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
958; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
959; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
960; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !3
961; EPILOG:       exit2.loopexit.epilog-lcssa:
962; EPILOG-NEXT:    br label %exit2.loopexit
963; EPILOG:       exit2.loopexit:
964; EPILOG-NEXT:    ret void
965;
966; EPILOG-BLOCK-LABEL: @test3(
967; EPILOG-BLOCK-NEXT:  entry:
968; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
969; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
970; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
971; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
972; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new
973; EPILOG-BLOCK:       entry.new:
974; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
975; EPILOG-BLOCK-NEXT:    br label %loop_header
976; EPILOG-BLOCK:       loop_header:
977; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
978; EPILOG-BLOCK-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
979; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
980; EPILOG-BLOCK-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
981; EPILOG-BLOCK:       loop_exiting_bb1:
982; EPILOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
983; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
984; EPILOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
985; EPILOG-BLOCK-NEXT:    ]
986; EPILOG-BLOCK:       exit3.loopexit:
987; EPILOG-BLOCK-NEXT:    br label %exit3
988; EPILOG-BLOCK:       exit3:
989; EPILOG-BLOCK-NEXT:    ret void
990; EPILOG-BLOCK:       loop_latch:
991; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
992; EPILOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
993; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
994; EPILOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
995; EPILOG-BLOCK:       loop_exiting_bb1.1:
996; EPILOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
997; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
998; EPILOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
999; EPILOG-BLOCK-NEXT:    ]
1000; EPILOG-BLOCK:       loop_latch.1:
1001; EPILOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
1002; EPILOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
1003; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
1004; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
1005; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !3
1006; EPILOG-BLOCK:       exit1.loopexit:
1007; EPILOG-BLOCK-NEXT:    br label %exit1
1008; EPILOG-BLOCK:       exit1:
1009; EPILOG-BLOCK-NEXT:    ret void
1010; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa.loopexit:
1011; EPILOG-BLOCK-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
1012; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit.unr-lcssa
1013; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa:
1014; EPILOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
1015; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1016; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
1017; EPILOG-BLOCK:       loop_header.epil.preheader:
1018; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
1019; EPILOG-BLOCK:       loop_header.epil:
1020; EPILOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil
1021; EPILOG-BLOCK:       loop_exiting_bb1.epil:
1022; EPILOG-BLOCK-NEXT:    switch i64 %sum.unr, label %loop_latch.epil [
1023; EPILOG-BLOCK-NEXT:    i64 24, label %exit1
1024; EPILOG-BLOCK-NEXT:    i64 42, label %exit3
1025; EPILOG-BLOCK-NEXT:    ]
1026; EPILOG-BLOCK:       loop_latch.epil:
1027; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit
1028; EPILOG-BLOCK:       exit2.loopexit:
1029; EPILOG-BLOCK-NEXT:    ret void
1030;
1031; PROLOG-LABEL: @test3(
1032; PROLOG-NEXT:  entry:
1033; PROLOG-NEXT:    %0 = freeze i64 %trip
1034; PROLOG-NEXT:    %1 = add i64 %0, -1
1035; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
1036; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1037; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
1038; PROLOG:       loop_header.prol.preheader:
1039; PROLOG-NEXT:    br label %loop_header.prol
1040; PROLOG:       loop_header.prol:
1041; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
1042; PROLOG-NEXT:    %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ]
1043; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
1044; PROLOG-NEXT:    br i1 undef, label %loop_latch.prol, label %loop_exiting_bb1.prol
1045; PROLOG:       loop_exiting_bb1.prol:
1046; PROLOG-NEXT:    switch i64 %sum.prol, label %loop_latch.prol [
1047; PROLOG-NEXT:    i64 24, label %exit1.loopexit1
1048; PROLOG-NEXT:    i64 42, label %exit3.loopexit2
1049; PROLOG-NEXT:    ]
1050; PROLOG:       loop_latch.prol:
1051; PROLOG-NEXT:    %iv_next.prol = add nuw nsw i64 %iv.prol, 1
1052; PROLOG-NEXT:    %sum.next.prol = add i64 %sum.prol, %add
1053; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
1054; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
1055; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
1056; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !3
1057; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
1058; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
1059; PROLOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
1060; PROLOG-NEXT:    br label %loop_header.prol.loopexit
1061; PROLOG:       loop_header.prol.loopexit:
1062; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
1063; PROLOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
1064; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
1065; PROLOG-NEXT:    br i1 %2, label %exit2.loopexit, label %entry.new
1066; PROLOG:       entry.new:
1067; PROLOG-NEXT:    br label %loop_header
1068; PROLOG:       loop_header:
1069; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
1070; PROLOG-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
1071; PROLOG-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
1072; PROLOG:       loop_exiting_bb1:
1073; PROLOG-NEXT:    switch i64 %sum, label %loop_latch [
1074; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1075; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1076; PROLOG-NEXT:    ]
1077; PROLOG:       exit3.loopexit:
1078; PROLOG-NEXT:    br label %exit3
1079; PROLOG:       exit3.loopexit2:
1080; PROLOG-NEXT:    br label %exit3
1081; PROLOG:       exit3:
1082; PROLOG-NEXT:    ret void
1083; PROLOG:       loop_latch:
1084; PROLOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
1085; PROLOG-NEXT:    %sum.next = add i64 %sum, %add
1086; PROLOG-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
1087; PROLOG:       loop_exiting_bb1.1:
1088; PROLOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
1089; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1090; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1091; PROLOG-NEXT:    ]
1092; PROLOG:       loop_latch.1:
1093; PROLOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
1094; PROLOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
1095; PROLOG-NEXT:    br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2
1096; PROLOG:       loop_exiting_bb1.2:
1097; PROLOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
1098; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1099; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1100; PROLOG-NEXT:    ]
1101; PROLOG:       loop_latch.2:
1102; PROLOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
1103; PROLOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
1104; PROLOG-NEXT:    br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3
1105; PROLOG:       loop_exiting_bb1.3:
1106; PROLOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
1107; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1108; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1109; PROLOG-NEXT:    ]
1110; PROLOG:       loop_latch.3:
1111; PROLOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
1112; PROLOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
1113; PROLOG-NEXT:    br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4
1114; PROLOG:       loop_exiting_bb1.4:
1115; PROLOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
1116; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1117; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1118; PROLOG-NEXT:    ]
1119; PROLOG:       loop_latch.4:
1120; PROLOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
1121; PROLOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
1122; PROLOG-NEXT:    br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5
1123; PROLOG:       loop_exiting_bb1.5:
1124; PROLOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
1125; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1126; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1127; PROLOG-NEXT:    ]
1128; PROLOG:       loop_latch.5:
1129; PROLOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
1130; PROLOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
1131; PROLOG-NEXT:    br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6
1132; PROLOG:       loop_exiting_bb1.6:
1133; PROLOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
1134; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1135; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1136; PROLOG-NEXT:    ]
1137; PROLOG:       loop_latch.6:
1138; PROLOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
1139; PROLOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
1140; PROLOG-NEXT:    br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7
1141; PROLOG:       loop_exiting_bb1.7:
1142; PROLOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
1143; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1144; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1145; PROLOG-NEXT:    ]
1146; PROLOG:       loop_latch.7:
1147; PROLOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
1148; PROLOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
1149; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
1150; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa
1151; PROLOG:       exit1.loopexit:
1152; PROLOG-NEXT:    br label %exit1
1153; PROLOG:       exit1.loopexit1:
1154; PROLOG-NEXT:    br label %exit1
1155; PROLOG:       exit1:
1156; PROLOG-NEXT:    ret void
1157; PROLOG:       exit2.loopexit.unr-lcssa:
1158; PROLOG-NEXT:    br label %exit2.loopexit
1159; PROLOG:       exit2.loopexit:
1160; PROLOG-NEXT:    ret void
1161;
1162; PROLOG-BLOCK-LABEL: @test3(
1163; PROLOG-BLOCK-NEXT:  entry:
1164; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
1165; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
1166; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
1167; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1168; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
1169; PROLOG-BLOCK:       loop_header.prol.preheader:
1170; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
1171; PROLOG-BLOCK:       loop_header.prol:
1172; PROLOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.prol, label %loop_exiting_bb1.prol
1173; PROLOG-BLOCK:       loop_exiting_bb1.prol:
1174; PROLOG-BLOCK-NEXT:    switch i64 0, label %loop_latch.prol [
1175; PROLOG-BLOCK-NEXT:    i64 24, label %exit1
1176; PROLOG-BLOCK-NEXT:    i64 42, label %exit3
1177; PROLOG-BLOCK-NEXT:    ]
1178; PROLOG-BLOCK:       loop_latch.prol:
1179; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
1180; PROLOG-BLOCK:       loop_header.prol.loopexit:
1181; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
1182; PROLOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %add, %loop_latch.prol ]
1183; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
1184; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit2.loopexit, label %entry.new
1185; PROLOG-BLOCK:       entry.new:
1186; PROLOG-BLOCK-NEXT:    br label %loop_header
1187; PROLOG-BLOCK:       loop_header:
1188; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
1189; PROLOG-BLOCK-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
1190; PROLOG-BLOCK-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
1191; PROLOG-BLOCK:       loop_exiting_bb1:
1192; PROLOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
1193; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
1194; PROLOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
1195; PROLOG-BLOCK-NEXT:    ]
1196; PROLOG-BLOCK:       exit3.loopexit:
1197; PROLOG-BLOCK-NEXT:    br label %exit3
1198; PROLOG-BLOCK:       exit3:
1199; PROLOG-BLOCK-NEXT:    ret void
1200; PROLOG-BLOCK:       loop_latch:
1201; PROLOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
1202; PROLOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
1203; PROLOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
1204; PROLOG-BLOCK:       loop_exiting_bb1.1:
1205; PROLOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
1206; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
1207; PROLOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
1208; PROLOG-BLOCK-NEXT:    ]
1209; PROLOG-BLOCK:       loop_latch.1:
1210; PROLOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
1211; PROLOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
1212; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
1213; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !3
1214; PROLOG-BLOCK:       exit1.loopexit:
1215; PROLOG-BLOCK-NEXT:    br label %exit1
1216; PROLOG-BLOCK:       exit1:
1217; PROLOG-BLOCK-NEXT:    ret void
1218; PROLOG-BLOCK:       exit2.loopexit.unr-lcssa:
1219; PROLOG-BLOCK-NEXT:    br label %exit2.loopexit
1220; PROLOG-BLOCK:       exit2.loopexit:
1221; PROLOG-BLOCK-NEXT:    ret void
1222;
1223
1224entry:
1225  br label %loop_header
1226
1227loop_header:
1228  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
1229  %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ]
1230  br i1 undef, label %loop_latch, label %loop_exiting_bb1
1231
1232loop_exiting_bb1:
1233  switch i64 %sum, label %loop_latch [
1234  i64 24, label %exit1
1235  i64 42, label %exit3
1236  ]
1237
1238exit3:
1239  ret void
1240
1241loop_latch:
1242  %iv_next = add nuw nsw i64 %iv, 1
1243  %sum.next = add i64 %sum, %add
1244  %cmp = icmp ne i64 %iv_next, %trip
1245  br i1 %cmp, label %loop_header, label %exit2.loopexit
1246
1247exit1:
1248  ret void
1249
1250exit2.loopexit:
1251  ret void
1252}
1253
1254; FIXME: Support multiple exiting blocks to the same latch exit block.
1255; Three exiting blocks where header and latch exit to same LatchExit.
1256define i32 @hdr_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) {
1257; EPILOG-LABEL: @hdr_latch_same_exit(
1258; EPILOG-NEXT:  entry:
1259; EPILOG-NEXT:    %0 = freeze i64 %n
1260; EPILOG-NEXT:    %1 = add i64 %0, -1
1261; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
1262; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
1263; EPILOG-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
1264; EPILOG:       entry.new:
1265; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
1266; EPILOG-NEXT:    br label %header
1267; EPILOG:       header:
1268; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
1269; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
1270; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
1271; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block
1272; EPILOG:       for.exiting_block:
1273; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
1274; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1275; EPILOG:       latch:
1276; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1277; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
1278; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.02
1279; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1280; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
1281; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.1
1282; EPILOG:       for.exiting_block.1:
1283; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1284; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1285; EPILOG:       latch.1:
1286; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1287; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1288; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
1289; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
1290; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
1291; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.2
1292; EPILOG:       for.exiting_block.2:
1293; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1294; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
1295; EPILOG:       latch.2:
1296; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1297; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
1298; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
1299; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
1300; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
1301; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.3
1302; EPILOG:       for.exiting_block.3:
1303; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1304; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
1305; EPILOG:       latch.3:
1306; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1307; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
1308; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
1309; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
1310; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
1311; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.4
1312; EPILOG:       for.exiting_block.4:
1313; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1314; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
1315; EPILOG:       latch.4:
1316; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
1317; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
1318; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
1319; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
1320; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
1321; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.5
1322; EPILOG:       for.exiting_block.5:
1323; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1324; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
1325; EPILOG:       latch.5:
1326; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
1327; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
1328; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
1329; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
1330; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
1331; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.6
1332; EPILOG:       for.exiting_block.6:
1333; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
1334; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
1335; EPILOG:       latch.6:
1336; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
1337; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
1338; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
1339; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
1340; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
1341; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.7
1342; EPILOG:       for.exiting_block.7:
1343; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
1344; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
1345; EPILOG:       latch.7:
1346; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
1347; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
1348; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
1349; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
1350; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
1351; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
1352; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
1353; EPILOG:       latchExit.unr-lcssa.loopexit:
1354; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
1355; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
1356; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
1357; EPILOG-NEXT:    br label %latchExit.unr-lcssa
1358; EPILOG:       latchExit.unr-lcssa:
1359; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1360; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1361; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1362; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1363; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1364; EPILOG:       header.epil.preheader:
1365; EPILOG-NEXT:    br label %header.epil
1366; EPILOG:       header.epil:
1367; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
1368; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
1369; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
1370; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit2, label %for.exiting_block.epil
1371; EPILOG:       for.exiting_block.epil:
1372; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1373; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit4, label %latch.epil
1374; EPILOG:       latch.epil:
1375; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
1376; EPILOG-NEXT:    %11 = load i32, i32* %arrayidx.epil, align 4
1377; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil
1378; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
1379; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
1380; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
1381; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
1382; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit2, !llvm.loop !4
1383; EPILOG:       latchExit.epilog-lcssa.loopexit:
1384; 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 ]
1385; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1386; EPILOG:       latchExit.epilog-lcssa.loopexit2:
1387; EPILOG-NEXT:    %result.ph1.ph3 = phi i32 [ 0, %header.epil ], [ %add.epil, %latch.epil ]
1388; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1389; EPILOG:       latchExit.epilog-lcssa:
1390; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph3, %latchExit.epilog-lcssa.loopexit2 ]
1391; EPILOG-NEXT:    br label %latchExit
1392; EPILOG:       latchExit:
1393; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1394; EPILOG-NEXT:    ret i32 %result
1395; EPILOG:       for.exit2.loopexit:
1396; EPILOG-NEXT:    br label %for.exit2
1397; EPILOG:       for.exit2.loopexit4:
1398; EPILOG-NEXT:    br label %for.exit2
1399; EPILOG:       for.exit2:
1400; EPILOG-NEXT:    ret i32 42
1401;
1402; EPILOG-BLOCK-LABEL: @hdr_latch_same_exit(
1403; EPILOG-BLOCK-NEXT:  entry:
1404; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n
1405; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
1406; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
1407; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
1408; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
1409; EPILOG-BLOCK:       entry.new:
1410; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
1411; EPILOG-BLOCK-NEXT:    br label %header
1412; EPILOG-BLOCK:       header:
1413; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
1414; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
1415; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
1416; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block
1417; EPILOG-BLOCK:       for.exiting_block:
1418; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
1419; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1420; EPILOG-BLOCK:       latch:
1421; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1422; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
1423; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
1424; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1425; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
1426; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.1
1427; EPILOG-BLOCK:       for.exiting_block.1:
1428; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1429; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1430; EPILOG-BLOCK:       latch.1:
1431; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1432; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1433; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
1434; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1435; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
1436; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
1437; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !4
1438; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
1439; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
1440; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
1441; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
1442; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
1443; EPILOG-BLOCK:       latchExit.unr-lcssa:
1444; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1445; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1446; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1447; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1448; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1449; EPILOG-BLOCK:       header.epil.preheader:
1450; EPILOG-BLOCK-NEXT:    br label %header.epil
1451; EPILOG-BLOCK:       header.epil:
1452; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa, label %for.exiting_block.epil
1453; EPILOG-BLOCK:       for.exiting_block.epil:
1454; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1455; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %latch.epil
1456; EPILOG-BLOCK:       latch.epil:
1457; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
1458; EPILOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.epil, align 4
1459; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.unr
1460; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1461; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
1462; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ 0, %header ], [ 0, %latch ]
1463; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1464; EPILOG-BLOCK:       latchExit.epilog-lcssa:
1465; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 0, %header.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
1466; EPILOG-BLOCK-NEXT:    br label %latchExit
1467; EPILOG-BLOCK:       latchExit:
1468; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1469; EPILOG-BLOCK-NEXT:    ret i32 %result
1470; EPILOG-BLOCK:       for.exit2.loopexit:
1471; EPILOG-BLOCK-NEXT:    br label %for.exit2
1472; EPILOG-BLOCK:       for.exit2:
1473; EPILOG-BLOCK-NEXT:    ret i32 42
1474;
1475; PROLOG-LABEL: @hdr_latch_same_exit(
1476; PROLOG-NEXT:  entry:
1477; PROLOG-NEXT:    %0 = freeze i64 %n
1478; PROLOG-NEXT:    %1 = add i64 %0, -1
1479; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
1480; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1481; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
1482; PROLOG:       header.prol.preheader:
1483; PROLOG-NEXT:    br label %header.prol
1484; PROLOG:       header.prol:
1485; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
1486; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
1487; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
1488; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit1, label %for.exiting_block.prol
1489; PROLOG:       for.exiting_block.prol:
1490; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
1491; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit3, label %latch.prol
1492; PROLOG:       latch.prol:
1493; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
1494; PROLOG-NEXT:    %2 = load i32, i32* %arrayidx.prol, align 4
1495; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol
1496; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
1497; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
1498; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
1499; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
1500; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !4
1501; PROLOG:       header.prol.loopexit.unr-lcssa:
1502; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
1503; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
1504; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
1505; PROLOG-NEXT:    br label %header.prol.loopexit
1506; PROLOG:       header.prol.loopexit:
1507; PROLOG-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
1508; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
1509; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
1510; PROLOG-NEXT:    %3 = icmp ult i64 %1, 7
1511; PROLOG-NEXT:    br i1 %3, label %latchExit, label %entry.new
1512; PROLOG:       entry.new:
1513; PROLOG-NEXT:    br label %header
1514; PROLOG:       header:
1515; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
1516; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
1517; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block
1518; PROLOG:       for.exiting_block:
1519; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
1520; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1521; PROLOG:       latch:
1522; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1523; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx, align 4
1524; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.02
1525; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
1526; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.1
1527; PROLOG:       for.exiting_block.1:
1528; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1529; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1530; PROLOG:       latch.1:
1531; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1532; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
1533; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add
1534; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1535; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.2
1536; PROLOG:       for.exiting_block.2:
1537; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1538; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
1539; PROLOG:       latch.2:
1540; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1541; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.2, align 4
1542; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.1
1543; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
1544; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.3
1545; PROLOG:       for.exiting_block.3:
1546; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1547; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
1548; PROLOG:       latch.3:
1549; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1550; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.3, align 4
1551; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.2
1552; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
1553; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.4
1554; PROLOG:       for.exiting_block.4:
1555; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1556; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
1557; PROLOG:       latch.4:
1558; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
1559; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.4, align 4
1560; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.3
1561; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
1562; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.5
1563; PROLOG:       for.exiting_block.5:
1564; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1565; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
1566; PROLOG:       latch.5:
1567; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
1568; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.5, align 4
1569; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.4
1570; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
1571; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.6
1572; PROLOG:       for.exiting_block.6:
1573; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
1574; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
1575; PROLOG:       latch.6:
1576; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
1577; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.6, align 4
1578; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.5
1579; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
1580; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.7
1581; PROLOG:       for.exiting_block.7:
1582; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
1583; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
1584; PROLOG:       latch.7:
1585; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
1586; PROLOG-NEXT:    %11 = load i32, i32* %arrayidx.7, align 4
1587; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.6
1588; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
1589; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
1590; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
1591; PROLOG:       latchExit.unr-lcssa.loopexit:
1592; 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 ]
1593; PROLOG-NEXT:    br label %latchExit.unr-lcssa
1594; PROLOG:       latchExit.unr-lcssa.loopexit1:
1595; PROLOG-NEXT:    %result.ph.ph2 = phi i32 [ 0, %header.prol ]
1596; PROLOG-NEXT:    br label %latchExit.unr-lcssa
1597; PROLOG:       latchExit.unr-lcssa:
1598; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph2, %latchExit.unr-lcssa.loopexit1 ]
1599; PROLOG-NEXT:    br label %latchExit
1600; PROLOG:       latchExit:
1601; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
1602; PROLOG-NEXT:    ret i32 %result
1603; PROLOG:       for.exit2.loopexit:
1604; PROLOG-NEXT:    br label %for.exit2
1605; PROLOG:       for.exit2.loopexit3:
1606; PROLOG-NEXT:    br label %for.exit2
1607; PROLOG:       for.exit2:
1608; PROLOG-NEXT:    ret i32 42
1609;
1610; PROLOG-BLOCK-LABEL: @hdr_latch_same_exit(
1611; PROLOG-BLOCK-NEXT:  entry:
1612; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n
1613; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
1614; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
1615; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1616; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
1617; PROLOG-BLOCK:       header.prol.preheader:
1618; PROLOG-BLOCK-NEXT:    br label %header.prol
1619; PROLOG-BLOCK:       header.prol:
1620; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.unr-lcssa, label %for.exiting_block.prol
1621; PROLOG-BLOCK:       for.exiting_block.prol:
1622; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
1623; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %latch.prol
1624; PROLOG-BLOCK:       latch.prol:
1625; PROLOG-BLOCK-NEXT:    %2 = load i32, i32* %a, align 4
1626; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
1627; PROLOG-BLOCK:       header.prol.loopexit:
1628; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %2, %latch.prol ]
1629; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
1630; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ]
1631; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 1
1632; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchExit, label %entry.new
1633; PROLOG-BLOCK:       entry.new:
1634; PROLOG-BLOCK-NEXT:    br label %header
1635; PROLOG-BLOCK:       header:
1636; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
1637; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
1638; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block
1639; PROLOG-BLOCK:       for.exiting_block:
1640; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
1641; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1642; PROLOG-BLOCK:       latch:
1643; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1644; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx, align 4
1645; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.02
1646; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
1647; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.1
1648; PROLOG-BLOCK:       for.exiting_block.1:
1649; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1650; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1651; PROLOG-BLOCK:       latch.1:
1652; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1653; PROLOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
1654; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add
1655; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1656; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
1657; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !4
1658; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
1659; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ %add.1, %latch.1 ]
1660; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
1661; PROLOG-BLOCK:       latchExit.unr-lcssa:
1662; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %header.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1663; PROLOG-BLOCK-NEXT:    br label %latchExit
1664; PROLOG-BLOCK:       latchExit:
1665; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
1666; PROLOG-BLOCK-NEXT:    ret i32 %result
1667; PROLOG-BLOCK:       for.exit2.loopexit:
1668; PROLOG-BLOCK-NEXT:    br label %for.exit2
1669; PROLOG-BLOCK:       for.exit2:
1670; PROLOG-BLOCK-NEXT:    ret i32 42
1671;
1672
1673entry:
1674  br label %header
1675
1676header:
1677  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
1678  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
1679  br i1 %cond, label %latchExit, label %for.exiting_block
1680
1681for.exiting_block:
1682  %cmp = icmp eq i64 %n, 42
1683  br i1 %cmp, label %for.exit2, label %latch
1684
1685latch:                                         ; preds = %latch, %entry
1686  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1687  %0 = load i32, i32* %arrayidx, align 4
1688  %add = add nsw i32 %0, %sum.02
1689  %indvars.iv.next = add i64 %indvars.iv, 1
1690  %exitcond = icmp eq i64 %indvars.iv.next, %n
1691  br i1 %exitcond, label %latchExit, label %header
1692
1693latchExit:                                          ; preds = %latch, %entry
1694  %result = phi i32 [ 0, %header ], [ %add, %latch ]
1695  ret i32 %result
1696
1697for.exit2:
1698  ret i32 42
1699}
1700
1701; Two exiting blocks to latch where the exiting blocks are Latch and a
1702; non-header
1703; FIXME: We should unroll this loop.
1704define i32 @otherblock_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) {
1705; EPILOG-LABEL: @otherblock_latch_same_exit(
1706; EPILOG-NEXT:  entry:
1707; EPILOG-NEXT:    %0 = freeze i64 %n
1708; EPILOG-NEXT:    %1 = add i64 %0, -1
1709; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
1710; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
1711; EPILOG-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
1712; EPILOG:       entry.new:
1713; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
1714; EPILOG-NEXT:    br label %header
1715; EPILOG:       header:
1716; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
1717; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
1718; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
1719; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
1720; EPILOG:       for.exiting_block:
1721; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
1722; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
1723; EPILOG:       latch:
1724; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1725; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
1726; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.02
1727; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1728; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
1729; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
1730; EPILOG:       for.exiting_block.1:
1731; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1732; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
1733; EPILOG:       latch.1:
1734; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1735; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1736; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
1737; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
1738; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
1739; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
1740; EPILOG:       for.exiting_block.2:
1741; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1742; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
1743; EPILOG:       latch.2:
1744; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1745; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
1746; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
1747; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
1748; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
1749; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
1750; EPILOG:       for.exiting_block.3:
1751; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1752; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
1753; EPILOG:       latch.3:
1754; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1755; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
1756; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
1757; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
1758; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
1759; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
1760; EPILOG:       for.exiting_block.4:
1761; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1762; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
1763; EPILOG:       latch.4:
1764; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
1765; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
1766; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
1767; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
1768; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
1769; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
1770; EPILOG:       for.exiting_block.5:
1771; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1772; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
1773; EPILOG:       latch.5:
1774; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
1775; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
1776; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
1777; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
1778; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
1779; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
1780; EPILOG:       for.exiting_block.6:
1781; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
1782; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
1783; EPILOG:       latch.6:
1784; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
1785; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
1786; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
1787; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
1788; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
1789; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
1790; EPILOG:       for.exiting_block.7:
1791; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
1792; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
1793; EPILOG:       latch.7:
1794; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
1795; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
1796; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
1797; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
1798; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
1799; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
1800; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
1801; EPILOG:       latchExit.unr-lcssa.loopexit:
1802; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
1803; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
1804; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
1805; EPILOG-NEXT:    br label %latchExit.unr-lcssa
1806; EPILOG:       latchExit.unr-lcssa:
1807; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1808; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1809; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1810; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1811; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1812; EPILOG:       header.epil.preheader:
1813; EPILOG-NEXT:    br label %header.epil
1814; EPILOG:       header.epil:
1815; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
1816; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
1817; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
1818; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
1819; EPILOG:       for.exiting_block.epil:
1820; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1821; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
1822; EPILOG:       latch.epil:
1823; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
1824; EPILOG-NEXT:    %11 = load i32, i32* %arrayidx.epil, align 4
1825; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil
1826; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
1827; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
1828; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
1829; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
1830; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !5
1831; EPILOG:       latchExit.epilog-lcssa.loopexit:
1832; 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 ]
1833; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1834; EPILOG:       latchExit.epilog-lcssa.loopexit3:
1835; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ 2, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
1836; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1837; EPILOG:       latchExit.epilog-lcssa:
1838; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
1839; EPILOG-NEXT:    br label %latchExit
1840; EPILOG:       latchExit:
1841; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1842; EPILOG-NEXT:    ret i32 %result
1843; EPILOG:       for.exit2.loopexit:
1844; EPILOG-NEXT:    br label %for.exit2
1845; EPILOG:       for.exit2.loopexit2:
1846; EPILOG-NEXT:    br label %for.exit2
1847; EPILOG:       for.exit2:
1848; EPILOG-NEXT:    ret i32 42
1849;
1850; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit(
1851; EPILOG-BLOCK-NEXT:  entry:
1852; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n
1853; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
1854; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
1855; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
1856; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
1857; EPILOG-BLOCK:       entry.new:
1858; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
1859; EPILOG-BLOCK-NEXT:    br label %header
1860; EPILOG-BLOCK:       header:
1861; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
1862; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
1863; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
1864; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
1865; EPILOG-BLOCK:       for.exiting_block:
1866; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
1867; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
1868; EPILOG-BLOCK:       latch:
1869; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1870; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
1871; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
1872; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1873; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
1874; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
1875; EPILOG-BLOCK:       for.exiting_block.1:
1876; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1877; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
1878; EPILOG-BLOCK:       latch.1:
1879; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1880; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1881; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
1882; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1883; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
1884; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
1885; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5
1886; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
1887; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
1888; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
1889; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
1890; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
1891; EPILOG-BLOCK:       latchExit.unr-lcssa:
1892; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1893; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1894; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1895; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1896; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1897; EPILOG-BLOCK:       header.epil.preheader:
1898; EPILOG-BLOCK-NEXT:    br label %header.epil
1899; EPILOG-BLOCK:       header.epil:
1900; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
1901; EPILOG-BLOCK:       for.exiting_block.epil:
1902; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1903; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
1904; EPILOG-BLOCK:       latch.epil:
1905; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
1906; EPILOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.epil, align 4
1907; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.unr
1908; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1909; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
1910; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ]
1911; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1912; EPILOG-BLOCK:       latchExit.epilog-lcssa:
1913; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 2, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
1914; EPILOG-BLOCK-NEXT:    br label %latchExit
1915; EPILOG-BLOCK:       latchExit:
1916; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1917; EPILOG-BLOCK-NEXT:    ret i32 %result
1918; EPILOG-BLOCK:       for.exit2.loopexit:
1919; EPILOG-BLOCK-NEXT:    br label %for.exit2
1920; EPILOG-BLOCK:       for.exit2:
1921; EPILOG-BLOCK-NEXT:    ret i32 42
1922;
1923; PROLOG-LABEL: @otherblock_latch_same_exit(
1924; PROLOG-NEXT:  entry:
1925; PROLOG-NEXT:    %0 = freeze i64 %n
1926; PROLOG-NEXT:    %1 = add i64 %0, -1
1927; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
1928; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1929; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
1930; PROLOG:       header.prol.preheader:
1931; PROLOG-NEXT:    br label %header.prol
1932; PROLOG:       header.prol:
1933; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
1934; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
1935; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
1936; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol
1937; PROLOG:       for.exiting_block.prol:
1938; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
1939; PROLOG-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol
1940; PROLOG:       latch.prol:
1941; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
1942; PROLOG-NEXT:    %2 = load i32, i32* %arrayidx.prol, align 4
1943; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol
1944; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
1945; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
1946; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
1947; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
1948; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !5
1949; PROLOG:       header.prol.loopexit.unr-lcssa:
1950; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
1951; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
1952; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
1953; PROLOG-NEXT:    br label %header.prol.loopexit
1954; PROLOG:       header.prol.loopexit:
1955; PROLOG-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
1956; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
1957; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
1958; PROLOG-NEXT:    %3 = icmp ult i64 %1, 7
1959; PROLOG-NEXT:    br i1 %3, label %latchExit, label %entry.new
1960; PROLOG:       entry.new:
1961; PROLOG-NEXT:    br label %header
1962; PROLOG:       header:
1963; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
1964; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
1965; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
1966; PROLOG:       for.exiting_block:
1967; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
1968; PROLOG-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
1969; PROLOG:       latch:
1970; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1971; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx, align 4
1972; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.02
1973; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
1974; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
1975; PROLOG:       for.exiting_block.1:
1976; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1977; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
1978; PROLOG:       latch.1:
1979; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1980; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
1981; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add
1982; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1983; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
1984; PROLOG:       for.exiting_block.2:
1985; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1986; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2
1987; PROLOG:       latch.2:
1988; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1989; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.2, align 4
1990; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.1
1991; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
1992; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
1993; PROLOG:       for.exiting_block.3:
1994; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1995; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3
1996; PROLOG:       latch.3:
1997; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1998; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.3, align 4
1999; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.2
2000; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
2001; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2002; PROLOG:       for.exiting_block.4:
2003; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2004; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4
2005; PROLOG:       latch.4:
2006; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2007; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.4, align 4
2008; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.3
2009; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
2010; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2011; PROLOG:       for.exiting_block.5:
2012; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2013; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5
2014; PROLOG:       latch.5:
2015; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2016; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.5, align 4
2017; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.4
2018; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
2019; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2020; PROLOG:       for.exiting_block.6:
2021; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2022; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6
2023; PROLOG:       latch.6:
2024; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2025; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.6, align 4
2026; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.5
2027; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
2028; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2029; PROLOG:       for.exiting_block.7:
2030; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2031; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7
2032; PROLOG:       latch.7:
2033; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2034; PROLOG-NEXT:    %11 = load i32, i32* %arrayidx.7, align 4
2035; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.6
2036; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2037; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
2038; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
2039; PROLOG:       latchExit.unr-lcssa.loopexit:
2040; 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 ]
2041; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2042; PROLOG:       latchExit.unr-lcssa.loopexit2:
2043; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ 2, %for.exiting_block.prol ]
2044; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2045; PROLOG:       latchExit.unr-lcssa:
2046; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]
2047; PROLOG-NEXT:    br label %latchExit
2048; PROLOG:       latchExit:
2049; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2050; PROLOG-NEXT:    ret i32 %result
2051; PROLOG:       for.exit2.loopexit:
2052; PROLOG-NEXT:    br label %for.exit2
2053; PROLOG:       for.exit2.loopexit1:
2054; PROLOG-NEXT:    br label %for.exit2
2055; PROLOG:       for.exit2:
2056; PROLOG-NEXT:    ret i32 42
2057;
2058; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit(
2059; PROLOG-BLOCK-NEXT:  entry:
2060; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n
2061; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
2062; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
2063; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2064; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
2065; PROLOG-BLOCK:       header.prol.preheader:
2066; PROLOG-BLOCK-NEXT:    br label %header.prol
2067; PROLOG-BLOCK:       header.prol:
2068; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.prol
2069; PROLOG-BLOCK:       for.exiting_block.prol:
2070; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
2071; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol
2072; PROLOG-BLOCK:       latch.prol:
2073; PROLOG-BLOCK-NEXT:    %2 = load i32, i32* %a, align 4
2074; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
2075; PROLOG-BLOCK:       header.prol.loopexit:
2076; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %2, %latch.prol ]
2077; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
2078; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ]
2079; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 1
2080; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchExit, label %entry.new
2081; PROLOG-BLOCK:       entry.new:
2082; PROLOG-BLOCK-NEXT:    br label %header
2083; PROLOG-BLOCK:       header:
2084; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2085; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
2086; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2087; PROLOG-BLOCK:       for.exiting_block:
2088; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2089; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2090; PROLOG-BLOCK:       latch:
2091; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2092; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx, align 4
2093; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.02
2094; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2095; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2096; PROLOG-BLOCK:       for.exiting_block.1:
2097; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2098; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2099; PROLOG-BLOCK:       latch.1:
2100; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2101; PROLOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
2102; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add
2103; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2104; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
2105; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5
2106; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2107; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
2108; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2109; PROLOG-BLOCK:       latchExit.unr-lcssa:
2110; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 2, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2111; PROLOG-BLOCK-NEXT:    br label %latchExit
2112; PROLOG-BLOCK:       latchExit:
2113; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2114; PROLOG-BLOCK-NEXT:    ret i32 %result
2115; PROLOG-BLOCK:       for.exit2.loopexit:
2116; PROLOG-BLOCK-NEXT:    br label %for.exit2
2117; PROLOG-BLOCK:       for.exit2:
2118; PROLOG-BLOCK-NEXT:    ret i32 42
2119;
2120
2121entry:
2122  br label %header
2123
2124header:
2125  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
2126  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
2127  br i1 %cond, label %for.exit2, label %for.exiting_block
2128
2129for.exiting_block:
2130  %cmp = icmp eq i64 %n, 42
2131  br i1 %cmp, label %latchExit, label %latch
2132
2133latch:                                         ; preds = %latch, %entry
2134  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2135  %0 = load i32, i32* %arrayidx, align 4
2136  %add = add nsw i32 %0, %sum.02
2137  %indvars.iv.next = add i64 %indvars.iv, 1
2138  %exitcond = icmp eq i64 %indvars.iv.next, %n
2139  br i1 %exitcond, label %latchExit, label %header
2140
2141latchExit:                                          ; preds = %latch, %entry
2142  %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ]
2143  ret i32 %result
2144
2145for.exit2:
2146  ret i32 42
2147}
2148
2149; Two exiting blocks to latch where the exiting blocks are Latch and a
2150; non-header
2151; Same as above test except the incoming value for latch Phi is from the header
2152; FIXME: We should be able to runtime unroll.
2153define i32 @otherblock_latch_same_exit2(i32* nocapture %a, i64 %n, i1 %cond) {
2154; EPILOG-LABEL: @otherblock_latch_same_exit2(
2155; EPILOG-NEXT:  entry:
2156; EPILOG-NEXT:    %0 = freeze i64 %n
2157; EPILOG-NEXT:    %1 = add i64 %0, -1
2158; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
2159; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
2160; EPILOG-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
2161; EPILOG:       entry.new:
2162; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
2163; EPILOG-NEXT:    br label %header
2164; EPILOG:       header:
2165; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
2166; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
2167; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
2168; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2169; EPILOG:       for.exiting_block:
2170; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
2171; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2172; EPILOG:       latch:
2173; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2174; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
2175; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.02
2176; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2177; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
2178; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2179; EPILOG:       for.exiting_block.1:
2180; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2181; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2182; EPILOG:       latch.1:
2183; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2184; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2185; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
2186; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
2187; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
2188; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2189; EPILOG:       for.exiting_block.2:
2190; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2191; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
2192; EPILOG:       latch.2:
2193; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2194; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
2195; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
2196; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
2197; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
2198; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2199; EPILOG:       for.exiting_block.3:
2200; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2201; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
2202; EPILOG:       latch.3:
2203; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2204; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
2205; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
2206; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
2207; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
2208; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2209; EPILOG:       for.exiting_block.4:
2210; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2211; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
2212; EPILOG:       latch.4:
2213; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2214; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
2215; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2216; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
2217; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
2218; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2219; EPILOG:       for.exiting_block.5:
2220; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2221; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
2222; EPILOG:       latch.5:
2223; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2224; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
2225; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2226; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
2227; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
2228; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2229; EPILOG:       for.exiting_block.6:
2230; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2231; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
2232; EPILOG:       latch.6:
2233; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2234; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
2235; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2236; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
2237; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
2238; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2239; EPILOG:       for.exiting_block.7:
2240; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2241; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
2242; EPILOG:       latch.7:
2243; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2244; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
2245; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2246; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2247; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
2248; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
2249; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
2250; EPILOG:       latchExit.unr-lcssa.loopexit:
2251; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
2252; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
2253; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
2254; EPILOG-NEXT:    br label %latchExit.unr-lcssa
2255; EPILOG:       latchExit.unr-lcssa:
2256; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2257; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2258; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2259; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2260; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2261; EPILOG:       header.epil.preheader:
2262; EPILOG-NEXT:    br label %header.epil
2263; EPILOG:       header.epil:
2264; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
2265; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
2266; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
2267; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
2268; EPILOG:       for.exiting_block.epil:
2269; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2270; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
2271; EPILOG:       latch.epil:
2272; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
2273; EPILOG-NEXT:    %11 = load i32, i32* %arrayidx.epil, align 4
2274; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil
2275; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
2276; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
2277; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
2278; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
2279; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !6
2280; EPILOG:       latchExit.epilog-lcssa.loopexit:
2281; 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 ]
2282; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2283; EPILOG:       latchExit.epilog-lcssa.loopexit3:
2284; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
2285; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2286; EPILOG:       latchExit.epilog-lcssa:
2287; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
2288; EPILOG-NEXT:    br label %latchExit
2289; EPILOG:       latchExit:
2290; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2291; EPILOG-NEXT:    ret i32 %result
2292; EPILOG:       for.exit2.loopexit:
2293; EPILOG-NEXT:    br label %for.exit2
2294; EPILOG:       for.exit2.loopexit2:
2295; EPILOG-NEXT:    br label %for.exit2
2296; EPILOG:       for.exit2:
2297; EPILOG-NEXT:    ret i32 42
2298;
2299; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit2(
2300; EPILOG-BLOCK-NEXT:  entry:
2301; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n
2302; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
2303; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
2304; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
2305; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
2306; EPILOG-BLOCK:       entry.new:
2307; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
2308; EPILOG-BLOCK-NEXT:    br label %header
2309; EPILOG-BLOCK:       header:
2310; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2311; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
2312; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
2313; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2314; EPILOG-BLOCK:       for.exiting_block:
2315; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2316; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2317; EPILOG-BLOCK:       latch:
2318; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2319; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
2320; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
2321; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2322; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
2323; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2324; EPILOG-BLOCK:       for.exiting_block.1:
2325; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2326; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2327; EPILOG-BLOCK:       latch.1:
2328; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2329; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2330; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2331; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2332; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
2333; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
2334; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6
2335; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2336; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
2337; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
2338; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
2339; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2340; EPILOG-BLOCK:       latchExit.unr-lcssa:
2341; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2342; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2343; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2344; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2345; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2346; EPILOG-BLOCK:       header.epil.preheader:
2347; EPILOG-BLOCK-NEXT:    br label %header.epil
2348; EPILOG-BLOCK:       header.epil:
2349; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
2350; EPILOG-BLOCK:       for.exiting_block.epil:
2351; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2352; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
2353; EPILOG-BLOCK:       latch.epil:
2354; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
2355; EPILOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.epil, align 4
2356; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.unr
2357; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2358; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
2359; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ]
2360; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2361; EPILOG-BLOCK:       latchExit.epilog-lcssa:
2362; 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 ]
2363; EPILOG-BLOCK-NEXT:    br label %latchExit
2364; EPILOG-BLOCK:       latchExit:
2365; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2366; EPILOG-BLOCK-NEXT:    ret i32 %result
2367; EPILOG-BLOCK:       for.exit2.loopexit:
2368; EPILOG-BLOCK-NEXT:    br label %for.exit2
2369; EPILOG-BLOCK:       for.exit2:
2370; EPILOG-BLOCK-NEXT:    ret i32 42
2371;
2372; PROLOG-LABEL: @otherblock_latch_same_exit2(
2373; PROLOG-NEXT:  entry:
2374; PROLOG-NEXT:    %0 = freeze i64 %n
2375; PROLOG-NEXT:    %1 = add i64 %0, -1
2376; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
2377; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2378; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
2379; PROLOG:       header.prol.preheader:
2380; PROLOG-NEXT:    br label %header.prol
2381; PROLOG:       header.prol:
2382; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
2383; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
2384; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
2385; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol
2386; PROLOG:       for.exiting_block.prol:
2387; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
2388; PROLOG-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol
2389; PROLOG:       latch.prol:
2390; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
2391; PROLOG-NEXT:    %2 = load i32, i32* %arrayidx.prol, align 4
2392; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol
2393; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
2394; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
2395; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
2396; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
2397; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !6
2398; PROLOG:       header.prol.loopexit.unr-lcssa:
2399; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
2400; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
2401; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
2402; PROLOG-NEXT:    br label %header.prol.loopexit
2403; PROLOG:       header.prol.loopexit:
2404; PROLOG-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
2405; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
2406; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
2407; PROLOG-NEXT:    %3 = icmp ult i64 %1, 7
2408; PROLOG-NEXT:    br i1 %3, label %latchExit, label %entry.new
2409; PROLOG:       entry.new:
2410; PROLOG-NEXT:    br label %header
2411; PROLOG:       header:
2412; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
2413; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
2414; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2415; PROLOG:       for.exiting_block:
2416; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
2417; PROLOG-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2418; PROLOG:       latch:
2419; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2420; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx, align 4
2421; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.02
2422; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2423; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2424; PROLOG:       for.exiting_block.1:
2425; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2426; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2427; PROLOG:       latch.1:
2428; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2429; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
2430; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add
2431; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2432; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2433; PROLOG:       for.exiting_block.2:
2434; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2435; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2
2436; PROLOG:       latch.2:
2437; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2438; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.2, align 4
2439; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.1
2440; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
2441; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2442; PROLOG:       for.exiting_block.3:
2443; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2444; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3
2445; PROLOG:       latch.3:
2446; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2447; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.3, align 4
2448; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.2
2449; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
2450; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2451; PROLOG:       for.exiting_block.4:
2452; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2453; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4
2454; PROLOG:       latch.4:
2455; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2456; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.4, align 4
2457; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.3
2458; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
2459; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2460; PROLOG:       for.exiting_block.5:
2461; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2462; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5
2463; PROLOG:       latch.5:
2464; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2465; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.5, align 4
2466; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.4
2467; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
2468; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2469; PROLOG:       for.exiting_block.6:
2470; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2471; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6
2472; PROLOG:       latch.6:
2473; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2474; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.6, align 4
2475; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.5
2476; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
2477; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2478; PROLOG:       for.exiting_block.7:
2479; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2480; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7
2481; PROLOG:       latch.7:
2482; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2483; PROLOG-NEXT:    %11 = load i32, i32* %arrayidx.7, align 4
2484; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.6
2485; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2486; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
2487; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
2488; PROLOG:       latchExit.unr-lcssa.loopexit:
2489; 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 ]
2490; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2491; PROLOG:       latchExit.unr-lcssa.loopexit2:
2492; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ]
2493; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2494; PROLOG:       latchExit.unr-lcssa:
2495; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]
2496; PROLOG-NEXT:    br label %latchExit
2497; PROLOG:       latchExit:
2498; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2499; PROLOG-NEXT:    ret i32 %result
2500; PROLOG:       for.exit2.loopexit:
2501; PROLOG-NEXT:    br label %for.exit2
2502; PROLOG:       for.exit2.loopexit1:
2503; PROLOG-NEXT:    br label %for.exit2
2504; PROLOG:       for.exit2:
2505; PROLOG-NEXT:    ret i32 42
2506;
2507; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit2(
2508; PROLOG-BLOCK-NEXT:  entry:
2509; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n
2510; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
2511; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
2512; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2513; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
2514; PROLOG-BLOCK:       header.prol.preheader:
2515; PROLOG-BLOCK-NEXT:    br label %header.prol
2516; PROLOG-BLOCK:       header.prol:
2517; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.prol
2518; PROLOG-BLOCK:       for.exiting_block.prol:
2519; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
2520; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol
2521; PROLOG-BLOCK:       latch.prol:
2522; PROLOG-BLOCK-NEXT:    %2 = load i32, i32* %a, align 4
2523; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
2524; PROLOG-BLOCK:       header.prol.loopexit:
2525; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %2, %latch.prol ]
2526; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
2527; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ]
2528; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 1
2529; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchExit, label %entry.new
2530; PROLOG-BLOCK:       entry.new:
2531; PROLOG-BLOCK-NEXT:    br label %header
2532; PROLOG-BLOCK:       header:
2533; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2534; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
2535; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2536; PROLOG-BLOCK:       for.exiting_block:
2537; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2538; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2539; PROLOG-BLOCK:       latch:
2540; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2541; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx, align 4
2542; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.02
2543; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2544; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2545; PROLOG-BLOCK:       for.exiting_block.1:
2546; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2547; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2548; PROLOG-BLOCK:       latch.1:
2549; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2550; PROLOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
2551; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add
2552; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2553; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
2554; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6
2555; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2556; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
2557; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2558; PROLOG-BLOCK:       latchExit.unr-lcssa:
2559; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2560; PROLOG-BLOCK-NEXT:    br label %latchExit
2561; PROLOG-BLOCK:       latchExit:
2562; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2563; PROLOG-BLOCK-NEXT:    ret i32 %result
2564; PROLOG-BLOCK:       for.exit2.loopexit:
2565; PROLOG-BLOCK-NEXT:    br label %for.exit2
2566; PROLOG-BLOCK:       for.exit2:
2567; PROLOG-BLOCK-NEXT:    ret i32 42
2568;
2569
2570entry:
2571  br label %header
2572
2573header:
2574  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
2575  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
2576  br i1 %cond, label %for.exit2, label %for.exiting_block
2577
2578for.exiting_block:
2579  %cmp = icmp eq i64 %n, 42
2580  br i1 %cmp, label %latchExit, label %latch
2581
2582latch:                                         ; preds = %latch, %entry
2583  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2584  %0 = load i32, i32* %arrayidx, align 4
2585  %add = add nsw i32 %0, %sum.02
2586  %indvars.iv.next = add i64 %indvars.iv, 1
2587  %exitcond = icmp eq i64 %indvars.iv.next, %n
2588  br i1 %exitcond, label %latchExit, label %header
2589
2590latchExit:                                          ; preds = %latch, %entry
2591  %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
2592  ret i32 %result
2593
2594for.exit2:
2595  ret i32 42
2596}
2597
2598; Two exiting blocks to latch where the exiting blocks are Latch and a
2599; non-header
2600; Same as above test except the incoming value for cloned latch Phi is from the
2601; for.exiting_block.
2602; FIXME: We should be able to runtime unroll.
2603define i32 @otherblock_latch_same_exit3(i32* nocapture %a, i64 %n, i1 %cond) {
2604; EPILOG-LABEL: @otherblock_latch_same_exit3(
2605; EPILOG-NEXT:  entry:
2606; EPILOG-NEXT:    %0 = freeze i64 %n
2607; EPILOG-NEXT:    %1 = add i64 %0, -1
2608; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
2609; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
2610; EPILOG-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
2611; EPILOG:       entry.new:
2612; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
2613; EPILOG-NEXT:    br label %header
2614; EPILOG:       header:
2615; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
2616; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
2617; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
2618; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2619; EPILOG:       for.exiting_block:
2620; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2621; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
2622; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.02
2623; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
2624; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2625; EPILOG:       latch:
2626; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2627; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
2628; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2629; EPILOG:       for.exiting_block.1:
2630; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2631; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2632; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
2633; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2634; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2635; EPILOG:       latch.1:
2636; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
2637; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
2638; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2639; EPILOG:       for.exiting_block.2:
2640; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2641; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
2642; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
2643; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2644; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
2645; EPILOG:       latch.2:
2646; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
2647; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
2648; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2649; EPILOG:       for.exiting_block.3:
2650; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2651; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
2652; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
2653; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2654; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
2655; EPILOG:       latch.3:
2656; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
2657; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
2658; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2659; EPILOG:       for.exiting_block.4:
2660; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2661; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
2662; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2663; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2664; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
2665; EPILOG:       latch.4:
2666; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
2667; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
2668; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2669; EPILOG:       for.exiting_block.5:
2670; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2671; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
2672; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2673; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2674; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
2675; EPILOG:       latch.5:
2676; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
2677; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
2678; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2679; EPILOG:       for.exiting_block.6:
2680; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2681; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
2682; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2683; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2684; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
2685; EPILOG:       latch.6:
2686; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
2687; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
2688; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2689; EPILOG:       for.exiting_block.7:
2690; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2691; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
2692; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2693; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2694; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
2695; EPILOG:       latch.7:
2696; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2697; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
2698; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
2699; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
2700; EPILOG:       latchExit.unr-lcssa.loopexit:
2701; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
2702; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
2703; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
2704; EPILOG-NEXT:    br label %latchExit.unr-lcssa
2705; EPILOG:       latchExit.unr-lcssa:
2706; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2707; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2708; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2709; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2710; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2711; EPILOG:       header.epil.preheader:
2712; EPILOG-NEXT:    br label %header.epil
2713; EPILOG:       header.epil:
2714; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
2715; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
2716; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
2717; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
2718; EPILOG:       for.exiting_block.epil:
2719; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
2720; EPILOG-NEXT:    %11 = load i32, i32* %arrayidx.epil, align 4
2721; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil
2722; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2723; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
2724; EPILOG:       latch.epil:
2725; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
2726; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
2727; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
2728; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
2729; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !7
2730; EPILOG:       latchExit.epilog-lcssa.loopexit:
2731; 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 ]
2732; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2733; EPILOG:       latchExit.epilog-lcssa.loopexit3:
2734; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
2735; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2736; EPILOG:       latchExit.epilog-lcssa:
2737; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
2738; EPILOG-NEXT:    br label %latchExit
2739; EPILOG:       latchExit:
2740; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2741; EPILOG-NEXT:    ret i32 %result
2742; EPILOG:       for.exit2.loopexit:
2743; EPILOG-NEXT:    br label %for.exit2
2744; EPILOG:       for.exit2.loopexit2:
2745; EPILOG-NEXT:    br label %for.exit2
2746; EPILOG:       for.exit2:
2747; EPILOG-NEXT:    ret i32 42
2748;
2749; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit3(
2750; EPILOG-BLOCK-NEXT:  entry:
2751; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n
2752; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
2753; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
2754; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
2755; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
2756; EPILOG-BLOCK:       entry.new:
2757; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
2758; EPILOG-BLOCK-NEXT:    br label %header
2759; EPILOG-BLOCK:       header:
2760; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2761; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
2762; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
2763; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2764; EPILOG-BLOCK:       for.exiting_block:
2765; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2766; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
2767; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
2768; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2769; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2770; EPILOG-BLOCK:       latch:
2771; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2772; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
2773; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2774; EPILOG-BLOCK:       for.exiting_block.1:
2775; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2776; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2777; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2778; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2779; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2780; EPILOG-BLOCK:       latch.1:
2781; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2782; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
2783; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
2784; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7
2785; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2786; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
2787; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
2788; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
2789; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2790; EPILOG-BLOCK:       latchExit.unr-lcssa:
2791; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2792; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2793; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2794; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2795; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2796; EPILOG-BLOCK:       header.epil.preheader:
2797; EPILOG-BLOCK-NEXT:    br label %header.epil
2798; EPILOG-BLOCK:       header.epil:
2799; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
2800; EPILOG-BLOCK:       for.exiting_block.epil:
2801; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
2802; EPILOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.epil, align 4
2803; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.unr
2804; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2805; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
2806; EPILOG-BLOCK:       latch.epil:
2807; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2808; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
2809; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ]
2810; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2811; EPILOG-BLOCK:       latchExit.epilog-lcssa:
2812; 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 ]
2813; EPILOG-BLOCK-NEXT:    br label %latchExit
2814; EPILOG-BLOCK:       latchExit:
2815; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2816; EPILOG-BLOCK-NEXT:    ret i32 %result
2817; EPILOG-BLOCK:       for.exit2.loopexit:
2818; EPILOG-BLOCK-NEXT:    br label %for.exit2
2819; EPILOG-BLOCK:       for.exit2:
2820; EPILOG-BLOCK-NEXT:    ret i32 42
2821;
2822; PROLOG-LABEL: @otherblock_latch_same_exit3(
2823; PROLOG-NEXT:  entry:
2824; PROLOG-NEXT:    %0 = freeze i64 %n
2825; PROLOG-NEXT:    %1 = add i64 %0, -1
2826; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
2827; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2828; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
2829; PROLOG:       header.prol.preheader:
2830; PROLOG-NEXT:    br label %header.prol
2831; PROLOG:       header.prol:
2832; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
2833; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
2834; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
2835; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol
2836; PROLOG:       for.exiting_block.prol:
2837; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
2838; PROLOG-NEXT:    %2 = load i32, i32* %arrayidx.prol, align 4
2839; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol
2840; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
2841; PROLOG-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol
2842; PROLOG:       latch.prol:
2843; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
2844; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
2845; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
2846; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
2847; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !7
2848; PROLOG:       header.prol.loopexit.unr-lcssa:
2849; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
2850; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
2851; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
2852; PROLOG-NEXT:    br label %header.prol.loopexit
2853; PROLOG:       header.prol.loopexit:
2854; PROLOG-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
2855; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
2856; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
2857; PROLOG-NEXT:    %3 = icmp ult i64 %1, 7
2858; PROLOG-NEXT:    br i1 %3, label %latchExit, label %entry.new
2859; PROLOG:       entry.new:
2860; PROLOG-NEXT:    br label %header
2861; PROLOG:       header:
2862; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
2863; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
2864; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2865; PROLOG:       for.exiting_block:
2866; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2867; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx, align 4
2868; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.02
2869; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
2870; PROLOG-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2871; PROLOG:       latch:
2872; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2873; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2874; PROLOG:       for.exiting_block.1:
2875; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2876; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
2877; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add
2878; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2879; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2880; PROLOG:       latch.1:
2881; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2882; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2883; PROLOG:       for.exiting_block.2:
2884; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2885; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.2, align 4
2886; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.1
2887; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2888; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2
2889; PROLOG:       latch.2:
2890; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
2891; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2892; PROLOG:       for.exiting_block.3:
2893; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2894; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.3, align 4
2895; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.2
2896; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2897; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3
2898; PROLOG:       latch.3:
2899; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
2900; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2901; PROLOG:       for.exiting_block.4:
2902; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2903; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.4, align 4
2904; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.3
2905; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2906; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4
2907; PROLOG:       latch.4:
2908; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
2909; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2910; PROLOG:       for.exiting_block.5:
2911; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2912; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.5, align 4
2913; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.4
2914; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2915; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5
2916; PROLOG:       latch.5:
2917; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
2918; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2919; PROLOG:       for.exiting_block.6:
2920; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2921; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.6, align 4
2922; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.5
2923; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2924; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6
2925; PROLOG:       latch.6:
2926; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
2927; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2928; PROLOG:       for.exiting_block.7:
2929; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2930; PROLOG-NEXT:    %11 = load i32, i32* %arrayidx.7, align 4
2931; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.6
2932; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2933; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7
2934; PROLOG:       latch.7:
2935; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2936; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
2937; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
2938; PROLOG:       latchExit.unr-lcssa.loopexit:
2939; 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 ]
2940; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2941; PROLOG:       latchExit.unr-lcssa.loopexit2:
2942; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ]
2943; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2944; PROLOG:       latchExit.unr-lcssa:
2945; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]
2946; PROLOG-NEXT:    br label %latchExit
2947; PROLOG:       latchExit:
2948; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2949; PROLOG-NEXT:    ret i32 %result
2950; PROLOG:       for.exit2.loopexit:
2951; PROLOG-NEXT:    br label %for.exit2
2952; PROLOG:       for.exit2.loopexit1:
2953; PROLOG-NEXT:    br label %for.exit2
2954; PROLOG:       for.exit2:
2955; PROLOG-NEXT:    ret i32 42
2956;
2957; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit3(
2958; PROLOG-BLOCK-NEXT:  entry:
2959; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n
2960; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
2961; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
2962; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2963; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
2964; PROLOG-BLOCK:       header.prol.preheader:
2965; PROLOG-BLOCK-NEXT:    br label %header.prol
2966; PROLOG-BLOCK:       header.prol:
2967; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.prol
2968; PROLOG-BLOCK:       for.exiting_block.prol:
2969; PROLOG-BLOCK-NEXT:    %2 = load i32, i32* %a, align 4
2970; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
2971; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol
2972; PROLOG-BLOCK:       latch.prol:
2973; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
2974; PROLOG-BLOCK:       header.prol.loopexit:
2975; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %2, %latch.prol ]
2976; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
2977; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ]
2978; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 1
2979; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchExit, label %entry.new
2980; PROLOG-BLOCK:       entry.new:
2981; PROLOG-BLOCK-NEXT:    br label %header
2982; PROLOG-BLOCK:       header:
2983; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2984; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
2985; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2986; PROLOG-BLOCK:       for.exiting_block:
2987; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2988; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx, align 4
2989; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.02
2990; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2991; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2992; PROLOG-BLOCK:       latch:
2993; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2994; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2995; PROLOG-BLOCK:       for.exiting_block.1:
2996; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2997; PROLOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
2998; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add
2999; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3000; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
3001; PROLOG-BLOCK:       latch.1:
3002; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
3003; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
3004; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7
3005; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
3006; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
3007; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
3008; PROLOG-BLOCK:       latchExit.unr-lcssa:
3009; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
3010; PROLOG-BLOCK-NEXT:    br label %latchExit
3011; PROLOG-BLOCK:       latchExit:
3012; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
3013; PROLOG-BLOCK-NEXT:    ret i32 %result
3014; PROLOG-BLOCK:       for.exit2.loopexit:
3015; PROLOG-BLOCK-NEXT:    br label %for.exit2
3016; PROLOG-BLOCK:       for.exit2:
3017; PROLOG-BLOCK-NEXT:    ret i32 42
3018;
3019
3020entry:
3021  br label %header
3022
3023header:
3024  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
3025  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
3026  br i1 %cond, label %for.exit2, label %for.exiting_block
3027
3028for.exiting_block:
3029  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3030  %0 = load i32, i32* %arrayidx, align 4
3031  %add = add nsw i32 %0, %sum.02
3032  %cmp = icmp eq i64 %n, 42
3033  br i1 %cmp, label %latchExit, label %latch
3034
3035latch:                                         ; preds = %latch, %entry
3036  %indvars.iv.next = add i64 %indvars.iv, 1
3037  %exitcond = icmp eq i64 %indvars.iv.next, %n
3038  br i1 %exitcond, label %latchExit, label %header
3039
3040latchExit:                                          ; preds = %latch, %entry
3041  %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
3042  ret i32 %result
3043
3044for.exit2:
3045  ret i32 42
3046}
3047
3048; Show a case where we have multiple exits, but (provably) exit on the
3049; first iteration and thus have nothing to unroll
3050define void @non_loop(i32 %arg) {
3051; CHECK-LABEL: @non_loop(
3052; CHECK-NEXT:  entry:
3053; CHECK-NEXT:    %i = icmp sgt i32 undef, %arg
3054; CHECK-NEXT:    br i1 %i, label %preheader, label %returnblock
3055; CHECK:       preheader:
3056; CHECK-NEXT:    br label %header
3057; CHECK:       header:
3058; CHECK-NEXT:    br i1 true, label %latchExit, label %latch
3059; CHECK:       latch:
3060; CHECK-NEXT:    br label %latchExit
3061; CHECK:       latchExit:
3062; CHECK-NEXT:    %i2.ph = phi i32 [ %arg, %header ], [ -1, %latch ]
3063; CHECK-NEXT:    br label %returnblock
3064; CHECK:       returnblock:
3065; CHECK-NEXT:    %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ]
3066; CHECK-NEXT:    ret void
3067;
3068
3069entry:
3070  %i = icmp sgt i32 undef, %arg
3071  br i1 %i, label %preheader, label %returnblock
3072
3073preheader:                                 ; preds = %entry
3074  br label %header
3075
3076header:                                           ; preds = %preheader, %latch
3077  %i4 = phi i32 [ %inc, %latch ], [ %arg, %preheader ]
3078  %inc = add nsw i32 %i4, 1
3079  br i1 true, label %latchExit, label %latch
3080
3081latch:                                            ; preds = %header
3082  %cmp = icmp slt i32 %inc, undef
3083  br i1 %cmp, label %header, label %latchExit
3084
3085latchExit:                                ; preds = %header, %latch
3086  %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ]
3087  br label %returnblock
3088
3089returnblock:                                         ; preds = %latchExit, %entry
3090  %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ]
3091  ret void
3092}
3093
3094; Latch exit is shared by all exiting blocks
3095define void @unique_exit(i32 %N, i32 %M) {
3096; EPILOG-LABEL: @unique_exit(
3097; EPILOG-NEXT:  preheader:
3098; EPILOG-NEXT:    %M.shifted = shl i32 %M, 3
3099; EPILOG-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1)
3100; EPILOG-NEXT:    %0 = freeze i32 %umax
3101; EPILOG-NEXT:    %1 = add i32 %0, -1
3102; EPILOG-NEXT:    %xtraiter = and i32 %0, 7
3103; EPILOG-NEXT:    %2 = icmp ult i32 %1, 7
3104; EPILOG-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %preheader.new
3105; EPILOG:       preheader.new:
3106; EPILOG-NEXT:    %unroll_iter = sub i32 %0, %xtraiter
3107; EPILOG-NEXT:    br label %header
3108; EPILOG:       header:
3109; EPILOG-NEXT:    %i4 = phi i32 [ 0, %preheader.new ], [ %inc.7, %latch.7 ]
3110; EPILOG-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ]
3111; EPILOG-NEXT:    %inc = add nuw nsw i32 %i4, 1
3112; EPILOG-NEXT:    %cmp1 = icmp ult i32 %inc, %N
3113; EPILOG-NEXT:    br i1 %cmp1, label %latch, label %latchExit.epilog-lcssa.loopexit
3114; EPILOG:       latch:
3115; EPILOG-NEXT:    %niter.next = add nuw nsw i32 %niter, 1
3116; EPILOG-NEXT:    %inc.1 = add nuw nsw i32 %inc, 1
3117; EPILOG-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N
3118; EPILOG-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.epilog-lcssa.loopexit
3119; EPILOG:       latch.1:
3120; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i32 %niter.next, 1
3121; EPILOG-NEXT:    %inc.2 = add nuw nsw i32 %inc.1, 1
3122; EPILOG-NEXT:    %cmp1.2 = icmp ult i32 %inc.2, %N
3123; EPILOG-NEXT:    br i1 %cmp1.2, label %latch.2, label %latchExit.epilog-lcssa.loopexit
3124; EPILOG:       latch.2:
3125; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i32 %niter.next.1, 1
3126; EPILOG-NEXT:    %inc.3 = add nuw nsw i32 %inc.2, 1
3127; EPILOG-NEXT:    %cmp1.3 = icmp ult i32 %inc.3, %N
3128; EPILOG-NEXT:    br i1 %cmp1.3, label %latch.3, label %latchExit.epilog-lcssa.loopexit
3129; EPILOG:       latch.3:
3130; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i32 %niter.next.2, 1
3131; EPILOG-NEXT:    %inc.4 = add nuw nsw i32 %inc.3, 1
3132; EPILOG-NEXT:    %cmp1.4 = icmp ult i32 %inc.4, %N
3133; EPILOG-NEXT:    br i1 %cmp1.4, label %latch.4, label %latchExit.epilog-lcssa.loopexit
3134; EPILOG:       latch.4:
3135; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i32 %niter.next.3, 1
3136; EPILOG-NEXT:    %inc.5 = add nuw nsw i32 %inc.4, 1
3137; EPILOG-NEXT:    %cmp1.5 = icmp ult i32 %inc.5, %N
3138; EPILOG-NEXT:    br i1 %cmp1.5, label %latch.5, label %latchExit.epilog-lcssa.loopexit
3139; EPILOG:       latch.5:
3140; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i32 %niter.next.4, 1
3141; EPILOG-NEXT:    %inc.6 = add nuw nsw i32 %inc.5, 1
3142; EPILOG-NEXT:    %cmp1.6 = icmp ult i32 %inc.6, %N
3143; EPILOG-NEXT:    br i1 %cmp1.6, label %latch.6, label %latchExit.epilog-lcssa.loopexit
3144; EPILOG:       latch.6:
3145; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i32 %niter.next.5, 1
3146; EPILOG-NEXT:    %inc.7 = add nuw i32 %inc.6, 1
3147; EPILOG-NEXT:    %cmp1.7 = icmp ult i32 %inc.7, %N
3148; EPILOG-NEXT:    br i1 %cmp1.7, label %latch.7, label %latchExit.epilog-lcssa.loopexit
3149; EPILOG:       latch.7:
3150; EPILOG-NEXT:    %niter.next.7 = add i32 %niter.next.6, 1
3151; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i32 %niter.next.7, %unroll_iter
3152; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %latchExit.unr-lcssa.loopexit
3153; EPILOG:       latchExit.unr-lcssa.loopexit:
3154; EPILOG-NEXT:    %i2.ph.ph.ph = phi i32 [ -1, %latch.7 ]
3155; EPILOG-NEXT:    %i4.unr.ph = phi i32 [ %inc.7, %latch.7 ]
3156; EPILOG-NEXT:    br label %latchExit.unr-lcssa
3157; EPILOG:       latchExit.unr-lcssa:
3158; EPILOG-NEXT:    %i2.ph.ph = phi i32 [ undef, %preheader ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ]
3159; EPILOG-NEXT:    %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %latchExit.unr-lcssa.loopexit ]
3160; EPILOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
3161; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
3162; EPILOG:       header.epil.preheader:
3163; EPILOG-NEXT:    br label %header.epil
3164; EPILOG:       header.epil:
3165; EPILOG-NEXT:    %i4.epil = phi i32 [ %inc.epil, %latch.epil ], [ %i4.unr, %header.epil.preheader ]
3166; EPILOG-NEXT:    %epil.iter = phi i32 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
3167; EPILOG-NEXT:    %inc.epil = add nuw i32 %i4.epil, 1
3168; EPILOG-NEXT:    %cmp1.epil = icmp ult i32 %inc.epil, %N
3169; EPILOG-NEXT:    br i1 %cmp1.epil, label %latch.epil, label %latchExit.epilog-lcssa.loopexit2
3170; EPILOG:       latch.epil:
3171; EPILOG-NEXT:    %cmp.epil = icmp ult i32 %inc.epil, %M.shifted
3172; EPILOG-NEXT:    %epil.iter.next = add i32 %epil.iter, 1
3173; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i32 %epil.iter.next, %xtraiter
3174; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit2, !llvm.loop !8
3175; EPILOG:       latchExit.epilog-lcssa.loopexit:
3176; 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 ]
3177; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
3178; EPILOG:       latchExit.epilog-lcssa.loopexit2:
3179; EPILOG-NEXT:    %i2.ph.ph1.ph3 = phi i32 [ %i4.epil, %header.epil ], [ -1, %latch.epil ]
3180; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
3181; EPILOG:       latchExit.epilog-lcssa:
3182; EPILOG-NEXT:    %i2.ph.ph1 = phi i32 [ %i2.ph.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %i2.ph.ph1.ph3, %latchExit.epilog-lcssa.loopexit2 ]
3183; EPILOG-NEXT:    br label %latchExit
3184; EPILOG:       latchExit:
3185; EPILOG-NEXT:    %i2.ph = phi i32 [ %i2.ph.ph, %latchExit.unr-lcssa ], [ %i2.ph.ph1, %latchExit.epilog-lcssa ]
3186; EPILOG-NEXT:    ret void
3187;
3188; EPILOG-BLOCK-LABEL: @unique_exit(
3189; EPILOG-BLOCK-NEXT:  preheader:
3190; EPILOG-BLOCK-NEXT:    %M.shifted = shl i32 %M, 3
3191; EPILOG-BLOCK-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1)
3192; EPILOG-BLOCK-NEXT:    %0 = freeze i32 %umax
3193; EPILOG-BLOCK-NEXT:    %1 = add i32 %0, -1
3194; EPILOG-BLOCK-NEXT:    %xtraiter = and i32 %0, 1
3195; EPILOG-BLOCK-NEXT:    %2 = icmp ult i32 %1, 1
3196; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %preheader.new
3197; EPILOG-BLOCK:       preheader.new:
3198; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i32 %0, %xtraiter
3199; EPILOG-BLOCK-NEXT:    br label %header
3200; EPILOG-BLOCK:       header:
3201; EPILOG-BLOCK-NEXT:    %i4 = phi i32 [ 0, %preheader.new ], [ %inc.1, %latch.1 ]
3202; EPILOG-BLOCK-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ]
3203; EPILOG-BLOCK-NEXT:    %inc = add nuw nsw i32 %i4, 1
3204; EPILOG-BLOCK-NEXT:    %cmp1 = icmp ult i32 %inc, %N
3205; EPILOG-BLOCK-NEXT:    br i1 %cmp1, label %latch, label %latchExit.epilog-lcssa.loopexit
3206; EPILOG-BLOCK:       latch:
3207; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i32 %niter, 1
3208; EPILOG-BLOCK-NEXT:    %inc.1 = add nuw i32 %inc, 1
3209; EPILOG-BLOCK-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N
3210; EPILOG-BLOCK-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.epilog-lcssa.loopexit
3211; EPILOG-BLOCK:       latch.1:
3212; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i32 %niter.next, 1
3213; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i32 %niter.next.1, %unroll_iter
3214; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %latchExit.unr-lcssa.loopexit, !llvm.loop !8
3215; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
3216; EPILOG-BLOCK-NEXT:    %i2.ph.ph.ph = phi i32 [ -1, %latch.1 ]
3217; EPILOG-BLOCK-NEXT:    %i4.unr.ph = phi i32 [ %inc.1, %latch.1 ]
3218; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
3219; EPILOG-BLOCK:       latchExit.unr-lcssa:
3220; EPILOG-BLOCK-NEXT:    %i2.ph.ph = phi i32 [ undef, %preheader ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ]
3221; EPILOG-BLOCK-NEXT:    %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %latchExit.unr-lcssa.loopexit ]
3222; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
3223; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
3224; EPILOG-BLOCK:       header.epil.preheader:
3225; EPILOG-BLOCK-NEXT:    br label %header.epil
3226; EPILOG-BLOCK:       header.epil:
3227; EPILOG-BLOCK-NEXT:    %inc.epil = add nuw i32 %i4.unr, 1
3228; EPILOG-BLOCK-NEXT:    %cmp1.epil = icmp ult i32 %inc.epil, %N
3229; EPILOG-BLOCK-NEXT:    br i1 %cmp1.epil, label %latch.epil, label %latchExit.epilog-lcssa
3230; EPILOG-BLOCK:       latch.epil:
3231; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
3232; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
3233; EPILOG-BLOCK-NEXT:    %i2.ph.ph1.ph = phi i32 [ %i4, %header ], [ %inc, %latch ]
3234; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
3235; EPILOG-BLOCK:       latchExit.epilog-lcssa:
3236; EPILOG-BLOCK-NEXT:    %i2.ph.ph1 = phi i32 [ -1, %latch.epil ], [ %i4.unr, %header.epil ], [ %i2.ph.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
3237; EPILOG-BLOCK-NEXT:    br label %latchExit
3238; EPILOG-BLOCK:       latchExit:
3239; EPILOG-BLOCK-NEXT:    %i2.ph = phi i32 [ %i2.ph.ph, %latchExit.unr-lcssa ], [ %i2.ph.ph1, %latchExit.epilog-lcssa ]
3240; EPILOG-BLOCK-NEXT:    ret void
3241;
3242; PROLOG-LABEL: @unique_exit(
3243; PROLOG-NEXT:  preheader:
3244; PROLOG-NEXT:    %M.shifted = shl i32 %M, 3
3245; PROLOG-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1)
3246; PROLOG-NEXT:    %0 = freeze i32 %umax
3247; PROLOG-NEXT:    %1 = add i32 %0, -1
3248; PROLOG-NEXT:    %xtraiter = and i32 %0, 7
3249; PROLOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
3250; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
3251; PROLOG:       header.prol.preheader:
3252; PROLOG-NEXT:    br label %header.prol
3253; PROLOG:       header.prol:
3254; PROLOG-NEXT:    %i4.prol = phi i32 [ %inc.prol, %latch.prol ], [ 0, %header.prol.preheader ]
3255; PROLOG-NEXT:    %prol.iter = phi i32 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
3256; PROLOG-NEXT:    %inc.prol = add nuw i32 %i4.prol, 1
3257; PROLOG-NEXT:    %cmp1.prol = icmp ult i32 %inc.prol, %N
3258; PROLOG-NEXT:    br i1 %cmp1.prol, label %latch.prol, label %latchExit.unr-lcssa.loopexit1
3259; PROLOG:       latch.prol:
3260; PROLOG-NEXT:    %cmp.prol = icmp ult i32 %inc.prol, %M.shifted
3261; PROLOG-NEXT:    %prol.iter.next = add i32 %prol.iter, 1
3262; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i32 %prol.iter.next, %xtraiter
3263; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !8
3264; PROLOG:       header.prol.loopexit.unr-lcssa:
3265; PROLOG-NEXT:    %i4.unr.ph = phi i32 [ %inc.prol, %latch.prol ]
3266; PROLOG-NEXT:    %i2.ph.unr.ph = phi i32 [ -1, %latch.prol ]
3267; PROLOG-NEXT:    br label %header.prol.loopexit
3268; PROLOG:       header.prol.loopexit:
3269; PROLOG-NEXT:    %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %header.prol.loopexit.unr-lcssa ]
3270; PROLOG-NEXT:    %i2.ph.unr = phi i32 [ undef, %preheader ], [ %i2.ph.unr.ph, %header.prol.loopexit.unr-lcssa ]
3271; PROLOG-NEXT:    %2 = icmp ult i32 %1, 7
3272; PROLOG-NEXT:    br i1 %2, label %latchExit, label %preheader.new
3273; PROLOG:       preheader.new:
3274; PROLOG-NEXT:    br label %header
3275; PROLOG:       header:
3276; PROLOG-NEXT:    %i4 = phi i32 [ %i4.unr, %preheader.new ], [ %inc.7, %latch.7 ]
3277; PROLOG-NEXT:    %inc = add nuw i32 %i4, 1
3278; PROLOG-NEXT:    %cmp1 = icmp ult i32 %inc, %N
3279; PROLOG-NEXT:    br i1 %cmp1, label %latch, label %latchExit.unr-lcssa.loopexit
3280; PROLOG:       latch:
3281; PROLOG-NEXT:    %inc.1 = add nuw i32 %inc, 1
3282; PROLOG-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N
3283; PROLOG-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.unr-lcssa.loopexit
3284; PROLOG:       latch.1:
3285; PROLOG-NEXT:    %inc.2 = add nuw i32 %inc.1, 1
3286; PROLOG-NEXT:    %cmp1.2 = icmp ult i32 %inc.2, %N
3287; PROLOG-NEXT:    br i1 %cmp1.2, label %latch.2, label %latchExit.unr-lcssa.loopexit
3288; PROLOG:       latch.2:
3289; PROLOG-NEXT:    %inc.3 = add nuw i32 %inc.2, 1
3290; PROLOG-NEXT:    %cmp1.3 = icmp ult i32 %inc.3, %N
3291; PROLOG-NEXT:    br i1 %cmp1.3, label %latch.3, label %latchExit.unr-lcssa.loopexit
3292; PROLOG:       latch.3:
3293; PROLOG-NEXT:    %inc.4 = add nuw i32 %inc.3, 1
3294; PROLOG-NEXT:    %cmp1.4 = icmp ult i32 %inc.4, %N
3295; PROLOG-NEXT:    br i1 %cmp1.4, label %latch.4, label %latchExit.unr-lcssa.loopexit
3296; PROLOG:       latch.4:
3297; PROLOG-NEXT:    %inc.5 = add nuw i32 %inc.4, 1
3298; PROLOG-NEXT:    %cmp1.5 = icmp ult i32 %inc.5, %N
3299; PROLOG-NEXT:    br i1 %cmp1.5, label %latch.5, label %latchExit.unr-lcssa.loopexit
3300; PROLOG:       latch.5:
3301; PROLOG-NEXT:    %inc.6 = add nuw i32 %inc.5, 1
3302; PROLOG-NEXT:    %cmp1.6 = icmp ult i32 %inc.6, %N
3303; PROLOG-NEXT:    br i1 %cmp1.6, label %latch.6, label %latchExit.unr-lcssa.loopexit
3304; PROLOG:       latch.6:
3305; PROLOG-NEXT:    %inc.7 = add nuw i32 %inc.6, 1
3306; PROLOG-NEXT:    %cmp1.7 = icmp ult i32 %inc.7, %N
3307; PROLOG-NEXT:    br i1 %cmp1.7, label %latch.7, label %latchExit.unr-lcssa.loopexit
3308; PROLOG:       latch.7:
3309; PROLOG-NEXT:    %cmp.7 = icmp ult i32 %inc.7, %M.shifted
3310; PROLOG-NEXT:    br i1 %cmp.7, label %header, label %latchExit.unr-lcssa.loopexit
3311; PROLOG:       latchExit.unr-lcssa.loopexit:
3312; 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 ]
3313; PROLOG-NEXT:    br label %latchExit.unr-lcssa
3314; PROLOG:       latchExit.unr-lcssa.loopexit1:
3315; PROLOG-NEXT:    %i2.ph.ph.ph2 = phi i32 [ %i4.prol, %header.prol ]
3316; PROLOG-NEXT:    br label %latchExit.unr-lcssa
3317; PROLOG:       latchExit.unr-lcssa:
3318; PROLOG-NEXT:    %i2.ph.ph = phi i32 [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %i2.ph.ph.ph2, %latchExit.unr-lcssa.loopexit1 ]
3319; PROLOG-NEXT:    br label %latchExit
3320; PROLOG:       latchExit:
3321; PROLOG-NEXT:    %i2.ph = phi i32 [ %i2.ph.unr, %header.prol.loopexit ], [ %i2.ph.ph, %latchExit.unr-lcssa ]
3322; PROLOG-NEXT:    ret void
3323;
3324; PROLOG-BLOCK-LABEL: @unique_exit(
3325; PROLOG-BLOCK-NEXT:  preheader:
3326; PROLOG-BLOCK-NEXT:    %M.shifted = shl i32 %M, 3
3327; PROLOG-BLOCK-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1)
3328; PROLOG-BLOCK-NEXT:    %0 = freeze i32 %umax
3329; PROLOG-BLOCK-NEXT:    %1 = add i32 %0, -1
3330; PROLOG-BLOCK-NEXT:    %xtraiter = and i32 %0, 1
3331; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
3332; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
3333; PROLOG-BLOCK:       header.prol.preheader:
3334; PROLOG-BLOCK-NEXT:    br label %header.prol
3335; PROLOG-BLOCK:       header.prol:
3336; PROLOG-BLOCK-NEXT:    %cmp1.prol = icmp ult i32 1, %N
3337; PROLOG-BLOCK-NEXT:    br i1 %cmp1.prol, label %latch.prol, label %latchExit.unr-lcssa
3338; PROLOG-BLOCK:       latch.prol:
3339; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
3340; PROLOG-BLOCK:       header.prol.loopexit:
3341; PROLOG-BLOCK-NEXT:    %i4.unr = phi i32 [ 0, %preheader ], [ 1, %latch.prol ]
3342; PROLOG-BLOCK-NEXT:    %i2.ph.unr = phi i32 [ undef, %preheader ], [ -1, %latch.prol ]
3343; PROLOG-BLOCK-NEXT:    %2 = icmp ult i32 %1, 1
3344; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchExit, label %preheader.new
3345; PROLOG-BLOCK:       preheader.new:
3346; PROLOG-BLOCK-NEXT:    br label %header
3347; PROLOG-BLOCK:       header:
3348; PROLOG-BLOCK-NEXT:    %i4 = phi i32 [ %i4.unr, %preheader.new ], [ %inc.1, %latch.1 ]
3349; PROLOG-BLOCK-NEXT:    %inc = add nuw i32 %i4, 1
3350; PROLOG-BLOCK-NEXT:    %cmp1 = icmp ult i32 %inc, %N
3351; PROLOG-BLOCK-NEXT:    br i1 %cmp1, label %latch, label %latchExit.unr-lcssa.loopexit
3352; PROLOG-BLOCK:       latch:
3353; PROLOG-BLOCK-NEXT:    %inc.1 = add nuw i32 %inc, 1
3354; PROLOG-BLOCK-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N
3355; PROLOG-BLOCK-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.unr-lcssa.loopexit
3356; PROLOG-BLOCK:       latch.1:
3357; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ult i32 %inc.1, %M.shifted
3358; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %header, label %latchExit.unr-lcssa.loopexit, !llvm.loop !8
3359; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
3360; PROLOG-BLOCK-NEXT:    %i2.ph.ph.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ -1, %latch.1 ]
3361; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
3362; PROLOG-BLOCK:       latchExit.unr-lcssa:
3363; PROLOG-BLOCK-NEXT:    %i2.ph.ph = phi i32 [ 0, %header.prol ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ]
3364; PROLOG-BLOCK-NEXT:    br label %latchExit
3365; PROLOG-BLOCK:       latchExit:
3366; PROLOG-BLOCK-NEXT:    %i2.ph = phi i32 [ %i2.ph.unr, %header.prol.loopexit ], [ %i2.ph.ph, %latchExit.unr-lcssa ]
3367; PROLOG-BLOCK-NEXT:    ret void
3368;
3369
3370preheader:
3371  %M.shifted = shl nuw i32 %M, 3
3372  br label %header
3373
3374header:                                           ; preds = %preheader, %latch
3375  %i4 = phi i32 [ %inc, %latch ], [ 0, %preheader ]
3376  %inc = add nuw i32 %i4, 1
3377  %cmp1 = icmp ult i32 %inc, %N
3378  br i1 %cmp1, label %latch, label %latchExit
3379
3380latch:                                            ; preds = %header
3381  %cmp = icmp ult i32 %inc, %M.shifted
3382  br i1 %cmp, label %header, label %latchExit
3383
3384latchExit:                                ; preds = %header, %latch
3385  %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ]
3386  ret void
3387}
3388
3389
3390; two exiting and two exit blocks.
3391; the non-latch exiting block has duplicate edges to the non-latch exit block.
3392define i64 @test5(i64 %trip, i64 %add, i1 %cond) {
3393; EPILOG-LABEL: @test5(
3394; EPILOG-NEXT:  entry:
3395; EPILOG-NEXT:    %0 = freeze i64 %trip
3396; EPILOG-NEXT:    %1 = add i64 %0, -1
3397; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
3398; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
3399; EPILOG-NEXT:    br i1 %2, label %latchexit.unr-lcssa, label %entry.new
3400; EPILOG:       entry.new:
3401; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
3402; EPILOG-NEXT:    br label %loop_header
3403; EPILOG:       loop_header:
3404; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
3405; EPILOG-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
3406; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
3407; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3408; EPILOG:       loop_exiting:
3409; EPILOG-NEXT:    %ivy = add i64 %iv, %add
3410; EPILOG-NEXT:    switch i64 %sum, label %loop_latch [
3411; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3412; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3413; EPILOG-NEXT:    ]
3414; EPILOG:       loop_latch:
3415; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3416; EPILOG-NEXT:    %sum.next = add i64 %sum, %add
3417; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
3418; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3419; EPILOG:       loop_exiting.1:
3420; EPILOG-NEXT:    %ivy.1 = add i64 %iv_next, %add
3421; EPILOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3422; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3423; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3424; EPILOG-NEXT:    ]
3425; EPILOG:       loop_latch.1:
3426; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3427; EPILOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3428; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
3429; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.2
3430; EPILOG:       loop_exiting.2:
3431; EPILOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add
3432; EPILOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
3433; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3434; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3435; EPILOG-NEXT:    ]
3436; EPILOG:       loop_latch.2:
3437; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
3438; EPILOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
3439; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
3440; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.3
3441; EPILOG:       loop_exiting.3:
3442; EPILOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add
3443; EPILOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
3444; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3445; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3446; EPILOG-NEXT:    ]
3447; EPILOG:       loop_latch.3:
3448; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
3449; EPILOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
3450; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
3451; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.4
3452; EPILOG:       loop_exiting.4:
3453; EPILOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add
3454; EPILOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
3455; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3456; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3457; EPILOG-NEXT:    ]
3458; EPILOG:       loop_latch.4:
3459; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
3460; EPILOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
3461; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
3462; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.5
3463; EPILOG:       loop_exiting.5:
3464; EPILOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add
3465; EPILOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
3466; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3467; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3468; EPILOG-NEXT:    ]
3469; EPILOG:       loop_latch.5:
3470; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
3471; EPILOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
3472; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
3473; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.6
3474; EPILOG:       loop_exiting.6:
3475; EPILOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add
3476; EPILOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
3477; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3478; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3479; EPILOG-NEXT:    ]
3480; EPILOG:       loop_latch.6:
3481; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
3482; EPILOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
3483; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
3484; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.7
3485; EPILOG:       loop_exiting.7:
3486; EPILOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add
3487; EPILOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
3488; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3489; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3490; EPILOG-NEXT:    ]
3491; EPILOG:       loop_latch.7:
3492; EPILOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
3493; EPILOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
3494; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
3495; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
3496; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %latchexit.unr-lcssa.loopexit
3497; EPILOG:       exit1.loopexit:
3498; 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 ]
3499; EPILOG-NEXT:    br label %exit1
3500; EPILOG:       exit1.loopexit2:
3501; EPILOG-NEXT:    %result.ph3 = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ]
3502; EPILOG-NEXT:    br label %exit1
3503; EPILOG:       exit1:
3504; EPILOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph3, %exit1.loopexit2 ]
3505; EPILOG-NEXT:    ret i64 %result
3506; EPILOG:       latchexit.unr-lcssa.loopexit:
3507; EPILOG-NEXT:    %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3508; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
3509; EPILOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3510; EPILOG-NEXT:    br label %latchexit.unr-lcssa
3511; EPILOG:       latchexit.unr-lcssa:
3512; EPILOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ]
3513; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ]
3514; EPILOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ]
3515; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3516; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit
3517; EPILOG:       loop_header.epil.preheader:
3518; EPILOG-NEXT:    br label %loop_header.epil
3519; EPILOG:       loop_header.epil:
3520; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
3521; EPILOG-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]
3522; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
3523; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil
3524; EPILOG:       loop_exiting.epil:
3525; EPILOG-NEXT:    %ivy.epil = add i64 %iv.epil, %add
3526; EPILOG-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
3527; EPILOG-NEXT:    i64 24, label %exit1.loopexit2
3528; EPILOG-NEXT:    i64 42, label %exit1.loopexit2
3529; EPILOG-NEXT:    ]
3530; EPILOG:       loop_latch.epil:
3531; EPILOG-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
3532; EPILOG-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
3533; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
3534; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
3535; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
3536; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %latchexit.epilog-lcssa, !llvm.loop !9
3537; EPILOG:       latchexit.epilog-lcssa:
3538; EPILOG-NEXT:    %sum.next.lcssa.ph1 = phi i64 [ %sum.next.epil, %loop_latch.epil ]
3539; EPILOG-NEXT:    br label %latchexit
3540; EPILOG:       latchexit:
3541; EPILOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.lcssa.ph1, %latchexit.epilog-lcssa ]
3542; EPILOG-NEXT:    ret i64 %sum.next.lcssa
3543;
3544; EPILOG-BLOCK-LABEL: @test5(
3545; EPILOG-BLOCK-NEXT:  entry:
3546; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
3547; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
3548; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
3549; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
3550; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchexit.unr-lcssa, label %entry.new
3551; EPILOG-BLOCK:       entry.new:
3552; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
3553; EPILOG-BLOCK-NEXT:    br label %loop_header
3554; EPILOG-BLOCK:       loop_header:
3555; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
3556; EPILOG-BLOCK-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
3557; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
3558; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3559; EPILOG-BLOCK:       loop_exiting:
3560; EPILOG-BLOCK-NEXT:    %ivy = add i64 %iv, %add
3561; EPILOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
3562; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3563; EPILOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3564; EPILOG-BLOCK-NEXT:    ]
3565; EPILOG-BLOCK:       loop_latch:
3566; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3567; EPILOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
3568; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
3569; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3570; EPILOG-BLOCK:       loop_exiting.1:
3571; EPILOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add
3572; EPILOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3573; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3574; EPILOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3575; EPILOG-BLOCK-NEXT:    ]
3576; EPILOG-BLOCK:       loop_latch.1:
3577; EPILOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3578; EPILOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3579; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
3580; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
3581; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !9
3582; EPILOG-BLOCK:       exit1.loopexit:
3583; EPILOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]
3584; EPILOG-BLOCK-NEXT:    br label %exit1
3585; EPILOG-BLOCK:       exit1:
3586; EPILOG-BLOCK-NEXT:    %result = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ], [ %result.ph, %exit1.loopexit ]
3587; EPILOG-BLOCK-NEXT:    ret i64 %result
3588; EPILOG-BLOCK:       latchexit.unr-lcssa.loopexit:
3589; EPILOG-BLOCK-NEXT:    %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3590; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
3591; EPILOG-BLOCK-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3592; EPILOG-BLOCK-NEXT:    br label %latchexit.unr-lcssa
3593; EPILOG-BLOCK:       latchexit.unr-lcssa:
3594; EPILOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ]
3595; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ]
3596; EPILOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ]
3597; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3598; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit
3599; EPILOG-BLOCK:       loop_header.epil.preheader:
3600; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
3601; EPILOG-BLOCK:       loop_header.epil:
3602; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil
3603; EPILOG-BLOCK:       loop_exiting.epil:
3604; EPILOG-BLOCK-NEXT:    %ivy.epil = add i64 %iv.unr, %add
3605; EPILOG-BLOCK-NEXT:    switch i64 %sum.unr, label %loop_latch.epil [
3606; EPILOG-BLOCK-NEXT:    i64 24, label %exit1
3607; EPILOG-BLOCK-NEXT:    i64 42, label %exit1
3608; EPILOG-BLOCK-NEXT:    ]
3609; EPILOG-BLOCK:       loop_latch.epil:
3610; EPILOG-BLOCK-NEXT:    %sum.next.epil = add i64 %sum.unr, %add
3611; EPILOG-BLOCK-NEXT:    br label %latchexit
3612; EPILOG-BLOCK:       latchexit:
3613; EPILOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.epil, %loop_latch.epil ]
3614; EPILOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa
3615;
3616; PROLOG-LABEL: @test5(
3617; PROLOG-NEXT:  entry:
3618; PROLOG-NEXT:    %0 = freeze i64 %trip
3619; PROLOG-NEXT:    %1 = add i64 %0, -1
3620; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
3621; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3622; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
3623; PROLOG:       loop_header.prol.preheader:
3624; PROLOG-NEXT:    br label %loop_header.prol
3625; PROLOG:       loop_header.prol:
3626; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
3627; PROLOG-NEXT:    %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ]
3628; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
3629; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol
3630; PROLOG:       loop_exiting.prol:
3631; PROLOG-NEXT:    %ivy.prol = add i64 %iv.prol, %add
3632; PROLOG-NEXT:    switch i64 %sum.prol, label %loop_latch.prol [
3633; PROLOG-NEXT:    i64 24, label %exit1.loopexit1
3634; PROLOG-NEXT:    i64 42, label %exit1.loopexit1
3635; PROLOG-NEXT:    ]
3636; PROLOG:       loop_latch.prol:
3637; PROLOG-NEXT:    %iv_next.prol = add nuw nsw i64 %iv.prol, 1
3638; PROLOG-NEXT:    %sum.next.prol = add i64 %sum.prol, %add
3639; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
3640; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
3641; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
3642; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !9
3643; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
3644; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
3645; PROLOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
3646; PROLOG-NEXT:    %sum.next.lcssa.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
3647; PROLOG-NEXT:    br label %loop_header.prol.loopexit
3648; PROLOG:       loop_header.prol.loopexit:
3649; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
3650; PROLOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
3651; PROLOG-NEXT:    %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %sum.next.lcssa.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
3652; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
3653; PROLOG-NEXT:    br i1 %2, label %latchexit, label %entry.new
3654; PROLOG:       entry.new:
3655; PROLOG-NEXT:    br label %loop_header
3656; PROLOG:       loop_header:
3657; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
3658; PROLOG-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
3659; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3660; PROLOG:       loop_exiting:
3661; PROLOG-NEXT:    %ivy = add i64 %iv, %add
3662; PROLOG-NEXT:    switch i64 %sum, label %loop_latch [
3663; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3664; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3665; PROLOG-NEXT:    ]
3666; PROLOG:       loop_latch:
3667; PROLOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3668; PROLOG-NEXT:    %sum.next = add i64 %sum, %add
3669; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3670; PROLOG:       loop_exiting.1:
3671; PROLOG-NEXT:    %ivy.1 = add i64 %iv_next, %add
3672; PROLOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3673; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3674; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3675; PROLOG-NEXT:    ]
3676; PROLOG:       loop_latch.1:
3677; PROLOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3678; PROLOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3679; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.2
3680; PROLOG:       loop_exiting.2:
3681; PROLOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add
3682; PROLOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
3683; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3684; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3685; PROLOG-NEXT:    ]
3686; PROLOG:       loop_latch.2:
3687; PROLOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
3688; PROLOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
3689; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.3
3690; PROLOG:       loop_exiting.3:
3691; PROLOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add
3692; PROLOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
3693; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3694; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3695; PROLOG-NEXT:    ]
3696; PROLOG:       loop_latch.3:
3697; PROLOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
3698; PROLOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
3699; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.4
3700; PROLOG:       loop_exiting.4:
3701; PROLOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add
3702; PROLOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
3703; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3704; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3705; PROLOG-NEXT:    ]
3706; PROLOG:       loop_latch.4:
3707; PROLOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
3708; PROLOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
3709; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.5
3710; PROLOG:       loop_exiting.5:
3711; PROLOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add
3712; PROLOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
3713; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3714; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3715; PROLOG-NEXT:    ]
3716; PROLOG:       loop_latch.5:
3717; PROLOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
3718; PROLOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
3719; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.6
3720; PROLOG:       loop_exiting.6:
3721; PROLOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add
3722; PROLOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
3723; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3724; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3725; PROLOG-NEXT:    ]
3726; PROLOG:       loop_latch.6:
3727; PROLOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
3728; PROLOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
3729; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.7
3730; PROLOG:       loop_exiting.7:
3731; PROLOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add
3732; PROLOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
3733; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3734; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3735; PROLOG-NEXT:    ]
3736; PROLOG:       loop_latch.7:
3737; PROLOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
3738; PROLOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
3739; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
3740; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %latchexit.unr-lcssa
3741; PROLOG:       exit1.loopexit:
3742; 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 ]
3743; PROLOG-NEXT:    br label %exit1
3744; PROLOG:       exit1.loopexit1:
3745; PROLOG-NEXT:    %result.ph2 = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ]
3746; PROLOG-NEXT:    br label %exit1
3747; PROLOG:       exit1:
3748; PROLOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph2, %exit1.loopexit1 ]
3749; PROLOG-NEXT:    ret i64 %result
3750; PROLOG:       latchexit.unr-lcssa:
3751; PROLOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3752; PROLOG-NEXT:    br label %latchexit
3753; PROLOG:       latchexit:
3754; PROLOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]
3755; PROLOG-NEXT:    ret i64 %sum.next.lcssa
3756;
3757; PROLOG-BLOCK-LABEL: @test5(
3758; PROLOG-BLOCK-NEXT:  entry:
3759; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
3760; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
3761; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
3762; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3763; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
3764; PROLOG-BLOCK:       loop_header.prol.preheader:
3765; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
3766; PROLOG-BLOCK:       loop_header.prol:
3767; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol
3768; PROLOG-BLOCK:       loop_exiting.prol:
3769; PROLOG-BLOCK-NEXT:    switch i64 0, label %loop_latch.prol [
3770; PROLOG-BLOCK-NEXT:    i64 24, label %exit1
3771; PROLOG-BLOCK-NEXT:    i64 42, label %exit1
3772; PROLOG-BLOCK-NEXT:    ]
3773; PROLOG-BLOCK:       loop_latch.prol:
3774; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
3775; PROLOG-BLOCK:       loop_header.prol.loopexit:
3776; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
3777; PROLOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %add, %loop_latch.prol ]
3778; PROLOG-BLOCK-NEXT:    %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %add, %loop_latch.prol ]
3779; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
3780; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchexit, label %entry.new
3781; PROLOG-BLOCK:       entry.new:
3782; PROLOG-BLOCK-NEXT:    br label %loop_header
3783; PROLOG-BLOCK:       loop_header:
3784; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
3785; PROLOG-BLOCK-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
3786; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3787; PROLOG-BLOCK:       loop_exiting:
3788; PROLOG-BLOCK-NEXT:    %ivy = add i64 %iv, %add
3789; PROLOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
3790; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3791; PROLOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3792; PROLOG-BLOCK-NEXT:    ]
3793; PROLOG-BLOCK:       loop_latch:
3794; PROLOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3795; PROLOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
3796; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3797; PROLOG-BLOCK:       loop_exiting.1:
3798; PROLOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add
3799; PROLOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3800; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3801; PROLOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3802; PROLOG-BLOCK-NEXT:    ]
3803; PROLOG-BLOCK:       loop_latch.1:
3804; PROLOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3805; PROLOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3806; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
3807; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %latchexit.unr-lcssa, !llvm.loop !9
3808; PROLOG-BLOCK:       exit1.loopexit:
3809; PROLOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]
3810; PROLOG-BLOCK-NEXT:    br label %exit1
3811; PROLOG-BLOCK:       exit1:
3812; PROLOG-BLOCK-NEXT:    %result = phi i64 [ %add, %loop_exiting.prol ], [ %add, %loop_exiting.prol ], [ %result.ph, %exit1.loopexit ]
3813; PROLOG-BLOCK-NEXT:    ret i64 %result
3814; PROLOG-BLOCK:       latchexit.unr-lcssa:
3815; PROLOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3816; PROLOG-BLOCK-NEXT:    br label %latchexit
3817; PROLOG-BLOCK:       latchexit:
3818; PROLOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]
3819; PROLOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa
3820;
3821
3822entry:
3823  br label %loop_header
3824
3825loop_header:
3826  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
3827  %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ]
3828  br i1 %cond, label %loop_latch, label %loop_exiting
3829
3830loop_exiting:
3831  %ivy = add i64 %iv, %add
3832  switch i64 %sum, label %loop_latch [
3833  i64 24, label %exit1
3834  i64 42, label %exit1
3835  ]
3836
3837loop_latch:
3838  %iv_next = add nuw nsw i64 %iv, 1
3839  %sum.next = add i64 %sum, %add
3840  %cmp = icmp ne i64 %iv_next, %trip
3841  br i1 %cmp, label %loop_header, label %latchexit
3842
3843exit1:
3844  %result = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ]
3845  ret i64 %result
3846
3847latchexit:
3848  ret i64 %sum.next
3849}
3850
3851; test when exit blocks have successors.
3852define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) {
3853; EPILOG-LABEL: @test6(
3854; EPILOG-NEXT:  entry:
3855; EPILOG-NEXT:    %0 = freeze i64 %n
3856; EPILOG-NEXT:    %1 = add i64 %0, -1
3857; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
3858; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
3859; EPILOG-NEXT:    br i1 %2, label %latch_exit.unr-lcssa, label %entry.new
3860; EPILOG:       entry.new:
3861; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
3862; EPILOG-NEXT:    br label %header
3863; EPILOG:       header:
3864; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
3865; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
3866; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
3867; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
3868; EPILOG:       for.exiting_block:
3869; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
3870; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
3871; EPILOG:       latch:
3872; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3873; EPILOG-NEXT:    %load = load i32, i32* %arrayidx, align 4
3874; EPILOG-NEXT:    %add = add nsw i32 %load, %sum.02
3875; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
3876; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
3877; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
3878; EPILOG:       for.exiting_block.1:
3879; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3880; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3881; EPILOG:       latch.1:
3882; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3883; EPILOG-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
3884; EPILOG-NEXT:    %add.1 = add nsw i32 %load.1, %add
3885; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
3886; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
3887; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
3888; EPILOG:       for.exiting_block.2:
3889; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
3890; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
3891; EPILOG:       latch.2:
3892; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
3893; EPILOG-NEXT:    %load.2 = load i32, i32* %arrayidx.2, align 4
3894; EPILOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.1
3895; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
3896; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
3897; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
3898; EPILOG:       for.exiting_block.3:
3899; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
3900; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
3901; EPILOG:       latch.3:
3902; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
3903; EPILOG-NEXT:    %load.3 = load i32, i32* %arrayidx.3, align 4
3904; EPILOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.2
3905; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
3906; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
3907; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
3908; EPILOG:       for.exiting_block.4:
3909; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
3910; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
3911; EPILOG:       latch.4:
3912; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
3913; EPILOG-NEXT:    %load.4 = load i32, i32* %arrayidx.4, align 4
3914; EPILOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.3
3915; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
3916; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
3917; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
3918; EPILOG:       for.exiting_block.5:
3919; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
3920; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
3921; EPILOG:       latch.5:
3922; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
3923; EPILOG-NEXT:    %load.5 = load i32, i32* %arrayidx.5, align 4
3924; EPILOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.4
3925; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
3926; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
3927; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
3928; EPILOG:       for.exiting_block.6:
3929; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
3930; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
3931; EPILOG:       latch.6:
3932; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
3933; EPILOG-NEXT:    %load.6 = load i32, i32* %arrayidx.6, align 4
3934; EPILOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.5
3935; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
3936; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
3937; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
3938; EPILOG:       for.exiting_block.7:
3939; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
3940; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
3941; EPILOG:       latch.7:
3942; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
3943; EPILOG-NEXT:    %load.7 = load i32, i32* %arrayidx.7, align 4
3944; EPILOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.6
3945; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
3946; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
3947; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
3948; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latch_exit.unr-lcssa.loopexit, label %header
3949; EPILOG:       latch_exit.unr-lcssa.loopexit:
3950; EPILOG-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %latch.7 ]
3951; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
3952; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
3953; EPILOG-NEXT:    br label %latch_exit.unr-lcssa
3954; EPILOG:       latch_exit.unr-lcssa:
3955; EPILOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ]
3956; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3957; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3958; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3959; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit
3960; EPILOG:       header.epil.preheader:
3961; EPILOG-NEXT:    br label %header.epil
3962; EPILOG:       header.epil:
3963; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
3964; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
3965; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
3966; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil
3967; EPILOG:       for.exiting_block.epil:
3968; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
3969; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit2, label %latch.epil
3970; EPILOG:       latch.epil:
3971; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
3972; EPILOG-NEXT:    %load.epil = load i32, i32* %arrayidx.epil, align 4
3973; EPILOG-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.epil
3974; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
3975; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
3976; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
3977; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
3978; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latch_exit.epilog-lcssa, !llvm.loop !10
3979; EPILOG:       latch_exit.epilog-lcssa:
3980; EPILOG-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %latch.epil ]
3981; EPILOG-NEXT:    br label %latch_exit
3982; EPILOG:       latch_exit:
3983; EPILOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %sum.0.lcssa.ph1, %latch_exit.epilog-lcssa ]
3984; EPILOG-NEXT:    ret i32 %sum.0.lcssa
3985; EPILOG:       for.exit2.loopexit:
3986; 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 ]
3987; EPILOG-NEXT:    br label %for.exit2
3988; EPILOG:       for.exit2.loopexit2:
3989; EPILOG-NEXT:    %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
3990; EPILOG-NEXT:    br label %for.exit2
3991; EPILOG:       for.exit2:
3992; EPILOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
3993; EPILOG-NEXT:    %addx = add i32 %retval, %x
3994; EPILOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3995; EPILOG:       exit_true:
3996; EPILOG-NEXT:    ret i32 %retval
3997; EPILOG:       exit_false:
3998; EPILOG-NEXT:    ret i32 %addx
3999;
4000; EPILOG-BLOCK-LABEL: @test6(
4001; EPILOG-BLOCK-NEXT:  entry:
4002; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n
4003; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
4004; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4005; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4006; EPILOG-BLOCK-NEXT:    br i1 %2, label %latch_exit.unr-lcssa, label %entry.new
4007; EPILOG-BLOCK:       entry.new:
4008; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
4009; EPILOG-BLOCK-NEXT:    br label %header
4010; EPILOG-BLOCK:       header:
4011; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
4012; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
4013; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
4014; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
4015; EPILOG-BLOCK:       for.exiting_block:
4016; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
4017; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
4018; EPILOG-BLOCK:       latch:
4019; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
4020; EPILOG-BLOCK-NEXT:    %load = load i32, i32* %arrayidx, align 4
4021; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %load, %sum.02
4022; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
4023; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
4024; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
4025; EPILOG-BLOCK:       for.exiting_block.1:
4026; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
4027; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
4028; EPILOG-BLOCK:       latch.1:
4029; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
4030; EPILOG-BLOCK-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
4031; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add
4032; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
4033; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
4034; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
4035; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latch_exit.unr-lcssa.loopexit, label %header, !llvm.loop !10
4036; EPILOG-BLOCK:       latch_exit.unr-lcssa.loopexit:
4037; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %latch.1 ]
4038; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
4039; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
4040; EPILOG-BLOCK-NEXT:    br label %latch_exit.unr-lcssa
4041; EPILOG-BLOCK:       latch_exit.unr-lcssa:
4042; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ]
4043; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ]
4044; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ]
4045; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4046; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit
4047; EPILOG-BLOCK:       header.epil.preheader:
4048; EPILOG-BLOCK-NEXT:    br label %header.epil
4049; EPILOG-BLOCK:       header.epil:
4050; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.epil
4051; EPILOG-BLOCK:       for.exiting_block.epil:
4052; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
4053; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %latch.epil
4054; EPILOG-BLOCK:       latch.epil:
4055; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
4056; EPILOG-BLOCK-NEXT:    %load.epil = load i32, i32* %arrayidx.epil, align 4
4057; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.unr
4058; EPILOG-BLOCK-NEXT:    br label %latch_exit
4059; EPILOG-BLOCK:       latch_exit:
4060; EPILOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %add.epil, %latch.epil ]
4061; EPILOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
4062; EPILOG-BLOCK:       for.exit2.loopexit:
4063; EPILOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]
4064; EPILOG-BLOCK-NEXT:    br label %for.exit2
4065; EPILOG-BLOCK:       for.exit2:
4066; EPILOG-BLOCK-NEXT:    %retval = phi i32 [ %sum.02.unr, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ]
4067; EPILOG-BLOCK-NEXT:    %addx = add i32 %retval, %x
4068; EPILOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false
4069; EPILOG-BLOCK:       exit_true:
4070; EPILOG-BLOCK-NEXT:    ret i32 %retval
4071; EPILOG-BLOCK:       exit_false:
4072; EPILOG-BLOCK-NEXT:    ret i32 %addx
4073;
4074; PROLOG-LABEL: @test6(
4075; PROLOG-NEXT:  entry:
4076; PROLOG-NEXT:    %0 = freeze i64 %n
4077; PROLOG-NEXT:    %1 = add i64 %0, -1
4078; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
4079; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4080; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4081; PROLOG:       header.prol.preheader:
4082; PROLOG-NEXT:    br label %header.prol
4083; PROLOG:       header.prol:
4084; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
4085; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
4086; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
4087; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol
4088; PROLOG:       for.exiting_block.prol:
4089; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
4090; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit1, label %latch.prol
4091; PROLOG:       latch.prol:
4092; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
4093; PROLOG-NEXT:    %load.prol = load i32, i32* %arrayidx.prol, align 4
4094; PROLOG-NEXT:    %add.prol = add nsw i32 %load.prol, %sum.02.prol
4095; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
4096; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
4097; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
4098; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
4099; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !10
4100; PROLOG:       header.prol.loopexit.unr-lcssa:
4101; PROLOG-NEXT:    %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %latch.prol ]
4102; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
4103; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
4104; PROLOG-NEXT:    br label %header.prol.loopexit
4105; PROLOG:       header.prol.loopexit:
4106; PROLOG-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ]
4107; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
4108; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
4109; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
4110; PROLOG-NEXT:    br i1 %2, label %latch_exit, label %entry.new
4111; PROLOG:       entry.new:
4112; PROLOG-NEXT:    br label %header
4113; PROLOG:       header:
4114; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
4115; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
4116; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
4117; PROLOG:       for.exiting_block:
4118; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
4119; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
4120; PROLOG:       latch:
4121; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
4122; PROLOG-NEXT:    %load = load i32, i32* %arrayidx, align 4
4123; PROLOG-NEXT:    %add = add nsw i32 %load, %sum.02
4124; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
4125; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
4126; PROLOG:       for.exiting_block.1:
4127; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
4128; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
4129; PROLOG:       latch.1:
4130; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
4131; PROLOG-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
4132; PROLOG-NEXT:    %add.1 = add nsw i32 %load.1, %add
4133; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
4134; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
4135; PROLOG:       for.exiting_block.2:
4136; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
4137; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
4138; PROLOG:       latch.2:
4139; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
4140; PROLOG-NEXT:    %load.2 = load i32, i32* %arrayidx.2, align 4
4141; PROLOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.1
4142; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
4143; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
4144; PROLOG:       for.exiting_block.3:
4145; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
4146; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
4147; PROLOG:       latch.3:
4148; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
4149; PROLOG-NEXT:    %load.3 = load i32, i32* %arrayidx.3, align 4
4150; PROLOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.2
4151; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
4152; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
4153; PROLOG:       for.exiting_block.4:
4154; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
4155; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
4156; PROLOG:       latch.4:
4157; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
4158; PROLOG-NEXT:    %load.4 = load i32, i32* %arrayidx.4, align 4
4159; PROLOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.3
4160; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
4161; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
4162; PROLOG:       for.exiting_block.5:
4163; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
4164; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
4165; PROLOG:       latch.5:
4166; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
4167; PROLOG-NEXT:    %load.5 = load i32, i32* %arrayidx.5, align 4
4168; PROLOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.4
4169; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
4170; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
4171; PROLOG:       for.exiting_block.6:
4172; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
4173; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
4174; PROLOG:       latch.6:
4175; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
4176; PROLOG-NEXT:    %load.6 = load i32, i32* %arrayidx.6, align 4
4177; PROLOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.5
4178; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
4179; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
4180; PROLOG:       for.exiting_block.7:
4181; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
4182; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
4183; PROLOG:       latch.7:
4184; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
4185; PROLOG-NEXT:    %load.7 = load i32, i32* %arrayidx.7, align 4
4186; PROLOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.6
4187; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
4188; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
4189; PROLOG-NEXT:    br i1 %exitcond.7, label %latch_exit.unr-lcssa, label %header
4190; PROLOG:       latch_exit.unr-lcssa:
4191; PROLOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %latch.7 ]
4192; PROLOG-NEXT:    br label %latch_exit
4193; PROLOG:       latch_exit:
4194; PROLOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]
4195; PROLOG-NEXT:    ret i32 %sum.0.lcssa
4196; PROLOG:       for.exit2.loopexit:
4197; 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 ]
4198; PROLOG-NEXT:    br label %for.exit2
4199; PROLOG:       for.exit2.loopexit1:
4200; PROLOG-NEXT:    %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
4201; PROLOG-NEXT:    br label %for.exit2
4202; PROLOG:       for.exit2:
4203; PROLOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
4204; PROLOG-NEXT:    %addx = add i32 %retval, %x
4205; PROLOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false
4206; PROLOG:       exit_true:
4207; PROLOG-NEXT:    ret i32 %retval
4208; PROLOG:       exit_false:
4209; PROLOG-NEXT:    ret i32 %addx
4210;
4211; PROLOG-BLOCK-LABEL: @test6(
4212; PROLOG-BLOCK-NEXT:  entry:
4213; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n
4214; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
4215; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4216; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4217; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4218; PROLOG-BLOCK:       header.prol.preheader:
4219; PROLOG-BLOCK-NEXT:    br label %header.prol
4220; PROLOG-BLOCK:       header.prol:
4221; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.prol
4222; PROLOG-BLOCK:       for.exiting_block.prol:
4223; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
4224; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %latch.prol
4225; PROLOG-BLOCK:       latch.prol:
4226; PROLOG-BLOCK-NEXT:    %load.prol = load i32, i32* %a, align 4
4227; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
4228; PROLOG-BLOCK:       header.prol.loopexit:
4229; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %load.prol, %latch.prol ]
4230; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
4231; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %load.prol, %latch.prol ]
4232; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4233; PROLOG-BLOCK-NEXT:    br i1 %2, label %latch_exit, label %entry.new
4234; PROLOG-BLOCK:       entry.new:
4235; PROLOG-BLOCK-NEXT:    br label %header
4236; PROLOG-BLOCK:       header:
4237; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
4238; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
4239; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
4240; PROLOG-BLOCK:       for.exiting_block:
4241; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
4242; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
4243; PROLOG-BLOCK:       latch:
4244; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
4245; PROLOG-BLOCK-NEXT:    %load = load i32, i32* %arrayidx, align 4
4246; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %load, %sum.02
4247; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
4248; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
4249; PROLOG-BLOCK:       for.exiting_block.1:
4250; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
4251; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
4252; PROLOG-BLOCK:       latch.1:
4253; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
4254; PROLOG-BLOCK-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
4255; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add
4256; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
4257; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
4258; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latch_exit.unr-lcssa, label %header, !llvm.loop !10
4259; PROLOG-BLOCK:       latch_exit.unr-lcssa:
4260; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %latch.1 ]
4261; PROLOG-BLOCK-NEXT:    br label %latch_exit
4262; PROLOG-BLOCK:       latch_exit:
4263; PROLOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]
4264; PROLOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
4265; PROLOG-BLOCK:       for.exit2.loopexit:
4266; PROLOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]
4267; PROLOG-BLOCK-NEXT:    br label %for.exit2
4268; PROLOG-BLOCK:       for.exit2:
4269; PROLOG-BLOCK-NEXT:    %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ]
4270; PROLOG-BLOCK-NEXT:    %addx = add i32 %retval, %x
4271; PROLOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false
4272; PROLOG-BLOCK:       exit_true:
4273; PROLOG-BLOCK-NEXT:    ret i32 %retval
4274; PROLOG-BLOCK:       exit_false:
4275; PROLOG-BLOCK-NEXT:    ret i32 %addx
4276;
4277
4278entry:
4279  br label %header
4280
4281header:
4282  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
4283  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
4284  br i1 false, label %for.exit2, label %for.exiting_block
4285
4286for.exiting_block:
4287  %cmp = icmp eq i64 %n, 42
4288  br i1 %cmp, label %for.exit2, label %latch
4289
4290latch:
4291  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
4292  %load = load i32, i32* %arrayidx, align 4
4293  %add = add nsw i32 %load, %sum.02
4294  %indvars.iv.next = add i64 %indvars.iv, 1
4295  %exitcond = icmp eq i64 %indvars.iv.next, %n
4296  br i1 %exitcond, label %latch_exit, label %header
4297
4298latch_exit:
4299  %sum.0.lcssa = phi i32 [ %add, %latch ]
4300  ret i32 %sum.0.lcssa
4301
4302for.exit2:
4303  %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ]
4304  %addx = add i32 %retval, %x
4305  br i1 %cond, label %exit_true, label %exit_false
4306
4307exit_true:
4308  ret i32 %retval
4309
4310exit_false:
4311  ret i32 %addx
4312}
4313
4314; test when value in exit block does not have VMap.
4315define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) {
4316; EPILOG-LABEL: @test7(
4317; EPILOG-NEXT:  bb:
4318; EPILOG-NEXT:    %i = icmp slt i32 undef, 2
4319; EPILOG-NEXT:    %sext = sext i32 undef to i64
4320; EPILOG-NEXT:    %shft = ashr exact i32 %arg, 16
4321; EPILOG-NEXT:    br i1 %i, label %loopexit2, label %preheader
4322; EPILOG:       preheader:
4323; EPILOG-NEXT:    %0 = add nsw i64 %sext, -1
4324; EPILOG-NEXT:    %1 = freeze i64 %0
4325; EPILOG-NEXT:    %2 = add i64 %1, -1
4326; EPILOG-NEXT:    %xtraiter = and i64 %1, 7
4327; EPILOG-NEXT:    %3 = icmp ult i64 %2, 7
4328; EPILOG-NEXT:    br i1 %3, label %latchexit.unr-lcssa, label %preheader.new
4329; EPILOG:       preheader.new:
4330; EPILOG-NEXT:    %unroll_iter = sub i64 %1, %xtraiter
4331; EPILOG-NEXT:    br label %header
4332; EPILOG:       header:
4333; EPILOG-NEXT:    %i6 = phi i64 [ 1, %preheader.new ], [ %add.7, %latch.7 ]
4334; EPILOG-NEXT:    %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ]
4335; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4336; EPILOG:       latch:
4337; EPILOG-NEXT:    %add = add nuw nsw i64 %i6, 1
4338; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
4339; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4340; EPILOG:       latch.1:
4341; EPILOG-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4342; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
4343; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.2
4344; EPILOG:       latch.2:
4345; EPILOG-NEXT:    %add.2 = add nuw nsw i64 %add.1, 1
4346; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
4347; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.3
4348; EPILOG:       latch.3:
4349; EPILOG-NEXT:    %add.3 = add nuw nsw i64 %add.2, 1
4350; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
4351; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.4
4352; EPILOG:       latch.4:
4353; EPILOG-NEXT:    %add.4 = add nuw nsw i64 %add.3, 1
4354; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
4355; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.5
4356; EPILOG:       latch.5:
4357; EPILOG-NEXT:    %add.5 = add nuw nsw i64 %add.4, 1
4358; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
4359; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.6
4360; EPILOG:       latch.6:
4361; EPILOG-NEXT:    %add.6 = add nuw nsw i64 %add.5, 1
4362; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
4363; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.7
4364; EPILOG:       latch.7:
4365; EPILOG-NEXT:    %add.7 = add nuw nsw i64 %add.6, 1
4366; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
4367; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
4368; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %latchexit.unr-lcssa.loopexit
4369; EPILOG:       latchexit.unr-lcssa.loopexit:
4370; EPILOG-NEXT:    %i6.unr.ph = phi i64 [ %add.7, %latch.7 ]
4371; EPILOG-NEXT:    br label %latchexit.unr-lcssa
4372; EPILOG:       latchexit.unr-lcssa:
4373; EPILOG-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ]
4374; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4375; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit
4376; EPILOG:       header.epil.preheader:
4377; EPILOG-NEXT:    br label %header.epil
4378; EPILOG:       header.epil:
4379; EPILOG-NEXT:    %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ], [ %add.epil, %latch.epil ]
4380; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
4381; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit1, label %latch.epil
4382; EPILOG:       latch.epil:
4383; EPILOG-NEXT:    %add.epil = add nuw nsw i64 %i6.epil, 1
4384; EPILOG-NEXT:    %i9.epil = icmp slt i64 %add.epil, %sext
4385; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
4386; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
4387; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchexit.epilog-lcssa, !llvm.loop !11
4388; EPILOG:       latchexit.epilog-lcssa:
4389; EPILOG-NEXT:    br label %latchexit
4390; EPILOG:       latchexit:
4391; EPILOG-NEXT:    unreachable
4392; EPILOG:       loopexit2:
4393; EPILOG-NEXT:    ret i32 %shft
4394; EPILOG:       loopexit1.loopexit:
4395; 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 ]
4396; EPILOG-NEXT:    br label %loopexit1
4397; EPILOG:       loopexit1.loopexit1:
4398; EPILOG-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.epil ]
4399; EPILOG-NEXT:    br label %loopexit1
4400; EPILOG:       loopexit1:
4401; EPILOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
4402; EPILOG-NEXT:    ret i32 %sext3
4403;
4404; EPILOG-BLOCK-LABEL: @test7(
4405; EPILOG-BLOCK-NEXT:  bb:
4406; EPILOG-BLOCK-NEXT:    %i = icmp slt i32 undef, 2
4407; EPILOG-BLOCK-NEXT:    %sext = sext i32 undef to i64
4408; EPILOG-BLOCK-NEXT:    %shft = ashr exact i32 %arg, 16
4409; EPILOG-BLOCK-NEXT:    br i1 %i, label %loopexit2, label %preheader
4410; EPILOG-BLOCK:       preheader:
4411; EPILOG-BLOCK-NEXT:    %0 = add nsw i64 %sext, -1
4412; EPILOG-BLOCK-NEXT:    %1 = freeze i64 %0
4413; EPILOG-BLOCK-NEXT:    %2 = add i64 %1, -1
4414; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %1, 1
4415; EPILOG-BLOCK-NEXT:    %3 = icmp ult i64 %2, 1
4416; EPILOG-BLOCK-NEXT:    br i1 %3, label %latchexit.unr-lcssa, label %preheader.new
4417; EPILOG-BLOCK:       preheader.new:
4418; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %1, %xtraiter
4419; EPILOG-BLOCK-NEXT:    br label %header
4420; EPILOG-BLOCK:       header:
4421; EPILOG-BLOCK-NEXT:    %i6 = phi i64 [ 1, %preheader.new ], [ %add.1, %latch.1 ]
4422; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ]
4423; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4424; EPILOG-BLOCK:       latch:
4425; EPILOG-BLOCK-NEXT:    %add = add nuw nsw i64 %i6, 1
4426; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
4427; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4428; EPILOG-BLOCK:       latch.1:
4429; EPILOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4430; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
4431; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
4432; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !11
4433; EPILOG-BLOCK:       latchexit.unr-lcssa.loopexit:
4434; EPILOG-BLOCK-NEXT:    br label %latchexit.unr-lcssa
4435; EPILOG-BLOCK:       latchexit.unr-lcssa:
4436; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4437; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit
4438; EPILOG-BLOCK:       header.epil.preheader:
4439; EPILOG-BLOCK-NEXT:    br label %header.epil
4440; EPILOG-BLOCK:       header.epil:
4441; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1, label %latch.epil
4442; EPILOG-BLOCK:       latch.epil:
4443; EPILOG-BLOCK-NEXT:    br label %latchexit
4444; EPILOG-BLOCK:       latchexit:
4445; EPILOG-BLOCK-NEXT:    unreachable
4446; EPILOG-BLOCK:       loopexit2:
4447; EPILOG-BLOCK-NEXT:    ret i32 %shft
4448; EPILOG-BLOCK:       loopexit1.loopexit:
4449; EPILOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]
4450; EPILOG-BLOCK-NEXT:    br label %loopexit1
4451; EPILOG-BLOCK:       loopexit1:
4452; EPILOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.epil ], [ %sext3.ph, %loopexit1.loopexit ]
4453; EPILOG-BLOCK-NEXT:    ret i32 %sext3
4454;
4455; PROLOG-LABEL: @test7(
4456; PROLOG-NEXT:  bb:
4457; PROLOG-NEXT:    %i = icmp slt i32 undef, 2
4458; PROLOG-NEXT:    %sext = sext i32 undef to i64
4459; PROLOG-NEXT:    %shft = ashr exact i32 %arg, 16
4460; PROLOG-NEXT:    br i1 %i, label %loopexit2, label %preheader
4461; PROLOG:       preheader:
4462; PROLOG-NEXT:    %0 = add nsw i64 %sext, -1
4463; PROLOG-NEXT:    %1 = freeze i64 %0
4464; PROLOG-NEXT:    %2 = add i64 %1, -1
4465; PROLOG-NEXT:    %xtraiter = and i64 %1, 7
4466; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4467; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4468; PROLOG:       header.prol.preheader:
4469; PROLOG-NEXT:    br label %header.prol
4470; PROLOG:       header.prol:
4471; PROLOG-NEXT:    %i6.prol = phi i64 [ 1, %header.prol.preheader ], [ %add.prol, %latch.prol ]
4472; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
4473; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit1, label %latch.prol
4474; PROLOG:       latch.prol:
4475; PROLOG-NEXT:    %add.prol = add nuw nsw i64 %i6.prol, 1
4476; PROLOG-NEXT:    %i9.prol = icmp slt i64 %add.prol, %sext
4477; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
4478; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
4479; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !11
4480; PROLOG:       header.prol.loopexit.unr-lcssa:
4481; PROLOG-NEXT:    %i6.unr.ph = phi i64 [ %add.prol, %latch.prol ]
4482; PROLOG-NEXT:    br label %header.prol.loopexit
4483; PROLOG:       header.prol.loopexit:
4484; PROLOG-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %header.prol.loopexit.unr-lcssa ]
4485; PROLOG-NEXT:    %3 = icmp ult i64 %2, 7
4486; PROLOG-NEXT:    br i1 %3, label %latchexit, label %preheader.new
4487; PROLOG:       preheader.new:
4488; PROLOG-NEXT:    br label %header
4489; PROLOG:       header:
4490; PROLOG-NEXT:    %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.7, %latch.7 ]
4491; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4492; PROLOG:       latch:
4493; PROLOG-NEXT:    %add = add nuw nsw i64 %i6, 1
4494; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4495; PROLOG:       latch.1:
4496; PROLOG-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4497; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.2
4498; PROLOG:       latch.2:
4499; PROLOG-NEXT:    %add.2 = add nuw nsw i64 %add.1, 1
4500; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.3
4501; PROLOG:       latch.3:
4502; PROLOG-NEXT:    %add.3 = add nuw nsw i64 %add.2, 1
4503; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.4
4504; PROLOG:       latch.4:
4505; PROLOG-NEXT:    %add.4 = add nuw nsw i64 %add.3, 1
4506; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.5
4507; PROLOG:       latch.5:
4508; PROLOG-NEXT:    %add.5 = add nuw nsw i64 %add.4, 1
4509; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.6
4510; PROLOG:       latch.6:
4511; PROLOG-NEXT:    %add.6 = add nuw nsw i64 %add.5, 1
4512; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.7
4513; PROLOG:       latch.7:
4514; PROLOG-NEXT:    %add.7 = add nuw nsw i64 %add.6, 1
4515; PROLOG-NEXT:    %i9.7 = icmp slt i64 %add.7, %sext
4516; PROLOG-NEXT:    br i1 %i9.7, label %header, label %latchexit.unr-lcssa
4517; PROLOG:       latchexit.unr-lcssa:
4518; PROLOG-NEXT:    br label %latchexit
4519; PROLOG:       latchexit:
4520; PROLOG-NEXT:    unreachable
4521; PROLOG:       loopexit2:
4522; PROLOG-NEXT:    ret i32 %shft
4523; PROLOG:       loopexit1.loopexit:
4524; 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 ]
4525; PROLOG-NEXT:    br label %loopexit1
4526; PROLOG:       loopexit1.loopexit1:
4527; PROLOG-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.prol ]
4528; PROLOG-NEXT:    br label %loopexit1
4529; PROLOG:       loopexit1:
4530; PROLOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
4531; PROLOG-NEXT:    ret i32 %sext3
4532;
4533; PROLOG-BLOCK-LABEL: @test7(
4534; PROLOG-BLOCK-NEXT:  bb:
4535; PROLOG-BLOCK-NEXT:    %i = icmp slt i32 undef, 2
4536; PROLOG-BLOCK-NEXT:    %sext = sext i32 undef to i64
4537; PROLOG-BLOCK-NEXT:    %shft = ashr exact i32 %arg, 16
4538; PROLOG-BLOCK-NEXT:    br i1 %i, label %loopexit2, label %preheader
4539; PROLOG-BLOCK:       preheader:
4540; PROLOG-BLOCK-NEXT:    %0 = add nsw i64 %sext, -1
4541; PROLOG-BLOCK-NEXT:    %1 = freeze i64 %0
4542; PROLOG-BLOCK-NEXT:    %2 = add i64 %1, -1
4543; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %1, 1
4544; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4545; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4546; PROLOG-BLOCK:       header.prol.preheader:
4547; PROLOG-BLOCK-NEXT:    br label %header.prol
4548; PROLOG-BLOCK:       header.prol:
4549; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1, label %latch.prol
4550; PROLOG-BLOCK:       latch.prol:
4551; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
4552; PROLOG-BLOCK:       header.prol.loopexit:
4553; PROLOG-BLOCK-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ 2, %latch.prol ]
4554; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %2, 1
4555; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchexit, label %preheader.new
4556; PROLOG-BLOCK:       preheader.new:
4557; PROLOG-BLOCK-NEXT:    br label %header
4558; PROLOG-BLOCK:       header:
4559; PROLOG-BLOCK-NEXT:    %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.1, %latch.1 ]
4560; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4561; PROLOG-BLOCK:       latch:
4562; PROLOG-BLOCK-NEXT:    %add = add nuw nsw i64 %i6, 1
4563; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4564; PROLOG-BLOCK:       latch.1:
4565; PROLOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4566; PROLOG-BLOCK-NEXT:    %i9.1 = icmp slt i64 %add.1, %sext
4567; PROLOG-BLOCK-NEXT:    br i1 %i9.1, label %header, label %latchexit.unr-lcssa, !llvm.loop !11
4568; PROLOG-BLOCK:       latchexit.unr-lcssa:
4569; PROLOG-BLOCK-NEXT:    br label %latchexit
4570; PROLOG-BLOCK:       latchexit:
4571; PROLOG-BLOCK-NEXT:    unreachable
4572; PROLOG-BLOCK:       loopexit2:
4573; PROLOG-BLOCK-NEXT:    ret i32 %shft
4574; PROLOG-BLOCK:       loopexit1.loopexit:
4575; PROLOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]
4576; PROLOG-BLOCK-NEXT:    br label %loopexit1
4577; PROLOG-BLOCK:       loopexit1:
4578; PROLOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.prol ], [ %sext3.ph, %loopexit1.loopexit ]
4579; PROLOG-BLOCK-NEXT:    ret i32 %sext3
4580;
4581bb:
4582  %i = icmp slt i32 undef, 2
4583  %sext = sext i32 undef to i64
4584  %shft = ashr exact i32 %arg, 16
4585  br i1 %i, label %loopexit2, label %preheader
4586
4587preheader:                                              ; preds = %bb2
4588  br label %header
4589
4590header:                                              ; preds = %latch, %preheader
4591  %i6 = phi i64 [ 1, %preheader ], [ %add, %latch ]
4592  br i1 false, label %loopexit1, label %latch
4593
4594latch:                                              ; preds = %header
4595  %add = add nuw nsw i64 %i6, 1
4596  %i9 = icmp slt i64 %add, %sext
4597  br i1 %i9, label %header, label %latchexit
4598
4599latchexit:                                             ; preds = %latch
4600  unreachable
4601
4602loopexit2:                                             ; preds = %bb2
4603  ret i32 %shft
4604
4605loopexit1:                                             ; preds = %header
4606  %sext3 = phi i32 [ %shft, %header ]
4607  ret i32 %sext3
4608}
4609
4610; Nested loop and inner loop is unrolled.  The tricky bit here is that
4611; several blocks in the inner loop fall out of the outer block when we
4612; use the epilogue block remainder strategy.
4613define void @test8() {
4614; EPILOG-LABEL: @test8(
4615; EPILOG-NEXT:  bb:
4616; EPILOG-NEXT:    br label %outerloop
4617; EPILOG:       outerloop.loopexit.loopexit:
4618; EPILOG-NEXT:    br label %outerloop.loopexit
4619; EPILOG:       outerloop.loopexit.loopexit1:
4620; EPILOG-NEXT:    br label %outerloop.loopexit
4621; EPILOG:       outerloop.loopexit:
4622; EPILOG-NEXT:    br label %outerloop
4623; EPILOG:       outerloop:
4624; EPILOG-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]
4625; EPILOG-NEXT:    %0 = sub i64 100, %i
4626; EPILOG-NEXT:    %1 = sub i64 99, %i
4627; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
4628; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
4629; EPILOG-NEXT:    br i1 %2, label %exit.unr-lcssa, label %outerloop.new
4630; EPILOG:       outerloop.new:
4631; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
4632; EPILOG-NEXT:    br label %innerH
4633; EPILOG:       innerH:
4634; EPILOG-NEXT:    %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.7, %latch.7 ]
4635; EPILOG-NEXT:    %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.7, %latch.7 ]
4636; EPILOG-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4637; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4638; EPILOG:       latch:
4639; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
4640; EPILOG-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
4641; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4642; EPILOG:       latch.1:
4643; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
4644; EPILOG-NEXT:    %i4.2 = add nuw nsw i64 %i4.1, 1
4645; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.2
4646; EPILOG:       latch.2:
4647; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
4648; EPILOG-NEXT:    %i4.3 = add nuw nsw i64 %i4.2, 1
4649; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.3
4650; EPILOG:       latch.3:
4651; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
4652; EPILOG-NEXT:    %i4.4 = add nuw nsw i64 %i4.3, 1
4653; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.4
4654; EPILOG:       latch.4:
4655; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
4656; EPILOG-NEXT:    %i4.5 = add nuw nsw i64 %i4.4, 1
4657; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.5
4658; EPILOG:       latch.5:
4659; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
4660; EPILOG-NEXT:    %i4.6 = add nuw nsw i64 %i4.5, 1
4661; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.6
4662; EPILOG:       latch.6:
4663; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
4664; EPILOG-NEXT:    %i4.7 = add nuw nsw i64 %i4.6, 1
4665; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.7
4666; EPILOG:       latch.7:
4667; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
4668; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
4669; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %innerH, label %exit.unr-lcssa.loopexit
4670; EPILOG:       exit.unr-lcssa.loopexit:
4671; EPILOG-NEXT:    %i3.unr.ph = phi i64 [ %i4.7, %latch.7 ]
4672; EPILOG-NEXT:    br label %exit.unr-lcssa
4673; EPILOG:       exit.unr-lcssa:
4674; EPILOG-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %exit.unr-lcssa.loopexit ]
4675; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4676; EPILOG-NEXT:    br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit
4677; EPILOG:       innerH.epil.preheader:
4678; EPILOG-NEXT:    br label %innerH.epil
4679; EPILOG:       innerH.epil:
4680; EPILOG-NEXT:    %i3.epil = phi i64 [ %i4.epil, %latch.epil ], [ %i3.unr, %innerH.epil.preheader ]
4681; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %innerH.epil.preheader ], [ %epil.iter.next, %latch.epil ]
4682; EPILOG-NEXT:    %i4.epil = add nuw nsw i64 %i3.epil, 1
4683; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit1, label %latch.epil
4684; EPILOG:       latch.epil:
4685; EPILOG-NEXT:    %i6.epil = icmp ult i64 %i4.epil, 100
4686; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
4687; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
4688; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %innerH.epil, label %exit.epilog-lcssa, !llvm.loop !12
4689; EPILOG:       exit.epilog-lcssa:
4690; EPILOG-NEXT:    br label %exit
4691; EPILOG:       exit.loopexit:
4692; EPILOG-NEXT:    br label %exit
4693; EPILOG:       exit:
4694; EPILOG-NEXT:    ret void
4695;
4696; EPILOG-BLOCK-LABEL: @test8(
4697; EPILOG-BLOCK-NEXT:  bb:
4698; EPILOG-BLOCK-NEXT:    br label %outerloop
4699; EPILOG-BLOCK:       outerloop.loopexit.loopexit:
4700; EPILOG-BLOCK-NEXT:    br label %outerloop.loopexit
4701; EPILOG-BLOCK:       outerloop.loopexit:
4702; EPILOG-BLOCK-NEXT:    br i1 false, label %exit.unr-lcssa.1, label %outerloop.new.1
4703; EPILOG-BLOCK:       outerloop.new.1:
4704; EPILOG-BLOCK-NEXT:    br label %innerH.1
4705; EPILOG-BLOCK:       innerH.1:
4706; EPILOG-BLOCK-NEXT:    %i3.1 = phi i64 [ 0, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ]
4707; EPILOG-BLOCK-NEXT:    %niter.1 = phi i64 [ 0, %outerloop.new.1 ], [ %niter.next.1.1, %latch.1.1 ]
4708; EPILOG-BLOCK-NEXT:    %i4.12 = add nuw nsw i64 %i3.1, 1
4709; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.14
4710; EPILOG-BLOCK:       latch.14:
4711; EPILOG-BLOCK-NEXT:    %niter.next.13 = add nuw nsw i64 %niter.1, 1
4712; EPILOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i4.12, 1
4713; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1
4714; EPILOG-BLOCK:       latch.1.1:
4715; EPILOG-BLOCK-NEXT:    %niter.next.1.1 = add i64 %niter.next.13, 1
4716; EPILOG-BLOCK-NEXT:    %niter.ncmp.1.1 = icmp ne i64 %niter.next.1.1, 100
4717; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit.1, !llvm.loop !12
4718; EPILOG-BLOCK:       exit.unr-lcssa.loopexit.1:
4719; EPILOG-BLOCK-NEXT:    br label %exit.unr-lcssa.1
4720; EPILOG-BLOCK:       outerloop.loopexit.loopexit.1:
4721; EPILOG-BLOCK-NEXT:    br label %outerloop.loopexit.1
4722; EPILOG-BLOCK:       exit.unr-lcssa.1:
4723; EPILOG-BLOCK-NEXT:    br i1 false, label %innerH.epil.preheader.1, label %exit.loopexit
4724; EPILOG-BLOCK:       innerH.epil.preheader.1:
4725; EPILOG-BLOCK-NEXT:    br label %innerH.epil.1
4726; EPILOG-BLOCK:       innerH.epil.1:
4727; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.epil
4728; EPILOG-BLOCK:       outerloop.loopexit.1:
4729; EPILOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !13
4730; EPILOG-BLOCK:       outerloop:
4731; EPILOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]
4732; EPILOG-BLOCK-NEXT:    %0 = sub i64 100, %i
4733; EPILOG-BLOCK-NEXT:    %1 = sub i64 99, %i
4734; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4735; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4736; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit.unr-lcssa, label %outerloop.new
4737; EPILOG-BLOCK:       outerloop.new:
4738; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
4739; EPILOG-BLOCK-NEXT:    br label %innerH
4740; EPILOG-BLOCK:       innerH:
4741; EPILOG-BLOCK-NEXT:    %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.1, %latch.1 ]
4742; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.1, %latch.1 ]
4743; EPILOG-BLOCK-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4744; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4745; EPILOG-BLOCK:       latch:
4746; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
4747; EPILOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
4748; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4749; EPILOG-BLOCK:       latch.1:
4750; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
4751; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
4752; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !12
4753; EPILOG-BLOCK:       exit.unr-lcssa.loopexit:
4754; EPILOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4755; EPILOG-BLOCK:       exit.unr-lcssa:
4756; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4757; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit
4758; EPILOG-BLOCK:       innerH.epil.preheader:
4759; EPILOG-BLOCK-NEXT:    br label %innerH.epil
4760; EPILOG-BLOCK:       innerH.epil:
4761; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.epil
4762; EPILOG-BLOCK:       latch.epil:
4763; EPILOG-BLOCK-NEXT:    br label %exit
4764; EPILOG-BLOCK:       exit.loopexit:
4765; EPILOG-BLOCK-NEXT:    br label %exit
4766; EPILOG-BLOCK:       exit:
4767; EPILOG-BLOCK-NEXT:    ret void
4768;
4769; PROLOG-LABEL: @test8(
4770; PROLOG-NEXT:  bb:
4771; PROLOG-NEXT:    br label %outerloop
4772; PROLOG:       outerloop.loopexit.loopexit:
4773; PROLOG-NEXT:    br label %outerloop.loopexit
4774; PROLOG:       outerloop.loopexit.loopexit1:
4775; PROLOG-NEXT:    br label %outerloop.loopexit
4776; PROLOG:       outerloop.loopexit:
4777; PROLOG-NEXT:    br label %outerloop
4778; PROLOG:       outerloop:
4779; PROLOG-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]
4780; PROLOG-NEXT:    %0 = sub i64 100, %i
4781; PROLOG-NEXT:    %1 = sub i64 99, %i
4782; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
4783; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4784; PROLOG-NEXT:    br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit
4785; PROLOG:       innerH.prol.preheader:
4786; PROLOG-NEXT:    br label %innerH.prol
4787; PROLOG:       innerH.prol:
4788; PROLOG-NEXT:    %i3.prol = phi i64 [ %i4.prol, %latch.prol ], [ %i, %innerH.prol.preheader ]
4789; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %innerH.prol.preheader ], [ %prol.iter.next, %latch.prol ]
4790; PROLOG-NEXT:    %i4.prol = add nuw nsw i64 %i3.prol, 1
4791; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit1, label %latch.prol
4792; PROLOG:       latch.prol:
4793; PROLOG-NEXT:    %i6.prol = icmp ult i64 %i4.prol, 100
4794; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
4795; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
4796; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %innerH.prol, label %innerH.prol.loopexit.unr-lcssa, !llvm.loop !12
4797; PROLOG:       innerH.prol.loopexit.unr-lcssa:
4798; PROLOG-NEXT:    %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ]
4799; PROLOG-NEXT:    br label %innerH.prol.loopexit
4800; PROLOG:       innerH.prol.loopexit:
4801; PROLOG-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %innerH.prol.loopexit.unr-lcssa ]
4802; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
4803; PROLOG-NEXT:    br i1 %2, label %exit.loopexit, label %outerloop.new
4804; PROLOG:       outerloop.new:
4805; PROLOG-NEXT:    br label %innerH
4806; PROLOG:       innerH:
4807; PROLOG-NEXT:    %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.7, %latch.7 ]
4808; PROLOG-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4809; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4810; PROLOG:       latch:
4811; PROLOG-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
4812; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4813; PROLOG:       latch.1:
4814; PROLOG-NEXT:    %i4.2 = add nuw nsw i64 %i4.1, 1
4815; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.2
4816; PROLOG:       latch.2:
4817; PROLOG-NEXT:    %i4.3 = add nuw nsw i64 %i4.2, 1
4818; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.3
4819; PROLOG:       latch.3:
4820; PROLOG-NEXT:    %i4.4 = add nuw nsw i64 %i4.3, 1
4821; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.4
4822; PROLOG:       latch.4:
4823; PROLOG-NEXT:    %i4.5 = add nuw nsw i64 %i4.4, 1
4824; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.5
4825; PROLOG:       latch.5:
4826; PROLOG-NEXT:    %i4.6 = add nuw nsw i64 %i4.5, 1
4827; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.6
4828; PROLOG:       latch.6:
4829; PROLOG-NEXT:    %i4.7 = add nuw nsw i64 %i4.6, 1
4830; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.7
4831; PROLOG:       latch.7:
4832; PROLOG-NEXT:    %i6.7 = icmp ult i64 %i4.7, 100
4833; PROLOG-NEXT:    br i1 %i6.7, label %innerH, label %exit.unr-lcssa
4834; PROLOG:       exit.unr-lcssa:
4835; PROLOG-NEXT:    br label %exit
4836; PROLOG:       exit.loopexit:
4837; PROLOG-NEXT:    br label %exit
4838; PROLOG:       exit:
4839; PROLOG-NEXT:    ret void
4840;
4841; PROLOG-BLOCK-LABEL: @test8(
4842; PROLOG-BLOCK-NEXT:  bb:
4843; PROLOG-BLOCK-NEXT:    br label %outerloop
4844; PROLOG-BLOCK:       outerloop.loopexit.loopexit:
4845; PROLOG-BLOCK-NEXT:    br label %outerloop.loopexit
4846; PROLOG-BLOCK:       outerloop.loopexit:
4847; PROLOG-BLOCK-NEXT:    br i1 false, label %innerH.prol.preheader.1, label %innerH.prol.loopexit.1
4848; PROLOG-BLOCK:       innerH.prol.preheader.1:
4849; PROLOG-BLOCK-NEXT:    br label %innerH.prol.1
4850; PROLOG-BLOCK:       innerH.prol.1:
4851; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.prol.1
4852; PROLOG-BLOCK:       latch.prol.1:
4853; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit.1
4854; PROLOG-BLOCK:       innerH.prol.loopexit.1:
4855; PROLOG-BLOCK-NEXT:    %i3.unr.1 = phi i64 [ 0, %outerloop.loopexit ], [ 1, %latch.prol.1 ]
4856; PROLOG-BLOCK-NEXT:    br i1 false, label %exit.loopexit, label %outerloop.new.1
4857; PROLOG-BLOCK:       outerloop.new.1:
4858; PROLOG-BLOCK-NEXT:    br label %innerH.1
4859; PROLOG-BLOCK:       innerH.1:
4860; PROLOG-BLOCK-NEXT:    %i3.1 = phi i64 [ %i3.unr.1, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ]
4861; PROLOG-BLOCK-NEXT:    %i4.11 = add nuw nsw i64 %i3.1, 1
4862; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.12
4863; PROLOG-BLOCK:       latch.12:
4864; PROLOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i4.11, 1
4865; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1
4866; PROLOG-BLOCK:       latch.1.1:
4867; PROLOG-BLOCK-NEXT:    %i6.1.1 = icmp ult i64 %i4.1.1, 100
4868; PROLOG-BLOCK-NEXT:    br i1 %i6.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit3, !llvm.loop !12
4869; PROLOG-BLOCK:       outerloop.loopexit.loopexit.1:
4870; PROLOG-BLOCK-NEXT:    br label %outerloop.loopexit.1
4871; PROLOG-BLOCK:       outerloop.loopexit.1:
4872; PROLOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !13
4873; PROLOG-BLOCK:       outerloop:
4874; PROLOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]
4875; PROLOG-BLOCK-NEXT:    %0 = sub i64 100, %i
4876; PROLOG-BLOCK-NEXT:    %1 = sub i64 99, %i
4877; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4878; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4879; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit
4880; PROLOG-BLOCK:       innerH.prol.preheader:
4881; PROLOG-BLOCK-NEXT:    br label %innerH.prol
4882; PROLOG-BLOCK:       innerH.prol:
4883; PROLOG-BLOCK-NEXT:    %i4.prol = add nuw nsw i64 %i, 1
4884; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.prol
4885; PROLOG-BLOCK:       latch.prol:
4886; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit
4887; PROLOG-BLOCK:       innerH.prol.loopexit:
4888; PROLOG-BLOCK-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i4.prol, %latch.prol ]
4889; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4890; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit.loopexit, label %outerloop.new
4891; PROLOG-BLOCK:       outerloop.new:
4892; PROLOG-BLOCK-NEXT:    br label %innerH
4893; PROLOG-BLOCK:       innerH:
4894; PROLOG-BLOCK-NEXT:    %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.1, %latch.1 ]
4895; PROLOG-BLOCK-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4896; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4897; PROLOG-BLOCK:       latch:
4898; PROLOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
4899; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4900; PROLOG-BLOCK:       latch.1:
4901; PROLOG-BLOCK-NEXT:    %i6.1 = icmp ult i64 %i4.1, 100
4902; PROLOG-BLOCK-NEXT:    br i1 %i6.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !12
4903; PROLOG-BLOCK:       exit.unr-lcssa.loopexit:
4904; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4905; PROLOG-BLOCK:       exit.unr-lcssa.loopexit3:
4906; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4907; PROLOG-BLOCK:       exit.unr-lcssa:
4908; PROLOG-BLOCK-NEXT:    br label %exit
4909; PROLOG-BLOCK:       exit.loopexit:
4910; PROLOG-BLOCK-NEXT:    br label %exit
4911; PROLOG-BLOCK:       exit:
4912; PROLOG-BLOCK-NEXT:    ret void
4913;
4914
4915bb:
4916  br label %outerloop
4917
4918outerloop:                                              ; preds = %innerH, %bb
4919  %i = phi i64 [ 3, %bb ], [ 0, %innerH ]
4920  br label %innerH
4921
4922innerH:                                              ; preds = %latch, %outerloop
4923  %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ]
4924  %i4 = add nuw nsw i64 %i3, 1
4925  br i1 false, label %outerloop, label %latch
4926
4927latch:                                              ; preds = %innerH
4928  %i6 = icmp ult i64 %i4, 100
4929  br i1 %i6, label %innerH, label %exit
4930
4931exit:                                              ; preds = %latch
4932  ret void
4933}
4934
4935declare i8 addrspace(1)* @foo(i32)
4936; inner loop prolog unrolled
4937; a value from outer loop is used in exit block of inner loop.
4938; Don't create VMap entries for such values (%trip).
4939define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) {
4940; EPILOG-LABEL: @test9(
4941; EPILOG-NEXT:  bb:
4942; EPILOG-NEXT:    %0 = add i32 %n, -1
4943; EPILOG-NEXT:    br label %outerloopHdr
4944; EPILOG:       outerloopHdr:
4945; EPILOG-NEXT:    %trip = add i32 %n, -1
4946; EPILOG-NEXT:    %outercnd = icmp slt i32 0, %trip
4947; EPILOG-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
4948; EPILOG:       preheader:
4949; EPILOG-NEXT:    %i4 = zext i32 0 to i64
4950; EPILOG-NEXT:    %1 = freeze i32 %0
4951; EPILOG-NEXT:    %2 = add i32 %1, -1
4952; EPILOG-NEXT:    %xtraiter = and i32 %1, 7
4953; EPILOG-NEXT:    %3 = icmp ult i32 %2, 7
4954; EPILOG-NEXT:    br i1 %3, label %outerLatch.loopexit.unr-lcssa, label %preheader.new
4955; EPILOG:       preheader.new:
4956; EPILOG-NEXT:    %unroll_iter = sub i32 %1, %xtraiter
4957; EPILOG-NEXT:    br label %header
4958; EPILOG:       header:
4959; EPILOG-NEXT:    %phi = phi i64 [ %i4, %preheader.new ], [ %iv.next.7, %latch.7 ]
4960; EPILOG-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ]
4961; EPILOG-NEXT:    br i1 true, label %latch, label %innerexit.loopexit
4962; EPILOG:       innerexit.loopexit:
4963; 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 ]
4964; EPILOG-NEXT:    br label %innerexit
4965; EPILOG:       innerexit.loopexit1:
4966; EPILOG-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.epil ]
4967; EPILOG-NEXT:    br label %innerexit
4968; EPILOG:       innerexit:
4969; EPILOG-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
4970; EPILOG-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
4971; EPILOG-NEXT:    ret i8 addrspace(1)* %i9
4972; EPILOG:       latch:
4973; EPILOG-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
4974; EPILOG-NEXT:    %niter.next = add nuw nsw i32 %niter, 1
4975; EPILOG-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit
4976; EPILOG:       latch.1:
4977; EPILOG-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
4978; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i32 %niter.next, 1
4979; EPILOG-NEXT:    br i1 true, label %latch.2, label %innerexit.loopexit
4980; EPILOG:       latch.2:
4981; EPILOG-NEXT:    %iv.next.2 = add nuw nsw i64 %iv.next.1, 1
4982; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i32 %niter.next.1, 1
4983; EPILOG-NEXT:    br i1 true, label %latch.3, label %innerexit.loopexit
4984; EPILOG:       latch.3:
4985; EPILOG-NEXT:    %iv.next.3 = add nuw nsw i64 %iv.next.2, 1
4986; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i32 %niter.next.2, 1
4987; EPILOG-NEXT:    br i1 true, label %latch.4, label %innerexit.loopexit
4988; EPILOG:       latch.4:
4989; EPILOG-NEXT:    %iv.next.4 = add nuw nsw i64 %iv.next.3, 1
4990; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i32 %niter.next.3, 1
4991; EPILOG-NEXT:    br i1 true, label %latch.5, label %innerexit.loopexit
4992; EPILOG:       latch.5:
4993; EPILOG-NEXT:    %iv.next.5 = add nuw nsw i64 %iv.next.4, 1
4994; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i32 %niter.next.4, 1
4995; EPILOG-NEXT:    br i1 true, label %latch.6, label %innerexit.loopexit
4996; EPILOG:       latch.6:
4997; EPILOG-NEXT:    %iv.next.6 = add nuw nsw i64 %iv.next.5, 1
4998; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i32 %niter.next.5, 1
4999; EPILOG-NEXT:    br i1 true, label %latch.7, label %innerexit.loopexit
5000; EPILOG:       latch.7:
5001; EPILOG-NEXT:    %iv.next.7 = add nuw nsw i64 %iv.next.6, 1
5002; EPILOG-NEXT:    %niter.next.7 = add i32 %niter.next.6, 1
5003; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i32 %niter.next.7, %unroll_iter
5004; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit
5005; EPILOG:       outerLatch.loopexit.unr-lcssa.loopexit:
5006; EPILOG-NEXT:    %phi.unr.ph = phi i64 [ %iv.next.7, %latch.7 ]
5007; EPILOG-NEXT:    br label %outerLatch.loopexit.unr-lcssa
5008; EPILOG:       outerLatch.loopexit.unr-lcssa:
5009; EPILOG-NEXT:    %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %outerLatch.loopexit.unr-lcssa.loopexit ]
5010; EPILOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
5011; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit
5012; EPILOG:       header.epil.preheader:
5013; EPILOG-NEXT:    br label %header.epil
5014; EPILOG:       header.epil:
5015; EPILOG-NEXT:    %phi.epil = phi i64 [ %phi.unr, %header.epil.preheader ], [ %iv.next.epil, %latch.epil ]
5016; EPILOG-NEXT:    %epil.iter = phi i32 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
5017; EPILOG-NEXT:    %i7.epil = trunc i64 %phi.epil to i32
5018; EPILOG-NEXT:    br i1 true, label %latch.epil, label %innerexit.loopexit1
5019; EPILOG:       latch.epil:
5020; EPILOG-NEXT:    %i11.epil = add nsw i32 %i7.epil, 1
5021; EPILOG-NEXT:    %innercnd.epil = icmp slt i32 %i11.epil, %trip
5022; EPILOG-NEXT:    %iv.next.epil = add nuw nsw i64 %phi.epil, 1
5023; EPILOG-NEXT:    %epil.iter.next = add i32 %epil.iter, 1
5024; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i32 %epil.iter.next, %xtraiter
5025; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %outerLatch.loopexit.epilog-lcssa, !llvm.loop !13
5026; EPILOG:       outerLatch.loopexit.epilog-lcssa:
5027; EPILOG-NEXT:    br label %outerLatch.loopexit
5028; EPILOG:       outerLatch.loopexit:
5029; EPILOG-NEXT:    br label %outerLatch
5030; EPILOG:       outerLatch:
5031; EPILOG-NEXT:    br label %outerloopHdr
5032;
5033; EPILOG-BLOCK-LABEL: @test9(
5034; EPILOG-BLOCK-NEXT:  bb:
5035; EPILOG-BLOCK-NEXT:    %0 = add i32 %n, -1
5036; EPILOG-BLOCK-NEXT:    br label %outerloopHdr
5037; EPILOG-BLOCK:       outerloopHdr:
5038; EPILOG-BLOCK-NEXT:    %trip = add i32 %n, -1
5039; EPILOG-BLOCK-NEXT:    %outercnd = icmp slt i32 0, %trip
5040; EPILOG-BLOCK-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
5041; EPILOG-BLOCK:       preheader:
5042; EPILOG-BLOCK-NEXT:    %1 = freeze i32 %0
5043; EPILOG-BLOCK-NEXT:    %2 = add i32 %1, -1
5044; EPILOG-BLOCK-NEXT:    %xtraiter = and i32 %1, 1
5045; EPILOG-BLOCK-NEXT:    %3 = icmp ult i32 %2, 1
5046; EPILOG-BLOCK-NEXT:    br i1 %3, label %outerLatch.loopexit.unr-lcssa, label %preheader.new
5047; EPILOG-BLOCK:       preheader.new:
5048; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i32 %1, %xtraiter
5049; EPILOG-BLOCK-NEXT:    br label %header
5050; EPILOG-BLOCK:       header:
5051; EPILOG-BLOCK-NEXT:    %phi = phi i64 [ 0, %preheader.new ], [ %iv.next.1, %latch.1 ]
5052; EPILOG-BLOCK-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ]
5053; EPILOG-BLOCK-NEXT:    br i1 true, label %latch, label %innerexit.loopexit.loopexit
5054; EPILOG-BLOCK:       innerexit.loopexit.loopexit:
5055; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ]
5056; EPILOG-BLOCK-NEXT:    br label %innerexit.loopexit
5057; EPILOG-BLOCK:       innerexit.loopexit.loopexit6:
5058; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph.ph7 = phi i32 [ %trip.1, %latch.15 ], [ %trip.1, %header.1 ]
5059; EPILOG-BLOCK-NEXT:    br label %innerexit.loopexit
5060; EPILOG-BLOCK:       innerexit.loopexit:
5061; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph7, %innerexit.loopexit.loopexit6 ]
5062; EPILOG-BLOCK-NEXT:    br label %innerexit
5063; EPILOG-BLOCK:       innerexit.loopexit1:
5064; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.epil ], [ %trip.1, %header.epil.1 ]
5065; EPILOG-BLOCK-NEXT:    br label %innerexit
5066; EPILOG-BLOCK:       innerexit:
5067; EPILOG-BLOCK-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
5068; EPILOG-BLOCK-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
5069; EPILOG-BLOCK-NEXT:    ret i8 addrspace(1)* %i9
5070; EPILOG-BLOCK:       latch:
5071; EPILOG-BLOCK-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
5072; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i32 %niter, 1
5073; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit.loopexit
5074; EPILOG-BLOCK:       latch.1:
5075; EPILOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
5076; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i32 %niter.next, 1
5077; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i32 %niter.next.1, %unroll_iter
5078; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit, !llvm.loop !14
5079; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa.loopexit:
5080; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit.unr-lcssa
5081; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa:
5082; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
5083; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit
5084; EPILOG-BLOCK:       header.epil.preheader:
5085; EPILOG-BLOCK-NEXT:    br label %header.epil
5086; EPILOG-BLOCK:       header.epil:
5087; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.epil, label %innerexit.loopexit1
5088; EPILOG-BLOCK:       latch.epil:
5089; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit
5090; EPILOG-BLOCK:       outerLatch.loopexit:
5091; EPILOG-BLOCK-NEXT:    br label %outerLatch
5092; EPILOG-BLOCK:       outerLatch:
5093; EPILOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -1
5094; EPILOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.1
5095; EPILOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.1
5096; EPILOG-BLOCK:       preheader.1:
5097; EPILOG-BLOCK-NEXT:    %4 = freeze i32 %0
5098; EPILOG-BLOCK-NEXT:    %5 = add i32 %4, -1
5099; EPILOG-BLOCK-NEXT:    %xtraiter.1 = and i32 %4, 1
5100; EPILOG-BLOCK-NEXT:    %6 = icmp ult i32 %5, 1
5101; EPILOG-BLOCK-NEXT:    br i1 %6, label %outerLatch.loopexit.unr-lcssa.1, label %preheader.new.1
5102; EPILOG-BLOCK:       preheader.new.1:
5103; EPILOG-BLOCK-NEXT:    %unroll_iter.1 = sub i32 %4, %xtraiter.1
5104; EPILOG-BLOCK-NEXT:    br label %header.1
5105; EPILOG-BLOCK:       header.1:
5106; EPILOG-BLOCK-NEXT:    %phi.1 = phi i64 [ 0, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ]
5107; EPILOG-BLOCK-NEXT:    %niter.1 = phi i32 [ 0, %preheader.new.1 ], [ %niter.next.1.1, %latch.1.1 ]
5108; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.15, label %innerexit.loopexit.loopexit6
5109; EPILOG-BLOCK:       latch.15:
5110; EPILOG-BLOCK-NEXT:    %iv.next.13 = add nuw nsw i64 %phi.1, 1
5111; EPILOG-BLOCK-NEXT:    %niter.next.14 = add nuw nsw i32 %niter.1, 1
5112; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit6
5113; EPILOG-BLOCK:       latch.1.1:
5114; EPILOG-BLOCK-NEXT:    %iv.next.1.1 = add nuw nsw i64 %iv.next.13, 1
5115; EPILOG-BLOCK-NEXT:    %niter.next.1.1 = add i32 %niter.next.14, 1
5116; EPILOG-BLOCK-NEXT:    %niter.ncmp.1.1 = icmp ne i32 %niter.next.1.1, %unroll_iter.1
5117; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.loopexit.1, !llvm.loop !14
5118; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa.loopexit.1:
5119; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit.unr-lcssa.1
5120; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa.1:
5121; EPILOG-BLOCK-NEXT:    %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0
5122; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod.1, label %header.epil.preheader.1, label %outerLatch.loopexit.1
5123; EPILOG-BLOCK:       header.epil.preheader.1:
5124; EPILOG-BLOCK-NEXT:    br label %header.epil.1
5125; EPILOG-BLOCK:       header.epil.1:
5126; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.epil.1, label %innerexit.loopexit1
5127; EPILOG-BLOCK:       latch.epil.1:
5128; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit.1
5129; EPILOG-BLOCK:       outerLatch.loopexit.1:
5130; EPILOG-BLOCK-NEXT:    br label %outerLatch.1
5131; EPILOG-BLOCK:       outerLatch.1:
5132; EPILOG-BLOCK-NEXT:    br label %outerloopHdr, !llvm.loop !15
5133;
5134; PROLOG-LABEL: @test9(
5135; PROLOG-NEXT:  bb:
5136; PROLOG-NEXT:    %0 = add i32 %n, -1
5137; PROLOG-NEXT:    br label %outerloopHdr
5138; PROLOG:       outerloopHdr:
5139; PROLOG-NEXT:    %trip = add i32 %n, -1
5140; PROLOG-NEXT:    %outercnd = icmp slt i32 0, %trip
5141; PROLOG-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
5142; PROLOG:       preheader:
5143; PROLOG-NEXT:    %i4 = zext i32 0 to i64
5144; PROLOG-NEXT:    %1 = freeze i32 %0
5145; PROLOG-NEXT:    %2 = add i32 %1, -1
5146; PROLOG-NEXT:    %xtraiter = and i32 %1, 7
5147; PROLOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
5148; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
5149; PROLOG:       header.prol.preheader:
5150; PROLOG-NEXT:    br label %header.prol
5151; PROLOG:       header.prol:
5152; PROLOG-NEXT:    %phi.prol = phi i64 [ %i4, %header.prol.preheader ], [ %iv.next.prol, %latch.prol ]
5153; PROLOG-NEXT:    %prol.iter = phi i32 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
5154; PROLOG-NEXT:    %i7.prol = trunc i64 %phi.prol to i32
5155; PROLOG-NEXT:    br i1 true, label %latch.prol, label %innerexit.loopexit1
5156; PROLOG:       latch.prol:
5157; PROLOG-NEXT:    %i11.prol = add nsw i32 %i7.prol, 1
5158; PROLOG-NEXT:    %innercnd.prol = icmp slt i32 %i11.prol, %trip
5159; PROLOG-NEXT:    %iv.next.prol = add nuw nsw i64 %phi.prol, 1
5160; PROLOG-NEXT:    %prol.iter.next = add i32 %prol.iter, 1
5161; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i32 %prol.iter.next, %xtraiter
5162; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !13
5163; PROLOG:       header.prol.loopexit.unr-lcssa:
5164; PROLOG-NEXT:    %phi.unr.ph = phi i64 [ %iv.next.prol, %latch.prol ]
5165; PROLOG-NEXT:    br label %header.prol.loopexit
5166; PROLOG:       header.prol.loopexit:
5167; PROLOG-NEXT:    %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %header.prol.loopexit.unr-lcssa ]
5168; PROLOG-NEXT:    %3 = icmp ult i32 %2, 7
5169; PROLOG-NEXT:    br i1 %3, label %outerLatch.loopexit, label %preheader.new
5170; PROLOG:       preheader.new:
5171; PROLOG-NEXT:    br label %header
5172; PROLOG:       header:
5173; PROLOG-NEXT:    %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.7, %latch.7 ]
5174; PROLOG-NEXT:    br i1 true, label %latch, label %innerexit.loopexit
5175; PROLOG:       innerexit.loopexit:
5176; 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 ]
5177; PROLOG-NEXT:    br label %innerexit
5178; PROLOG:       innerexit.loopexit1:
5179; PROLOG-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ]
5180; PROLOG-NEXT:    br label %innerexit
5181; PROLOG:       innerexit:
5182; PROLOG-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
5183; PROLOG-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
5184; PROLOG-NEXT:    ret i8 addrspace(1)* %i9
5185; PROLOG:       latch:
5186; PROLOG-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
5187; PROLOG-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit
5188; PROLOG:       latch.1:
5189; PROLOG-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
5190; PROLOG-NEXT:    br i1 true, label %latch.2, label %innerexit.loopexit
5191; PROLOG:       latch.2:
5192; PROLOG-NEXT:    %iv.next.2 = add nuw nsw i64 %iv.next.1, 1
5193; PROLOG-NEXT:    br i1 true, label %latch.3, label %innerexit.loopexit
5194; PROLOG:       latch.3:
5195; PROLOG-NEXT:    %iv.next.3 = add nuw nsw i64 %iv.next.2, 1
5196; PROLOG-NEXT:    br i1 true, label %latch.4, label %innerexit.loopexit
5197; PROLOG:       latch.4:
5198; PROLOG-NEXT:    %iv.next.4 = add nuw nsw i64 %iv.next.3, 1
5199; PROLOG-NEXT:    br i1 true, label %latch.5, label %innerexit.loopexit
5200; PROLOG:       latch.5:
5201; PROLOG-NEXT:    %iv.next.5 = add nuw nsw i64 %iv.next.4, 1
5202; PROLOG-NEXT:    br i1 true, label %latch.6, label %innerexit.loopexit
5203; PROLOG:       latch.6:
5204; PROLOG-NEXT:    %iv.next.6 = add nuw nsw i64 %iv.next.5, 1
5205; PROLOG-NEXT:    %i7.7 = trunc i64 %iv.next.6 to i32
5206; PROLOG-NEXT:    br i1 true, label %latch.7, label %innerexit.loopexit
5207; PROLOG:       latch.7:
5208; PROLOG-NEXT:    %i11.7 = add nsw i32 %i7.7, 1
5209; PROLOG-NEXT:    %innercnd.7 = icmp slt i32 %i11.7, %trip
5210; PROLOG-NEXT:    %iv.next.7 = add nuw nsw i64 %iv.next.6, 1
5211; PROLOG-NEXT:    br i1 %innercnd.7, label %header, label %outerLatch.loopexit.unr-lcssa
5212; PROLOG:       outerLatch.loopexit.unr-lcssa:
5213; PROLOG-NEXT:    br label %outerLatch.loopexit
5214; PROLOG:       outerLatch.loopexit:
5215; PROLOG-NEXT:    br label %outerLatch
5216; PROLOG:       outerLatch:
5217; PROLOG-NEXT:    br label %outerloopHdr
5218;
5219; PROLOG-BLOCK-LABEL: @test9(
5220; PROLOG-BLOCK-NEXT:  bb:
5221; PROLOG-BLOCK-NEXT:    %0 = add i32 %n, -1
5222; PROLOG-BLOCK-NEXT:    br label %outerloopHdr
5223; PROLOG-BLOCK:       outerloopHdr:
5224; PROLOG-BLOCK-NEXT:    %trip = add i32 %n, -1
5225; PROLOG-BLOCK-NEXT:    %outercnd = icmp slt i32 0, %trip
5226; PROLOG-BLOCK-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
5227; PROLOG-BLOCK:       preheader:
5228; PROLOG-BLOCK-NEXT:    %1 = freeze i32 %0
5229; PROLOG-BLOCK-NEXT:    %2 = add i32 %1, -1
5230; PROLOG-BLOCK-NEXT:    %xtraiter = and i32 %1, 1
5231; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
5232; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
5233; PROLOG-BLOCK:       header.prol.preheader:
5234; PROLOG-BLOCK-NEXT:    br label %header.prol
5235; PROLOG-BLOCK:       header.prol:
5236; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.prol, label %innerexit.loopexit1
5237; PROLOG-BLOCK:       latch.prol:
5238; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
5239; PROLOG-BLOCK:       header.prol.loopexit:
5240; PROLOG-BLOCK-NEXT:    %phi.unr = phi i64 [ 0, %preheader ], [ 1, %latch.prol ]
5241; PROLOG-BLOCK-NEXT:    %3 = icmp ult i32 %2, 1
5242; PROLOG-BLOCK-NEXT:    br i1 %3, label %outerLatch.loopexit, label %preheader.new
5243; PROLOG-BLOCK:       preheader.new:
5244; PROLOG-BLOCK-NEXT:    br label %header
5245; PROLOG-BLOCK:       header:
5246; PROLOG-BLOCK-NEXT:    %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.1, %latch.1 ]
5247; PROLOG-BLOCK-NEXT:    br i1 true, label %latch, label %innerexit.loopexit.loopexit
5248; PROLOG-BLOCK:       innerexit.loopexit.loopexit:
5249; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ]
5250; PROLOG-BLOCK-NEXT:    br label %innerexit.loopexit
5251; PROLOG-BLOCK:       innerexit.loopexit.loopexit5:
5252; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph.ph6 = phi i32 [ %trip.1, %latch.14 ], [ %trip.1, %header.1 ]
5253; PROLOG-BLOCK-NEXT:    br label %innerexit.loopexit
5254; PROLOG-BLOCK:       innerexit.loopexit:
5255; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph6, %innerexit.loopexit.loopexit5 ]
5256; PROLOG-BLOCK-NEXT:    br label %innerexit
5257; PROLOG-BLOCK:       innerexit.loopexit1:
5258; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ], [ %trip.1, %header.prol.1 ]
5259; PROLOG-BLOCK-NEXT:    br label %innerexit
5260; PROLOG-BLOCK:       innerexit:
5261; PROLOG-BLOCK-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
5262; PROLOG-BLOCK-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
5263; PROLOG-BLOCK-NEXT:    ret i8 addrspace(1)* %i9
5264; PROLOG-BLOCK:       latch:
5265; PROLOG-BLOCK-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
5266; PROLOG-BLOCK-NEXT:    %i7.1 = trunc i64 %iv.next to i32
5267; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit.loopexit
5268; PROLOG-BLOCK:       latch.1:
5269; PROLOG-BLOCK-NEXT:    %i11.1 = add nsw i32 %i7.1, 1
5270; PROLOG-BLOCK-NEXT:    %innercnd.1 = icmp slt i32 %i11.1, %trip
5271; PROLOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
5272; PROLOG-BLOCK-NEXT:    br i1 %innercnd.1, label %header, label %outerLatch.loopexit.unr-lcssa, !llvm.loop !14
5273; PROLOG-BLOCK:       outerLatch.loopexit.unr-lcssa:
5274; PROLOG-BLOCK-NEXT:    br label %outerLatch.loopexit
5275; PROLOG-BLOCK:       outerLatch.loopexit:
5276; PROLOG-BLOCK-NEXT:    br label %outerLatch
5277; PROLOG-BLOCK:       outerLatch:
5278; PROLOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -1
5279; PROLOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.1
5280; PROLOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.1
5281; PROLOG-BLOCK:       preheader.1:
5282; PROLOG-BLOCK-NEXT:    %4 = freeze i32 %0
5283; PROLOG-BLOCK-NEXT:    %5 = add i32 %4, -1
5284; PROLOG-BLOCK-NEXT:    %xtraiter.1 = and i32 %4, 1
5285; PROLOG-BLOCK-NEXT:    %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0
5286; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod.1, label %header.prol.preheader.1, label %header.prol.loopexit.1
5287; PROLOG-BLOCK:       header.prol.preheader.1:
5288; PROLOG-BLOCK-NEXT:    br label %header.prol.1
5289; PROLOG-BLOCK:       header.prol.1:
5290; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.prol.1, label %innerexit.loopexit1
5291; PROLOG-BLOCK:       latch.prol.1:
5292; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit.1
5293; PROLOG-BLOCK:       header.prol.loopexit.1:
5294; PROLOG-BLOCK-NEXT:    %phi.unr.1 = phi i64 [ 0, %preheader.1 ], [ 1, %latch.prol.1 ]
5295; PROLOG-BLOCK-NEXT:    %6 = icmp ult i32 %5, 1
5296; PROLOG-BLOCK-NEXT:    br i1 %6, label %outerLatch.loopexit.1, label %preheader.new.1
5297; PROLOG-BLOCK:       preheader.new.1:
5298; PROLOG-BLOCK-NEXT:    br label %header.1
5299; PROLOG-BLOCK:       header.1:
5300; PROLOG-BLOCK-NEXT:    %phi.1 = phi i64 [ %phi.unr.1, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ]
5301; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.14, label %innerexit.loopexit.loopexit5
5302; PROLOG-BLOCK:       latch.14:
5303; PROLOG-BLOCK-NEXT:    %iv.next.13 = add nuw nsw i64 %phi.1, 1
5304; PROLOG-BLOCK-NEXT:    %i7.1.1 = trunc i64 %iv.next.13 to i32
5305; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit5
5306; PROLOG-BLOCK:       latch.1.1:
5307; PROLOG-BLOCK-NEXT:    %i11.1.1 = add nsw i32 %i7.1.1, 1
5308; PROLOG-BLOCK-NEXT:    %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.1
5309; PROLOG-BLOCK-NEXT:    %iv.next.1.1 = add nuw nsw i64 %iv.next.13, 1
5310; PROLOG-BLOCK-NEXT:    br i1 %innercnd.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.1, !llvm.loop !14
5311; PROLOG-BLOCK:       outerLatch.loopexit.unr-lcssa.1:
5312; PROLOG-BLOCK-NEXT:    br label %outerLatch.loopexit.1
5313; PROLOG-BLOCK:       outerLatch.loopexit.1:
5314; PROLOG-BLOCK-NEXT:    br label %outerLatch.1
5315; PROLOG-BLOCK:       outerLatch.1:
5316; PROLOG-BLOCK-NEXT:    br label %outerloopHdr, !llvm.loop !15
5317;
5318bb:
5319  br label %outerloopHdr
5320
5321outerloopHdr:                                              ; preds = %outerLatch, %bb
5322  %trip = add i32 %n, -1
5323  %outercnd = icmp slt i32 0, %trip
5324  br i1 %outercnd, label %preheader, label %outerLatch
5325
5326preheader:                                              ; preds = %outerloopHdr
5327  %i4 = zext i32 0 to i64
5328  br label %header
5329
5330header:                                              ; preds = %latch, %preheader
5331  %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ]
5332  %i7 = trunc i64 %phi to i32
5333  br i1 true, label %latch, label %innerexit
5334
5335innerexit:                                              ; preds = %header
5336  %i9 = call i8 addrspace(1)* @foo(i32 %trip)
5337  ret i8 addrspace(1)* %i9
5338
5339latch:                                             ; preds = %header
5340  %i11 = add nsw i32 %i7, 1
5341  %innercnd = icmp slt i32 %i11, %trip
5342  %iv.next = add nuw nsw i64 %phi, 1
5343  br i1 %innercnd, label %header, label %outerLatch
5344
5345outerLatch:                                             ; preds = %latch, %outerloopHdr
5346  br label %outerloopHdr
5347}
5348
5349declare void @bar()
5350
5351; This is a case where we should be able to eliminate N-1 copies
5352; of the early exit test in the main loop when runtime unrolling
5353; by N.
5354define void @test10(i64 %trip, i64 %trip2) {
5355; EPILOG-LABEL: @test10(
5356; EPILOG-NEXT:  entry:
5357; EPILOG-NEXT:    %0 = freeze i64 %trip
5358; EPILOG-NEXT:    %1 = add i64 %0, -1
5359; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
5360; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
5361; EPILOG-NEXT:    br i1 %2, label %exit2.unr-lcssa, label %entry.new
5362; EPILOG:       entry.new:
5363; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
5364; EPILOG-NEXT:    br label %loop_header
5365; EPILOG:       loop_header:
5366; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5367; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
5368; EPILOG-NEXT:    call void @bar()
5369; EPILOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5370; EPILOG-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5371; EPILOG:       loop_latch:
5372; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5373; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5374; EPILOG-NEXT:    call void @bar()
5375; EPILOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5376; EPILOG-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5377; EPILOG:       loop_latch.1:
5378; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
5379; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
5380; EPILOG-NEXT:    call void @bar()
5381; EPILOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
5382; EPILOG-NEXT:    br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit
5383; EPILOG:       loop_latch.2:
5384; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
5385; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
5386; EPILOG-NEXT:    call void @bar()
5387; EPILOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
5388; EPILOG-NEXT:    br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit
5389; EPILOG:       loop_latch.3:
5390; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
5391; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
5392; EPILOG-NEXT:    call void @bar()
5393; EPILOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
5394; EPILOG-NEXT:    br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit
5395; EPILOG:       loop_latch.4:
5396; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
5397; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
5398; EPILOG-NEXT:    call void @bar()
5399; EPILOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
5400; EPILOG-NEXT:    br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit
5401; EPILOG:       loop_latch.5:
5402; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
5403; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
5404; EPILOG-NEXT:    call void @bar()
5405; EPILOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
5406; EPILOG-NEXT:    br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit
5407; EPILOG:       loop_latch.6:
5408; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
5409; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
5410; EPILOG-NEXT:    call void @bar()
5411; EPILOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
5412; EPILOG-NEXT:    br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit
5413; EPILOG:       loop_latch.7:
5414; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
5415; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
5416; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
5417; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit
5418; EPILOG:       exit1.loopexit:
5419; EPILOG-NEXT:    br label %exit1
5420; EPILOG:       exit1.loopexit1:
5421; EPILOG-NEXT:    br label %exit1
5422; EPILOG:       exit1:
5423; EPILOG-NEXT:    ret void
5424; EPILOG:       exit2.unr-lcssa.loopexit:
5425; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
5426; EPILOG-NEXT:    br label %exit2.unr-lcssa
5427; EPILOG:       exit2.unr-lcssa:
5428; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ]
5429; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5430; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5431; EPILOG:       loop_header.epil.preheader:
5432; EPILOG-NEXT:    br label %loop_header.epil
5433; EPILOG:       loop_header.epil:
5434; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
5435; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
5436; EPILOG-NEXT:    call void @bar()
5437; EPILOG-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil, %trip2
5438; EPILOG-NEXT:    br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1.loopexit1
5439; EPILOG:       loop_latch.epil:
5440; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
5441; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
5442; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
5443; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
5444; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !14
5445; EPILOG:       exit2.epilog-lcssa:
5446; EPILOG-NEXT:    br label %exit2
5447; EPILOG:       exit2:
5448; EPILOG-NEXT:    ret void
5449;
5450; EPILOG-BLOCK-LABEL: @test10(
5451; EPILOG-BLOCK-NEXT:  entry:
5452; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
5453; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
5454; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
5455; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
5456; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit2.unr-lcssa, label %entry.new
5457; EPILOG-BLOCK:       entry.new:
5458; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
5459; EPILOG-BLOCK-NEXT:    br label %loop_header
5460; EPILOG-BLOCK:       loop_header:
5461; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5462; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
5463; EPILOG-BLOCK-NEXT:    call void @bar()
5464; EPILOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5465; EPILOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5466; EPILOG-BLOCK:       loop_latch:
5467; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5468; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5469; EPILOG-BLOCK-NEXT:    call void @bar()
5470; EPILOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5471; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5472; EPILOG-BLOCK:       loop_latch.1:
5473; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5474; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
5475; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
5476; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !16
5477; EPILOG-BLOCK:       exit1.loopexit:
5478; EPILOG-BLOCK-NEXT:    br label %exit1
5479; EPILOG-BLOCK:       exit1:
5480; EPILOG-BLOCK-NEXT:    ret void
5481; EPILOG-BLOCK:       exit2.unr-lcssa.loopexit:
5482; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
5483; EPILOG-BLOCK-NEXT:    br label %exit2.unr-lcssa
5484; EPILOG-BLOCK:       exit2.unr-lcssa:
5485; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ]
5486; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5487; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5488; EPILOG-BLOCK:       loop_header.epil.preheader:
5489; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
5490; EPILOG-BLOCK:       loop_header.epil:
5491; EPILOG-BLOCK-NEXT:    call void @bar()
5492; EPILOG-BLOCK-NEXT:    %cmp_early.epil = icmp ne i64 %iv.unr, %trip2
5493; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1
5494; EPILOG-BLOCK:       loop_latch.epil:
5495; EPILOG-BLOCK-NEXT:    br label %exit2
5496; EPILOG-BLOCK:       exit2:
5497; EPILOG-BLOCK-NEXT:    ret void
5498;
5499; PROLOG-LABEL: @test10(
5500; PROLOG-NEXT:  entry:
5501; PROLOG-NEXT:    %0 = freeze i64 %trip
5502; PROLOG-NEXT:    %1 = add i64 %0, -1
5503; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
5504; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5505; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5506; PROLOG:       loop_header.prol.preheader:
5507; PROLOG-NEXT:    br label %loop_header.prol
5508; PROLOG:       loop_header.prol:
5509; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
5510; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
5511; PROLOG-NEXT:    call void @bar()
5512; PROLOG-NEXT:    %cmp_early.prol = icmp ne i64 %iv.prol, %trip2
5513; PROLOG-NEXT:    br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1.loopexit1
5514; PROLOG:       loop_latch.prol:
5515; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
5516; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
5517; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
5518; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
5519; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !14
5520; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
5521; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
5522; PROLOG-NEXT:    br label %loop_header.prol.loopexit
5523; PROLOG:       loop_header.prol.loopexit:
5524; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
5525; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
5526; PROLOG-NEXT:    br i1 %2, label %exit2, label %entry.new
5527; PROLOG:       entry.new:
5528; PROLOG-NEXT:    br label %loop_header
5529; PROLOG:       loop_header:
5530; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5531; PROLOG-NEXT:    call void @bar()
5532; PROLOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5533; PROLOG-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5534; PROLOG:       loop_latch:
5535; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
5536; PROLOG-NEXT:    call void @bar()
5537; PROLOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5538; PROLOG-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5539; PROLOG:       loop_latch.1:
5540; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5541; PROLOG-NEXT:    call void @bar()
5542; PROLOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
5543; PROLOG-NEXT:    br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit
5544; PROLOG:       loop_latch.2:
5545; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
5546; PROLOG-NEXT:    call void @bar()
5547; PROLOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
5548; PROLOG-NEXT:    br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit
5549; PROLOG:       loop_latch.3:
5550; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
5551; PROLOG-NEXT:    call void @bar()
5552; PROLOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
5553; PROLOG-NEXT:    br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit
5554; PROLOG:       loop_latch.4:
5555; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
5556; PROLOG-NEXT:    call void @bar()
5557; PROLOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
5558; PROLOG-NEXT:    br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit
5559; PROLOG:       loop_latch.5:
5560; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
5561; PROLOG-NEXT:    call void @bar()
5562; PROLOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
5563; PROLOG-NEXT:    br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit
5564; PROLOG:       loop_latch.6:
5565; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
5566; PROLOG-NEXT:    call void @bar()
5567; PROLOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
5568; PROLOG-NEXT:    br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit
5569; PROLOG:       loop_latch.7:
5570; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
5571; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
5572; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa
5573; PROLOG:       exit1.loopexit:
5574; PROLOG-NEXT:    br label %exit1
5575; PROLOG:       exit1.loopexit1:
5576; PROLOG-NEXT:    br label %exit1
5577; PROLOG:       exit1:
5578; PROLOG-NEXT:    ret void
5579; PROLOG:       exit2.unr-lcssa:
5580; PROLOG-NEXT:    br label %exit2
5581; PROLOG:       exit2:
5582; PROLOG-NEXT:    ret void
5583;
5584; PROLOG-BLOCK-LABEL: @test10(
5585; PROLOG-BLOCK-NEXT:  entry:
5586; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
5587; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
5588; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
5589; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5590; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5591; PROLOG-BLOCK:       loop_header.prol.preheader:
5592; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
5593; PROLOG-BLOCK:       loop_header.prol:
5594; PROLOG-BLOCK-NEXT:    call void @bar()
5595; PROLOG-BLOCK-NEXT:    %cmp_early.prol = icmp ne i64 0, %trip2
5596; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1
5597; PROLOG-BLOCK:       loop_latch.prol:
5598; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
5599; PROLOG-BLOCK:       loop_header.prol.loopexit:
5600; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
5601; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
5602; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit2, label %entry.new
5603; PROLOG-BLOCK:       entry.new:
5604; PROLOG-BLOCK-NEXT:    br label %loop_header
5605; PROLOG-BLOCK:       loop_header:
5606; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5607; PROLOG-BLOCK-NEXT:    call void @bar()
5608; PROLOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5609; PROLOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5610; PROLOG-BLOCK:       loop_latch:
5611; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
5612; PROLOG-BLOCK-NEXT:    call void @bar()
5613; PROLOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5614; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5615; PROLOG-BLOCK:       loop_latch.1:
5616; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5617; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
5618; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !16
5619; PROLOG-BLOCK:       exit1.loopexit:
5620; PROLOG-BLOCK-NEXT:    br label %exit1
5621; PROLOG-BLOCK:       exit1:
5622; PROLOG-BLOCK-NEXT:    ret void
5623; PROLOG-BLOCK:       exit2.unr-lcssa:
5624; PROLOG-BLOCK-NEXT:    br label %exit2
5625; PROLOG-BLOCK:       exit2:
5626; PROLOG-BLOCK-NEXT:    ret void
5627;
5628entry:
5629  br label %loop_header
5630
5631loop_header:
5632  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
5633  call void @bar()
5634  %cmp_early = icmp ne i64 %iv, %trip2
5635  br i1 %cmp_early, label %loop_latch, label %exit1
5636
5637loop_latch:
5638  %iv_next = add i64 %iv, 1
5639  %cmp = icmp ne i64 %iv_next, %trip
5640  br i1 %cmp, label %loop_header, label %exit2
5641
5642exit1:
5643  ret void
5644
5645exit2:
5646  ret void
5647}
5648
5649; With a loop invariant, we can eliminate the last N-1
5650; copies of the exit test in the unrolled main loop body.
5651define void @test11(i64 %trip, i1 %cond) {
5652; EPILOG-LABEL: @test11(
5653; EPILOG-NEXT:  entry:
5654; EPILOG-NEXT:    %0 = freeze i64 %trip
5655; EPILOG-NEXT:    %1 = add i64 %0, -1
5656; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
5657; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
5658; EPILOG-NEXT:    br i1 %2, label %exit2.unr-lcssa, label %entry.new
5659; EPILOG:       entry.new:
5660; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
5661; EPILOG-NEXT:    br label %loop_header
5662; EPILOG:       loop_header:
5663; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5664; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
5665; EPILOG-NEXT:    call void @bar()
5666; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5667; EPILOG:       loop_latch:
5668; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5669; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5670; EPILOG-NEXT:    call void @bar()
5671; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5672; EPILOG:       loop_latch.1:
5673; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
5674; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
5675; EPILOG-NEXT:    call void @bar()
5676; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.loopexit
5677; EPILOG:       loop_latch.2:
5678; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
5679; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
5680; EPILOG-NEXT:    call void @bar()
5681; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.loopexit
5682; EPILOG:       loop_latch.3:
5683; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
5684; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
5685; EPILOG-NEXT:    call void @bar()
5686; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.loopexit
5687; EPILOG:       loop_latch.4:
5688; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
5689; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
5690; EPILOG-NEXT:    call void @bar()
5691; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.loopexit
5692; EPILOG:       loop_latch.5:
5693; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
5694; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
5695; EPILOG-NEXT:    call void @bar()
5696; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.loopexit
5697; EPILOG:       loop_latch.6:
5698; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
5699; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
5700; EPILOG-NEXT:    call void @bar()
5701; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.loopexit
5702; EPILOG:       loop_latch.7:
5703; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
5704; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
5705; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
5706; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit
5707; EPILOG:       exit1.loopexit:
5708; EPILOG-NEXT:    br label %exit1
5709; EPILOG:       exit1.loopexit1:
5710; EPILOG-NEXT:    br label %exit1
5711; EPILOG:       exit1:
5712; EPILOG-NEXT:    ret void
5713; EPILOG:       exit2.unr-lcssa.loopexit:
5714; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
5715; EPILOG-NEXT:    br label %exit2.unr-lcssa
5716; EPILOG:       exit2.unr-lcssa:
5717; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ]
5718; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5719; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5720; EPILOG:       loop_header.epil.preheader:
5721; EPILOG-NEXT:    br label %loop_header.epil
5722; EPILOG:       loop_header.epil:
5723; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
5724; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
5725; EPILOG-NEXT:    call void @bar()
5726; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1.loopexit1
5727; EPILOG:       loop_latch.epil:
5728; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
5729; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
5730; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
5731; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
5732; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !15
5733; EPILOG:       exit2.epilog-lcssa:
5734; EPILOG-NEXT:    br label %exit2
5735; EPILOG:       exit2:
5736; EPILOG-NEXT:    ret void
5737;
5738; EPILOG-BLOCK-LABEL: @test11(
5739; EPILOG-BLOCK-NEXT:  entry:
5740; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
5741; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
5742; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
5743; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
5744; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit2.unr-lcssa, label %entry.new
5745; EPILOG-BLOCK:       entry.new:
5746; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
5747; EPILOG-BLOCK-NEXT:    br label %loop_header
5748; EPILOG-BLOCK:       loop_header:
5749; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5750; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
5751; EPILOG-BLOCK-NEXT:    call void @bar()
5752; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5753; EPILOG-BLOCK:       loop_latch:
5754; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5755; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5756; EPILOG-BLOCK-NEXT:    call void @bar()
5757; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5758; EPILOG-BLOCK:       loop_latch.1:
5759; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5760; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
5761; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
5762; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !17
5763; EPILOG-BLOCK:       exit1.loopexit:
5764; EPILOG-BLOCK-NEXT:    br label %exit1
5765; EPILOG-BLOCK:       exit1:
5766; EPILOG-BLOCK-NEXT:    ret void
5767; EPILOG-BLOCK:       exit2.unr-lcssa.loopexit:
5768; EPILOG-BLOCK-NEXT:    br label %exit2.unr-lcssa
5769; EPILOG-BLOCK:       exit2.unr-lcssa:
5770; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5771; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5772; EPILOG-BLOCK:       loop_header.epil.preheader:
5773; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
5774; EPILOG-BLOCK:       loop_header.epil:
5775; EPILOG-BLOCK-NEXT:    call void @bar()
5776; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1
5777; EPILOG-BLOCK:       loop_latch.epil:
5778; EPILOG-BLOCK-NEXT:    br label %exit2
5779; EPILOG-BLOCK:       exit2:
5780; EPILOG-BLOCK-NEXT:    ret void
5781;
5782; PROLOG-LABEL: @test11(
5783; PROLOG-NEXT:  entry:
5784; PROLOG-NEXT:    %0 = freeze i64 %trip
5785; PROLOG-NEXT:    %1 = add i64 %0, -1
5786; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
5787; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5788; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5789; PROLOG:       loop_header.prol.preheader:
5790; PROLOG-NEXT:    br label %loop_header.prol
5791; PROLOG:       loop_header.prol:
5792; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
5793; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
5794; PROLOG-NEXT:    call void @bar()
5795; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1.loopexit1
5796; PROLOG:       loop_latch.prol:
5797; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
5798; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
5799; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
5800; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
5801; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !15
5802; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
5803; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
5804; PROLOG-NEXT:    br label %loop_header.prol.loopexit
5805; PROLOG:       loop_header.prol.loopexit:
5806; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
5807; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
5808; PROLOG-NEXT:    br i1 %2, label %exit2, label %entry.new
5809; PROLOG:       entry.new:
5810; PROLOG-NEXT:    br label %loop_header
5811; PROLOG:       loop_header:
5812; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5813; PROLOG-NEXT:    call void @bar()
5814; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5815; PROLOG:       loop_latch:
5816; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
5817; PROLOG-NEXT:    call void @bar()
5818; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5819; PROLOG:       loop_latch.1:
5820; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5821; PROLOG-NEXT:    call void @bar()
5822; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.loopexit
5823; PROLOG:       loop_latch.2:
5824; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
5825; PROLOG-NEXT:    call void @bar()
5826; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.loopexit
5827; PROLOG:       loop_latch.3:
5828; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
5829; PROLOG-NEXT:    call void @bar()
5830; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.loopexit
5831; PROLOG:       loop_latch.4:
5832; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
5833; PROLOG-NEXT:    call void @bar()
5834; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.loopexit
5835; PROLOG:       loop_latch.5:
5836; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
5837; PROLOG-NEXT:    call void @bar()
5838; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.loopexit
5839; PROLOG:       loop_latch.6:
5840; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
5841; PROLOG-NEXT:    call void @bar()
5842; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.loopexit
5843; PROLOG:       loop_latch.7:
5844; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
5845; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
5846; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa
5847; PROLOG:       exit1.loopexit:
5848; PROLOG-NEXT:    br label %exit1
5849; PROLOG:       exit1.loopexit1:
5850; PROLOG-NEXT:    br label %exit1
5851; PROLOG:       exit1:
5852; PROLOG-NEXT:    ret void
5853; PROLOG:       exit2.unr-lcssa:
5854; PROLOG-NEXT:    br label %exit2
5855; PROLOG:       exit2:
5856; PROLOG-NEXT:    ret void
5857;
5858; PROLOG-BLOCK-LABEL: @test11(
5859; PROLOG-BLOCK-NEXT:  entry:
5860; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
5861; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
5862; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
5863; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5864; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5865; PROLOG-BLOCK:       loop_header.prol.preheader:
5866; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
5867; PROLOG-BLOCK:       loop_header.prol:
5868; PROLOG-BLOCK-NEXT:    call void @bar()
5869; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1
5870; PROLOG-BLOCK:       loop_latch.prol:
5871; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
5872; PROLOG-BLOCK:       loop_header.prol.loopexit:
5873; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
5874; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
5875; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit2, label %entry.new
5876; PROLOG-BLOCK:       entry.new:
5877; PROLOG-BLOCK-NEXT:    br label %loop_header
5878; PROLOG-BLOCK:       loop_header:
5879; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5880; PROLOG-BLOCK-NEXT:    call void @bar()
5881; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5882; PROLOG-BLOCK:       loop_latch:
5883; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
5884; PROLOG-BLOCK-NEXT:    call void @bar()
5885; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5886; PROLOG-BLOCK:       loop_latch.1:
5887; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5888; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
5889; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !17
5890; PROLOG-BLOCK:       exit1.loopexit:
5891; PROLOG-BLOCK-NEXT:    br label %exit1
5892; PROLOG-BLOCK:       exit1:
5893; PROLOG-BLOCK-NEXT:    ret void
5894; PROLOG-BLOCK:       exit2.unr-lcssa:
5895; PROLOG-BLOCK-NEXT:    br label %exit2
5896; PROLOG-BLOCK:       exit2:
5897; PROLOG-BLOCK-NEXT:    ret void
5898;
5899entry:
5900  br label %loop_header
5901
5902loop_header:
5903  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
5904  call void @bar()
5905  br i1 %cond, label %loop_latch, label %exit1
5906
5907loop_latch:
5908  %iv_next = add i64 %iv, 1
5909  %cmp = icmp ne i64 %iv_next, %trip
5910  br i1 %cmp, label %loop_header, label %exit2
5911
5912exit1:
5913  ret void
5914
5915exit2:
5916  ret void
5917}
5918
5919; Combine a computeable and invariant test to make sure
5920; the interaction of both doesn't do anything weird
5921define void @test12(i64 %trip, i64 %trip2, i1 %cond) {
5922; EPILOG-LABEL: @test12(
5923; EPILOG-NEXT:  entry:
5924; EPILOG-NEXT:    %0 = freeze i64 %trip
5925; EPILOG-NEXT:    %1 = add i64 %0, -1
5926; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
5927; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
5928; EPILOG-NEXT:    br i1 %2, label %exit1.unr-lcssa, label %entry.new
5929; EPILOG:       entry.new:
5930; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
5931; EPILOG-NEXT:    br label %loop_header
5932; EPILOG:       loop_header:
5933; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5934; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
5935; EPILOG-NEXT:    call void @bar()
5936; EPILOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5937; EPILOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
5938; EPILOG:       loop_exiting_bb2:
5939; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit
5940; EPILOG:       loop_latch:
5941; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5942; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5943; EPILOG-NEXT:    call void @bar()
5944; EPILOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5945; EPILOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
5946; EPILOG:       loop_exiting_bb2.1:
5947; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
5948; EPILOG:       loop_latch.1:
5949; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
5950; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
5951; EPILOG-NEXT:    call void @bar()
5952; EPILOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
5953; EPILOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit
5954; EPILOG:       loop_exiting_bb2.2:
5955; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit
5956; EPILOG:       loop_latch.2:
5957; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
5958; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
5959; EPILOG-NEXT:    call void @bar()
5960; EPILOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
5961; EPILOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit
5962; EPILOG:       loop_exiting_bb2.3:
5963; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit
5964; EPILOG:       loop_latch.3:
5965; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
5966; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
5967; EPILOG-NEXT:    call void @bar()
5968; EPILOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
5969; EPILOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit
5970; EPILOG:       loop_exiting_bb2.4:
5971; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit
5972; EPILOG:       loop_latch.4:
5973; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
5974; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
5975; EPILOG-NEXT:    call void @bar()
5976; EPILOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
5977; EPILOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit
5978; EPILOG:       loop_exiting_bb2.5:
5979; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit
5980; EPILOG:       loop_latch.5:
5981; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
5982; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
5983; EPILOG-NEXT:    call void @bar()
5984; EPILOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
5985; EPILOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit
5986; EPILOG:       loop_exiting_bb2.6:
5987; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit
5988; EPILOG:       loop_latch.6:
5989; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
5990; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
5991; EPILOG-NEXT:    call void @bar()
5992; EPILOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
5993; EPILOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit
5994; EPILOG:       loop_exiting_bb2.7:
5995; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit
5996; EPILOG:       loop_latch.7:
5997; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
5998; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
5999; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
6000; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6001; EPILOG:       exit1.unr-lcssa.loopexit:
6002; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
6003; EPILOG-NEXT:    br label %exit1.unr-lcssa
6004; EPILOG:       exit1.unr-lcssa:
6005; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
6006; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6007; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6008; EPILOG:       loop_header.epil.preheader:
6009; EPILOG-NEXT:    br label %loop_header.epil
6010; EPILOG:       loop_header.epil:
6011; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
6012; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
6013; EPILOG-NEXT:    call void @bar()
6014; EPILOG-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil, %trip2
6015; EPILOG-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1
6016; EPILOG:       loop_exiting_bb2.epil:
6017; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1
6018; EPILOG:       loop_latch.epil:
6019; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
6020; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
6021; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
6022; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
6023; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !16
6024; EPILOG:       exit1.epilog-lcssa.loopexit:
6025; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6026; EPILOG:       exit1.epilog-lcssa.loopexit1:
6027; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6028; EPILOG:       exit1.epilog-lcssa:
6029; EPILOG-NEXT:    br label %exit1
6030; EPILOG:       exit1:
6031; EPILOG-NEXT:    ret void
6032;
6033; EPILOG-BLOCK-LABEL: @test12(
6034; EPILOG-BLOCK-NEXT:  entry:
6035; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
6036; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
6037; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
6038; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
6039; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit1.unr-lcssa, label %entry.new
6040; EPILOG-BLOCK:       entry.new:
6041; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
6042; EPILOG-BLOCK-NEXT:    br label %loop_header
6043; EPILOG-BLOCK:       loop_header:
6044; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6045; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
6046; EPILOG-BLOCK-NEXT:    call void @bar()
6047; EPILOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6048; EPILOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6049; EPILOG-BLOCK:       loop_exiting_bb2:
6050; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6051; EPILOG-BLOCK:       loop_latch:
6052; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
6053; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
6054; EPILOG-BLOCK-NEXT:    call void @bar()
6055; EPILOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6056; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6057; EPILOG-BLOCK:       loop_exiting_bb2.1:
6058; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6059; EPILOG-BLOCK:       loop_latch.1:
6060; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6061; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
6062; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
6063; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18
6064; EPILOG-BLOCK:       exit1.unr-lcssa.loopexit:
6065; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
6066; EPILOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6067; EPILOG-BLOCK:       exit1.unr-lcssa:
6068; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
6069; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6070; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6071; EPILOG-BLOCK:       loop_header.epil.preheader:
6072; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
6073; EPILOG-BLOCK:       loop_header.epil:
6074; EPILOG-BLOCK-NEXT:    call void @bar()
6075; EPILOG-BLOCK-NEXT:    %cmp_early.epil = icmp ne i64 %iv.unr, %trip2
6076; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa
6077; EPILOG-BLOCK:       loop_exiting_bb2.epil:
6078; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa
6079; EPILOG-BLOCK:       loop_latch.epil:
6080; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6081; EPILOG-BLOCK:       exit1.epilog-lcssa.loopexit:
6082; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6083; EPILOG-BLOCK:       exit1.epilog-lcssa:
6084; EPILOG-BLOCK-NEXT:    br label %exit1
6085; EPILOG-BLOCK:       exit1:
6086; EPILOG-BLOCK-NEXT:    ret void
6087;
6088; PROLOG-LABEL: @test12(
6089; PROLOG-NEXT:  entry:
6090; PROLOG-NEXT:    %0 = freeze i64 %trip
6091; PROLOG-NEXT:    %1 = add i64 %0, -1
6092; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
6093; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6094; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6095; PROLOG:       loop_header.prol.preheader:
6096; PROLOG-NEXT:    br label %loop_header.prol
6097; PROLOG:       loop_header.prol:
6098; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
6099; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
6100; PROLOG-NEXT:    call void @bar()
6101; PROLOG-NEXT:    %cmp_early.prol = icmp ne i64 %iv.prol, %trip2
6102; PROLOG-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1
6103; PROLOG:       loop_exiting_bb2.prol:
6104; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1
6105; PROLOG:       loop_latch.prol:
6106; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
6107; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
6108; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
6109; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
6110; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !16
6111; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
6112; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
6113; PROLOG-NEXT:    br label %loop_header.prol.loopexit
6114; PROLOG:       loop_header.prol.loopexit:
6115; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
6116; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
6117; PROLOG-NEXT:    br i1 %2, label %exit1, label %entry.new
6118; PROLOG:       entry.new:
6119; PROLOG-NEXT:    br label %loop_header
6120; PROLOG:       loop_header:
6121; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6122; PROLOG-NEXT:    call void @bar()
6123; PROLOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6124; PROLOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6125; PROLOG:       loop_exiting_bb2:
6126; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit
6127; PROLOG:       loop_latch:
6128; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
6129; PROLOG-NEXT:    call void @bar()
6130; PROLOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6131; PROLOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6132; PROLOG:       loop_exiting_bb2.1:
6133; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6134; PROLOG:       loop_latch.1:
6135; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6136; PROLOG-NEXT:    call void @bar()
6137; PROLOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
6138; PROLOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit
6139; PROLOG:       loop_exiting_bb2.2:
6140; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.unr-lcssa.loopexit
6141; PROLOG:       loop_latch.2:
6142; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
6143; PROLOG-NEXT:    call void @bar()
6144; PROLOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
6145; PROLOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit
6146; PROLOG:       loop_exiting_bb2.3:
6147; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.unr-lcssa.loopexit
6148; PROLOG:       loop_latch.3:
6149; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
6150; PROLOG-NEXT:    call void @bar()
6151; PROLOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
6152; PROLOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit
6153; PROLOG:       loop_exiting_bb2.4:
6154; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.unr-lcssa.loopexit
6155; PROLOG:       loop_latch.4:
6156; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
6157; PROLOG-NEXT:    call void @bar()
6158; PROLOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
6159; PROLOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit
6160; PROLOG:       loop_exiting_bb2.5:
6161; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.unr-lcssa.loopexit
6162; PROLOG:       loop_latch.5:
6163; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
6164; PROLOG-NEXT:    call void @bar()
6165; PROLOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
6166; PROLOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit
6167; PROLOG:       loop_exiting_bb2.6:
6168; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.unr-lcssa.loopexit
6169; PROLOG:       loop_latch.6:
6170; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
6171; PROLOG-NEXT:    call void @bar()
6172; PROLOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
6173; PROLOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit
6174; PROLOG:       loop_exiting_bb2.7:
6175; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.unr-lcssa.loopexit
6176; PROLOG:       loop_latch.7:
6177; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
6178; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
6179; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6180; PROLOG:       exit1.unr-lcssa.loopexit:
6181; PROLOG-NEXT:    br label %exit1.unr-lcssa
6182; PROLOG:       exit1.unr-lcssa.loopexit1:
6183; PROLOG-NEXT:    br label %exit1.unr-lcssa
6184; PROLOG:       exit1.unr-lcssa:
6185; PROLOG-NEXT:    br label %exit1
6186; PROLOG:       exit1:
6187; PROLOG-NEXT:    ret void
6188;
6189; PROLOG-BLOCK-LABEL: @test12(
6190; PROLOG-BLOCK-NEXT:  entry:
6191; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
6192; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
6193; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
6194; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6195; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6196; PROLOG-BLOCK:       loop_header.prol.preheader:
6197; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
6198; PROLOG-BLOCK:       loop_header.prol:
6199; PROLOG-BLOCK-NEXT:    call void @bar()
6200; PROLOG-BLOCK-NEXT:    %cmp_early.prol = icmp ne i64 0, %trip2
6201; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa
6202; PROLOG-BLOCK:       loop_exiting_bb2.prol:
6203; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa
6204; PROLOG-BLOCK:       loop_latch.prol:
6205; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
6206; PROLOG-BLOCK:       loop_header.prol.loopexit:
6207; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
6208; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
6209; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit1, label %entry.new
6210; PROLOG-BLOCK:       entry.new:
6211; PROLOG-BLOCK-NEXT:    br label %loop_header
6212; PROLOG-BLOCK:       loop_header:
6213; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6214; PROLOG-BLOCK-NEXT:    call void @bar()
6215; PROLOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6216; PROLOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6217; PROLOG-BLOCK:       loop_exiting_bb2:
6218; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit
6219; PROLOG-BLOCK:       loop_latch:
6220; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
6221; PROLOG-BLOCK-NEXT:    call void @bar()
6222; PROLOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6223; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6224; PROLOG-BLOCK:       loop_exiting_bb2.1:
6225; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6226; PROLOG-BLOCK:       loop_latch.1:
6227; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6228; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
6229; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18
6230; PROLOG-BLOCK:       exit1.unr-lcssa.loopexit:
6231; PROLOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6232; PROLOG-BLOCK:       exit1.unr-lcssa:
6233; PROLOG-BLOCK-NEXT:    br label %exit1
6234; PROLOG-BLOCK:       exit1:
6235; PROLOG-BLOCK-NEXT:    ret void
6236;
6237entry:
6238  br label %loop_header
6239
6240loop_header:
6241  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
6242  call void @bar()
6243  %cmp_early = icmp ne i64 %iv, %trip2
6244  br i1 %cmp_early, label %loop_exiting_bb2, label %exit1
6245
6246loop_exiting_bb2:
6247  br i1 %cond, label %loop_latch, label %exit1
6248
6249loop_latch:
6250  %iv_next = add i64 %iv, 1
6251  %cmp = icmp ne i64 %iv_next, %trip
6252  br i1 %cmp, label %loop_header, label %exit1
6253
6254exit1:
6255  ret void
6256}
6257
6258declare i1 @unknown_cond()
6259
6260; Mix of computable and uncompatable exits
6261define void @test13(i64 %trip, i64 %trip2) {
6262; EPILOG-LABEL: @test13(
6263; EPILOG-NEXT:  entry:
6264; EPILOG-NEXT:    %0 = freeze i64 %trip
6265; EPILOG-NEXT:    %1 = add i64 %0, -1
6266; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
6267; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
6268; EPILOG-NEXT:    br i1 %2, label %exit1.unr-lcssa, label %entry.new
6269; EPILOG:       entry.new:
6270; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
6271; EPILOG-NEXT:    br label %loop_header
6272; EPILOG:       loop_header:
6273; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6274; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
6275; EPILOG-NEXT:    call void @bar()
6276; EPILOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6277; EPILOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6278; EPILOG:       loop_exiting_bb2:
6279; EPILOG-NEXT:    %unknown = call i1 @unknown_cond()
6280; EPILOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6281; EPILOG:       loop_latch:
6282; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
6283; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
6284; EPILOG-NEXT:    call void @bar()
6285; EPILOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6286; EPILOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6287; EPILOG:       loop_exiting_bb2.1:
6288; EPILOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
6289; EPILOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6290; EPILOG:       loop_latch.1:
6291; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
6292; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
6293; EPILOG-NEXT:    call void @bar()
6294; EPILOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
6295; EPILOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit
6296; EPILOG:       loop_exiting_bb2.2:
6297; EPILOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
6298; EPILOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit
6299; EPILOG:       loop_latch.2:
6300; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
6301; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
6302; EPILOG-NEXT:    call void @bar()
6303; EPILOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
6304; EPILOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit
6305; EPILOG:       loop_exiting_bb2.3:
6306; EPILOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
6307; EPILOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit
6308; EPILOG:       loop_latch.3:
6309; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
6310; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
6311; EPILOG-NEXT:    call void @bar()
6312; EPILOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
6313; EPILOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit
6314; EPILOG:       loop_exiting_bb2.4:
6315; EPILOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
6316; EPILOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit
6317; EPILOG:       loop_latch.4:
6318; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
6319; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
6320; EPILOG-NEXT:    call void @bar()
6321; EPILOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
6322; EPILOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit
6323; EPILOG:       loop_exiting_bb2.5:
6324; EPILOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
6325; EPILOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit
6326; EPILOG:       loop_latch.5:
6327; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
6328; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
6329; EPILOG-NEXT:    call void @bar()
6330; EPILOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
6331; EPILOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit
6332; EPILOG:       loop_exiting_bb2.6:
6333; EPILOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
6334; EPILOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit
6335; EPILOG:       loop_latch.6:
6336; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
6337; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
6338; EPILOG-NEXT:    call void @bar()
6339; EPILOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
6340; EPILOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit
6341; EPILOG:       loop_exiting_bb2.7:
6342; EPILOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
6343; EPILOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit
6344; EPILOG:       loop_latch.7:
6345; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
6346; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
6347; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
6348; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6349; EPILOG:       exit1.unr-lcssa.loopexit:
6350; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
6351; EPILOG-NEXT:    br label %exit1.unr-lcssa
6352; EPILOG:       exit1.unr-lcssa:
6353; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
6354; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6355; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6356; EPILOG:       loop_header.epil.preheader:
6357; EPILOG-NEXT:    br label %loop_header.epil
6358; EPILOG:       loop_header.epil:
6359; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
6360; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
6361; EPILOG-NEXT:    call void @bar()
6362; EPILOG-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil, %trip2
6363; EPILOG-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1
6364; EPILOG:       loop_exiting_bb2.epil:
6365; EPILOG-NEXT:    %unknown.epil = call i1 @unknown_cond()
6366; EPILOG-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1
6367; EPILOG:       loop_latch.epil:
6368; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
6369; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
6370; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
6371; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
6372; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !17
6373; EPILOG:       exit1.epilog-lcssa.loopexit:
6374; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6375; EPILOG:       exit1.epilog-lcssa.loopexit1:
6376; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6377; EPILOG:       exit1.epilog-lcssa:
6378; EPILOG-NEXT:    br label %exit1
6379; EPILOG:       exit1:
6380; EPILOG-NEXT:    ret void
6381;
6382; EPILOG-BLOCK-LABEL: @test13(
6383; EPILOG-BLOCK-NEXT:  entry:
6384; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
6385; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
6386; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
6387; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
6388; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit1.unr-lcssa, label %entry.new
6389; EPILOG-BLOCK:       entry.new:
6390; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
6391; EPILOG-BLOCK-NEXT:    br label %loop_header
6392; EPILOG-BLOCK:       loop_header:
6393; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6394; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
6395; EPILOG-BLOCK-NEXT:    call void @bar()
6396; EPILOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6397; EPILOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6398; EPILOG-BLOCK:       loop_exiting_bb2:
6399; EPILOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6400; EPILOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6401; EPILOG-BLOCK:       loop_latch:
6402; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
6403; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
6404; EPILOG-BLOCK-NEXT:    call void @bar()
6405; EPILOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6406; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6407; EPILOG-BLOCK:       loop_exiting_bb2.1:
6408; EPILOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6409; EPILOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6410; EPILOG-BLOCK:       loop_latch.1:
6411; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6412; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
6413; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
6414; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19
6415; EPILOG-BLOCK:       exit1.unr-lcssa.loopexit:
6416; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
6417; EPILOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6418; EPILOG-BLOCK:       exit1.unr-lcssa:
6419; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
6420; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6421; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6422; EPILOG-BLOCK:       loop_header.epil.preheader:
6423; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
6424; EPILOG-BLOCK:       loop_header.epil:
6425; EPILOG-BLOCK-NEXT:    call void @bar()
6426; EPILOG-BLOCK-NEXT:    %cmp_early.epil = icmp ne i64 %iv.unr, %trip2
6427; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa
6428; EPILOG-BLOCK:       loop_exiting_bb2.epil:
6429; EPILOG-BLOCK-NEXT:    %unknown.epil = call i1 @unknown_cond()
6430; EPILOG-BLOCK-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa
6431; EPILOG-BLOCK:       loop_latch.epil:
6432; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6433; EPILOG-BLOCK:       exit1.epilog-lcssa.loopexit:
6434; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6435; EPILOG-BLOCK:       exit1.epilog-lcssa:
6436; EPILOG-BLOCK-NEXT:    br label %exit1
6437; EPILOG-BLOCK:       exit1:
6438; EPILOG-BLOCK-NEXT:    ret void
6439;
6440; PROLOG-LABEL: @test13(
6441; PROLOG-NEXT:  entry:
6442; PROLOG-NEXT:    %0 = freeze i64 %trip
6443; PROLOG-NEXT:    %1 = add i64 %0, -1
6444; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
6445; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6446; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6447; PROLOG:       loop_header.prol.preheader:
6448; PROLOG-NEXT:    br label %loop_header.prol
6449; PROLOG:       loop_header.prol:
6450; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
6451; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
6452; PROLOG-NEXT:    call void @bar()
6453; PROLOG-NEXT:    %cmp_early.prol = icmp ne i64 %iv.prol, %trip2
6454; PROLOG-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1
6455; PROLOG:       loop_exiting_bb2.prol:
6456; PROLOG-NEXT:    %unknown.prol = call i1 @unknown_cond()
6457; PROLOG-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1
6458; PROLOG:       loop_latch.prol:
6459; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
6460; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
6461; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
6462; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
6463; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !17
6464; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
6465; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
6466; PROLOG-NEXT:    br label %loop_header.prol.loopexit
6467; PROLOG:       loop_header.prol.loopexit:
6468; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
6469; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
6470; PROLOG-NEXT:    br i1 %2, label %exit1, label %entry.new
6471; PROLOG:       entry.new:
6472; PROLOG-NEXT:    br label %loop_header
6473; PROLOG:       loop_header:
6474; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6475; PROLOG-NEXT:    call void @bar()
6476; PROLOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6477; PROLOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6478; PROLOG:       loop_exiting_bb2:
6479; PROLOG-NEXT:    %unknown = call i1 @unknown_cond()
6480; PROLOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6481; PROLOG:       loop_latch:
6482; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
6483; PROLOG-NEXT:    call void @bar()
6484; PROLOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6485; PROLOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6486; PROLOG:       loop_exiting_bb2.1:
6487; PROLOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
6488; PROLOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6489; PROLOG:       loop_latch.1:
6490; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6491; PROLOG-NEXT:    call void @bar()
6492; PROLOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
6493; PROLOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit
6494; PROLOG:       loop_exiting_bb2.2:
6495; PROLOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
6496; PROLOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit
6497; PROLOG:       loop_latch.2:
6498; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
6499; PROLOG-NEXT:    call void @bar()
6500; PROLOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
6501; PROLOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit
6502; PROLOG:       loop_exiting_bb2.3:
6503; PROLOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
6504; PROLOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit
6505; PROLOG:       loop_latch.3:
6506; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
6507; PROLOG-NEXT:    call void @bar()
6508; PROLOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
6509; PROLOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit
6510; PROLOG:       loop_exiting_bb2.4:
6511; PROLOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
6512; PROLOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit
6513; PROLOG:       loop_latch.4:
6514; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
6515; PROLOG-NEXT:    call void @bar()
6516; PROLOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
6517; PROLOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit
6518; PROLOG:       loop_exiting_bb2.5:
6519; PROLOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
6520; PROLOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit
6521; PROLOG:       loop_latch.5:
6522; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
6523; PROLOG-NEXT:    call void @bar()
6524; PROLOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
6525; PROLOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit
6526; PROLOG:       loop_exiting_bb2.6:
6527; PROLOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
6528; PROLOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit
6529; PROLOG:       loop_latch.6:
6530; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
6531; PROLOG-NEXT:    call void @bar()
6532; PROLOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
6533; PROLOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit
6534; PROLOG:       loop_exiting_bb2.7:
6535; PROLOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
6536; PROLOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit
6537; PROLOG:       loop_latch.7:
6538; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
6539; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
6540; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6541; PROLOG:       exit1.unr-lcssa.loopexit:
6542; PROLOG-NEXT:    br label %exit1.unr-lcssa
6543; PROLOG:       exit1.unr-lcssa.loopexit1:
6544; PROLOG-NEXT:    br label %exit1.unr-lcssa
6545; PROLOG:       exit1.unr-lcssa:
6546; PROLOG-NEXT:    br label %exit1
6547; PROLOG:       exit1:
6548; PROLOG-NEXT:    ret void
6549;
6550; PROLOG-BLOCK-LABEL: @test13(
6551; PROLOG-BLOCK-NEXT:  entry:
6552; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
6553; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
6554; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
6555; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6556; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6557; PROLOG-BLOCK:       loop_header.prol.preheader:
6558; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
6559; PROLOG-BLOCK:       loop_header.prol:
6560; PROLOG-BLOCK-NEXT:    call void @bar()
6561; PROLOG-BLOCK-NEXT:    %cmp_early.prol = icmp ne i64 0, %trip2
6562; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa
6563; PROLOG-BLOCK:       loop_exiting_bb2.prol:
6564; PROLOG-BLOCK-NEXT:    %unknown.prol = call i1 @unknown_cond()
6565; PROLOG-BLOCK-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa
6566; PROLOG-BLOCK:       loop_latch.prol:
6567; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
6568; PROLOG-BLOCK:       loop_header.prol.loopexit:
6569; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
6570; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
6571; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit1, label %entry.new
6572; PROLOG-BLOCK:       entry.new:
6573; PROLOG-BLOCK-NEXT:    br label %loop_header
6574; PROLOG-BLOCK:       loop_header:
6575; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6576; PROLOG-BLOCK-NEXT:    call void @bar()
6577; PROLOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6578; PROLOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6579; PROLOG-BLOCK:       loop_exiting_bb2:
6580; PROLOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6581; PROLOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6582; PROLOG-BLOCK:       loop_latch:
6583; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
6584; PROLOG-BLOCK-NEXT:    call void @bar()
6585; PROLOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6586; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6587; PROLOG-BLOCK:       loop_exiting_bb2.1:
6588; PROLOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6589; PROLOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6590; PROLOG-BLOCK:       loop_latch.1:
6591; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6592; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
6593; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19
6594; PROLOG-BLOCK:       exit1.unr-lcssa.loopexit:
6595; PROLOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6596; PROLOG-BLOCK:       exit1.unr-lcssa:
6597; PROLOG-BLOCK-NEXT:    br label %exit1
6598; PROLOG-BLOCK:       exit1:
6599; PROLOG-BLOCK-NEXT:    ret void
6600;
6601entry:
6602  br label %loop_header
6603
6604loop_header:
6605  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
6606  call void @bar()
6607  %cmp_early = icmp ne i64 %iv, %trip2
6608  br i1 %cmp_early, label %loop_exiting_bb2, label %exit1
6609
6610loop_exiting_bb2:
6611  %unknown = call i1 @unknown_cond()
6612  br i1 %unknown, label %loop_latch, label %exit1
6613
6614loop_latch:
6615  %iv_next = add i64 %iv, 1
6616  %cmp = icmp ne i64 %iv_next, %trip
6617  br i1 %cmp, label %loop_header, label %exit1
6618
6619exit1:
6620  ret void
6621}
6622
6623; Mix of invariant and (even in theory) uncomputable exits
6624define void @test14(i64 %trip, i1 %cond) {
6625; EPILOG-LABEL: @test14(
6626; EPILOG-NEXT:  entry:
6627; EPILOG-NEXT:    %0 = freeze i64 %trip
6628; EPILOG-NEXT:    %1 = add i64 %0, -1
6629; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
6630; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
6631; EPILOG-NEXT:    br i1 %2, label %exit1.unr-lcssa, label %entry.new
6632; EPILOG:       entry.new:
6633; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
6634; EPILOG-NEXT:    br label %loop_header
6635; EPILOG:       loop_header:
6636; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6637; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
6638; EPILOG-NEXT:    call void @bar()
6639; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6640; EPILOG:       loop_exiting_bb2:
6641; EPILOG-NEXT:    %unknown = call i1 @unknown_cond()
6642; EPILOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6643; EPILOG:       loop_latch:
6644; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
6645; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
6646; EPILOG-NEXT:    call void @bar()
6647; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6648; EPILOG:       loop_exiting_bb2.1:
6649; EPILOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
6650; EPILOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6651; EPILOG:       loop_latch.1:
6652; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
6653; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
6654; EPILOG-NEXT:    call void @bar()
6655; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit
6656; EPILOG:       loop_exiting_bb2.2:
6657; EPILOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
6658; EPILOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit
6659; EPILOG:       loop_latch.2:
6660; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
6661; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
6662; EPILOG-NEXT:    call void @bar()
6663; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit
6664; EPILOG:       loop_exiting_bb2.3:
6665; EPILOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
6666; EPILOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit
6667; EPILOG:       loop_latch.3:
6668; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
6669; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
6670; EPILOG-NEXT:    call void @bar()
6671; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit
6672; EPILOG:       loop_exiting_bb2.4:
6673; EPILOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
6674; EPILOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit
6675; EPILOG:       loop_latch.4:
6676; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
6677; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
6678; EPILOG-NEXT:    call void @bar()
6679; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit
6680; EPILOG:       loop_exiting_bb2.5:
6681; EPILOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
6682; EPILOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit
6683; EPILOG:       loop_latch.5:
6684; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
6685; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
6686; EPILOG-NEXT:    call void @bar()
6687; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit
6688; EPILOG:       loop_exiting_bb2.6:
6689; EPILOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
6690; EPILOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit
6691; EPILOG:       loop_latch.6:
6692; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
6693; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
6694; EPILOG-NEXT:    call void @bar()
6695; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit
6696; EPILOG:       loop_exiting_bb2.7:
6697; EPILOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
6698; EPILOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit
6699; EPILOG:       loop_latch.7:
6700; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
6701; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
6702; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
6703; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6704; EPILOG:       exit1.unr-lcssa.loopexit:
6705; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
6706; EPILOG-NEXT:    br label %exit1.unr-lcssa
6707; EPILOG:       exit1.unr-lcssa:
6708; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
6709; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6710; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6711; EPILOG:       loop_header.epil.preheader:
6712; EPILOG-NEXT:    br label %loop_header.epil
6713; EPILOG:       loop_header.epil:
6714; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
6715; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
6716; EPILOG-NEXT:    call void @bar()
6717; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1
6718; EPILOG:       loop_exiting_bb2.epil:
6719; EPILOG-NEXT:    %unknown.epil = call i1 @unknown_cond()
6720; EPILOG-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1
6721; EPILOG:       loop_latch.epil:
6722; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
6723; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
6724; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
6725; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
6726; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !18
6727; EPILOG:       exit1.epilog-lcssa.loopexit:
6728; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6729; EPILOG:       exit1.epilog-lcssa.loopexit1:
6730; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6731; EPILOG:       exit1.epilog-lcssa:
6732; EPILOG-NEXT:    br label %exit1
6733; EPILOG:       exit1:
6734; EPILOG-NEXT:    ret void
6735;
6736; EPILOG-BLOCK-LABEL: @test14(
6737; EPILOG-BLOCK-NEXT:  entry:
6738; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
6739; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
6740; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
6741; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
6742; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit1.unr-lcssa, label %entry.new
6743; EPILOG-BLOCK:       entry.new:
6744; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
6745; EPILOG-BLOCK-NEXT:    br label %loop_header
6746; EPILOG-BLOCK:       loop_header:
6747; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6748; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
6749; EPILOG-BLOCK-NEXT:    call void @bar()
6750; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6751; EPILOG-BLOCK:       loop_exiting_bb2:
6752; EPILOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6753; EPILOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6754; EPILOG-BLOCK:       loop_latch:
6755; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
6756; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
6757; EPILOG-BLOCK-NEXT:    call void @bar()
6758; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6759; EPILOG-BLOCK:       loop_exiting_bb2.1:
6760; EPILOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6761; EPILOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6762; EPILOG-BLOCK:       loop_latch.1:
6763; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6764; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
6765; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
6766; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !20
6767; EPILOG-BLOCK:       exit1.unr-lcssa.loopexit:
6768; EPILOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6769; EPILOG-BLOCK:       exit1.unr-lcssa:
6770; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6771; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6772; EPILOG-BLOCK:       loop_header.epil.preheader:
6773; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
6774; EPILOG-BLOCK:       loop_header.epil:
6775; EPILOG-BLOCK-NEXT:    call void @bar()
6776; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa
6777; EPILOG-BLOCK:       loop_exiting_bb2.epil:
6778; EPILOG-BLOCK-NEXT:    %unknown.epil = call i1 @unknown_cond()
6779; EPILOG-BLOCK-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa
6780; EPILOG-BLOCK:       loop_latch.epil:
6781; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6782; EPILOG-BLOCK:       exit1.epilog-lcssa.loopexit:
6783; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6784; EPILOG-BLOCK:       exit1.epilog-lcssa:
6785; EPILOG-BLOCK-NEXT:    br label %exit1
6786; EPILOG-BLOCK:       exit1:
6787; EPILOG-BLOCK-NEXT:    ret void
6788;
6789; PROLOG-LABEL: @test14(
6790; PROLOG-NEXT:  entry:
6791; PROLOG-NEXT:    %0 = freeze i64 %trip
6792; PROLOG-NEXT:    %1 = add i64 %0, -1
6793; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
6794; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6795; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6796; PROLOG:       loop_header.prol.preheader:
6797; PROLOG-NEXT:    br label %loop_header.prol
6798; PROLOG:       loop_header.prol:
6799; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
6800; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
6801; PROLOG-NEXT:    call void @bar()
6802; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1
6803; PROLOG:       loop_exiting_bb2.prol:
6804; PROLOG-NEXT:    %unknown.prol = call i1 @unknown_cond()
6805; PROLOG-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1
6806; PROLOG:       loop_latch.prol:
6807; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
6808; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
6809; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
6810; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
6811; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !18
6812; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
6813; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
6814; PROLOG-NEXT:    br label %loop_header.prol.loopexit
6815; PROLOG:       loop_header.prol.loopexit:
6816; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
6817; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
6818; PROLOG-NEXT:    br i1 %2, label %exit1, label %entry.new
6819; PROLOG:       entry.new:
6820; PROLOG-NEXT:    br label %loop_header
6821; PROLOG:       loop_header:
6822; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6823; PROLOG-NEXT:    call void @bar()
6824; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6825; PROLOG:       loop_exiting_bb2:
6826; PROLOG-NEXT:    %unknown = call i1 @unknown_cond()
6827; PROLOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6828; PROLOG:       loop_latch:
6829; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
6830; PROLOG-NEXT:    call void @bar()
6831; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6832; PROLOG:       loop_exiting_bb2.1:
6833; PROLOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
6834; PROLOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6835; PROLOG:       loop_latch.1:
6836; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6837; PROLOG-NEXT:    call void @bar()
6838; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit
6839; PROLOG:       loop_exiting_bb2.2:
6840; PROLOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
6841; PROLOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit
6842; PROLOG:       loop_latch.2:
6843; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
6844; PROLOG-NEXT:    call void @bar()
6845; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit
6846; PROLOG:       loop_exiting_bb2.3:
6847; PROLOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
6848; PROLOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit
6849; PROLOG:       loop_latch.3:
6850; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
6851; PROLOG-NEXT:    call void @bar()
6852; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit
6853; PROLOG:       loop_exiting_bb2.4:
6854; PROLOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
6855; PROLOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit
6856; PROLOG:       loop_latch.4:
6857; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
6858; PROLOG-NEXT:    call void @bar()
6859; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit
6860; PROLOG:       loop_exiting_bb2.5:
6861; PROLOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
6862; PROLOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit
6863; PROLOG:       loop_latch.5:
6864; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
6865; PROLOG-NEXT:    call void @bar()
6866; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit
6867; PROLOG:       loop_exiting_bb2.6:
6868; PROLOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
6869; PROLOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit
6870; PROLOG:       loop_latch.6:
6871; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
6872; PROLOG-NEXT:    call void @bar()
6873; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit
6874; PROLOG:       loop_exiting_bb2.7:
6875; PROLOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
6876; PROLOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit
6877; PROLOG:       loop_latch.7:
6878; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
6879; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
6880; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6881; PROLOG:       exit1.unr-lcssa.loopexit:
6882; PROLOG-NEXT:    br label %exit1.unr-lcssa
6883; PROLOG:       exit1.unr-lcssa.loopexit1:
6884; PROLOG-NEXT:    br label %exit1.unr-lcssa
6885; PROLOG:       exit1.unr-lcssa:
6886; PROLOG-NEXT:    br label %exit1
6887; PROLOG:       exit1:
6888; PROLOG-NEXT:    ret void
6889;
6890; PROLOG-BLOCK-LABEL: @test14(
6891; PROLOG-BLOCK-NEXT:  entry:
6892; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
6893; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
6894; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
6895; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6896; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6897; PROLOG-BLOCK:       loop_header.prol.preheader:
6898; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
6899; PROLOG-BLOCK:       loop_header.prol:
6900; PROLOG-BLOCK-NEXT:    call void @bar()
6901; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa
6902; PROLOG-BLOCK:       loop_exiting_bb2.prol:
6903; PROLOG-BLOCK-NEXT:    %unknown.prol = call i1 @unknown_cond()
6904; PROLOG-BLOCK-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa
6905; PROLOG-BLOCK:       loop_latch.prol:
6906; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
6907; PROLOG-BLOCK:       loop_header.prol.loopexit:
6908; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
6909; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
6910; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit1, label %entry.new
6911; PROLOG-BLOCK:       entry.new:
6912; PROLOG-BLOCK-NEXT:    br label %loop_header
6913; PROLOG-BLOCK:       loop_header:
6914; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6915; PROLOG-BLOCK-NEXT:    call void @bar()
6916; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6917; PROLOG-BLOCK:       loop_exiting_bb2:
6918; PROLOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6919; PROLOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6920; PROLOG-BLOCK:       loop_latch:
6921; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
6922; PROLOG-BLOCK-NEXT:    call void @bar()
6923; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6924; PROLOG-BLOCK:       loop_exiting_bb2.1:
6925; PROLOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6926; PROLOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6927; PROLOG-BLOCK:       loop_latch.1:
6928; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6929; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
6930; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !20
6931; PROLOG-BLOCK:       exit1.unr-lcssa.loopexit:
6932; PROLOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6933; PROLOG-BLOCK:       exit1.unr-lcssa:
6934; PROLOG-BLOCK-NEXT:    br label %exit1
6935; PROLOG-BLOCK:       exit1:
6936; PROLOG-BLOCK-NEXT:    ret void
6937;
6938entry:
6939  br label %loop_header
6940
6941loop_header:
6942  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
6943  call void @bar()
6944  br i1 %cond, label %loop_exiting_bb2, label %exit1
6945
6946loop_exiting_bb2:
6947  %unknown = call i1 @unknown_cond()
6948  br i1 %unknown, label %loop_latch, label %exit1
6949
6950loop_latch:
6951  %iv_next = add i64 %iv, 1
6952  %cmp = icmp ne i64 %iv_next, %trip
6953  br i1 %cmp, label %loop_header, label %exit1
6954
6955exit1:
6956  ret void
6957}
6958