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 = add i64 %trip, -1
15; EPILOG-NEXT:    %xtraiter = and i64 %trip, 7
16; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
17; EPILOG-NEXT:    br i1 %1, label %exit2.loopexit.unr-lcssa, label %entry.new
18; EPILOG:       entry.new:
19; EPILOG-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
20; EPILOG-NEXT:    br label %loop_header
21; EPILOG:       loop_header:
22; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
23; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
24; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
25; EPILOG:       loop_exiting_bb1:
26; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
27; EPILOG:       loop_exiting_bb2:
28; EPILOG-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
29; EPILOG:       exit3.loopexit:
30; EPILOG-NEXT:    br label %exit3
31; EPILOG:       exit3.loopexit2:
32; EPILOG-NEXT:    br label %exit3
33; EPILOG:       exit3:
34; EPILOG-NEXT:    ret void
35; EPILOG:       loop_latch:
36; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
37; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
38; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
39; EPILOG:       loop_exiting_bb1.1:
40; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
41; EPILOG:       loop_exiting_bb2.1:
42; EPILOG-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
43; EPILOG:       loop_latch.1:
44; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
45; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
46; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2
47; EPILOG:       loop_exiting_bb1.2:
48; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit
49; EPILOG:       loop_exiting_bb2.2:
50; EPILOG-NEXT:    br i1 false, label %loop_latch.2, label %exit3.loopexit
51; EPILOG:       loop_latch.2:
52; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
53; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
54; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3
55; EPILOG:       loop_exiting_bb1.3:
56; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit
57; EPILOG:       loop_exiting_bb2.3:
58; EPILOG-NEXT:    br i1 false, label %loop_latch.3, label %exit3.loopexit
59; EPILOG:       loop_latch.3:
60; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
61; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
62; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4
63; EPILOG:       loop_exiting_bb1.4:
64; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit
65; EPILOG:       loop_exiting_bb2.4:
66; EPILOG-NEXT:    br i1 false, label %loop_latch.4, label %exit3.loopexit
67; EPILOG:       loop_latch.4:
68; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
69; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
70; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5
71; EPILOG:       loop_exiting_bb1.5:
72; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit
73; EPILOG:       loop_exiting_bb2.5:
74; EPILOG-NEXT:    br i1 false, label %loop_latch.5, label %exit3.loopexit
75; EPILOG:       loop_latch.5:
76; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
77; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
78; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6
79; EPILOG:       loop_exiting_bb1.6:
80; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit
81; EPILOG:       loop_exiting_bb2.6:
82; EPILOG-NEXT:    br i1 false, label %loop_latch.6, label %exit3.loopexit
83; EPILOG:       loop_latch.6:
84; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
85; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
86; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7
87; EPILOG:       loop_exiting_bb1.7:
88; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit
89; EPILOG:       loop_exiting_bb2.7:
90; EPILOG-NEXT:    br i1 false, label %loop_latch.7, label %exit3.loopexit
91; EPILOG:       loop_latch.7:
92; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
93; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
94; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
95; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit
96; EPILOG:       exit1.loopexit:
97; EPILOG-NEXT:    br label %exit1
98; EPILOG:       exit1.loopexit1:
99; EPILOG-NEXT:    br label %exit1
100; EPILOG:       exit1:
101; EPILOG-NEXT:    ret void
102; EPILOG:       exit2.loopexit.unr-lcssa.loopexit:
103; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
104; EPILOG-NEXT:    br label %exit2.loopexit.unr-lcssa
105; EPILOG:       exit2.loopexit.unr-lcssa:
106; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
107; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
108; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
109; EPILOG:       loop_header.epil.preheader:
110; EPILOG-NEXT:    br label %loop_header.epil
111; EPILOG:       loop_header.epil:
112; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
113; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
114; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil
115; EPILOG:       loop_exiting_bb1.epil:
116; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.epil, label %exit1.loopexit1
117; EPILOG:       loop_exiting_bb2.epil:
118; EPILOG-NEXT:    br i1 false, label %loop_latch.epil, label %exit3.loopexit2
119; EPILOG:       loop_latch.epil:
120; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
121; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
122; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
123; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
124; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !0
125; EPILOG:       exit2.loopexit.epilog-lcssa:
126; EPILOG-NEXT:    br label %exit2.loopexit
127; EPILOG:       exit2.loopexit:
128; EPILOG-NEXT:    ret void
129;
130; EPILOG-BLOCK-LABEL: @test1(
131; EPILOG-BLOCK-NEXT:  entry:
132; EPILOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
133; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
134; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
135; EPILOG-BLOCK-NEXT:    br i1 %1, label %exit2.loopexit.unr-lcssa, label %entry.new
136; EPILOG-BLOCK:       entry.new:
137; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
138; EPILOG-BLOCK-NEXT:    br label %loop_header
139; EPILOG-BLOCK:       loop_header:
140; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
141; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
142; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
143; EPILOG-BLOCK:       loop_exiting_bb1:
144; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
145; EPILOG-BLOCK:       loop_exiting_bb2:
146; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
147; EPILOG-BLOCK:       exit3.loopexit:
148; EPILOG-BLOCK-NEXT:    br label %exit3
149; EPILOG-BLOCK:       exit3:
150; EPILOG-BLOCK-NEXT:    ret void
151; EPILOG-BLOCK:       loop_latch:
152; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
153; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
154; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
155; EPILOG-BLOCK:       loop_exiting_bb1.1:
156; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
157; EPILOG-BLOCK:       loop_exiting_bb2.1:
158; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
159; EPILOG-BLOCK:       loop_latch.1:
160; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
161; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
162; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
163; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !0
164; EPILOG-BLOCK:       exit1.loopexit:
165; EPILOG-BLOCK-NEXT:    br label %exit1
166; EPILOG-BLOCK:       exit1:
167; EPILOG-BLOCK-NEXT:    ret void
168; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa.loopexit:
169; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit.unr-lcssa
170; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa:
171; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
172; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
173; EPILOG-BLOCK:       loop_header.epil.preheader:
174; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
175; EPILOG-BLOCK:       loop_header.epil:
176; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil
177; EPILOG-BLOCK:       loop_exiting_bb1.epil:
178; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.epil, label %exit1
179; EPILOG-BLOCK:       loop_exiting_bb2.epil:
180; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch.epil, label %exit3
181; EPILOG-BLOCK:       loop_latch.epil:
182; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit
183; EPILOG-BLOCK:       exit2.loopexit:
184; EPILOG-BLOCK-NEXT:    ret void
185;
186; PROLOG-LABEL: @test1(
187; PROLOG-NEXT:  entry:
188; PROLOG-NEXT:    %0 = add i64 %trip, -1
189; PROLOG-NEXT:    %xtraiter = and i64 %trip, 7
190; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
191; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
192; PROLOG:       loop_header.prol.preheader:
193; PROLOG-NEXT:    br label %loop_header.prol
194; PROLOG:       loop_header.prol:
195; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
196; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
197; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol
198; PROLOG:       loop_exiting_bb1.prol:
199; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.prol, label %exit1.loopexit1
200; PROLOG:       loop_exiting_bb2.prol:
201; PROLOG-NEXT:    br i1 false, label %loop_latch.prol, label %exit3.loopexit2
202; PROLOG:       loop_latch.prol:
203; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
204; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
205; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
206; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
207; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !0
208; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
209; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
210; PROLOG-NEXT:    br label %loop_header.prol.loopexit
211; PROLOG:       loop_header.prol.loopexit:
212; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
213; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
214; PROLOG-NEXT:    br i1 %1, label %exit2.loopexit, label %entry.new
215; PROLOG:       entry.new:
216; PROLOG-NEXT:    br label %loop_header
217; PROLOG:       loop_header:
218; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
219; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
220; PROLOG:       loop_exiting_bb1:
221; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
222; PROLOG:       loop_exiting_bb2:
223; PROLOG-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
224; PROLOG:       exit3.loopexit:
225; PROLOG-NEXT:    br label %exit3
226; PROLOG:       exit3.loopexit2:
227; PROLOG-NEXT:    br label %exit3
228; PROLOG:       exit3:
229; PROLOG-NEXT:    ret void
230; PROLOG:       loop_latch:
231; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
232; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
233; PROLOG:       loop_exiting_bb1.1:
234; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
235; PROLOG:       loop_exiting_bb2.1:
236; PROLOG-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
237; PROLOG:       loop_latch.1:
238; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
239; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2
240; PROLOG:       loop_exiting_bb1.2:
241; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit
242; PROLOG:       loop_exiting_bb2.2:
243; PROLOG-NEXT:    br i1 false, label %loop_latch.2, label %exit3.loopexit
244; PROLOG:       loop_latch.2:
245; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
246; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3
247; PROLOG:       loop_exiting_bb1.3:
248; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit
249; PROLOG:       loop_exiting_bb2.3:
250; PROLOG-NEXT:    br i1 false, label %loop_latch.3, label %exit3.loopexit
251; PROLOG:       loop_latch.3:
252; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
253; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4
254; PROLOG:       loop_exiting_bb1.4:
255; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit
256; PROLOG:       loop_exiting_bb2.4:
257; PROLOG-NEXT:    br i1 false, label %loop_latch.4, label %exit3.loopexit
258; PROLOG:       loop_latch.4:
259; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
260; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5
261; PROLOG:       loop_exiting_bb1.5:
262; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit
263; PROLOG:       loop_exiting_bb2.5:
264; PROLOG-NEXT:    br i1 false, label %loop_latch.5, label %exit3.loopexit
265; PROLOG:       loop_latch.5:
266; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
267; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6
268; PROLOG:       loop_exiting_bb1.6:
269; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit
270; PROLOG:       loop_exiting_bb2.6:
271; PROLOG-NEXT:    br i1 false, label %loop_latch.6, label %exit3.loopexit
272; PROLOG:       loop_latch.6:
273; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
274; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7
275; PROLOG:       loop_exiting_bb1.7:
276; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit
277; PROLOG:       loop_exiting_bb2.7:
278; PROLOG-NEXT:    br i1 false, label %loop_latch.7, label %exit3.loopexit
279; PROLOG:       loop_latch.7:
280; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
281; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
282; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa
283; PROLOG:       exit1.loopexit:
284; PROLOG-NEXT:    br label %exit1
285; PROLOG:       exit1.loopexit1:
286; PROLOG-NEXT:    br label %exit1
287; PROLOG:       exit1:
288; PROLOG-NEXT:    ret void
289; PROLOG:       exit2.loopexit.unr-lcssa:
290; PROLOG-NEXT:    br label %exit2.loopexit
291; PROLOG:       exit2.loopexit:
292; PROLOG-NEXT:    ret void
293;
294; PROLOG-BLOCK-LABEL: @test1(
295; PROLOG-BLOCK-NEXT:  entry:
296; PROLOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
297; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
298; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
299; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
300; PROLOG-BLOCK:       loop_header.prol.preheader:
301; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
302; PROLOG-BLOCK:       loop_header.prol:
303; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol
304; PROLOG-BLOCK:       loop_exiting_bb1.prol:
305; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.prol, label %exit1
306; PROLOG-BLOCK:       loop_exiting_bb2.prol:
307; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch.prol, label %exit3
308; PROLOG-BLOCK:       loop_latch.prol:
309; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
310; PROLOG-BLOCK:       loop_header.prol.loopexit:
311; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
312; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
313; PROLOG-BLOCK-NEXT:    br i1 %1, label %exit2.loopexit, label %entry.new
314; PROLOG-BLOCK:       entry.new:
315; PROLOG-BLOCK-NEXT:    br label %loop_header
316; PROLOG-BLOCK:       loop_header:
317; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
318; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
319; PROLOG-BLOCK:       loop_exiting_bb1:
320; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
321; PROLOG-BLOCK:       loop_exiting_bb2:
322; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
323; PROLOG-BLOCK:       exit3.loopexit:
324; PROLOG-BLOCK-NEXT:    br label %exit3
325; PROLOG-BLOCK:       exit3:
326; PROLOG-BLOCK-NEXT:    ret void
327; PROLOG-BLOCK:       loop_latch:
328; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
329; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
330; PROLOG-BLOCK:       loop_exiting_bb1.1:
331; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
332; PROLOG-BLOCK:       loop_exiting_bb2.1:
333; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
334; PROLOG-BLOCK:       loop_latch.1:
335; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
336; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
337; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !0
338; PROLOG-BLOCK:       exit1.loopexit:
339; PROLOG-BLOCK-NEXT:    br label %exit1
340; PROLOG-BLOCK:       exit1:
341; PROLOG-BLOCK-NEXT:    ret void
342; PROLOG-BLOCK:       exit2.loopexit.unr-lcssa:
343; PROLOG-BLOCK-NEXT:    br label %exit2.loopexit
344; PROLOG-BLOCK:       exit2.loopexit:
345; PROLOG-BLOCK-NEXT:    ret void
346;
347
348entry:
349  br label %loop_header
350
351loop_header:
352  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
353  br i1 %cond, label %loop_latch, label %loop_exiting_bb1
354
355loop_exiting_bb1:
356  br i1 false, label %loop_exiting_bb2, label %exit1
357
358loop_exiting_bb2:
359  br i1 false, label %loop_latch, label %exit3
360
361exit3:
362  ret void
363
364loop_latch:
365  %iv_next = add i64 %iv, 1
366  %cmp = icmp ne i64 %iv_next, %trip
367  br i1 %cmp, label %loop_header, label %exit2.loopexit
368
369exit1:
370  ret void
371
372exit2.loopexit:
373  ret void
374}
375
376
377; test with three exiting and two exit blocks.
378; The non-latch exit block has 2 unique predecessors.
379; There are 2 values passed to the exit blocks that are calculated at every iteration.
380; %sum.02 and %add. Both of these are incoming values for phi from every exiting
381; unrolled block.
382define i32 @test2(i32* nocapture %a, i64 %n) {
383; EPILOG-LABEL: @test2(
384; EPILOG-NEXT:  entry:
385; EPILOG-NEXT:    %0 = add i64 %n, -1
386; EPILOG-NEXT:    %xtraiter = and i64 %n, 7
387; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
388; EPILOG-NEXT:    br i1 %1, label %for.end.unr-lcssa, label %entry.new
389; EPILOG:       entry.new:
390; EPILOG-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
391; EPILOG-NEXT:    br label %header
392; EPILOG:       header:
393; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ]
394; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %for.body.7 ]
395; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %for.body.7 ]
396; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
397; EPILOG:       for.exiting_block:
398; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
399; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
400; EPILOG:       for.body:
401; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
402; EPILOG-NEXT:    %2 = load i32, i32* %arrayidx, align 4
403; EPILOG-NEXT:    %add = add nsw i32 %2, %sum.02
404; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
405; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
406; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
407; EPILOG:       for.exiting_block.1:
408; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
409; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
410; EPILOG:       for.body.1:
411; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
412; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx.1, align 4
413; EPILOG-NEXT:    %add.1 = add nsw i32 %3, %add
414; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
415; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
416; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
417; EPILOG:       for.exiting_block.2:
418; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
419; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2
420; EPILOG:       for.body.2:
421; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
422; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.2, align 4
423; EPILOG-NEXT:    %add.2 = add nsw i32 %4, %add.1
424; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
425; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
426; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
427; EPILOG:       for.exiting_block.3:
428; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
429; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3
430; EPILOG:       for.body.3:
431; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
432; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.3, align 4
433; EPILOG-NEXT:    %add.3 = add nsw i32 %5, %add.2
434; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
435; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
436; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
437; EPILOG:       for.exiting_block.4:
438; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
439; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4
440; EPILOG:       for.body.4:
441; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
442; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.4, align 4
443; EPILOG-NEXT:    %add.4 = add nsw i32 %6, %add.3
444; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
445; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
446; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
447; EPILOG:       for.exiting_block.5:
448; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
449; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5
450; EPILOG:       for.body.5:
451; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
452; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.5, align 4
453; EPILOG-NEXT:    %add.5 = add nsw i32 %7, %add.4
454; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
455; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
456; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
457; EPILOG:       for.exiting_block.6:
458; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
459; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6
460; EPILOG:       for.body.6:
461; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
462; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.6, align 4
463; EPILOG-NEXT:    %add.6 = add nsw i32 %8, %add.5
464; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
465; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
466; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
467; EPILOG:       for.exiting_block.7:
468; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
469; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7
470; EPILOG:       for.body.7:
471; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
472; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.7, align 4
473; EPILOG-NEXT:    %add.7 = add nsw i32 %9, %add.6
474; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
475; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
476; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
477; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %for.end.unr-lcssa.loopexit, label %header
478; EPILOG:       for.end.unr-lcssa.loopexit:
479; EPILOG-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %for.body.7 ]
480; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %for.body.7 ]
481; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %for.body.7 ]
482; EPILOG-NEXT:    br label %for.end.unr-lcssa
483; EPILOG:       for.end.unr-lcssa:
484; EPILOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ]
485; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ]
486; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ]
487; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
488; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %for.end
489; EPILOG:       header.epil.preheader:
490; EPILOG-NEXT:    br label %header.epil
491; EPILOG:       header.epil:
492; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %for.body.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
493; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %for.body.epil ], [ %sum.02.unr, %header.epil.preheader ]
494; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %for.body.epil ]
495; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil
496; EPILOG:       for.exiting_block.epil:
497; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
498; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit2, label %for.body.epil
499; EPILOG:       for.body.epil:
500; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
501; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.epil, align 4
502; EPILOG-NEXT:    %add.epil = add nsw i32 %10, %sum.02.epil
503; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
504; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
505; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
506; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
507; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %for.end.epilog-lcssa, !llvm.loop !2
508; EPILOG:       for.end.epilog-lcssa:
509; EPILOG-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %for.body.epil ]
510; EPILOG-NEXT:    br label %for.end
511; EPILOG:       for.end:
512; EPILOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %sum.0.lcssa.ph1, %for.end.epilog-lcssa ]
513; EPILOG-NEXT:    ret i32 %sum.0.lcssa
514; EPILOG:       for.exit2.loopexit:
515; 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 ]
516; EPILOG-NEXT:    br label %for.exit2
517; EPILOG:       for.exit2.loopexit2:
518; EPILOG-NEXT:    %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
519; EPILOG-NEXT:    br label %for.exit2
520; EPILOG:       for.exit2:
521; EPILOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
522; EPILOG-NEXT:    ret i32 %retval
523;
524; EPILOG-BLOCK-LABEL: @test2(
525; EPILOG-BLOCK-NEXT:  entry:
526; EPILOG-BLOCK-NEXT:    %0 = add i64 %n, -1
527; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
528; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
529; EPILOG-BLOCK-NEXT:    br i1 %1, label %for.end.unr-lcssa, label %entry.new
530; EPILOG-BLOCK:       entry.new:
531; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
532; EPILOG-BLOCK-NEXT:    br label %header
533; EPILOG-BLOCK:       header:
534; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ]
535; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %for.body.1 ]
536; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %for.body.1 ]
537; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
538; EPILOG-BLOCK:       for.exiting_block:
539; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
540; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
541; EPILOG-BLOCK:       for.body:
542; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
543; EPILOG-BLOCK-NEXT:    %2 = load i32, i32* %arrayidx, align 4
544; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %2, %sum.02
545; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
546; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
547; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
548; EPILOG-BLOCK:       for.exiting_block.1:
549; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
550; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
551; EPILOG-BLOCK:       for.body.1:
552; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
553; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx.1, align 4
554; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %3, %add
555; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
556; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
557; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
558; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %for.end.unr-lcssa.loopexit, label %header, !llvm.loop !2
559; EPILOG-BLOCK:       for.end.unr-lcssa.loopexit:
560; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %for.body.1 ]
561; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %for.body.1 ]
562; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %for.body.1 ]
563; EPILOG-BLOCK-NEXT:    br label %for.end.unr-lcssa
564; EPILOG-BLOCK:       for.end.unr-lcssa:
565; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ]
566; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ]
567; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ]
568; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
569; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %for.end
570; EPILOG-BLOCK:       header.epil.preheader:
571; EPILOG-BLOCK-NEXT:    br label %header.epil
572; EPILOG-BLOCK:       header.epil:
573; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.epil
574; EPILOG-BLOCK:       for.exiting_block.epil:
575; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
576; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %for.body.epil
577; EPILOG-BLOCK:       for.body.epil:
578; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
579; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.epil, align 4
580; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %4, %sum.02.unr
581; EPILOG-BLOCK-NEXT:    br label %for.end
582; EPILOG-BLOCK:       for.end:
583; EPILOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %add.epil, %for.body.epil ]
584; EPILOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
585; EPILOG-BLOCK:       for.exit2.loopexit:
586; EPILOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ]
587; EPILOG-BLOCK-NEXT:    br label %for.exit2
588; EPILOG-BLOCK:       for.exit2:
589; EPILOG-BLOCK-NEXT:    %retval = phi i32 [ %sum.02.unr, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ]
590; EPILOG-BLOCK-NEXT:    ret i32 %retval
591;
592; PROLOG-LABEL: @test2(
593; PROLOG-NEXT:  entry:
594; PROLOG-NEXT:    %0 = add i64 %n, -1
595; PROLOG-NEXT:    %xtraiter = and i64 %n, 7
596; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
597; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
598; PROLOG:       header.prol.preheader:
599; PROLOG-NEXT:    br label %header.prol
600; PROLOG:       header.prol:
601; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %for.body.prol ], [ 0, %header.prol.preheader ]
602; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %for.body.prol ], [ 0, %header.prol.preheader ]
603; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %for.body.prol ]
604; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol
605; PROLOG:       for.exiting_block.prol:
606; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
607; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit1, label %for.body.prol
608; PROLOG:       for.body.prol:
609; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
610; PROLOG-NEXT:    %1 = load i32, i32* %arrayidx.prol, align 4
611; PROLOG-NEXT:    %add.prol = add nsw i32 %1, %sum.02.prol
612; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
613; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
614; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
615; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
616; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !2
617; PROLOG:       header.prol.loopexit.unr-lcssa:
618; PROLOG-NEXT:    %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %for.body.prol ]
619; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %for.body.prol ]
620; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %for.body.prol ]
621; PROLOG-NEXT:    br label %header.prol.loopexit
622; PROLOG:       header.prol.loopexit:
623; PROLOG-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ]
624; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
625; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
626; PROLOG-NEXT:    %2 = icmp ult i64 %0, 7
627; PROLOG-NEXT:    br i1 %2, label %for.end, label %entry.new
628; PROLOG:       entry.new:
629; PROLOG-NEXT:    br label %header
630; PROLOG:       header:
631; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ]
632; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %for.body.7 ]
633; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
634; PROLOG:       for.exiting_block:
635; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
636; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
637; PROLOG:       for.body:
638; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
639; PROLOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
640; PROLOG-NEXT:    %add = add nsw i32 %3, %sum.02
641; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
642; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
643; PROLOG:       for.exiting_block.1:
644; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
645; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
646; PROLOG:       for.body.1:
647; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
648; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
649; PROLOG-NEXT:    %add.1 = add nsw i32 %4, %add
650; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
651; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
652; PROLOG:       for.exiting_block.2:
653; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
654; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2
655; PROLOG:       for.body.2:
656; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
657; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
658; PROLOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
659; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
660; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
661; PROLOG:       for.exiting_block.3:
662; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
663; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3
664; PROLOG:       for.body.3:
665; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
666; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
667; PROLOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
668; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
669; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
670; PROLOG:       for.exiting_block.4:
671; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
672; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4
673; PROLOG:       for.body.4:
674; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
675; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
676; PROLOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
677; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
678; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
679; PROLOG:       for.exiting_block.5:
680; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
681; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5
682; PROLOG:       for.body.5:
683; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
684; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
685; PROLOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
686; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
687; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
688; PROLOG:       for.exiting_block.6:
689; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
690; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6
691; PROLOG:       for.body.6:
692; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
693; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
694; PROLOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
695; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
696; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
697; PROLOG:       for.exiting_block.7:
698; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
699; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7
700; PROLOG:       for.body.7:
701; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
702; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
703; PROLOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
704; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
705; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
706; PROLOG-NEXT:    br i1 %exitcond.7, label %for.end.unr-lcssa, label %header
707; PROLOG:       for.end.unr-lcssa:
708; PROLOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %for.body.7 ]
709; PROLOG-NEXT:    br label %for.end
710; PROLOG:       for.end:
711; PROLOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ]
712; PROLOG-NEXT:    ret i32 %sum.0.lcssa
713; PROLOG:       for.exit2.loopexit:
714; 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 ]
715; PROLOG-NEXT:    br label %for.exit2
716; PROLOG:       for.exit2.loopexit1:
717; PROLOG-NEXT:    %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
718; PROLOG-NEXT:    br label %for.exit2
719; PROLOG:       for.exit2:
720; PROLOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
721; PROLOG-NEXT:    ret i32 %retval
722;
723; PROLOG-BLOCK-LABEL: @test2(
724; PROLOG-BLOCK-NEXT:  entry:
725; PROLOG-BLOCK-NEXT:    %0 = add i64 %n, -1
726; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
727; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
728; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
729; PROLOG-BLOCK:       header.prol.preheader:
730; PROLOG-BLOCK-NEXT:    br label %header.prol
731; PROLOG-BLOCK:       header.prol:
732; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.prol
733; PROLOG-BLOCK:       for.exiting_block.prol:
734; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
735; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %for.body.prol
736; PROLOG-BLOCK:       for.body.prol:
737; PROLOG-BLOCK-NEXT:    %1 = load i32, i32* %a, align 4
738; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
739; PROLOG-BLOCK:       header.prol.loopexit:
740; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %1, %for.body.prol ]
741; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %for.body.prol ]
742; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %1, %for.body.prol ]
743; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %0, 1
744; PROLOG-BLOCK-NEXT:    br i1 %2, label %for.end, label %entry.new
745; PROLOG-BLOCK:       entry.new:
746; PROLOG-BLOCK-NEXT:    br label %header
747; PROLOG-BLOCK:       header:
748; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ]
749; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %for.body.1 ]
750; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
751; PROLOG-BLOCK:       for.exiting_block:
752; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
753; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
754; PROLOG-BLOCK:       for.body:
755; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
756; PROLOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
757; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
758; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
759; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
760; PROLOG-BLOCK:       for.exiting_block.1:
761; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
762; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
763; PROLOG-BLOCK:       for.body.1:
764; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
765; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
766; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
767; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
768; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
769; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %for.end.unr-lcssa, label %header, !llvm.loop !2
770; PROLOG-BLOCK:       for.end.unr-lcssa:
771; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %for.body.1 ]
772; PROLOG-BLOCK-NEXT:    br label %for.end
773; PROLOG-BLOCK:       for.end:
774; PROLOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ]
775; PROLOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
776; PROLOG-BLOCK:       for.exit2.loopexit:
777; PROLOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ]
778; PROLOG-BLOCK-NEXT:    br label %for.exit2
779; PROLOG-BLOCK:       for.exit2:
780; PROLOG-BLOCK-NEXT:    %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ]
781; PROLOG-BLOCK-NEXT:    ret i32 %retval
782;
783
784
785entry:
786  br label %header
787
788header:
789  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
790  %sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ]
791  br i1 false, label %for.exit2, label %for.exiting_block
792
793for.exiting_block:
794  %cmp = icmp eq i64 %n, 42
795  br i1 %cmp, label %for.exit2, label %for.body
796
797for.body:
798  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
799  %0 = load i32, i32* %arrayidx, align 4
800  %add = add nsw i32 %0, %sum.02
801  %indvars.iv.next = add i64 %indvars.iv, 1
802  %exitcond = icmp eq i64 %indvars.iv.next, %n
803  br i1 %exitcond, label %for.end, label %header
804
805for.end:                                          ; preds = %for.body
806  %sum.0.lcssa = phi i32 [ %add, %for.body ]
807  ret i32 %sum.0.lcssa
808
809for.exit2:
810  %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ]
811  ret i32 %retval
812}
813
814; test with two exiting and three exit blocks.
815; the non-latch exiting block has a switch.
816define void @test3(i64 %trip, i64 %add) {
817; EPILOG-LABEL: @test3(
818; EPILOG-NEXT:  entry:
819; EPILOG-NEXT:    %0 = add i64 %trip, -1
820; EPILOG-NEXT:    %xtraiter = and i64 %trip, 7
821; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
822; EPILOG-NEXT:    br i1 %1, label %exit2.loopexit.unr-lcssa, label %entry.new
823; EPILOG:       entry.new:
824; EPILOG-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
825; EPILOG-NEXT:    br label %loop_header
826; EPILOG:       loop_header:
827; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
828; EPILOG-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
829; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
830; EPILOG-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
831; EPILOG:       loop_exiting_bb1:
832; EPILOG-NEXT:    switch i64 %sum, label %loop_latch [
833; EPILOG-NEXT:    i64 24, label %exit1.loopexit
834; EPILOG-NEXT:    i64 42, label %exit3.loopexit
835; EPILOG-NEXT:    ]
836; EPILOG:       exit3.loopexit:
837; EPILOG-NEXT:    br label %exit3
838; EPILOG:       exit3.loopexit2:
839; EPILOG-NEXT:    br label %exit3
840; EPILOG:       exit3:
841; EPILOG-NEXT:    ret void
842; EPILOG:       loop_latch:
843; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
844; EPILOG-NEXT:    %sum.next = add i64 %sum, %add
845; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
846; EPILOG-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
847; EPILOG:       loop_exiting_bb1.1:
848; EPILOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
849; EPILOG-NEXT:    i64 24, label %exit1.loopexit
850; EPILOG-NEXT:    i64 42, label %exit3.loopexit
851; EPILOG-NEXT:    ]
852; EPILOG:       loop_latch.1:
853; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
854; EPILOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
855; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
856; EPILOG-NEXT:    br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2
857; EPILOG:       loop_exiting_bb1.2:
858; EPILOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
859; EPILOG-NEXT:    i64 24, label %exit1.loopexit
860; EPILOG-NEXT:    i64 42, label %exit3.loopexit
861; EPILOG-NEXT:    ]
862; EPILOG:       loop_latch.2:
863; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
864; EPILOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
865; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
866; EPILOG-NEXT:    br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3
867; EPILOG:       loop_exiting_bb1.3:
868; EPILOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
869; EPILOG-NEXT:    i64 24, label %exit1.loopexit
870; EPILOG-NEXT:    i64 42, label %exit3.loopexit
871; EPILOG-NEXT:    ]
872; EPILOG:       loop_latch.3:
873; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
874; EPILOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
875; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
876; EPILOG-NEXT:    br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4
877; EPILOG:       loop_exiting_bb1.4:
878; EPILOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
879; EPILOG-NEXT:    i64 24, label %exit1.loopexit
880; EPILOG-NEXT:    i64 42, label %exit3.loopexit
881; EPILOG-NEXT:    ]
882; EPILOG:       loop_latch.4:
883; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
884; EPILOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
885; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
886; EPILOG-NEXT:    br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5
887; EPILOG:       loop_exiting_bb1.5:
888; EPILOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
889; EPILOG-NEXT:    i64 24, label %exit1.loopexit
890; EPILOG-NEXT:    i64 42, label %exit3.loopexit
891; EPILOG-NEXT:    ]
892; EPILOG:       loop_latch.5:
893; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
894; EPILOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
895; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
896; EPILOG-NEXT:    br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6
897; EPILOG:       loop_exiting_bb1.6:
898; EPILOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
899; EPILOG-NEXT:    i64 24, label %exit1.loopexit
900; EPILOG-NEXT:    i64 42, label %exit3.loopexit
901; EPILOG-NEXT:    ]
902; EPILOG:       loop_latch.6:
903; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
904; EPILOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
905; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
906; EPILOG-NEXT:    br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7
907; EPILOG:       loop_exiting_bb1.7:
908; EPILOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
909; EPILOG-NEXT:    i64 24, label %exit1.loopexit
910; EPILOG-NEXT:    i64 42, label %exit3.loopexit
911; EPILOG-NEXT:    ]
912; EPILOG:       loop_latch.7:
913; EPILOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
914; EPILOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
915; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
916; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
917; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit
918; EPILOG:       exit1.loopexit:
919; EPILOG-NEXT:    br label %exit1
920; EPILOG:       exit1.loopexit1:
921; EPILOG-NEXT:    br label %exit1
922; EPILOG:       exit1:
923; EPILOG-NEXT:    ret void
924; EPILOG:       exit2.loopexit.unr-lcssa.loopexit:
925; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
926; EPILOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
927; EPILOG-NEXT:    br label %exit2.loopexit.unr-lcssa
928; EPILOG:       exit2.loopexit.unr-lcssa:
929; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
930; EPILOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
931; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
932; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
933; EPILOG:       loop_header.epil.preheader:
934; EPILOG-NEXT:    br label %loop_header.epil
935; EPILOG:       loop_header.epil:
936; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
937; EPILOG-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]
938; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
939; EPILOG-NEXT:    br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil
940; EPILOG:       loop_exiting_bb1.epil:
941; EPILOG-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
942; EPILOG-NEXT:    i64 24, label %exit1.loopexit1
943; EPILOG-NEXT:    i64 42, label %exit3.loopexit2
944; EPILOG-NEXT:    ]
945; EPILOG:       loop_latch.epil:
946; EPILOG-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
947; EPILOG-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
948; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
949; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
950; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
951; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !3
952; EPILOG:       exit2.loopexit.epilog-lcssa:
953; EPILOG-NEXT:    br label %exit2.loopexit
954; EPILOG:       exit2.loopexit:
955; EPILOG-NEXT:    ret void
956;
957; EPILOG-BLOCK-LABEL: @test3(
958; EPILOG-BLOCK-NEXT:  entry:
959; EPILOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
960; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
961; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
962; EPILOG-BLOCK-NEXT:    br i1 %1, label %exit2.loopexit.unr-lcssa, label %entry.new
963; EPILOG-BLOCK:       entry.new:
964; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
965; EPILOG-BLOCK-NEXT:    br label %loop_header
966; EPILOG-BLOCK:       loop_header:
967; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
968; EPILOG-BLOCK-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
969; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
970; EPILOG-BLOCK-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
971; EPILOG-BLOCK:       loop_exiting_bb1:
972; EPILOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
973; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
974; EPILOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
975; EPILOG-BLOCK-NEXT:    ]
976; EPILOG-BLOCK:       exit3.loopexit:
977; EPILOG-BLOCK-NEXT:    br label %exit3
978; EPILOG-BLOCK:       exit3:
979; EPILOG-BLOCK-NEXT:    ret void
980; EPILOG-BLOCK:       loop_latch:
981; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
982; EPILOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
983; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
984; EPILOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
985; EPILOG-BLOCK:       loop_exiting_bb1.1:
986; EPILOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
987; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
988; EPILOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
989; EPILOG-BLOCK-NEXT:    ]
990; EPILOG-BLOCK:       loop_latch.1:
991; EPILOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
992; EPILOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
993; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
994; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
995; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !3
996; EPILOG-BLOCK:       exit1.loopexit:
997; EPILOG-BLOCK-NEXT:    br label %exit1
998; EPILOG-BLOCK:       exit1:
999; EPILOG-BLOCK-NEXT:    ret void
1000; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa.loopexit:
1001; EPILOG-BLOCK-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
1002; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit.unr-lcssa
1003; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa:
1004; EPILOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
1005; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1006; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
1007; EPILOG-BLOCK:       loop_header.epil.preheader:
1008; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
1009; EPILOG-BLOCK:       loop_header.epil:
1010; EPILOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil
1011; EPILOG-BLOCK:       loop_exiting_bb1.epil:
1012; EPILOG-BLOCK-NEXT:    switch i64 %sum.unr, label %loop_latch.epil [
1013; EPILOG-BLOCK-NEXT:    i64 24, label %exit1
1014; EPILOG-BLOCK-NEXT:    i64 42, label %exit3
1015; EPILOG-BLOCK-NEXT:    ]
1016; EPILOG-BLOCK:       loop_latch.epil:
1017; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit
1018; EPILOG-BLOCK:       exit2.loopexit:
1019; EPILOG-BLOCK-NEXT:    ret void
1020;
1021; PROLOG-LABEL: @test3(
1022; PROLOG-NEXT:  entry:
1023; PROLOG-NEXT:    %0 = add i64 %trip, -1
1024; PROLOG-NEXT:    %xtraiter = and i64 %trip, 7
1025; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1026; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
1027; PROLOG:       loop_header.prol.preheader:
1028; PROLOG-NEXT:    br label %loop_header.prol
1029; PROLOG:       loop_header.prol:
1030; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
1031; PROLOG-NEXT:    %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ]
1032; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
1033; PROLOG-NEXT:    br i1 undef, label %loop_latch.prol, label %loop_exiting_bb1.prol
1034; PROLOG:       loop_exiting_bb1.prol:
1035; PROLOG-NEXT:    switch i64 %sum.prol, label %loop_latch.prol [
1036; PROLOG-NEXT:    i64 24, label %exit1.loopexit1
1037; PROLOG-NEXT:    i64 42, label %exit3.loopexit2
1038; PROLOG-NEXT:    ]
1039; PROLOG:       loop_latch.prol:
1040; PROLOG-NEXT:    %iv_next.prol = add nuw nsw i64 %iv.prol, 1
1041; PROLOG-NEXT:    %sum.next.prol = add i64 %sum.prol, %add
1042; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
1043; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
1044; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
1045; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !3
1046; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
1047; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
1048; PROLOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
1049; PROLOG-NEXT:    br label %loop_header.prol.loopexit
1050; PROLOG:       loop_header.prol.loopexit:
1051; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
1052; PROLOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
1053; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
1054; PROLOG-NEXT:    br i1 %1, label %exit2.loopexit, label %entry.new
1055; PROLOG:       entry.new:
1056; PROLOG-NEXT:    br label %loop_header
1057; PROLOG:       loop_header:
1058; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
1059; PROLOG-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
1060; PROLOG-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
1061; PROLOG:       loop_exiting_bb1:
1062; PROLOG-NEXT:    switch i64 %sum, label %loop_latch [
1063; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1064; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1065; PROLOG-NEXT:    ]
1066; PROLOG:       exit3.loopexit:
1067; PROLOG-NEXT:    br label %exit3
1068; PROLOG:       exit3.loopexit2:
1069; PROLOG-NEXT:    br label %exit3
1070; PROLOG:       exit3:
1071; PROLOG-NEXT:    ret void
1072; PROLOG:       loop_latch:
1073; PROLOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
1074; PROLOG-NEXT:    %sum.next = add i64 %sum, %add
1075; PROLOG-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
1076; PROLOG:       loop_exiting_bb1.1:
1077; PROLOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
1078; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1079; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1080; PROLOG-NEXT:    ]
1081; PROLOG:       loop_latch.1:
1082; PROLOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
1083; PROLOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
1084; PROLOG-NEXT:    br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2
1085; PROLOG:       loop_exiting_bb1.2:
1086; PROLOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
1087; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1088; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1089; PROLOG-NEXT:    ]
1090; PROLOG:       loop_latch.2:
1091; PROLOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
1092; PROLOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
1093; PROLOG-NEXT:    br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3
1094; PROLOG:       loop_exiting_bb1.3:
1095; PROLOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
1096; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1097; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1098; PROLOG-NEXT:    ]
1099; PROLOG:       loop_latch.3:
1100; PROLOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
1101; PROLOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
1102; PROLOG-NEXT:    br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4
1103; PROLOG:       loop_exiting_bb1.4:
1104; PROLOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
1105; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1106; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1107; PROLOG-NEXT:    ]
1108; PROLOG:       loop_latch.4:
1109; PROLOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
1110; PROLOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
1111; PROLOG-NEXT:    br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5
1112; PROLOG:       loop_exiting_bb1.5:
1113; PROLOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
1114; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1115; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1116; PROLOG-NEXT:    ]
1117; PROLOG:       loop_latch.5:
1118; PROLOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
1119; PROLOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
1120; PROLOG-NEXT:    br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6
1121; PROLOG:       loop_exiting_bb1.6:
1122; PROLOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
1123; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1124; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1125; PROLOG-NEXT:    ]
1126; PROLOG:       loop_latch.6:
1127; PROLOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
1128; PROLOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
1129; PROLOG-NEXT:    br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7
1130; PROLOG:       loop_exiting_bb1.7:
1131; PROLOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
1132; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1133; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1134; PROLOG-NEXT:    ]
1135; PROLOG:       loop_latch.7:
1136; PROLOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
1137; PROLOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
1138; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
1139; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa
1140; PROLOG:       exit1.loopexit:
1141; PROLOG-NEXT:    br label %exit1
1142; PROLOG:       exit1.loopexit1:
1143; PROLOG-NEXT:    br label %exit1
1144; PROLOG:       exit1:
1145; PROLOG-NEXT:    ret void
1146; PROLOG:       exit2.loopexit.unr-lcssa:
1147; PROLOG-NEXT:    br label %exit2.loopexit
1148; PROLOG:       exit2.loopexit:
1149; PROLOG-NEXT:    ret void
1150;
1151; PROLOG-BLOCK-LABEL: @test3(
1152; PROLOG-BLOCK-NEXT:  entry:
1153; PROLOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
1154; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
1155; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1156; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
1157; PROLOG-BLOCK:       loop_header.prol.preheader:
1158; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
1159; PROLOG-BLOCK:       loop_header.prol:
1160; PROLOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.prol, label %loop_exiting_bb1.prol
1161; PROLOG-BLOCK:       loop_exiting_bb1.prol:
1162; PROLOG-BLOCK-NEXT:    switch i64 0, label %loop_latch.prol [
1163; PROLOG-BLOCK-NEXT:    i64 24, label %exit1
1164; PROLOG-BLOCK-NEXT:    i64 42, label %exit3
1165; PROLOG-BLOCK-NEXT:    ]
1166; PROLOG-BLOCK:       loop_latch.prol:
1167; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
1168; PROLOG-BLOCK:       loop_header.prol.loopexit:
1169; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
1170; PROLOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %add, %loop_latch.prol ]
1171; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
1172; PROLOG-BLOCK-NEXT:    br i1 %1, label %exit2.loopexit, label %entry.new
1173; PROLOG-BLOCK:       entry.new:
1174; PROLOG-BLOCK-NEXT:    br label %loop_header
1175; PROLOG-BLOCK:       loop_header:
1176; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
1177; PROLOG-BLOCK-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
1178; PROLOG-BLOCK-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
1179; PROLOG-BLOCK:       loop_exiting_bb1:
1180; PROLOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
1181; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
1182; PROLOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
1183; PROLOG-BLOCK-NEXT:    ]
1184; PROLOG-BLOCK:       exit3.loopexit:
1185; PROLOG-BLOCK-NEXT:    br label %exit3
1186; PROLOG-BLOCK:       exit3:
1187; PROLOG-BLOCK-NEXT:    ret void
1188; PROLOG-BLOCK:       loop_latch:
1189; PROLOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
1190; PROLOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
1191; PROLOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
1192; PROLOG-BLOCK:       loop_exiting_bb1.1:
1193; PROLOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
1194; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
1195; PROLOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
1196; PROLOG-BLOCK-NEXT:    ]
1197; PROLOG-BLOCK:       loop_latch.1:
1198; PROLOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
1199; PROLOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
1200; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
1201; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !3
1202; PROLOG-BLOCK:       exit1.loopexit:
1203; PROLOG-BLOCK-NEXT:    br label %exit1
1204; PROLOG-BLOCK:       exit1:
1205; PROLOG-BLOCK-NEXT:    ret void
1206; PROLOG-BLOCK:       exit2.loopexit.unr-lcssa:
1207; PROLOG-BLOCK-NEXT:    br label %exit2.loopexit
1208; PROLOG-BLOCK:       exit2.loopexit:
1209; PROLOG-BLOCK-NEXT:    ret void
1210;
1211
1212entry:
1213  br label %loop_header
1214
1215loop_header:
1216  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
1217  %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ]
1218  br i1 undef, label %loop_latch, label %loop_exiting_bb1
1219
1220loop_exiting_bb1:
1221  switch i64 %sum, label %loop_latch [
1222  i64 24, label %exit1
1223  i64 42, label %exit3
1224  ]
1225
1226exit3:
1227  ret void
1228
1229loop_latch:
1230  %iv_next = add nuw nsw i64 %iv, 1
1231  %sum.next = add i64 %sum, %add
1232  %cmp = icmp ne i64 %iv_next, %trip
1233  br i1 %cmp, label %loop_header, label %exit2.loopexit
1234
1235exit1:
1236  ret void
1237
1238exit2.loopexit:
1239  ret void
1240}
1241
1242; FIXME: Support multiple exiting blocks to the same latch exit block.
1243; Three exiting blocks where header and latch exit to same LatchExit.
1244define i32 @hdr_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) {
1245; EPILOG-LABEL: @hdr_latch_same_exit(
1246; EPILOG-NEXT:  entry:
1247; EPILOG-NEXT:    %0 = add i64 %n, -1
1248; EPILOG-NEXT:    %xtraiter = and i64 %n, 7
1249; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
1250; EPILOG-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
1251; EPILOG:       entry.new:
1252; EPILOG-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
1253; EPILOG-NEXT:    br label %header
1254; EPILOG:       header:
1255; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
1256; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
1257; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
1258; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block
1259; EPILOG:       for.exiting_block:
1260; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
1261; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1262; EPILOG:       latch:
1263; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1264; EPILOG-NEXT:    %2 = load i32, i32* %arrayidx, align 4
1265; EPILOG-NEXT:    %add = add nsw i32 %2, %sum.02
1266; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1267; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
1268; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.1
1269; EPILOG:       for.exiting_block.1:
1270; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1271; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1272; EPILOG:       latch.1:
1273; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1274; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx.1, align 4
1275; EPILOG-NEXT:    %add.1 = add nsw i32 %3, %add
1276; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
1277; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
1278; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.2
1279; EPILOG:       for.exiting_block.2:
1280; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1281; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
1282; EPILOG:       latch.2:
1283; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1284; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.2, align 4
1285; EPILOG-NEXT:    %add.2 = add nsw i32 %4, %add.1
1286; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
1287; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
1288; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.3
1289; EPILOG:       for.exiting_block.3:
1290; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1291; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
1292; EPILOG:       latch.3:
1293; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1294; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.3, align 4
1295; EPILOG-NEXT:    %add.3 = add nsw i32 %5, %add.2
1296; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
1297; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
1298; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.4
1299; EPILOG:       for.exiting_block.4:
1300; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1301; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
1302; EPILOG:       latch.4:
1303; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
1304; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.4, align 4
1305; EPILOG-NEXT:    %add.4 = add nsw i32 %6, %add.3
1306; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
1307; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
1308; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.5
1309; EPILOG:       for.exiting_block.5:
1310; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1311; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
1312; EPILOG:       latch.5:
1313; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
1314; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.5, align 4
1315; EPILOG-NEXT:    %add.5 = add nsw i32 %7, %add.4
1316; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
1317; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
1318; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.6
1319; EPILOG:       for.exiting_block.6:
1320; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
1321; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
1322; EPILOG:       latch.6:
1323; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
1324; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.6, align 4
1325; EPILOG-NEXT:    %add.6 = add nsw i32 %8, %add.5
1326; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
1327; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
1328; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.7
1329; EPILOG:       for.exiting_block.7:
1330; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
1331; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
1332; EPILOG:       latch.7:
1333; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
1334; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.7, align 4
1335; EPILOG-NEXT:    %add.7 = add nsw i32 %9, %add.6
1336; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
1337; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
1338; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
1339; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
1340; EPILOG:       latchExit.unr-lcssa.loopexit:
1341; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
1342; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
1343; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
1344; EPILOG-NEXT:    br label %latchExit.unr-lcssa
1345; EPILOG:       latchExit.unr-lcssa:
1346; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1347; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1348; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1349; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1350; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1351; EPILOG:       header.epil.preheader:
1352; EPILOG-NEXT:    br label %header.epil
1353; EPILOG:       header.epil:
1354; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
1355; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
1356; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
1357; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit2, label %for.exiting_block.epil
1358; EPILOG:       for.exiting_block.epil:
1359; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1360; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit4, label %latch.epil
1361; EPILOG:       latch.epil:
1362; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
1363; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.epil, align 4
1364; EPILOG-NEXT:    %add.epil = add nsw i32 %10, %sum.02.epil
1365; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
1366; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
1367; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
1368; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
1369; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit2, !llvm.loop !4
1370; EPILOG:       latchExit.epilog-lcssa.loopexit:
1371; 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 ]
1372; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1373; EPILOG:       latchExit.epilog-lcssa.loopexit2:
1374; EPILOG-NEXT:    %result.ph1.ph3 = phi i32 [ 0, %header.epil ], [ %add.epil, %latch.epil ]
1375; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1376; EPILOG:       latchExit.epilog-lcssa:
1377; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph3, %latchExit.epilog-lcssa.loopexit2 ]
1378; EPILOG-NEXT:    br label %latchExit
1379; EPILOG:       latchExit:
1380; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1381; EPILOG-NEXT:    ret i32 %result
1382; EPILOG:       for.exit2.loopexit:
1383; EPILOG-NEXT:    br label %for.exit2
1384; EPILOG:       for.exit2.loopexit4:
1385; EPILOG-NEXT:    br label %for.exit2
1386; EPILOG:       for.exit2:
1387; EPILOG-NEXT:    ret i32 42
1388;
1389; EPILOG-BLOCK-LABEL: @hdr_latch_same_exit(
1390; EPILOG-BLOCK-NEXT:  entry:
1391; EPILOG-BLOCK-NEXT:    %0 = add i64 %n, -1
1392; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
1393; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
1394; EPILOG-BLOCK-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
1395; EPILOG-BLOCK:       entry.new:
1396; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
1397; EPILOG-BLOCK-NEXT:    br label %header
1398; EPILOG-BLOCK:       header:
1399; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
1400; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
1401; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
1402; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block
1403; EPILOG-BLOCK:       for.exiting_block:
1404; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
1405; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1406; EPILOG-BLOCK:       latch:
1407; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1408; EPILOG-BLOCK-NEXT:    %2 = load i32, i32* %arrayidx, align 4
1409; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %2, %sum.02
1410; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1411; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
1412; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.1
1413; EPILOG-BLOCK:       for.exiting_block.1:
1414; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1415; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1416; EPILOG-BLOCK:       latch.1:
1417; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1418; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx.1, align 4
1419; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %3, %add
1420; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1421; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
1422; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
1423; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !4
1424; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
1425; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
1426; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
1427; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
1428; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
1429; EPILOG-BLOCK:       latchExit.unr-lcssa:
1430; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1431; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1432; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1433; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1434; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1435; EPILOG-BLOCK:       header.epil.preheader:
1436; EPILOG-BLOCK-NEXT:    br label %header.epil
1437; EPILOG-BLOCK:       header.epil:
1438; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa, label %for.exiting_block.epil
1439; EPILOG-BLOCK:       for.exiting_block.epil:
1440; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1441; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %latch.epil
1442; EPILOG-BLOCK:       latch.epil:
1443; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
1444; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.epil, align 4
1445; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %4, %sum.02.unr
1446; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1447; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
1448; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ 0, %header ], [ 0, %latch ]
1449; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1450; EPILOG-BLOCK:       latchExit.epilog-lcssa:
1451; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 0, %header.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
1452; EPILOG-BLOCK-NEXT:    br label %latchExit
1453; EPILOG-BLOCK:       latchExit:
1454; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1455; EPILOG-BLOCK-NEXT:    ret i32 %result
1456; EPILOG-BLOCK:       for.exit2.loopexit:
1457; EPILOG-BLOCK-NEXT:    br label %for.exit2
1458; EPILOG-BLOCK:       for.exit2:
1459; EPILOG-BLOCK-NEXT:    ret i32 42
1460;
1461; PROLOG-LABEL: @hdr_latch_same_exit(
1462; PROLOG-NEXT:  entry:
1463; PROLOG-NEXT:    %0 = add i64 %n, -1
1464; PROLOG-NEXT:    %xtraiter = and i64 %n, 7
1465; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1466; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
1467; PROLOG:       header.prol.preheader:
1468; PROLOG-NEXT:    br label %header.prol
1469; PROLOG:       header.prol:
1470; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
1471; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
1472; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
1473; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit1, label %for.exiting_block.prol
1474; PROLOG:       for.exiting_block.prol:
1475; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
1476; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit3, label %latch.prol
1477; PROLOG:       latch.prol:
1478; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
1479; PROLOG-NEXT:    %1 = load i32, i32* %arrayidx.prol, align 4
1480; PROLOG-NEXT:    %add.prol = add nsw i32 %1, %sum.02.prol
1481; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
1482; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
1483; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
1484; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
1485; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !4
1486; PROLOG:       header.prol.loopexit.unr-lcssa:
1487; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
1488; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
1489; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
1490; PROLOG-NEXT:    br label %header.prol.loopexit
1491; PROLOG:       header.prol.loopexit:
1492; PROLOG-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
1493; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
1494; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
1495; PROLOG-NEXT:    %2 = icmp ult i64 %0, 7
1496; PROLOG-NEXT:    br i1 %2, label %latchExit, label %entry.new
1497; PROLOG:       entry.new:
1498; PROLOG-NEXT:    br label %header
1499; PROLOG:       header:
1500; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
1501; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
1502; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block
1503; PROLOG:       for.exiting_block:
1504; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
1505; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1506; PROLOG:       latch:
1507; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1508; PROLOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
1509; PROLOG-NEXT:    %add = add nsw i32 %3, %sum.02
1510; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
1511; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.1
1512; PROLOG:       for.exiting_block.1:
1513; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1514; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1515; PROLOG:       latch.1:
1516; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1517; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1518; PROLOG-NEXT:    %add.1 = add nsw i32 %4, %add
1519; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1520; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.2
1521; PROLOG:       for.exiting_block.2:
1522; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1523; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
1524; PROLOG:       latch.2:
1525; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1526; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
1527; PROLOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
1528; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
1529; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.3
1530; PROLOG:       for.exiting_block.3:
1531; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1532; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
1533; PROLOG:       latch.3:
1534; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1535; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
1536; PROLOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
1537; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
1538; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.4
1539; PROLOG:       for.exiting_block.4:
1540; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1541; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
1542; PROLOG:       latch.4:
1543; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
1544; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
1545; PROLOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
1546; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
1547; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.5
1548; PROLOG:       for.exiting_block.5:
1549; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1550; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
1551; PROLOG:       latch.5:
1552; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
1553; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
1554; PROLOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
1555; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
1556; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.6
1557; PROLOG:       for.exiting_block.6:
1558; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
1559; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
1560; PROLOG:       latch.6:
1561; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
1562; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
1563; PROLOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
1564; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
1565; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.7
1566; PROLOG:       for.exiting_block.7:
1567; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
1568; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
1569; PROLOG:       latch.7:
1570; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
1571; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
1572; PROLOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
1573; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
1574; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
1575; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
1576; PROLOG:       latchExit.unr-lcssa.loopexit:
1577; 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 ]
1578; PROLOG-NEXT:    br label %latchExit.unr-lcssa
1579; PROLOG:       latchExit.unr-lcssa.loopexit1:
1580; PROLOG-NEXT:    %result.ph.ph2 = phi i32 [ 0, %header.prol ]
1581; PROLOG-NEXT:    br label %latchExit.unr-lcssa
1582; PROLOG:       latchExit.unr-lcssa:
1583; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph2, %latchExit.unr-lcssa.loopexit1 ]
1584; PROLOG-NEXT:    br label %latchExit
1585; PROLOG:       latchExit:
1586; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
1587; PROLOG-NEXT:    ret i32 %result
1588; PROLOG:       for.exit2.loopexit:
1589; PROLOG-NEXT:    br label %for.exit2
1590; PROLOG:       for.exit2.loopexit3:
1591; PROLOG-NEXT:    br label %for.exit2
1592; PROLOG:       for.exit2:
1593; PROLOG-NEXT:    ret i32 42
1594;
1595; PROLOG-BLOCK-LABEL: @hdr_latch_same_exit(
1596; PROLOG-BLOCK-NEXT:  entry:
1597; PROLOG-BLOCK-NEXT:    %0 = add i64 %n, -1
1598; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
1599; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1600; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
1601; PROLOG-BLOCK:       header.prol.preheader:
1602; PROLOG-BLOCK-NEXT:    br label %header.prol
1603; PROLOG-BLOCK:       header.prol:
1604; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.unr-lcssa, label %for.exiting_block.prol
1605; PROLOG-BLOCK:       for.exiting_block.prol:
1606; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
1607; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %latch.prol
1608; PROLOG-BLOCK:       latch.prol:
1609; PROLOG-BLOCK-NEXT:    %1 = load i32, i32* %a, align 4
1610; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
1611; PROLOG-BLOCK:       header.prol.loopexit:
1612; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %1, %latch.prol ]
1613; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
1614; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %1, %latch.prol ]
1615; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %0, 1
1616; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchExit, label %entry.new
1617; PROLOG-BLOCK:       entry.new:
1618; PROLOG-BLOCK-NEXT:    br label %header
1619; PROLOG-BLOCK:       header:
1620; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
1621; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
1622; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block
1623; PROLOG-BLOCK:       for.exiting_block:
1624; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
1625; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1626; PROLOG-BLOCK:       latch:
1627; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1628; PROLOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
1629; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
1630; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
1631; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.1
1632; PROLOG-BLOCK:       for.exiting_block.1:
1633; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1634; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1635; PROLOG-BLOCK:       latch.1:
1636; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1637; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1638; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
1639; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1640; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
1641; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !4
1642; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
1643; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ %add.1, %latch.1 ]
1644; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
1645; PROLOG-BLOCK:       latchExit.unr-lcssa:
1646; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %header.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1647; PROLOG-BLOCK-NEXT:    br label %latchExit
1648; PROLOG-BLOCK:       latchExit:
1649; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
1650; PROLOG-BLOCK-NEXT:    ret i32 %result
1651; PROLOG-BLOCK:       for.exit2.loopexit:
1652; PROLOG-BLOCK-NEXT:    br label %for.exit2
1653; PROLOG-BLOCK:       for.exit2:
1654; PROLOG-BLOCK-NEXT:    ret i32 42
1655;
1656
1657entry:
1658  br label %header
1659
1660header:
1661  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
1662  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
1663  br i1 %cond, label %latchExit, label %for.exiting_block
1664
1665for.exiting_block:
1666  %cmp = icmp eq i64 %n, 42
1667  br i1 %cmp, label %for.exit2, label %latch
1668
1669latch:                                         ; preds = %latch, %entry
1670  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1671  %0 = load i32, i32* %arrayidx, align 4
1672  %add = add nsw i32 %0, %sum.02
1673  %indvars.iv.next = add i64 %indvars.iv, 1
1674  %exitcond = icmp eq i64 %indvars.iv.next, %n
1675  br i1 %exitcond, label %latchExit, label %header
1676
1677latchExit:                                          ; preds = %latch, %entry
1678  %result = phi i32 [ 0, %header ], [ %add, %latch ]
1679  ret i32 %result
1680
1681for.exit2:
1682  ret i32 42
1683}
1684
1685; Two exiting blocks to latch where the exiting blocks are Latch and a
1686; non-header
1687; FIXME: We should unroll this loop.
1688define i32 @otherblock_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) {
1689; EPILOG-LABEL: @otherblock_latch_same_exit(
1690; EPILOG-NEXT:  entry:
1691; EPILOG-NEXT:    %0 = add i64 %n, -1
1692; EPILOG-NEXT:    %xtraiter = and i64 %n, 7
1693; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
1694; EPILOG-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
1695; EPILOG:       entry.new:
1696; EPILOG-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
1697; EPILOG-NEXT:    br label %header
1698; EPILOG:       header:
1699; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
1700; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
1701; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
1702; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
1703; EPILOG:       for.exiting_block:
1704; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
1705; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
1706; EPILOG:       latch:
1707; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1708; EPILOG-NEXT:    %2 = load i32, i32* %arrayidx, align 4
1709; EPILOG-NEXT:    %add = add nsw i32 %2, %sum.02
1710; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1711; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
1712; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
1713; EPILOG:       for.exiting_block.1:
1714; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1715; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
1716; EPILOG:       latch.1:
1717; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1718; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx.1, align 4
1719; EPILOG-NEXT:    %add.1 = add nsw i32 %3, %add
1720; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
1721; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
1722; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
1723; EPILOG:       for.exiting_block.2:
1724; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1725; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
1726; EPILOG:       latch.2:
1727; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1728; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.2, align 4
1729; EPILOG-NEXT:    %add.2 = add nsw i32 %4, %add.1
1730; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
1731; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
1732; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
1733; EPILOG:       for.exiting_block.3:
1734; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1735; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
1736; EPILOG:       latch.3:
1737; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1738; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.3, align 4
1739; EPILOG-NEXT:    %add.3 = add nsw i32 %5, %add.2
1740; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
1741; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
1742; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
1743; EPILOG:       for.exiting_block.4:
1744; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1745; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
1746; EPILOG:       latch.4:
1747; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
1748; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.4, align 4
1749; EPILOG-NEXT:    %add.4 = add nsw i32 %6, %add.3
1750; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
1751; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
1752; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
1753; EPILOG:       for.exiting_block.5:
1754; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1755; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
1756; EPILOG:       latch.5:
1757; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
1758; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.5, align 4
1759; EPILOG-NEXT:    %add.5 = add nsw i32 %7, %add.4
1760; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
1761; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
1762; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
1763; EPILOG:       for.exiting_block.6:
1764; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
1765; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
1766; EPILOG:       latch.6:
1767; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
1768; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.6, align 4
1769; EPILOG-NEXT:    %add.6 = add nsw i32 %8, %add.5
1770; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
1771; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
1772; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
1773; EPILOG:       for.exiting_block.7:
1774; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
1775; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
1776; EPILOG:       latch.7:
1777; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
1778; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.7, align 4
1779; EPILOG-NEXT:    %add.7 = add nsw i32 %9, %add.6
1780; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
1781; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
1782; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
1783; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
1784; EPILOG:       latchExit.unr-lcssa.loopexit:
1785; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
1786; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
1787; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
1788; EPILOG-NEXT:    br label %latchExit.unr-lcssa
1789; EPILOG:       latchExit.unr-lcssa:
1790; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1791; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1792; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1793; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1794; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1795; EPILOG:       header.epil.preheader:
1796; EPILOG-NEXT:    br label %header.epil
1797; EPILOG:       header.epil:
1798; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
1799; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
1800; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
1801; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
1802; EPILOG:       for.exiting_block.epil:
1803; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1804; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
1805; EPILOG:       latch.epil:
1806; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
1807; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.epil, align 4
1808; EPILOG-NEXT:    %add.epil = add nsw i32 %10, %sum.02.epil
1809; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
1810; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
1811; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
1812; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
1813; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !5
1814; EPILOG:       latchExit.epilog-lcssa.loopexit:
1815; 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 ]
1816; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1817; EPILOG:       latchExit.epilog-lcssa.loopexit3:
1818; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ 2, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
1819; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1820; EPILOG:       latchExit.epilog-lcssa:
1821; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
1822; EPILOG-NEXT:    br label %latchExit
1823; EPILOG:       latchExit:
1824; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1825; EPILOG-NEXT:    ret i32 %result
1826; EPILOG:       for.exit2.loopexit:
1827; EPILOG-NEXT:    br label %for.exit2
1828; EPILOG:       for.exit2.loopexit2:
1829; EPILOG-NEXT:    br label %for.exit2
1830; EPILOG:       for.exit2:
1831; EPILOG-NEXT:    ret i32 42
1832;
1833; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit(
1834; EPILOG-BLOCK-NEXT:  entry:
1835; EPILOG-BLOCK-NEXT:    %0 = add i64 %n, -1
1836; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
1837; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
1838; EPILOG-BLOCK-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
1839; EPILOG-BLOCK:       entry.new:
1840; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
1841; EPILOG-BLOCK-NEXT:    br label %header
1842; EPILOG-BLOCK:       header:
1843; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
1844; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
1845; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
1846; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
1847; EPILOG-BLOCK:       for.exiting_block:
1848; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
1849; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
1850; EPILOG-BLOCK:       latch:
1851; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1852; EPILOG-BLOCK-NEXT:    %2 = load i32, i32* %arrayidx, align 4
1853; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %2, %sum.02
1854; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1855; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
1856; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
1857; EPILOG-BLOCK:       for.exiting_block.1:
1858; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1859; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
1860; EPILOG-BLOCK:       latch.1:
1861; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1862; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx.1, align 4
1863; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %3, %add
1864; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1865; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
1866; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
1867; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5
1868; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
1869; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
1870; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
1871; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
1872; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
1873; EPILOG-BLOCK:       latchExit.unr-lcssa:
1874; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1875; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1876; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1877; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1878; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1879; EPILOG-BLOCK:       header.epil.preheader:
1880; EPILOG-BLOCK-NEXT:    br label %header.epil
1881; EPILOG-BLOCK:       header.epil:
1882; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
1883; EPILOG-BLOCK:       for.exiting_block.epil:
1884; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1885; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
1886; EPILOG-BLOCK:       latch.epil:
1887; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
1888; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.epil, align 4
1889; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %4, %sum.02.unr
1890; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1891; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
1892; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ]
1893; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1894; EPILOG-BLOCK:       latchExit.epilog-lcssa:
1895; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 2, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
1896; EPILOG-BLOCK-NEXT:    br label %latchExit
1897; EPILOG-BLOCK:       latchExit:
1898; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1899; EPILOG-BLOCK-NEXT:    ret i32 %result
1900; EPILOG-BLOCK:       for.exit2.loopexit:
1901; EPILOG-BLOCK-NEXT:    br label %for.exit2
1902; EPILOG-BLOCK:       for.exit2:
1903; EPILOG-BLOCK-NEXT:    ret i32 42
1904;
1905; PROLOG-LABEL: @otherblock_latch_same_exit(
1906; PROLOG-NEXT:  entry:
1907; PROLOG-NEXT:    %0 = add i64 %n, -1
1908; PROLOG-NEXT:    %xtraiter = and i64 %n, 7
1909; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1910; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
1911; PROLOG:       header.prol.preheader:
1912; PROLOG-NEXT:    br label %header.prol
1913; PROLOG:       header.prol:
1914; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
1915; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
1916; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
1917; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol
1918; PROLOG:       for.exiting_block.prol:
1919; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
1920; PROLOG-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol
1921; PROLOG:       latch.prol:
1922; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
1923; PROLOG-NEXT:    %1 = load i32, i32* %arrayidx.prol, align 4
1924; PROLOG-NEXT:    %add.prol = add nsw i32 %1, %sum.02.prol
1925; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
1926; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
1927; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
1928; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
1929; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !5
1930; PROLOG:       header.prol.loopexit.unr-lcssa:
1931; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
1932; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
1933; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
1934; PROLOG-NEXT:    br label %header.prol.loopexit
1935; PROLOG:       header.prol.loopexit:
1936; PROLOG-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
1937; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
1938; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
1939; PROLOG-NEXT:    %2 = icmp ult i64 %0, 7
1940; PROLOG-NEXT:    br i1 %2, label %latchExit, label %entry.new
1941; PROLOG:       entry.new:
1942; PROLOG-NEXT:    br label %header
1943; PROLOG:       header:
1944; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
1945; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
1946; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
1947; PROLOG:       for.exiting_block:
1948; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
1949; PROLOG-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
1950; PROLOG:       latch:
1951; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1952; PROLOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
1953; PROLOG-NEXT:    %add = add nsw i32 %3, %sum.02
1954; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
1955; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
1956; PROLOG:       for.exiting_block.1:
1957; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1958; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
1959; PROLOG:       latch.1:
1960; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1961; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1962; PROLOG-NEXT:    %add.1 = add nsw i32 %4, %add
1963; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1964; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
1965; PROLOG:       for.exiting_block.2:
1966; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1967; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2
1968; PROLOG:       latch.2:
1969; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1970; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
1971; PROLOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
1972; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
1973; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
1974; PROLOG:       for.exiting_block.3:
1975; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1976; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3
1977; PROLOG:       latch.3:
1978; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1979; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
1980; PROLOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
1981; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
1982; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
1983; PROLOG:       for.exiting_block.4:
1984; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1985; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4
1986; PROLOG:       latch.4:
1987; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
1988; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
1989; PROLOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
1990; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
1991; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
1992; PROLOG:       for.exiting_block.5:
1993; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1994; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5
1995; PROLOG:       latch.5:
1996; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
1997; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
1998; PROLOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
1999; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
2000; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2001; PROLOG:       for.exiting_block.6:
2002; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2003; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6
2004; PROLOG:       latch.6:
2005; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2006; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
2007; PROLOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2008; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
2009; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2010; PROLOG:       for.exiting_block.7:
2011; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2012; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7
2013; PROLOG:       latch.7:
2014; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2015; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
2016; PROLOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2017; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2018; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
2019; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
2020; PROLOG:       latchExit.unr-lcssa.loopexit:
2021; 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 ]
2022; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2023; PROLOG:       latchExit.unr-lcssa.loopexit2:
2024; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ 2, %for.exiting_block.prol ]
2025; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2026; PROLOG:       latchExit.unr-lcssa:
2027; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]
2028; PROLOG-NEXT:    br label %latchExit
2029; PROLOG:       latchExit:
2030; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2031; PROLOG-NEXT:    ret i32 %result
2032; PROLOG:       for.exit2.loopexit:
2033; PROLOG-NEXT:    br label %for.exit2
2034; PROLOG:       for.exit2.loopexit1:
2035; PROLOG-NEXT:    br label %for.exit2
2036; PROLOG:       for.exit2:
2037; PROLOG-NEXT:    ret i32 42
2038;
2039; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit(
2040; PROLOG-BLOCK-NEXT:  entry:
2041; PROLOG-BLOCK-NEXT:    %0 = add i64 %n, -1
2042; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
2043; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2044; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
2045; PROLOG-BLOCK:       header.prol.preheader:
2046; PROLOG-BLOCK-NEXT:    br label %header.prol
2047; PROLOG-BLOCK:       header.prol:
2048; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.prol
2049; PROLOG-BLOCK:       for.exiting_block.prol:
2050; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
2051; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol
2052; PROLOG-BLOCK:       latch.prol:
2053; PROLOG-BLOCK-NEXT:    %1 = load i32, i32* %a, align 4
2054; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
2055; PROLOG-BLOCK:       header.prol.loopexit:
2056; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %1, %latch.prol ]
2057; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
2058; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %1, %latch.prol ]
2059; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %0, 1
2060; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchExit, label %entry.new
2061; PROLOG-BLOCK:       entry.new:
2062; PROLOG-BLOCK-NEXT:    br label %header
2063; PROLOG-BLOCK:       header:
2064; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2065; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
2066; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2067; PROLOG-BLOCK:       for.exiting_block:
2068; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2069; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2070; PROLOG-BLOCK:       latch:
2071; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2072; PROLOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
2073; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
2074; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2075; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2076; PROLOG-BLOCK:       for.exiting_block.1:
2077; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2078; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2079; PROLOG-BLOCK:       latch.1:
2080; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2081; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2082; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2083; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2084; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
2085; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5
2086; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2087; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
2088; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2089; PROLOG-BLOCK:       latchExit.unr-lcssa:
2090; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 2, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2091; PROLOG-BLOCK-NEXT:    br label %latchExit
2092; PROLOG-BLOCK:       latchExit:
2093; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2094; PROLOG-BLOCK-NEXT:    ret i32 %result
2095; PROLOG-BLOCK:       for.exit2.loopexit:
2096; PROLOG-BLOCK-NEXT:    br label %for.exit2
2097; PROLOG-BLOCK:       for.exit2:
2098; PROLOG-BLOCK-NEXT:    ret i32 42
2099;
2100
2101entry:
2102  br label %header
2103
2104header:
2105  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
2106  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
2107  br i1 %cond, label %for.exit2, label %for.exiting_block
2108
2109for.exiting_block:
2110  %cmp = icmp eq i64 %n, 42
2111  br i1 %cmp, label %latchExit, label %latch
2112
2113latch:                                         ; preds = %latch, %entry
2114  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2115  %0 = load i32, i32* %arrayidx, align 4
2116  %add = add nsw i32 %0, %sum.02
2117  %indvars.iv.next = add i64 %indvars.iv, 1
2118  %exitcond = icmp eq i64 %indvars.iv.next, %n
2119  br i1 %exitcond, label %latchExit, label %header
2120
2121latchExit:                                          ; preds = %latch, %entry
2122  %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ]
2123  ret i32 %result
2124
2125for.exit2:
2126  ret i32 42
2127}
2128
2129; Two exiting blocks to latch where the exiting blocks are Latch and a
2130; non-header
2131; Same as above test except the incoming value for latch Phi is from the header
2132; FIXME: We should be able to runtime unroll.
2133define i32 @otherblock_latch_same_exit2(i32* nocapture %a, i64 %n, i1 %cond) {
2134; EPILOG-LABEL: @otherblock_latch_same_exit2(
2135; EPILOG-NEXT:  entry:
2136; EPILOG-NEXT:    %0 = add i64 %n, -1
2137; EPILOG-NEXT:    %xtraiter = and i64 %n, 7
2138; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
2139; EPILOG-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
2140; EPILOG:       entry.new:
2141; EPILOG-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
2142; EPILOG-NEXT:    br label %header
2143; EPILOG:       header:
2144; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
2145; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
2146; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
2147; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2148; EPILOG:       for.exiting_block:
2149; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
2150; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2151; EPILOG:       latch:
2152; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2153; EPILOG-NEXT:    %2 = load i32, i32* %arrayidx, align 4
2154; EPILOG-NEXT:    %add = add nsw i32 %2, %sum.02
2155; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2156; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
2157; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2158; EPILOG:       for.exiting_block.1:
2159; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2160; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2161; EPILOG:       latch.1:
2162; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2163; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx.1, align 4
2164; EPILOG-NEXT:    %add.1 = add nsw i32 %3, %add
2165; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
2166; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
2167; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2168; EPILOG:       for.exiting_block.2:
2169; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2170; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
2171; EPILOG:       latch.2:
2172; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2173; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.2, align 4
2174; EPILOG-NEXT:    %add.2 = add nsw i32 %4, %add.1
2175; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
2176; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
2177; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2178; EPILOG:       for.exiting_block.3:
2179; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2180; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
2181; EPILOG:       latch.3:
2182; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2183; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.3, align 4
2184; EPILOG-NEXT:    %add.3 = add nsw i32 %5, %add.2
2185; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
2186; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
2187; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2188; EPILOG:       for.exiting_block.4:
2189; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2190; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
2191; EPILOG:       latch.4:
2192; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2193; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.4, align 4
2194; EPILOG-NEXT:    %add.4 = add nsw i32 %6, %add.3
2195; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
2196; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
2197; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2198; EPILOG:       for.exiting_block.5:
2199; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2200; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
2201; EPILOG:       latch.5:
2202; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2203; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.5, align 4
2204; EPILOG-NEXT:    %add.5 = add nsw i32 %7, %add.4
2205; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
2206; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
2207; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2208; EPILOG:       for.exiting_block.6:
2209; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2210; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
2211; EPILOG:       latch.6:
2212; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2213; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.6, align 4
2214; EPILOG-NEXT:    %add.6 = add nsw i32 %8, %add.5
2215; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
2216; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
2217; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2218; EPILOG:       for.exiting_block.7:
2219; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2220; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
2221; EPILOG:       latch.7:
2222; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2223; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.7, align 4
2224; EPILOG-NEXT:    %add.7 = add nsw i32 %9, %add.6
2225; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2226; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
2227; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
2228; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
2229; EPILOG:       latchExit.unr-lcssa.loopexit:
2230; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
2231; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
2232; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
2233; EPILOG-NEXT:    br label %latchExit.unr-lcssa
2234; EPILOG:       latchExit.unr-lcssa:
2235; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2236; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2237; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2238; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2239; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2240; EPILOG:       header.epil.preheader:
2241; EPILOG-NEXT:    br label %header.epil
2242; EPILOG:       header.epil:
2243; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
2244; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
2245; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
2246; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
2247; EPILOG:       for.exiting_block.epil:
2248; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2249; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
2250; EPILOG:       latch.epil:
2251; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
2252; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.epil, align 4
2253; EPILOG-NEXT:    %add.epil = add nsw i32 %10, %sum.02.epil
2254; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
2255; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
2256; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
2257; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
2258; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !6
2259; EPILOG:       latchExit.epilog-lcssa.loopexit:
2260; 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 ]
2261; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2262; EPILOG:       latchExit.epilog-lcssa.loopexit3:
2263; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
2264; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2265; EPILOG:       latchExit.epilog-lcssa:
2266; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
2267; EPILOG-NEXT:    br label %latchExit
2268; EPILOG:       latchExit:
2269; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2270; EPILOG-NEXT:    ret i32 %result
2271; EPILOG:       for.exit2.loopexit:
2272; EPILOG-NEXT:    br label %for.exit2
2273; EPILOG:       for.exit2.loopexit2:
2274; EPILOG-NEXT:    br label %for.exit2
2275; EPILOG:       for.exit2:
2276; EPILOG-NEXT:    ret i32 42
2277;
2278; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit2(
2279; EPILOG-BLOCK-NEXT:  entry:
2280; EPILOG-BLOCK-NEXT:    %0 = add i64 %n, -1
2281; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
2282; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
2283; EPILOG-BLOCK-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
2284; EPILOG-BLOCK:       entry.new:
2285; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
2286; EPILOG-BLOCK-NEXT:    br label %header
2287; EPILOG-BLOCK:       header:
2288; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2289; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
2290; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
2291; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2292; EPILOG-BLOCK:       for.exiting_block:
2293; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2294; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2295; EPILOG-BLOCK:       latch:
2296; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2297; EPILOG-BLOCK-NEXT:    %2 = load i32, i32* %arrayidx, align 4
2298; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %2, %sum.02
2299; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2300; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
2301; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2302; EPILOG-BLOCK:       for.exiting_block.1:
2303; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2304; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2305; EPILOG-BLOCK:       latch.1:
2306; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2307; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx.1, align 4
2308; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %3, %add
2309; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2310; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
2311; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
2312; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6
2313; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2314; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
2315; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
2316; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
2317; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2318; EPILOG-BLOCK:       latchExit.unr-lcssa:
2319; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2320; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2321; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2322; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2323; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2324; EPILOG-BLOCK:       header.epil.preheader:
2325; EPILOG-BLOCK-NEXT:    br label %header.epil
2326; EPILOG-BLOCK:       header.epil:
2327; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
2328; EPILOG-BLOCK:       for.exiting_block.epil:
2329; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2330; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
2331; EPILOG-BLOCK:       latch.epil:
2332; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
2333; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.epil, align 4
2334; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %4, %sum.02.unr
2335; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2336; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
2337; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ]
2338; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2339; EPILOG-BLOCK:       latchExit.epilog-lcssa:
2340; 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 ]
2341; EPILOG-BLOCK-NEXT:    br label %latchExit
2342; EPILOG-BLOCK:       latchExit:
2343; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2344; EPILOG-BLOCK-NEXT:    ret i32 %result
2345; EPILOG-BLOCK:       for.exit2.loopexit:
2346; EPILOG-BLOCK-NEXT:    br label %for.exit2
2347; EPILOG-BLOCK:       for.exit2:
2348; EPILOG-BLOCK-NEXT:    ret i32 42
2349;
2350; PROLOG-LABEL: @otherblock_latch_same_exit2(
2351; PROLOG-NEXT:  entry:
2352; PROLOG-NEXT:    %0 = add i64 %n, -1
2353; PROLOG-NEXT:    %xtraiter = and i64 %n, 7
2354; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2355; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
2356; PROLOG:       header.prol.preheader:
2357; PROLOG-NEXT:    br label %header.prol
2358; PROLOG:       header.prol:
2359; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
2360; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
2361; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
2362; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol
2363; PROLOG:       for.exiting_block.prol:
2364; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
2365; PROLOG-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol
2366; PROLOG:       latch.prol:
2367; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
2368; PROLOG-NEXT:    %1 = load i32, i32* %arrayidx.prol, align 4
2369; PROLOG-NEXT:    %add.prol = add nsw i32 %1, %sum.02.prol
2370; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
2371; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
2372; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
2373; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
2374; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !6
2375; PROLOG:       header.prol.loopexit.unr-lcssa:
2376; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
2377; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
2378; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
2379; PROLOG-NEXT:    br label %header.prol.loopexit
2380; PROLOG:       header.prol.loopexit:
2381; PROLOG-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
2382; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
2383; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
2384; PROLOG-NEXT:    %2 = icmp ult i64 %0, 7
2385; PROLOG-NEXT:    br i1 %2, label %latchExit, label %entry.new
2386; PROLOG:       entry.new:
2387; PROLOG-NEXT:    br label %header
2388; PROLOG:       header:
2389; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
2390; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
2391; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2392; PROLOG:       for.exiting_block:
2393; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
2394; PROLOG-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2395; PROLOG:       latch:
2396; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2397; PROLOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
2398; PROLOG-NEXT:    %add = add nsw i32 %3, %sum.02
2399; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2400; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2401; PROLOG:       for.exiting_block.1:
2402; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2403; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2404; PROLOG:       latch.1:
2405; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2406; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2407; PROLOG-NEXT:    %add.1 = add nsw i32 %4, %add
2408; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2409; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2410; PROLOG:       for.exiting_block.2:
2411; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2412; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2
2413; PROLOG:       latch.2:
2414; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2415; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
2416; PROLOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
2417; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
2418; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2419; PROLOG:       for.exiting_block.3:
2420; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2421; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3
2422; PROLOG:       latch.3:
2423; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2424; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
2425; PROLOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
2426; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
2427; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2428; PROLOG:       for.exiting_block.4:
2429; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2430; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4
2431; PROLOG:       latch.4:
2432; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2433; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
2434; PROLOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2435; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
2436; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2437; PROLOG:       for.exiting_block.5:
2438; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2439; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5
2440; PROLOG:       latch.5:
2441; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2442; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
2443; PROLOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2444; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
2445; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2446; PROLOG:       for.exiting_block.6:
2447; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2448; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6
2449; PROLOG:       latch.6:
2450; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2451; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
2452; PROLOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2453; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
2454; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2455; PROLOG:       for.exiting_block.7:
2456; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2457; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7
2458; PROLOG:       latch.7:
2459; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2460; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
2461; PROLOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2462; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2463; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
2464; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
2465; PROLOG:       latchExit.unr-lcssa.loopexit:
2466; 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 ]
2467; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2468; PROLOG:       latchExit.unr-lcssa.loopexit2:
2469; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ]
2470; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2471; PROLOG:       latchExit.unr-lcssa:
2472; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]
2473; PROLOG-NEXT:    br label %latchExit
2474; PROLOG:       latchExit:
2475; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2476; PROLOG-NEXT:    ret i32 %result
2477; PROLOG:       for.exit2.loopexit:
2478; PROLOG-NEXT:    br label %for.exit2
2479; PROLOG:       for.exit2.loopexit1:
2480; PROLOG-NEXT:    br label %for.exit2
2481; PROLOG:       for.exit2:
2482; PROLOG-NEXT:    ret i32 42
2483;
2484; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit2(
2485; PROLOG-BLOCK-NEXT:  entry:
2486; PROLOG-BLOCK-NEXT:    %0 = add i64 %n, -1
2487; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
2488; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2489; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
2490; PROLOG-BLOCK:       header.prol.preheader:
2491; PROLOG-BLOCK-NEXT:    br label %header.prol
2492; PROLOG-BLOCK:       header.prol:
2493; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.prol
2494; PROLOG-BLOCK:       for.exiting_block.prol:
2495; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
2496; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol
2497; PROLOG-BLOCK:       latch.prol:
2498; PROLOG-BLOCK-NEXT:    %1 = load i32, i32* %a, align 4
2499; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
2500; PROLOG-BLOCK:       header.prol.loopexit:
2501; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %1, %latch.prol ]
2502; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
2503; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %1, %latch.prol ]
2504; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %0, 1
2505; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchExit, label %entry.new
2506; PROLOG-BLOCK:       entry.new:
2507; PROLOG-BLOCK-NEXT:    br label %header
2508; PROLOG-BLOCK:       header:
2509; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2510; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
2511; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2512; PROLOG-BLOCK:       for.exiting_block:
2513; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2514; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2515; PROLOG-BLOCK:       latch:
2516; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2517; PROLOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
2518; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
2519; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2520; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2521; PROLOG-BLOCK:       for.exiting_block.1:
2522; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2523; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2524; PROLOG-BLOCK:       latch.1:
2525; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2526; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2527; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2528; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2529; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
2530; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6
2531; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2532; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
2533; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2534; PROLOG-BLOCK:       latchExit.unr-lcssa:
2535; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2536; PROLOG-BLOCK-NEXT:    br label %latchExit
2537; PROLOG-BLOCK:       latchExit:
2538; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2539; PROLOG-BLOCK-NEXT:    ret i32 %result
2540; PROLOG-BLOCK:       for.exit2.loopexit:
2541; PROLOG-BLOCK-NEXT:    br label %for.exit2
2542; PROLOG-BLOCK:       for.exit2:
2543; PROLOG-BLOCK-NEXT:    ret i32 42
2544;
2545
2546entry:
2547  br label %header
2548
2549header:
2550  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
2551  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
2552  br i1 %cond, label %for.exit2, label %for.exiting_block
2553
2554for.exiting_block:
2555  %cmp = icmp eq i64 %n, 42
2556  br i1 %cmp, label %latchExit, label %latch
2557
2558latch:                                         ; preds = %latch, %entry
2559  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2560  %0 = load i32, i32* %arrayidx, align 4
2561  %add = add nsw i32 %0, %sum.02
2562  %indvars.iv.next = add i64 %indvars.iv, 1
2563  %exitcond = icmp eq i64 %indvars.iv.next, %n
2564  br i1 %exitcond, label %latchExit, label %header
2565
2566latchExit:                                          ; preds = %latch, %entry
2567  %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
2568  ret i32 %result
2569
2570for.exit2:
2571  ret i32 42
2572}
2573
2574; Two exiting blocks to latch where the exiting blocks are Latch and a
2575; non-header
2576; Same as above test except the incoming value for cloned latch Phi is from the
2577; for.exiting_block.
2578; FIXME: We should be able to runtime unroll.
2579define i32 @otherblock_latch_same_exit3(i32* nocapture %a, i64 %n, i1 %cond) {
2580; EPILOG-LABEL: @otherblock_latch_same_exit3(
2581; EPILOG-NEXT:  entry:
2582; EPILOG-NEXT:    %0 = add i64 %n, -1
2583; EPILOG-NEXT:    %xtraiter = and i64 %n, 7
2584; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
2585; EPILOG-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
2586; EPILOG:       entry.new:
2587; EPILOG-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
2588; EPILOG-NEXT:    br label %header
2589; EPILOG:       header:
2590; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
2591; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
2592; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
2593; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2594; EPILOG:       for.exiting_block:
2595; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2596; EPILOG-NEXT:    %2 = load i32, i32* %arrayidx, align 4
2597; EPILOG-NEXT:    %add = add nsw i32 %2, %sum.02
2598; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
2599; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2600; EPILOG:       latch:
2601; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2602; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
2603; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2604; EPILOG:       for.exiting_block.1:
2605; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2606; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx.1, align 4
2607; EPILOG-NEXT:    %add.1 = add nsw i32 %3, %add
2608; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2609; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2610; EPILOG:       latch.1:
2611; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
2612; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
2613; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2614; EPILOG:       for.exiting_block.2:
2615; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2616; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.2, align 4
2617; EPILOG-NEXT:    %add.2 = add nsw i32 %4, %add.1
2618; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2619; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
2620; EPILOG:       latch.2:
2621; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
2622; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
2623; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2624; EPILOG:       for.exiting_block.3:
2625; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2626; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.3, align 4
2627; EPILOG-NEXT:    %add.3 = add nsw i32 %5, %add.2
2628; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2629; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
2630; EPILOG:       latch.3:
2631; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
2632; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
2633; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2634; EPILOG:       for.exiting_block.4:
2635; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2636; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.4, align 4
2637; EPILOG-NEXT:    %add.4 = add nsw i32 %6, %add.3
2638; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2639; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
2640; EPILOG:       latch.4:
2641; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
2642; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
2643; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2644; EPILOG:       for.exiting_block.5:
2645; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2646; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.5, align 4
2647; EPILOG-NEXT:    %add.5 = add nsw i32 %7, %add.4
2648; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2649; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
2650; EPILOG:       latch.5:
2651; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
2652; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
2653; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2654; EPILOG:       for.exiting_block.6:
2655; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2656; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.6, align 4
2657; EPILOG-NEXT:    %add.6 = add nsw i32 %8, %add.5
2658; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2659; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
2660; EPILOG:       latch.6:
2661; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
2662; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
2663; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2664; EPILOG:       for.exiting_block.7:
2665; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2666; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.7, align 4
2667; EPILOG-NEXT:    %add.7 = add nsw i32 %9, %add.6
2668; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2669; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
2670; EPILOG:       latch.7:
2671; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2672; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
2673; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
2674; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
2675; EPILOG:       latchExit.unr-lcssa.loopexit:
2676; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
2677; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
2678; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
2679; EPILOG-NEXT:    br label %latchExit.unr-lcssa
2680; EPILOG:       latchExit.unr-lcssa:
2681; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2682; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2683; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2684; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2685; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2686; EPILOG:       header.epil.preheader:
2687; EPILOG-NEXT:    br label %header.epil
2688; EPILOG:       header.epil:
2689; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
2690; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
2691; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
2692; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
2693; EPILOG:       for.exiting_block.epil:
2694; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
2695; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.epil, align 4
2696; EPILOG-NEXT:    %add.epil = add nsw i32 %10, %sum.02.epil
2697; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2698; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
2699; EPILOG:       latch.epil:
2700; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
2701; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
2702; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
2703; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
2704; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !7
2705; EPILOG:       latchExit.epilog-lcssa.loopexit:
2706; 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 ]
2707; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2708; EPILOG:       latchExit.epilog-lcssa.loopexit3:
2709; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
2710; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2711; EPILOG:       latchExit.epilog-lcssa:
2712; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
2713; EPILOG-NEXT:    br label %latchExit
2714; EPILOG:       latchExit:
2715; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2716; EPILOG-NEXT:    ret i32 %result
2717; EPILOG:       for.exit2.loopexit:
2718; EPILOG-NEXT:    br label %for.exit2
2719; EPILOG:       for.exit2.loopexit2:
2720; EPILOG-NEXT:    br label %for.exit2
2721; EPILOG:       for.exit2:
2722; EPILOG-NEXT:    ret i32 42
2723;
2724; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit3(
2725; EPILOG-BLOCK-NEXT:  entry:
2726; EPILOG-BLOCK-NEXT:    %0 = add i64 %n, -1
2727; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
2728; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
2729; EPILOG-BLOCK-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
2730; EPILOG-BLOCK:       entry.new:
2731; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
2732; EPILOG-BLOCK-NEXT:    br label %header
2733; EPILOG-BLOCK:       header:
2734; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2735; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
2736; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
2737; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2738; EPILOG-BLOCK:       for.exiting_block:
2739; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2740; EPILOG-BLOCK-NEXT:    %2 = load i32, i32* %arrayidx, align 4
2741; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %2, %sum.02
2742; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2743; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2744; EPILOG-BLOCK:       latch:
2745; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2746; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
2747; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2748; EPILOG-BLOCK:       for.exiting_block.1:
2749; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2750; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx.1, align 4
2751; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %3, %add
2752; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2753; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2754; EPILOG-BLOCK:       latch.1:
2755; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2756; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
2757; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
2758; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7
2759; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2760; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
2761; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
2762; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
2763; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2764; EPILOG-BLOCK:       latchExit.unr-lcssa:
2765; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2766; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2767; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2768; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2769; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2770; EPILOG-BLOCK:       header.epil.preheader:
2771; EPILOG-BLOCK-NEXT:    br label %header.epil
2772; EPILOG-BLOCK:       header.epil:
2773; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
2774; EPILOG-BLOCK:       for.exiting_block.epil:
2775; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
2776; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.epil, align 4
2777; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %4, %sum.02.unr
2778; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2779; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
2780; EPILOG-BLOCK:       latch.epil:
2781; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2782; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
2783; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ]
2784; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2785; EPILOG-BLOCK:       latchExit.epilog-lcssa:
2786; 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 ]
2787; EPILOG-BLOCK-NEXT:    br label %latchExit
2788; EPILOG-BLOCK:       latchExit:
2789; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2790; EPILOG-BLOCK-NEXT:    ret i32 %result
2791; EPILOG-BLOCK:       for.exit2.loopexit:
2792; EPILOG-BLOCK-NEXT:    br label %for.exit2
2793; EPILOG-BLOCK:       for.exit2:
2794; EPILOG-BLOCK-NEXT:    ret i32 42
2795;
2796; PROLOG-LABEL: @otherblock_latch_same_exit3(
2797; PROLOG-NEXT:  entry:
2798; PROLOG-NEXT:    %0 = add i64 %n, -1
2799; PROLOG-NEXT:    %xtraiter = and i64 %n, 7
2800; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2801; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
2802; PROLOG:       header.prol.preheader:
2803; PROLOG-NEXT:    br label %header.prol
2804; PROLOG:       header.prol:
2805; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
2806; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
2807; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
2808; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol
2809; PROLOG:       for.exiting_block.prol:
2810; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
2811; PROLOG-NEXT:    %1 = load i32, i32* %arrayidx.prol, align 4
2812; PROLOG-NEXT:    %add.prol = add nsw i32 %1, %sum.02.prol
2813; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
2814; PROLOG-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol
2815; PROLOG:       latch.prol:
2816; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
2817; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
2818; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
2819; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
2820; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !7
2821; PROLOG:       header.prol.loopexit.unr-lcssa:
2822; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
2823; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
2824; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
2825; PROLOG-NEXT:    br label %header.prol.loopexit
2826; PROLOG:       header.prol.loopexit:
2827; PROLOG-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
2828; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
2829; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
2830; PROLOG-NEXT:    %2 = icmp ult i64 %0, 7
2831; PROLOG-NEXT:    br i1 %2, label %latchExit, label %entry.new
2832; PROLOG:       entry.new:
2833; PROLOG-NEXT:    br label %header
2834; PROLOG:       header:
2835; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
2836; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
2837; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2838; PROLOG:       for.exiting_block:
2839; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2840; PROLOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
2841; PROLOG-NEXT:    %add = add nsw i32 %3, %sum.02
2842; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
2843; PROLOG-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2844; PROLOG:       latch:
2845; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2846; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2847; PROLOG:       for.exiting_block.1:
2848; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2849; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2850; PROLOG-NEXT:    %add.1 = add nsw i32 %4, %add
2851; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2852; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2853; PROLOG:       latch.1:
2854; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2855; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2856; PROLOG:       for.exiting_block.2:
2857; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2858; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
2859; PROLOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
2860; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2861; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2
2862; PROLOG:       latch.2:
2863; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
2864; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2865; PROLOG:       for.exiting_block.3:
2866; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2867; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
2868; PROLOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
2869; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2870; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3
2871; PROLOG:       latch.3:
2872; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
2873; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2874; PROLOG:       for.exiting_block.4:
2875; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2876; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
2877; PROLOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2878; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2879; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4
2880; PROLOG:       latch.4:
2881; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
2882; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2883; PROLOG:       for.exiting_block.5:
2884; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2885; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
2886; PROLOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2887; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2888; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5
2889; PROLOG:       latch.5:
2890; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
2891; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2892; PROLOG:       for.exiting_block.6:
2893; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2894; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
2895; PROLOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2896; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2897; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6
2898; PROLOG:       latch.6:
2899; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
2900; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2901; PROLOG:       for.exiting_block.7:
2902; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2903; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
2904; PROLOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2905; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2906; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7
2907; PROLOG:       latch.7:
2908; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2909; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
2910; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
2911; PROLOG:       latchExit.unr-lcssa.loopexit:
2912; 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 ]
2913; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2914; PROLOG:       latchExit.unr-lcssa.loopexit2:
2915; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ]
2916; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2917; PROLOG:       latchExit.unr-lcssa:
2918; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]
2919; PROLOG-NEXT:    br label %latchExit
2920; PROLOG:       latchExit:
2921; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2922; PROLOG-NEXT:    ret i32 %result
2923; PROLOG:       for.exit2.loopexit:
2924; PROLOG-NEXT:    br label %for.exit2
2925; PROLOG:       for.exit2.loopexit1:
2926; PROLOG-NEXT:    br label %for.exit2
2927; PROLOG:       for.exit2:
2928; PROLOG-NEXT:    ret i32 42
2929;
2930; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit3(
2931; PROLOG-BLOCK-NEXT:  entry:
2932; PROLOG-BLOCK-NEXT:    %0 = add i64 %n, -1
2933; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
2934; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2935; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
2936; PROLOG-BLOCK:       header.prol.preheader:
2937; PROLOG-BLOCK-NEXT:    br label %header.prol
2938; PROLOG-BLOCK:       header.prol:
2939; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.prol
2940; PROLOG-BLOCK:       for.exiting_block.prol:
2941; PROLOG-BLOCK-NEXT:    %1 = load i32, i32* %a, align 4
2942; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
2943; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol
2944; PROLOG-BLOCK:       latch.prol:
2945; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
2946; PROLOG-BLOCK:       header.prol.loopexit:
2947; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %1, %latch.prol ]
2948; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
2949; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %1, %latch.prol ]
2950; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %0, 1
2951; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchExit, label %entry.new
2952; PROLOG-BLOCK:       entry.new:
2953; PROLOG-BLOCK-NEXT:    br label %header
2954; PROLOG-BLOCK:       header:
2955; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2956; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
2957; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2958; PROLOG-BLOCK:       for.exiting_block:
2959; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2960; PROLOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
2961; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
2962; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2963; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2964; PROLOG-BLOCK:       latch:
2965; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2966; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2967; PROLOG-BLOCK:       for.exiting_block.1:
2968; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2969; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2970; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2971; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2972; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2973; PROLOG-BLOCK:       latch.1:
2974; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2975; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
2976; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7
2977; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2978; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
2979; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2980; PROLOG-BLOCK:       latchExit.unr-lcssa:
2981; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2982; PROLOG-BLOCK-NEXT:    br label %latchExit
2983; PROLOG-BLOCK:       latchExit:
2984; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2985; PROLOG-BLOCK-NEXT:    ret i32 %result
2986; PROLOG-BLOCK:       for.exit2.loopexit:
2987; PROLOG-BLOCK-NEXT:    br label %for.exit2
2988; PROLOG-BLOCK:       for.exit2:
2989; PROLOG-BLOCK-NEXT:    ret i32 42
2990;
2991
2992entry:
2993  br label %header
2994
2995header:
2996  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
2997  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
2998  br i1 %cond, label %for.exit2, label %for.exiting_block
2999
3000for.exiting_block:
3001  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3002  %0 = load i32, i32* %arrayidx, align 4
3003  %add = add nsw i32 %0, %sum.02
3004  %cmp = icmp eq i64 %n, 42
3005  br i1 %cmp, label %latchExit, label %latch
3006
3007latch:                                         ; preds = %latch, %entry
3008  %indvars.iv.next = add i64 %indvars.iv, 1
3009  %exitcond = icmp eq i64 %indvars.iv.next, %n
3010  br i1 %exitcond, label %latchExit, label %header
3011
3012latchExit:                                          ; preds = %latch, %entry
3013  %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
3014  ret i32 %result
3015
3016for.exit2:
3017  ret i32 42
3018}
3019
3020; Show a case where we have multiple exits, but (provably) exit on the
3021; first iteration and thus have nothing to unroll
3022define void @non_loop(i32 %arg) {
3023; CHECK-LABEL: @non_loop(
3024; CHECK-NEXT:  entry:
3025; CHECK-NEXT:    %i = icmp sgt i32 undef, %arg
3026; CHECK-NEXT:    br i1 %i, label %preheader, label %returnblock
3027; CHECK:       preheader:
3028; CHECK-NEXT:    br label %header
3029; CHECK:       header:
3030; CHECK-NEXT:    br i1 true, label %latchExit, label %latch
3031; CHECK:       latch:
3032; CHECK-NEXT:    br label %latchExit
3033; CHECK:       latchExit:
3034; CHECK-NEXT:    %i2.ph = phi i32 [ %arg, %header ], [ -1, %latch ]
3035; CHECK-NEXT:    br label %returnblock
3036; CHECK:       returnblock:
3037; CHECK-NEXT:    %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ]
3038; CHECK-NEXT:    ret void
3039;
3040
3041entry:
3042  %i = icmp sgt i32 undef, %arg
3043  br i1 %i, label %preheader, label %returnblock
3044
3045preheader:                                 ; preds = %entry
3046  br label %header
3047
3048header:                                           ; preds = %preheader, %latch
3049  %i4 = phi i32 [ %inc, %latch ], [ %arg, %preheader ]
3050  %inc = add nsw i32 %i4, 1
3051  br i1 true, label %latchExit, label %latch
3052
3053latch:                                            ; preds = %header
3054  %cmp = icmp slt i32 %inc, undef
3055  br i1 %cmp, label %header, label %latchExit
3056
3057latchExit:                                ; preds = %header, %latch
3058  %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ]
3059  br label %returnblock
3060
3061returnblock:                                         ; preds = %latchExit, %entry
3062  %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ]
3063  ret void
3064}
3065
3066; Latch exit is shared by all exiting blocks
3067define void @unique_exit(i32 %N, i32 %M) {
3068; EPILOG-LABEL: @unique_exit(
3069; EPILOG-NEXT:  preheader:
3070; EPILOG-NEXT:    %M.shifted = shl nuw i32 %M, 3
3071; EPILOG-NEXT:    %0 = shl i32 %M, 3
3072; EPILOG-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %0, i32 1)
3073; EPILOG-NEXT:    %1 = add i32 %umax, -1
3074; EPILOG-NEXT:    %xtraiter = and i32 %umax, 7
3075; EPILOG-NEXT:    %2 = icmp ult i32 %1, 7
3076; EPILOG-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %preheader.new
3077; EPILOG:       preheader.new:
3078; EPILOG-NEXT:    %unroll_iter = sub i32 %umax, %xtraiter
3079; EPILOG-NEXT:    br label %header
3080; EPILOG:       header:
3081; EPILOG-NEXT:    %i4 = phi i32 [ 0, %preheader.new ], [ %inc.7, %latch.7 ]
3082; EPILOG-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ]
3083; EPILOG-NEXT:    %inc = add nuw nsw i32 %i4, 1
3084; EPILOG-NEXT:    %cmp1 = icmp ult i32 %inc, %N
3085; EPILOG-NEXT:    br i1 %cmp1, label %latch, label %latchExit.epilog-lcssa.loopexit
3086; EPILOG:       latch:
3087; EPILOG-NEXT:    %niter.next = add nuw nsw i32 %niter, 1
3088; EPILOG-NEXT:    %inc.1 = add nuw nsw i32 %inc, 1
3089; EPILOG-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N
3090; EPILOG-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.epilog-lcssa.loopexit
3091; EPILOG:       latch.1:
3092; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i32 %niter.next, 1
3093; EPILOG-NEXT:    %inc.2 = add nuw nsw i32 %inc.1, 1
3094; EPILOG-NEXT:    %cmp1.2 = icmp ult i32 %inc.2, %N
3095; EPILOG-NEXT:    br i1 %cmp1.2, label %latch.2, label %latchExit.epilog-lcssa.loopexit
3096; EPILOG:       latch.2:
3097; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i32 %niter.next.1, 1
3098; EPILOG-NEXT:    %inc.3 = add nuw nsw i32 %inc.2, 1
3099; EPILOG-NEXT:    %cmp1.3 = icmp ult i32 %inc.3, %N
3100; EPILOG-NEXT:    br i1 %cmp1.3, label %latch.3, label %latchExit.epilog-lcssa.loopexit
3101; EPILOG:       latch.3:
3102; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i32 %niter.next.2, 1
3103; EPILOG-NEXT:    %inc.4 = add nuw nsw i32 %inc.3, 1
3104; EPILOG-NEXT:    %cmp1.4 = icmp ult i32 %inc.4, %N
3105; EPILOG-NEXT:    br i1 %cmp1.4, label %latch.4, label %latchExit.epilog-lcssa.loopexit
3106; EPILOG:       latch.4:
3107; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i32 %niter.next.3, 1
3108; EPILOG-NEXT:    %inc.5 = add nuw nsw i32 %inc.4, 1
3109; EPILOG-NEXT:    %cmp1.5 = icmp ult i32 %inc.5, %N
3110; EPILOG-NEXT:    br i1 %cmp1.5, label %latch.5, label %latchExit.epilog-lcssa.loopexit
3111; EPILOG:       latch.5:
3112; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i32 %niter.next.4, 1
3113; EPILOG-NEXT:    %inc.6 = add nuw nsw i32 %inc.5, 1
3114; EPILOG-NEXT:    %cmp1.6 = icmp ult i32 %inc.6, %N
3115; EPILOG-NEXT:    br i1 %cmp1.6, label %latch.6, label %latchExit.epilog-lcssa.loopexit
3116; EPILOG:       latch.6:
3117; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i32 %niter.next.5, 1
3118; EPILOG-NEXT:    %inc.7 = add nuw i32 %inc.6, 1
3119; EPILOG-NEXT:    %cmp1.7 = icmp ult i32 %inc.7, %N
3120; EPILOG-NEXT:    br i1 %cmp1.7, label %latch.7, label %latchExit.epilog-lcssa.loopexit
3121; EPILOG:       latch.7:
3122; EPILOG-NEXT:    %niter.next.7 = add i32 %niter.next.6, 1
3123; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i32 %niter.next.7, %unroll_iter
3124; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %latchExit.unr-lcssa.loopexit
3125; EPILOG:       latchExit.unr-lcssa.loopexit:
3126; EPILOG-NEXT:    %i2.ph.ph.ph = phi i32 [ -1, %latch.7 ]
3127; EPILOG-NEXT:    %i4.unr.ph = phi i32 [ %inc.7, %latch.7 ]
3128; EPILOG-NEXT:    br label %latchExit.unr-lcssa
3129; EPILOG:       latchExit.unr-lcssa:
3130; EPILOG-NEXT:    %i2.ph.ph = phi i32 [ undef, %preheader ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ]
3131; EPILOG-NEXT:    %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %latchExit.unr-lcssa.loopexit ]
3132; EPILOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
3133; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
3134; EPILOG:       header.epil.preheader:
3135; EPILOG-NEXT:    br label %header.epil
3136; EPILOG:       header.epil:
3137; EPILOG-NEXT:    %i4.epil = phi i32 [ %inc.epil, %latch.epil ], [ %i4.unr, %header.epil.preheader ]
3138; EPILOG-NEXT:    %epil.iter = phi i32 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
3139; EPILOG-NEXT:    %inc.epil = add nuw i32 %i4.epil, 1
3140; EPILOG-NEXT:    %cmp1.epil = icmp ult i32 %inc.epil, %N
3141; EPILOG-NEXT:    br i1 %cmp1.epil, label %latch.epil, label %latchExit.epilog-lcssa.loopexit2
3142; EPILOG:       latch.epil:
3143; EPILOG-NEXT:    %cmp.epil = icmp ult i32 %inc.epil, %M.shifted
3144; EPILOG-NEXT:    %epil.iter.next = add i32 %epil.iter, 1
3145; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i32 %epil.iter.next, %xtraiter
3146; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit2, !llvm.loop !8
3147; EPILOG:       latchExit.epilog-lcssa.loopexit:
3148; 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 ]
3149; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
3150; EPILOG:       latchExit.epilog-lcssa.loopexit2:
3151; EPILOG-NEXT:    %i2.ph.ph1.ph3 = phi i32 [ %i4.epil, %header.epil ], [ -1, %latch.epil ]
3152; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
3153; EPILOG:       latchExit.epilog-lcssa:
3154; EPILOG-NEXT:    %i2.ph.ph1 = phi i32 [ %i2.ph.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %i2.ph.ph1.ph3, %latchExit.epilog-lcssa.loopexit2 ]
3155; EPILOG-NEXT:    br label %latchExit
3156; EPILOG:       latchExit:
3157; EPILOG-NEXT:    %i2.ph = phi i32 [ %i2.ph.ph, %latchExit.unr-lcssa ], [ %i2.ph.ph1, %latchExit.epilog-lcssa ]
3158; EPILOG-NEXT:    ret void
3159;
3160; EPILOG-BLOCK-LABEL: @unique_exit(
3161; EPILOG-BLOCK-NEXT:  preheader:
3162; EPILOG-BLOCK-NEXT:    %0 = shl i32 %M, 3
3163; EPILOG-BLOCK-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %0, i32 1)
3164; EPILOG-BLOCK-NEXT:    %1 = add i32 %umax, -1
3165; EPILOG-BLOCK-NEXT:    %xtraiter = and i32 %umax, 1
3166; EPILOG-BLOCK-NEXT:    %2 = icmp ult i32 %1, 1
3167; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %preheader.new
3168; EPILOG-BLOCK:       preheader.new:
3169; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i32 %umax, %xtraiter
3170; EPILOG-BLOCK-NEXT:    br label %header
3171; EPILOG-BLOCK:       header:
3172; EPILOG-BLOCK-NEXT:    %i4 = phi i32 [ 0, %preheader.new ], [ %inc.1, %latch.1 ]
3173; EPILOG-BLOCK-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ]
3174; EPILOG-BLOCK-NEXT:    %inc = add nuw nsw i32 %i4, 1
3175; EPILOG-BLOCK-NEXT:    %cmp1 = icmp ult i32 %inc, %N
3176; EPILOG-BLOCK-NEXT:    br i1 %cmp1, label %latch, label %latchExit.epilog-lcssa.loopexit
3177; EPILOG-BLOCK:       latch:
3178; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i32 %niter, 1
3179; EPILOG-BLOCK-NEXT:    %inc.1 = add nuw i32 %inc, 1
3180; EPILOG-BLOCK-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N
3181; EPILOG-BLOCK-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.epilog-lcssa.loopexit
3182; EPILOG-BLOCK:       latch.1:
3183; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i32 %niter.next, 1
3184; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i32 %niter.next.1, %unroll_iter
3185; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %latchExit.unr-lcssa.loopexit, !llvm.loop !8
3186; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
3187; EPILOG-BLOCK-NEXT:    %i2.ph.ph.ph = phi i32 [ -1, %latch.1 ]
3188; EPILOG-BLOCK-NEXT:    %i4.unr.ph = phi i32 [ %inc.1, %latch.1 ]
3189; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
3190; EPILOG-BLOCK:       latchExit.unr-lcssa:
3191; EPILOG-BLOCK-NEXT:    %i2.ph.ph = phi i32 [ undef, %preheader ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ]
3192; EPILOG-BLOCK-NEXT:    %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %latchExit.unr-lcssa.loopexit ]
3193; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
3194; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
3195; EPILOG-BLOCK:       header.epil.preheader:
3196; EPILOG-BLOCK-NEXT:    br label %header.epil
3197; EPILOG-BLOCK:       header.epil:
3198; EPILOG-BLOCK-NEXT:    %inc.epil = add nuw i32 %i4.unr, 1
3199; EPILOG-BLOCK-NEXT:    %cmp1.epil = icmp ult i32 %inc.epil, %N
3200; EPILOG-BLOCK-NEXT:    br i1 %cmp1.epil, label %latch.epil, label %latchExit.epilog-lcssa
3201; EPILOG-BLOCK:       latch.epil:
3202; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
3203; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
3204; EPILOG-BLOCK-NEXT:    %i2.ph.ph1.ph = phi i32 [ %i4, %header ], [ %inc, %latch ]
3205; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
3206; EPILOG-BLOCK:       latchExit.epilog-lcssa:
3207; EPILOG-BLOCK-NEXT:    %i2.ph.ph1 = phi i32 [ -1, %latch.epil ], [ %i4.unr, %header.epil ], [ %i2.ph.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
3208; EPILOG-BLOCK-NEXT:    br label %latchExit
3209; EPILOG-BLOCK:       latchExit:
3210; EPILOG-BLOCK-NEXT:    %i2.ph = phi i32 [ %i2.ph.ph, %latchExit.unr-lcssa ], [ %i2.ph.ph1, %latchExit.epilog-lcssa ]
3211; EPILOG-BLOCK-NEXT:    ret void
3212;
3213; PROLOG-LABEL: @unique_exit(
3214; PROLOG-NEXT:  preheader:
3215; PROLOG-NEXT:    %M.shifted = shl nuw i32 %M, 3
3216; PROLOG-NEXT:    %0 = shl i32 %M, 3
3217; PROLOG-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %0, i32 1)
3218; PROLOG-NEXT:    %1 = add i32 %umax, -1
3219; PROLOG-NEXT:    %xtraiter = and i32 %umax, 7
3220; PROLOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
3221; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
3222; PROLOG:       header.prol.preheader:
3223; PROLOG-NEXT:    br label %header.prol
3224; PROLOG:       header.prol:
3225; PROLOG-NEXT:    %i4.prol = phi i32 [ %inc.prol, %latch.prol ], [ 0, %header.prol.preheader ]
3226; PROLOG-NEXT:    %prol.iter = phi i32 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
3227; PROLOG-NEXT:    %inc.prol = add nuw i32 %i4.prol, 1
3228; PROLOG-NEXT:    %cmp1.prol = icmp ult i32 %inc.prol, %N
3229; PROLOG-NEXT:    br i1 %cmp1.prol, label %latch.prol, label %latchExit.unr-lcssa.loopexit1
3230; PROLOG:       latch.prol:
3231; PROLOG-NEXT:    %cmp.prol = icmp ult i32 %inc.prol, %M.shifted
3232; PROLOG-NEXT:    %prol.iter.next = add i32 %prol.iter, 1
3233; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i32 %prol.iter.next, %xtraiter
3234; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !8
3235; PROLOG:       header.prol.loopexit.unr-lcssa:
3236; PROLOG-NEXT:    %i4.unr.ph = phi i32 [ %inc.prol, %latch.prol ]
3237; PROLOG-NEXT:    %i2.ph.unr.ph = phi i32 [ -1, %latch.prol ]
3238; PROLOG-NEXT:    br label %header.prol.loopexit
3239; PROLOG:       header.prol.loopexit:
3240; PROLOG-NEXT:    %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %header.prol.loopexit.unr-lcssa ]
3241; PROLOG-NEXT:    %i2.ph.unr = phi i32 [ undef, %preheader ], [ %i2.ph.unr.ph, %header.prol.loopexit.unr-lcssa ]
3242; PROLOG-NEXT:    %2 = icmp ult i32 %1, 7
3243; PROLOG-NEXT:    br i1 %2, label %latchExit, label %preheader.new
3244; PROLOG:       preheader.new:
3245; PROLOG-NEXT:    br label %header
3246; PROLOG:       header:
3247; PROLOG-NEXT:    %i4 = phi i32 [ %i4.unr, %preheader.new ], [ %inc.7, %latch.7 ]
3248; PROLOG-NEXT:    %inc = add nuw i32 %i4, 1
3249; PROLOG-NEXT:    %cmp1 = icmp ult i32 %inc, %N
3250; PROLOG-NEXT:    br i1 %cmp1, label %latch, label %latchExit.unr-lcssa.loopexit
3251; PROLOG:       latch:
3252; PROLOG-NEXT:    %inc.1 = add nuw i32 %inc, 1
3253; PROLOG-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N
3254; PROLOG-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.unr-lcssa.loopexit
3255; PROLOG:       latch.1:
3256; PROLOG-NEXT:    %inc.2 = add nuw i32 %inc.1, 1
3257; PROLOG-NEXT:    %cmp1.2 = icmp ult i32 %inc.2, %N
3258; PROLOG-NEXT:    br i1 %cmp1.2, label %latch.2, label %latchExit.unr-lcssa.loopexit
3259; PROLOG:       latch.2:
3260; PROLOG-NEXT:    %inc.3 = add nuw i32 %inc.2, 1
3261; PROLOG-NEXT:    %cmp1.3 = icmp ult i32 %inc.3, %N
3262; PROLOG-NEXT:    br i1 %cmp1.3, label %latch.3, label %latchExit.unr-lcssa.loopexit
3263; PROLOG:       latch.3:
3264; PROLOG-NEXT:    %inc.4 = add nuw i32 %inc.3, 1
3265; PROLOG-NEXT:    %cmp1.4 = icmp ult i32 %inc.4, %N
3266; PROLOG-NEXT:    br i1 %cmp1.4, label %latch.4, label %latchExit.unr-lcssa.loopexit
3267; PROLOG:       latch.4:
3268; PROLOG-NEXT:    %inc.5 = add nuw i32 %inc.4, 1
3269; PROLOG-NEXT:    %cmp1.5 = icmp ult i32 %inc.5, %N
3270; PROLOG-NEXT:    br i1 %cmp1.5, label %latch.5, label %latchExit.unr-lcssa.loopexit
3271; PROLOG:       latch.5:
3272; PROLOG-NEXT:    %inc.6 = add nuw i32 %inc.5, 1
3273; PROLOG-NEXT:    %cmp1.6 = icmp ult i32 %inc.6, %N
3274; PROLOG-NEXT:    br i1 %cmp1.6, label %latch.6, label %latchExit.unr-lcssa.loopexit
3275; PROLOG:       latch.6:
3276; PROLOG-NEXT:    %inc.7 = add nuw i32 %inc.6, 1
3277; PROLOG-NEXT:    %cmp1.7 = icmp ult i32 %inc.7, %N
3278; PROLOG-NEXT:    br i1 %cmp1.7, label %latch.7, label %latchExit.unr-lcssa.loopexit
3279; PROLOG:       latch.7:
3280; PROLOG-NEXT:    %cmp.7 = icmp ult i32 %inc.7, %M.shifted
3281; PROLOG-NEXT:    br i1 %cmp.7, label %header, label %latchExit.unr-lcssa.loopexit
3282; PROLOG:       latchExit.unr-lcssa.loopexit:
3283; 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 ]
3284; PROLOG-NEXT:    br label %latchExit.unr-lcssa
3285; PROLOG:       latchExit.unr-lcssa.loopexit1:
3286; PROLOG-NEXT:    %i2.ph.ph.ph2 = phi i32 [ %i4.prol, %header.prol ]
3287; PROLOG-NEXT:    br label %latchExit.unr-lcssa
3288; PROLOG:       latchExit.unr-lcssa:
3289; PROLOG-NEXT:    %i2.ph.ph = phi i32 [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %i2.ph.ph.ph2, %latchExit.unr-lcssa.loopexit1 ]
3290; PROLOG-NEXT:    br label %latchExit
3291; PROLOG:       latchExit:
3292; PROLOG-NEXT:    %i2.ph = phi i32 [ %i2.ph.unr, %header.prol.loopexit ], [ %i2.ph.ph, %latchExit.unr-lcssa ]
3293; PROLOG-NEXT:    ret void
3294;
3295; PROLOG-BLOCK-LABEL: @unique_exit(
3296; PROLOG-BLOCK-NEXT:  preheader:
3297; PROLOG-BLOCK-NEXT:    %M.shifted = shl nuw i32 %M, 3
3298; PROLOG-BLOCK-NEXT:    %0 = shl i32 %M, 3
3299; PROLOG-BLOCK-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %0, i32 1)
3300; PROLOG-BLOCK-NEXT:    %1 = add i32 %umax, -1
3301; PROLOG-BLOCK-NEXT:    %xtraiter = and i32 %umax, 1
3302; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
3303; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
3304; PROLOG-BLOCK:       header.prol.preheader:
3305; PROLOG-BLOCK-NEXT:    br label %header.prol
3306; PROLOG-BLOCK:       header.prol:
3307; PROLOG-BLOCK-NEXT:    %cmp1.prol = icmp ult i32 1, %N
3308; PROLOG-BLOCK-NEXT:    br i1 %cmp1.prol, label %latch.prol, label %latchExit.unr-lcssa
3309; PROLOG-BLOCK:       latch.prol:
3310; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
3311; PROLOG-BLOCK:       header.prol.loopexit:
3312; PROLOG-BLOCK-NEXT:    %i4.unr = phi i32 [ 0, %preheader ], [ 1, %latch.prol ]
3313; PROLOG-BLOCK-NEXT:    %i2.ph.unr = phi i32 [ undef, %preheader ], [ -1, %latch.prol ]
3314; PROLOG-BLOCK-NEXT:    %2 = icmp ult i32 %1, 1
3315; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchExit, label %preheader.new
3316; PROLOG-BLOCK:       preheader.new:
3317; PROLOG-BLOCK-NEXT:    br label %header
3318; PROLOG-BLOCK:       header:
3319; PROLOG-BLOCK-NEXT:    %i4 = phi i32 [ %i4.unr, %preheader.new ], [ %inc.1, %latch.1 ]
3320; PROLOG-BLOCK-NEXT:    %inc = add nuw i32 %i4, 1
3321; PROLOG-BLOCK-NEXT:    %cmp1 = icmp ult i32 %inc, %N
3322; PROLOG-BLOCK-NEXT:    br i1 %cmp1, label %latch, label %latchExit.unr-lcssa.loopexit
3323; PROLOG-BLOCK:       latch:
3324; PROLOG-BLOCK-NEXT:    %inc.1 = add nuw i32 %inc, 1
3325; PROLOG-BLOCK-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N
3326; PROLOG-BLOCK-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.unr-lcssa.loopexit
3327; PROLOG-BLOCK:       latch.1:
3328; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ult i32 %inc.1, %M.shifted
3329; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %header, label %latchExit.unr-lcssa.loopexit, !llvm.loop !8
3330; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
3331; PROLOG-BLOCK-NEXT:    %i2.ph.ph.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ -1, %latch.1 ]
3332; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
3333; PROLOG-BLOCK:       latchExit.unr-lcssa:
3334; PROLOG-BLOCK-NEXT:    %i2.ph.ph = phi i32 [ 0, %header.prol ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ]
3335; PROLOG-BLOCK-NEXT:    br label %latchExit
3336; PROLOG-BLOCK:       latchExit:
3337; PROLOG-BLOCK-NEXT:    %i2.ph = phi i32 [ %i2.ph.unr, %header.prol.loopexit ], [ %i2.ph.ph, %latchExit.unr-lcssa ]
3338; PROLOG-BLOCK-NEXT:    ret void
3339;
3340
3341preheader:
3342  %M.shifted = shl nuw i32 %M, 3
3343  br label %header
3344
3345header:                                           ; preds = %preheader, %latch
3346  %i4 = phi i32 [ %inc, %latch ], [ 0, %preheader ]
3347  %inc = add nuw i32 %i4, 1
3348  %cmp1 = icmp ult i32 %inc, %N
3349  br i1 %cmp1, label %latch, label %latchExit
3350
3351latch:                                            ; preds = %header
3352  %cmp = icmp ult i32 %inc, %M.shifted
3353  br i1 %cmp, label %header, label %latchExit
3354
3355latchExit:                                ; preds = %header, %latch
3356  %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ]
3357  ret void
3358}
3359
3360
3361; two exiting and two exit blocks.
3362; the non-latch exiting block has duplicate edges to the non-latch exit block.
3363define i64 @test5(i64 %trip, i64 %add, i1 %cond) {
3364; EPILOG-LABEL: @test5(
3365; EPILOG-NEXT:  entry:
3366; EPILOG-NEXT:    %0 = add i64 %trip, -1
3367; EPILOG-NEXT:    %xtraiter = and i64 %trip, 7
3368; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
3369; EPILOG-NEXT:    br i1 %1, label %latchexit.unr-lcssa, label %entry.new
3370; EPILOG:       entry.new:
3371; EPILOG-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
3372; EPILOG-NEXT:    br label %loop_header
3373; EPILOG:       loop_header:
3374; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
3375; EPILOG-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
3376; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
3377; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3378; EPILOG:       loop_exiting:
3379; EPILOG-NEXT:    %ivy = add i64 %iv, %add
3380; EPILOG-NEXT:    switch i64 %sum, label %loop_latch [
3381; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3382; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3383; EPILOG-NEXT:    ]
3384; EPILOG:       loop_latch:
3385; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3386; EPILOG-NEXT:    %sum.next = add i64 %sum, %add
3387; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
3388; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3389; EPILOG:       loop_exiting.1:
3390; EPILOG-NEXT:    %ivy.1 = add i64 %iv_next, %add
3391; EPILOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3392; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3393; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3394; EPILOG-NEXT:    ]
3395; EPILOG:       loop_latch.1:
3396; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3397; EPILOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3398; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
3399; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.2
3400; EPILOG:       loop_exiting.2:
3401; EPILOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add
3402; EPILOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
3403; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3404; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3405; EPILOG-NEXT:    ]
3406; EPILOG:       loop_latch.2:
3407; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
3408; EPILOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
3409; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
3410; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.3
3411; EPILOG:       loop_exiting.3:
3412; EPILOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add
3413; EPILOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
3414; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3415; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3416; EPILOG-NEXT:    ]
3417; EPILOG:       loop_latch.3:
3418; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
3419; EPILOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
3420; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
3421; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.4
3422; EPILOG:       loop_exiting.4:
3423; EPILOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add
3424; EPILOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
3425; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3426; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3427; EPILOG-NEXT:    ]
3428; EPILOG:       loop_latch.4:
3429; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
3430; EPILOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
3431; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
3432; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.5
3433; EPILOG:       loop_exiting.5:
3434; EPILOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add
3435; EPILOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
3436; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3437; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3438; EPILOG-NEXT:    ]
3439; EPILOG:       loop_latch.5:
3440; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
3441; EPILOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
3442; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
3443; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.6
3444; EPILOG:       loop_exiting.6:
3445; EPILOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add
3446; EPILOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
3447; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3448; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3449; EPILOG-NEXT:    ]
3450; EPILOG:       loop_latch.6:
3451; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
3452; EPILOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
3453; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
3454; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.7
3455; EPILOG:       loop_exiting.7:
3456; EPILOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add
3457; EPILOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
3458; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3459; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3460; EPILOG-NEXT:    ]
3461; EPILOG:       loop_latch.7:
3462; EPILOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
3463; EPILOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
3464; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
3465; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
3466; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %latchexit.unr-lcssa.loopexit
3467; EPILOG:       exit1.loopexit:
3468; 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 ]
3469; EPILOG-NEXT:    br label %exit1
3470; EPILOG:       exit1.loopexit2:
3471; EPILOG-NEXT:    %result.ph3 = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ]
3472; EPILOG-NEXT:    br label %exit1
3473; EPILOG:       exit1:
3474; EPILOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph3, %exit1.loopexit2 ]
3475; EPILOG-NEXT:    ret i64 %result
3476; EPILOG:       latchexit.unr-lcssa.loopexit:
3477; EPILOG-NEXT:    %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3478; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
3479; EPILOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3480; EPILOG-NEXT:    br label %latchexit.unr-lcssa
3481; EPILOG:       latchexit.unr-lcssa:
3482; EPILOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ]
3483; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ]
3484; EPILOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ]
3485; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3486; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit
3487; EPILOG:       loop_header.epil.preheader:
3488; EPILOG-NEXT:    br label %loop_header.epil
3489; EPILOG:       loop_header.epil:
3490; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
3491; EPILOG-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]
3492; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
3493; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil
3494; EPILOG:       loop_exiting.epil:
3495; EPILOG-NEXT:    %ivy.epil = add i64 %iv.epil, %add
3496; EPILOG-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
3497; EPILOG-NEXT:    i64 24, label %exit1.loopexit2
3498; EPILOG-NEXT:    i64 42, label %exit1.loopexit2
3499; EPILOG-NEXT:    ]
3500; EPILOG:       loop_latch.epil:
3501; EPILOG-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
3502; EPILOG-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
3503; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
3504; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
3505; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
3506; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %latchexit.epilog-lcssa, !llvm.loop !9
3507; EPILOG:       latchexit.epilog-lcssa:
3508; EPILOG-NEXT:    %sum.next.lcssa.ph1 = phi i64 [ %sum.next.epil, %loop_latch.epil ]
3509; EPILOG-NEXT:    br label %latchexit
3510; EPILOG:       latchexit:
3511; EPILOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.lcssa.ph1, %latchexit.epilog-lcssa ]
3512; EPILOG-NEXT:    ret i64 %sum.next.lcssa
3513;
3514; EPILOG-BLOCK-LABEL: @test5(
3515; EPILOG-BLOCK-NEXT:  entry:
3516; EPILOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
3517; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
3518; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
3519; EPILOG-BLOCK-NEXT:    br i1 %1, label %latchexit.unr-lcssa, label %entry.new
3520; EPILOG-BLOCK:       entry.new:
3521; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
3522; EPILOG-BLOCK-NEXT:    br label %loop_header
3523; EPILOG-BLOCK:       loop_header:
3524; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
3525; EPILOG-BLOCK-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
3526; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
3527; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3528; EPILOG-BLOCK:       loop_exiting:
3529; EPILOG-BLOCK-NEXT:    %ivy = add i64 %iv, %add
3530; EPILOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
3531; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3532; EPILOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3533; EPILOG-BLOCK-NEXT:    ]
3534; EPILOG-BLOCK:       loop_latch:
3535; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3536; EPILOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
3537; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
3538; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3539; EPILOG-BLOCK:       loop_exiting.1:
3540; EPILOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add
3541; EPILOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3542; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3543; EPILOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3544; EPILOG-BLOCK-NEXT:    ]
3545; EPILOG-BLOCK:       loop_latch.1:
3546; EPILOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3547; EPILOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3548; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
3549; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
3550; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !9
3551; EPILOG-BLOCK:       exit1.loopexit:
3552; EPILOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]
3553; EPILOG-BLOCK-NEXT:    br label %exit1
3554; EPILOG-BLOCK:       exit1:
3555; EPILOG-BLOCK-NEXT:    %result = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ], [ %result.ph, %exit1.loopexit ]
3556; EPILOG-BLOCK-NEXT:    ret i64 %result
3557; EPILOG-BLOCK:       latchexit.unr-lcssa.loopexit:
3558; EPILOG-BLOCK-NEXT:    %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3559; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
3560; EPILOG-BLOCK-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3561; EPILOG-BLOCK-NEXT:    br label %latchexit.unr-lcssa
3562; EPILOG-BLOCK:       latchexit.unr-lcssa:
3563; EPILOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ]
3564; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ]
3565; EPILOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ]
3566; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3567; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit
3568; EPILOG-BLOCK:       loop_header.epil.preheader:
3569; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
3570; EPILOG-BLOCK:       loop_header.epil:
3571; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil
3572; EPILOG-BLOCK:       loop_exiting.epil:
3573; EPILOG-BLOCK-NEXT:    %ivy.epil = add i64 %iv.unr, %add
3574; EPILOG-BLOCK-NEXT:    switch i64 %sum.unr, label %loop_latch.epil [
3575; EPILOG-BLOCK-NEXT:    i64 24, label %exit1
3576; EPILOG-BLOCK-NEXT:    i64 42, label %exit1
3577; EPILOG-BLOCK-NEXT:    ]
3578; EPILOG-BLOCK:       loop_latch.epil:
3579; EPILOG-BLOCK-NEXT:    %sum.next.epil = add i64 %sum.unr, %add
3580; EPILOG-BLOCK-NEXT:    br label %latchexit
3581; EPILOG-BLOCK:       latchexit:
3582; EPILOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.epil, %loop_latch.epil ]
3583; EPILOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa
3584;
3585; PROLOG-LABEL: @test5(
3586; PROLOG-NEXT:  entry:
3587; PROLOG-NEXT:    %0 = add i64 %trip, -1
3588; PROLOG-NEXT:    %xtraiter = and i64 %trip, 7
3589; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3590; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
3591; PROLOG:       loop_header.prol.preheader:
3592; PROLOG-NEXT:    br label %loop_header.prol
3593; PROLOG:       loop_header.prol:
3594; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
3595; PROLOG-NEXT:    %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ]
3596; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
3597; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol
3598; PROLOG:       loop_exiting.prol:
3599; PROLOG-NEXT:    %ivy.prol = add i64 %iv.prol, %add
3600; PROLOG-NEXT:    switch i64 %sum.prol, label %loop_latch.prol [
3601; PROLOG-NEXT:    i64 24, label %exit1.loopexit1
3602; PROLOG-NEXT:    i64 42, label %exit1.loopexit1
3603; PROLOG-NEXT:    ]
3604; PROLOG:       loop_latch.prol:
3605; PROLOG-NEXT:    %iv_next.prol = add nuw nsw i64 %iv.prol, 1
3606; PROLOG-NEXT:    %sum.next.prol = add i64 %sum.prol, %add
3607; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
3608; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
3609; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
3610; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !9
3611; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
3612; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
3613; PROLOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
3614; PROLOG-NEXT:    %sum.next.lcssa.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
3615; PROLOG-NEXT:    br label %loop_header.prol.loopexit
3616; PROLOG:       loop_header.prol.loopexit:
3617; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
3618; PROLOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
3619; PROLOG-NEXT:    %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %sum.next.lcssa.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
3620; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
3621; PROLOG-NEXT:    br i1 %1, label %latchexit, label %entry.new
3622; PROLOG:       entry.new:
3623; PROLOG-NEXT:    br label %loop_header
3624; PROLOG:       loop_header:
3625; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
3626; PROLOG-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
3627; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3628; PROLOG:       loop_exiting:
3629; PROLOG-NEXT:    %ivy = add i64 %iv, %add
3630; PROLOG-NEXT:    switch i64 %sum, label %loop_latch [
3631; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3632; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3633; PROLOG-NEXT:    ]
3634; PROLOG:       loop_latch:
3635; PROLOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3636; PROLOG-NEXT:    %sum.next = add i64 %sum, %add
3637; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3638; PROLOG:       loop_exiting.1:
3639; PROLOG-NEXT:    %ivy.1 = add i64 %iv_next, %add
3640; PROLOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3641; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3642; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3643; PROLOG-NEXT:    ]
3644; PROLOG:       loop_latch.1:
3645; PROLOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3646; PROLOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3647; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.2
3648; PROLOG:       loop_exiting.2:
3649; PROLOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add
3650; PROLOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
3651; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3652; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3653; PROLOG-NEXT:    ]
3654; PROLOG:       loop_latch.2:
3655; PROLOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
3656; PROLOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
3657; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.3
3658; PROLOG:       loop_exiting.3:
3659; PROLOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add
3660; PROLOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
3661; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3662; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3663; PROLOG-NEXT:    ]
3664; PROLOG:       loop_latch.3:
3665; PROLOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
3666; PROLOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
3667; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.4
3668; PROLOG:       loop_exiting.4:
3669; PROLOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add
3670; PROLOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
3671; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3672; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3673; PROLOG-NEXT:    ]
3674; PROLOG:       loop_latch.4:
3675; PROLOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
3676; PROLOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
3677; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.5
3678; PROLOG:       loop_exiting.5:
3679; PROLOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add
3680; PROLOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
3681; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3682; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3683; PROLOG-NEXT:    ]
3684; PROLOG:       loop_latch.5:
3685; PROLOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
3686; PROLOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
3687; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.6
3688; PROLOG:       loop_exiting.6:
3689; PROLOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add
3690; PROLOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
3691; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3692; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3693; PROLOG-NEXT:    ]
3694; PROLOG:       loop_latch.6:
3695; PROLOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
3696; PROLOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
3697; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.7
3698; PROLOG:       loop_exiting.7:
3699; PROLOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add
3700; PROLOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
3701; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3702; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3703; PROLOG-NEXT:    ]
3704; PROLOG:       loop_latch.7:
3705; PROLOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
3706; PROLOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
3707; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
3708; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %latchexit.unr-lcssa
3709; PROLOG:       exit1.loopexit:
3710; 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 ]
3711; PROLOG-NEXT:    br label %exit1
3712; PROLOG:       exit1.loopexit1:
3713; PROLOG-NEXT:    %result.ph2 = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ]
3714; PROLOG-NEXT:    br label %exit1
3715; PROLOG:       exit1:
3716; PROLOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph2, %exit1.loopexit1 ]
3717; PROLOG-NEXT:    ret i64 %result
3718; PROLOG:       latchexit.unr-lcssa:
3719; PROLOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3720; PROLOG-NEXT:    br label %latchexit
3721; PROLOG:       latchexit:
3722; PROLOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]
3723; PROLOG-NEXT:    ret i64 %sum.next.lcssa
3724;
3725; PROLOG-BLOCK-LABEL: @test5(
3726; PROLOG-BLOCK-NEXT:  entry:
3727; PROLOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
3728; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
3729; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3730; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
3731; PROLOG-BLOCK:       loop_header.prol.preheader:
3732; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
3733; PROLOG-BLOCK:       loop_header.prol:
3734; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol
3735; PROLOG-BLOCK:       loop_exiting.prol:
3736; PROLOG-BLOCK-NEXT:    switch i64 0, label %loop_latch.prol [
3737; PROLOG-BLOCK-NEXT:    i64 24, label %exit1
3738; PROLOG-BLOCK-NEXT:    i64 42, label %exit1
3739; PROLOG-BLOCK-NEXT:    ]
3740; PROLOG-BLOCK:       loop_latch.prol:
3741; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
3742; PROLOG-BLOCK:       loop_header.prol.loopexit:
3743; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
3744; PROLOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %add, %loop_latch.prol ]
3745; PROLOG-BLOCK-NEXT:    %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %add, %loop_latch.prol ]
3746; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
3747; PROLOG-BLOCK-NEXT:    br i1 %1, label %latchexit, label %entry.new
3748; PROLOG-BLOCK:       entry.new:
3749; PROLOG-BLOCK-NEXT:    br label %loop_header
3750; PROLOG-BLOCK:       loop_header:
3751; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
3752; PROLOG-BLOCK-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
3753; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3754; PROLOG-BLOCK:       loop_exiting:
3755; PROLOG-BLOCK-NEXT:    %ivy = add i64 %iv, %add
3756; PROLOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
3757; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3758; PROLOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3759; PROLOG-BLOCK-NEXT:    ]
3760; PROLOG-BLOCK:       loop_latch:
3761; PROLOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3762; PROLOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
3763; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3764; PROLOG-BLOCK:       loop_exiting.1:
3765; PROLOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add
3766; PROLOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3767; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3768; PROLOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3769; PROLOG-BLOCK-NEXT:    ]
3770; PROLOG-BLOCK:       loop_latch.1:
3771; PROLOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3772; PROLOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3773; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
3774; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %latchexit.unr-lcssa, !llvm.loop !9
3775; PROLOG-BLOCK:       exit1.loopexit:
3776; PROLOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]
3777; PROLOG-BLOCK-NEXT:    br label %exit1
3778; PROLOG-BLOCK:       exit1:
3779; PROLOG-BLOCK-NEXT:    %result = phi i64 [ %add, %loop_exiting.prol ], [ %add, %loop_exiting.prol ], [ %result.ph, %exit1.loopexit ]
3780; PROLOG-BLOCK-NEXT:    ret i64 %result
3781; PROLOG-BLOCK:       latchexit.unr-lcssa:
3782; PROLOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3783; PROLOG-BLOCK-NEXT:    br label %latchexit
3784; PROLOG-BLOCK:       latchexit:
3785; PROLOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]
3786; PROLOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa
3787;
3788
3789entry:
3790  br label %loop_header
3791
3792loop_header:
3793  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
3794  %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ]
3795  br i1 %cond, label %loop_latch, label %loop_exiting
3796
3797loop_exiting:
3798  %ivy = add i64 %iv, %add
3799  switch i64 %sum, label %loop_latch [
3800  i64 24, label %exit1
3801  i64 42, label %exit1
3802  ]
3803
3804loop_latch:
3805  %iv_next = add nuw nsw i64 %iv, 1
3806  %sum.next = add i64 %sum, %add
3807  %cmp = icmp ne i64 %iv_next, %trip
3808  br i1 %cmp, label %loop_header, label %latchexit
3809
3810exit1:
3811  %result = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ]
3812  ret i64 %result
3813
3814latchexit:
3815  ret i64 %sum.next
3816}
3817
3818; test when exit blocks have successors.
3819define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) {
3820; EPILOG-LABEL: @test6(
3821; EPILOG-NEXT:  entry:
3822; EPILOG-NEXT:    %0 = add i64 %n, -1
3823; EPILOG-NEXT:    %xtraiter = and i64 %n, 7
3824; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
3825; EPILOG-NEXT:    br i1 %1, label %latch_exit.unr-lcssa, label %entry.new
3826; EPILOG:       entry.new:
3827; EPILOG-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
3828; EPILOG-NEXT:    br label %header
3829; EPILOG:       header:
3830; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
3831; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
3832; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
3833; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
3834; EPILOG:       for.exiting_block:
3835; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
3836; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
3837; EPILOG:       latch:
3838; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3839; EPILOG-NEXT:    %load = load i32, i32* %arrayidx, align 4
3840; EPILOG-NEXT:    %add = add nsw i32 %load, %sum.02
3841; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
3842; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
3843; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
3844; EPILOG:       for.exiting_block.1:
3845; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3846; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3847; EPILOG:       latch.1:
3848; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3849; EPILOG-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
3850; EPILOG-NEXT:    %add.1 = add nsw i32 %load.1, %add
3851; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
3852; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
3853; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
3854; EPILOG:       for.exiting_block.2:
3855; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
3856; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
3857; EPILOG:       latch.2:
3858; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
3859; EPILOG-NEXT:    %load.2 = load i32, i32* %arrayidx.2, align 4
3860; EPILOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.1
3861; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
3862; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
3863; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
3864; EPILOG:       for.exiting_block.3:
3865; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
3866; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
3867; EPILOG:       latch.3:
3868; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
3869; EPILOG-NEXT:    %load.3 = load i32, i32* %arrayidx.3, align 4
3870; EPILOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.2
3871; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
3872; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
3873; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
3874; EPILOG:       for.exiting_block.4:
3875; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
3876; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
3877; EPILOG:       latch.4:
3878; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
3879; EPILOG-NEXT:    %load.4 = load i32, i32* %arrayidx.4, align 4
3880; EPILOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.3
3881; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
3882; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
3883; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
3884; EPILOG:       for.exiting_block.5:
3885; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
3886; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
3887; EPILOG:       latch.5:
3888; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
3889; EPILOG-NEXT:    %load.5 = load i32, i32* %arrayidx.5, align 4
3890; EPILOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.4
3891; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
3892; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
3893; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
3894; EPILOG:       for.exiting_block.6:
3895; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
3896; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
3897; EPILOG:       latch.6:
3898; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
3899; EPILOG-NEXT:    %load.6 = load i32, i32* %arrayidx.6, align 4
3900; EPILOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.5
3901; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
3902; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
3903; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
3904; EPILOG:       for.exiting_block.7:
3905; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
3906; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
3907; EPILOG:       latch.7:
3908; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
3909; EPILOG-NEXT:    %load.7 = load i32, i32* %arrayidx.7, align 4
3910; EPILOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.6
3911; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
3912; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
3913; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
3914; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latch_exit.unr-lcssa.loopexit, label %header
3915; EPILOG:       latch_exit.unr-lcssa.loopexit:
3916; EPILOG-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %latch.7 ]
3917; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
3918; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
3919; EPILOG-NEXT:    br label %latch_exit.unr-lcssa
3920; EPILOG:       latch_exit.unr-lcssa:
3921; EPILOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ]
3922; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3923; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3924; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3925; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit
3926; EPILOG:       header.epil.preheader:
3927; EPILOG-NEXT:    br label %header.epil
3928; EPILOG:       header.epil:
3929; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
3930; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
3931; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
3932; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil
3933; EPILOG:       for.exiting_block.epil:
3934; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
3935; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit2, label %latch.epil
3936; EPILOG:       latch.epil:
3937; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
3938; EPILOG-NEXT:    %load.epil = load i32, i32* %arrayidx.epil, align 4
3939; EPILOG-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.epil
3940; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
3941; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
3942; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
3943; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
3944; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latch_exit.epilog-lcssa, !llvm.loop !10
3945; EPILOG:       latch_exit.epilog-lcssa:
3946; EPILOG-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %latch.epil ]
3947; EPILOG-NEXT:    br label %latch_exit
3948; EPILOG:       latch_exit:
3949; EPILOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %sum.0.lcssa.ph1, %latch_exit.epilog-lcssa ]
3950; EPILOG-NEXT:    ret i32 %sum.0.lcssa
3951; EPILOG:       for.exit2.loopexit:
3952; 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 ]
3953; EPILOG-NEXT:    br label %for.exit2
3954; EPILOG:       for.exit2.loopexit2:
3955; EPILOG-NEXT:    %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
3956; EPILOG-NEXT:    br label %for.exit2
3957; EPILOG:       for.exit2:
3958; EPILOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
3959; EPILOG-NEXT:    %addx = add i32 %retval, %x
3960; EPILOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3961; EPILOG:       exit_true:
3962; EPILOG-NEXT:    ret i32 %retval
3963; EPILOG:       exit_false:
3964; EPILOG-NEXT:    ret i32 %addx
3965;
3966; EPILOG-BLOCK-LABEL: @test6(
3967; EPILOG-BLOCK-NEXT:  entry:
3968; EPILOG-BLOCK-NEXT:    %0 = add i64 %n, -1
3969; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
3970; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
3971; EPILOG-BLOCK-NEXT:    br i1 %1, label %latch_exit.unr-lcssa, label %entry.new
3972; EPILOG-BLOCK:       entry.new:
3973; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
3974; EPILOG-BLOCK-NEXT:    br label %header
3975; EPILOG-BLOCK:       header:
3976; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
3977; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
3978; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
3979; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
3980; EPILOG-BLOCK:       for.exiting_block:
3981; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
3982; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
3983; EPILOG-BLOCK:       latch:
3984; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3985; EPILOG-BLOCK-NEXT:    %load = load i32, i32* %arrayidx, align 4
3986; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %load, %sum.02
3987; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
3988; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
3989; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
3990; EPILOG-BLOCK:       for.exiting_block.1:
3991; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3992; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3993; EPILOG-BLOCK:       latch.1:
3994; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3995; EPILOG-BLOCK-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
3996; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add
3997; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
3998; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
3999; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
4000; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latch_exit.unr-lcssa.loopexit, label %header, !llvm.loop !10
4001; EPILOG-BLOCK:       latch_exit.unr-lcssa.loopexit:
4002; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %latch.1 ]
4003; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
4004; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
4005; EPILOG-BLOCK-NEXT:    br label %latch_exit.unr-lcssa
4006; EPILOG-BLOCK:       latch_exit.unr-lcssa:
4007; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ]
4008; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ]
4009; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ]
4010; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4011; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit
4012; EPILOG-BLOCK:       header.epil.preheader:
4013; EPILOG-BLOCK-NEXT:    br label %header.epil
4014; EPILOG-BLOCK:       header.epil:
4015; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.epil
4016; EPILOG-BLOCK:       for.exiting_block.epil:
4017; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
4018; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %latch.epil
4019; EPILOG-BLOCK:       latch.epil:
4020; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
4021; EPILOG-BLOCK-NEXT:    %load.epil = load i32, i32* %arrayidx.epil, align 4
4022; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.unr
4023; EPILOG-BLOCK-NEXT:    br label %latch_exit
4024; EPILOG-BLOCK:       latch_exit:
4025; EPILOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %add.epil, %latch.epil ]
4026; EPILOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
4027; EPILOG-BLOCK:       for.exit2.loopexit:
4028; EPILOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]
4029; EPILOG-BLOCK-NEXT:    br label %for.exit2
4030; EPILOG-BLOCK:       for.exit2:
4031; EPILOG-BLOCK-NEXT:    %retval = phi i32 [ %sum.02.unr, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ]
4032; EPILOG-BLOCK-NEXT:    %addx = add i32 %retval, %x
4033; EPILOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false
4034; EPILOG-BLOCK:       exit_true:
4035; EPILOG-BLOCK-NEXT:    ret i32 %retval
4036; EPILOG-BLOCK:       exit_false:
4037; EPILOG-BLOCK-NEXT:    ret i32 %addx
4038;
4039; PROLOG-LABEL: @test6(
4040; PROLOG-NEXT:  entry:
4041; PROLOG-NEXT:    %0 = add i64 %n, -1
4042; PROLOG-NEXT:    %xtraiter = and i64 %n, 7
4043; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4044; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4045; PROLOG:       header.prol.preheader:
4046; PROLOG-NEXT:    br label %header.prol
4047; PROLOG:       header.prol:
4048; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
4049; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
4050; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
4051; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol
4052; PROLOG:       for.exiting_block.prol:
4053; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
4054; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit1, label %latch.prol
4055; PROLOG:       latch.prol:
4056; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
4057; PROLOG-NEXT:    %load.prol = load i32, i32* %arrayidx.prol, align 4
4058; PROLOG-NEXT:    %add.prol = add nsw i32 %load.prol, %sum.02.prol
4059; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
4060; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
4061; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
4062; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
4063; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !10
4064; PROLOG:       header.prol.loopexit.unr-lcssa:
4065; PROLOG-NEXT:    %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %latch.prol ]
4066; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
4067; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
4068; PROLOG-NEXT:    br label %header.prol.loopexit
4069; PROLOG:       header.prol.loopexit:
4070; PROLOG-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ]
4071; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
4072; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
4073; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
4074; PROLOG-NEXT:    br i1 %1, label %latch_exit, label %entry.new
4075; PROLOG:       entry.new:
4076; PROLOG-NEXT:    br label %header
4077; PROLOG:       header:
4078; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
4079; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
4080; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
4081; PROLOG:       for.exiting_block:
4082; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
4083; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
4084; PROLOG:       latch:
4085; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
4086; PROLOG-NEXT:    %load = load i32, i32* %arrayidx, align 4
4087; PROLOG-NEXT:    %add = add nsw i32 %load, %sum.02
4088; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
4089; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
4090; PROLOG:       for.exiting_block.1:
4091; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
4092; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
4093; PROLOG:       latch.1:
4094; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
4095; PROLOG-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
4096; PROLOG-NEXT:    %add.1 = add nsw i32 %load.1, %add
4097; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
4098; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
4099; PROLOG:       for.exiting_block.2:
4100; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
4101; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
4102; PROLOG:       latch.2:
4103; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
4104; PROLOG-NEXT:    %load.2 = load i32, i32* %arrayidx.2, align 4
4105; PROLOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.1
4106; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
4107; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
4108; PROLOG:       for.exiting_block.3:
4109; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
4110; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
4111; PROLOG:       latch.3:
4112; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
4113; PROLOG-NEXT:    %load.3 = load i32, i32* %arrayidx.3, align 4
4114; PROLOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.2
4115; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
4116; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
4117; PROLOG:       for.exiting_block.4:
4118; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
4119; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
4120; PROLOG:       latch.4:
4121; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
4122; PROLOG-NEXT:    %load.4 = load i32, i32* %arrayidx.4, align 4
4123; PROLOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.3
4124; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
4125; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
4126; PROLOG:       for.exiting_block.5:
4127; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
4128; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
4129; PROLOG:       latch.5:
4130; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
4131; PROLOG-NEXT:    %load.5 = load i32, i32* %arrayidx.5, align 4
4132; PROLOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.4
4133; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
4134; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
4135; PROLOG:       for.exiting_block.6:
4136; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
4137; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
4138; PROLOG:       latch.6:
4139; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
4140; PROLOG-NEXT:    %load.6 = load i32, i32* %arrayidx.6, align 4
4141; PROLOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.5
4142; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
4143; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
4144; PROLOG:       for.exiting_block.7:
4145; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
4146; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
4147; PROLOG:       latch.7:
4148; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
4149; PROLOG-NEXT:    %load.7 = load i32, i32* %arrayidx.7, align 4
4150; PROLOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.6
4151; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
4152; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
4153; PROLOG-NEXT:    br i1 %exitcond.7, label %latch_exit.unr-lcssa, label %header
4154; PROLOG:       latch_exit.unr-lcssa:
4155; PROLOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %latch.7 ]
4156; PROLOG-NEXT:    br label %latch_exit
4157; PROLOG:       latch_exit:
4158; PROLOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]
4159; PROLOG-NEXT:    ret i32 %sum.0.lcssa
4160; PROLOG:       for.exit2.loopexit:
4161; 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 ]
4162; PROLOG-NEXT:    br label %for.exit2
4163; PROLOG:       for.exit2.loopexit1:
4164; PROLOG-NEXT:    %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
4165; PROLOG-NEXT:    br label %for.exit2
4166; PROLOG:       for.exit2:
4167; PROLOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
4168; PROLOG-NEXT:    %addx = add i32 %retval, %x
4169; PROLOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false
4170; PROLOG:       exit_true:
4171; PROLOG-NEXT:    ret i32 %retval
4172; PROLOG:       exit_false:
4173; PROLOG-NEXT:    ret i32 %addx
4174;
4175; PROLOG-BLOCK-LABEL: @test6(
4176; PROLOG-BLOCK-NEXT:  entry:
4177; PROLOG-BLOCK-NEXT:    %0 = add i64 %n, -1
4178; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
4179; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4180; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4181; PROLOG-BLOCK:       header.prol.preheader:
4182; PROLOG-BLOCK-NEXT:    br label %header.prol
4183; PROLOG-BLOCK:       header.prol:
4184; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.prol
4185; PROLOG-BLOCK:       for.exiting_block.prol:
4186; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
4187; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %latch.prol
4188; PROLOG-BLOCK:       latch.prol:
4189; PROLOG-BLOCK-NEXT:    %load.prol = load i32, i32* %a, align 4
4190; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
4191; PROLOG-BLOCK:       header.prol.loopexit:
4192; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %load.prol, %latch.prol ]
4193; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
4194; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %load.prol, %latch.prol ]
4195; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
4196; PROLOG-BLOCK-NEXT:    br i1 %1, label %latch_exit, label %entry.new
4197; PROLOG-BLOCK:       entry.new:
4198; PROLOG-BLOCK-NEXT:    br label %header
4199; PROLOG-BLOCK:       header:
4200; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
4201; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
4202; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
4203; PROLOG-BLOCK:       for.exiting_block:
4204; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
4205; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
4206; PROLOG-BLOCK:       latch:
4207; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
4208; PROLOG-BLOCK-NEXT:    %load = load i32, i32* %arrayidx, align 4
4209; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %load, %sum.02
4210; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
4211; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
4212; PROLOG-BLOCK:       for.exiting_block.1:
4213; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
4214; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
4215; PROLOG-BLOCK:       latch.1:
4216; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
4217; PROLOG-BLOCK-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
4218; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add
4219; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
4220; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
4221; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latch_exit.unr-lcssa, label %header, !llvm.loop !10
4222; PROLOG-BLOCK:       latch_exit.unr-lcssa:
4223; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %latch.1 ]
4224; PROLOG-BLOCK-NEXT:    br label %latch_exit
4225; PROLOG-BLOCK:       latch_exit:
4226; PROLOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]
4227; PROLOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
4228; PROLOG-BLOCK:       for.exit2.loopexit:
4229; PROLOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]
4230; PROLOG-BLOCK-NEXT:    br label %for.exit2
4231; PROLOG-BLOCK:       for.exit2:
4232; PROLOG-BLOCK-NEXT:    %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ]
4233; PROLOG-BLOCK-NEXT:    %addx = add i32 %retval, %x
4234; PROLOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false
4235; PROLOG-BLOCK:       exit_true:
4236; PROLOG-BLOCK-NEXT:    ret i32 %retval
4237; PROLOG-BLOCK:       exit_false:
4238; PROLOG-BLOCK-NEXT:    ret i32 %addx
4239;
4240
4241entry:
4242  br label %header
4243
4244header:
4245  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
4246  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
4247  br i1 false, label %for.exit2, label %for.exiting_block
4248
4249for.exiting_block:
4250  %cmp = icmp eq i64 %n, 42
4251  br i1 %cmp, label %for.exit2, label %latch
4252
4253latch:
4254  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
4255  %load = load i32, i32* %arrayidx, align 4
4256  %add = add nsw i32 %load, %sum.02
4257  %indvars.iv.next = add i64 %indvars.iv, 1
4258  %exitcond = icmp eq i64 %indvars.iv.next, %n
4259  br i1 %exitcond, label %latch_exit, label %header
4260
4261latch_exit:
4262  %sum.0.lcssa = phi i32 [ %add, %latch ]
4263  ret i32 %sum.0.lcssa
4264
4265for.exit2:
4266  %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ]
4267  %addx = add i32 %retval, %x
4268  br i1 %cond, label %exit_true, label %exit_false
4269
4270exit_true:
4271  ret i32 %retval
4272
4273exit_false:
4274  ret i32 %addx
4275}
4276
4277; test when value in exit block does not have VMap.
4278define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) {
4279; EPILOG-LABEL: @test7(
4280; EPILOG-NEXT:  bb:
4281; EPILOG-NEXT:    %i = icmp slt i32 undef, 2
4282; EPILOG-NEXT:    %sext = sext i32 undef to i64
4283; EPILOG-NEXT:    %shft = ashr exact i32 %arg, 16
4284; EPILOG-NEXT:    br i1 %i, label %loopexit2, label %preheader
4285; EPILOG:       preheader:
4286; EPILOG-NEXT:    %0 = add nsw i64 %sext, -1
4287; EPILOG-NEXT:    %1 = add nsw i64 %sext, -2
4288; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
4289; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
4290; EPILOG-NEXT:    br i1 %2, label %latchexit.unr-lcssa, label %preheader.new
4291; EPILOG:       preheader.new:
4292; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
4293; EPILOG-NEXT:    br label %header
4294; EPILOG:       header:
4295; EPILOG-NEXT:    %i6 = phi i64 [ 1, %preheader.new ], [ %add.7, %latch.7 ]
4296; EPILOG-NEXT:    %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ]
4297; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4298; EPILOG:       latch:
4299; EPILOG-NEXT:    %add = add nuw nsw i64 %i6, 1
4300; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
4301; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4302; EPILOG:       latch.1:
4303; EPILOG-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4304; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
4305; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.2
4306; EPILOG:       latch.2:
4307; EPILOG-NEXT:    %add.2 = add nuw nsw i64 %add.1, 1
4308; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
4309; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.3
4310; EPILOG:       latch.3:
4311; EPILOG-NEXT:    %add.3 = add nuw nsw i64 %add.2, 1
4312; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
4313; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.4
4314; EPILOG:       latch.4:
4315; EPILOG-NEXT:    %add.4 = add nuw nsw i64 %add.3, 1
4316; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
4317; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.5
4318; EPILOG:       latch.5:
4319; EPILOG-NEXT:    %add.5 = add nuw nsw i64 %add.4, 1
4320; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
4321; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.6
4322; EPILOG:       latch.6:
4323; EPILOG-NEXT:    %add.6 = add nuw nsw i64 %add.5, 1
4324; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
4325; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.7
4326; EPILOG:       latch.7:
4327; EPILOG-NEXT:    %add.7 = add nuw nsw i64 %add.6, 1
4328; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
4329; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
4330; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %latchexit.unr-lcssa.loopexit
4331; EPILOG:       latchexit.unr-lcssa.loopexit:
4332; EPILOG-NEXT:    %i6.unr.ph = phi i64 [ %add.7, %latch.7 ]
4333; EPILOG-NEXT:    br label %latchexit.unr-lcssa
4334; EPILOG:       latchexit.unr-lcssa:
4335; EPILOG-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ]
4336; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4337; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit
4338; EPILOG:       header.epil.preheader:
4339; EPILOG-NEXT:    br label %header.epil
4340; EPILOG:       header.epil:
4341; EPILOG-NEXT:    %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ], [ %add.epil, %latch.epil ]
4342; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
4343; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit1, label %latch.epil
4344; EPILOG:       latch.epil:
4345; EPILOG-NEXT:    %add.epil = add nuw nsw i64 %i6.epil, 1
4346; EPILOG-NEXT:    %i9.epil = icmp slt i64 %add.epil, %sext
4347; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
4348; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
4349; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchexit.epilog-lcssa, !llvm.loop !11
4350; EPILOG:       latchexit.epilog-lcssa:
4351; EPILOG-NEXT:    br label %latchexit
4352; EPILOG:       latchexit:
4353; EPILOG-NEXT:    unreachable
4354; EPILOG:       loopexit2:
4355; EPILOG-NEXT:    ret i32 %shft
4356; EPILOG:       loopexit1.loopexit:
4357; 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 ]
4358; EPILOG-NEXT:    br label %loopexit1
4359; EPILOG:       loopexit1.loopexit1:
4360; EPILOG-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.epil ]
4361; EPILOG-NEXT:    br label %loopexit1
4362; EPILOG:       loopexit1:
4363; EPILOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
4364; EPILOG-NEXT:    ret i32 %sext3
4365;
4366; EPILOG-BLOCK-LABEL: @test7(
4367; EPILOG-BLOCK-NEXT:  bb:
4368; EPILOG-BLOCK-NEXT:    %i = icmp slt i32 undef, 2
4369; EPILOG-BLOCK-NEXT:    %sext = sext i32 undef to i64
4370; EPILOG-BLOCK-NEXT:    %shft = ashr exact i32 %arg, 16
4371; EPILOG-BLOCK-NEXT:    br i1 %i, label %loopexit2, label %preheader
4372; EPILOG-BLOCK:       preheader:
4373; EPILOG-BLOCK-NEXT:    %0 = add nsw i64 %sext, -1
4374; EPILOG-BLOCK-NEXT:    %1 = add nsw i64 %sext, -2
4375; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4376; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4377; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchexit.unr-lcssa, label %preheader.new
4378; EPILOG-BLOCK:       preheader.new:
4379; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
4380; EPILOG-BLOCK-NEXT:    br label %header
4381; EPILOG-BLOCK:       header:
4382; EPILOG-BLOCK-NEXT:    %i6 = phi i64 [ 1, %preheader.new ], [ %add.1, %latch.1 ]
4383; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ]
4384; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4385; EPILOG-BLOCK:       latch:
4386; EPILOG-BLOCK-NEXT:    %add = add nuw nsw i64 %i6, 1
4387; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
4388; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4389; EPILOG-BLOCK:       latch.1:
4390; EPILOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4391; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
4392; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
4393; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !11
4394; EPILOG-BLOCK:       latchexit.unr-lcssa.loopexit:
4395; EPILOG-BLOCK-NEXT:    br label %latchexit.unr-lcssa
4396; EPILOG-BLOCK:       latchexit.unr-lcssa:
4397; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4398; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit
4399; EPILOG-BLOCK:       header.epil.preheader:
4400; EPILOG-BLOCK-NEXT:    br label %header.epil
4401; EPILOG-BLOCK:       header.epil:
4402; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1, label %latch.epil
4403; EPILOG-BLOCK:       latch.epil:
4404; EPILOG-BLOCK-NEXT:    br label %latchexit
4405; EPILOG-BLOCK:       latchexit:
4406; EPILOG-BLOCK-NEXT:    unreachable
4407; EPILOG-BLOCK:       loopexit2:
4408; EPILOG-BLOCK-NEXT:    ret i32 %shft
4409; EPILOG-BLOCK:       loopexit1.loopexit:
4410; EPILOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]
4411; EPILOG-BLOCK-NEXT:    br label %loopexit1
4412; EPILOG-BLOCK:       loopexit1:
4413; EPILOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.epil ], [ %sext3.ph, %loopexit1.loopexit ]
4414; EPILOG-BLOCK-NEXT:    ret i32 %sext3
4415;
4416; PROLOG-LABEL: @test7(
4417; PROLOG-NEXT:  bb:
4418; PROLOG-NEXT:    %i = icmp slt i32 undef, 2
4419; PROLOG-NEXT:    %sext = sext i32 undef to i64
4420; PROLOG-NEXT:    %shft = ashr exact i32 %arg, 16
4421; PROLOG-NEXT:    br i1 %i, label %loopexit2, label %preheader
4422; PROLOG:       preheader:
4423; PROLOG-NEXT:    %0 = add nsw i64 %sext, -1
4424; PROLOG-NEXT:    %1 = add nsw i64 %sext, -2
4425; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
4426; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4427; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4428; PROLOG:       header.prol.preheader:
4429; PROLOG-NEXT:    br label %header.prol
4430; PROLOG:       header.prol:
4431; PROLOG-NEXT:    %i6.prol = phi i64 [ 1, %header.prol.preheader ], [ %add.prol, %latch.prol ]
4432; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
4433; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit1, label %latch.prol
4434; PROLOG:       latch.prol:
4435; PROLOG-NEXT:    %add.prol = add nuw nsw i64 %i6.prol, 1
4436; PROLOG-NEXT:    %i9.prol = icmp slt i64 %add.prol, %sext
4437; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
4438; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
4439; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !11
4440; PROLOG:       header.prol.loopexit.unr-lcssa:
4441; PROLOG-NEXT:    %i6.unr.ph = phi i64 [ %add.prol, %latch.prol ]
4442; PROLOG-NEXT:    br label %header.prol.loopexit
4443; PROLOG:       header.prol.loopexit:
4444; PROLOG-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %header.prol.loopexit.unr-lcssa ]
4445; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
4446; PROLOG-NEXT:    br i1 %2, label %latchexit, label %preheader.new
4447; PROLOG:       preheader.new:
4448; PROLOG-NEXT:    br label %header
4449; PROLOG:       header:
4450; PROLOG-NEXT:    %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.7, %latch.7 ]
4451; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4452; PROLOG:       latch:
4453; PROLOG-NEXT:    %add = add nuw nsw i64 %i6, 1
4454; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4455; PROLOG:       latch.1:
4456; PROLOG-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4457; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.2
4458; PROLOG:       latch.2:
4459; PROLOG-NEXT:    %add.2 = add nuw nsw i64 %add.1, 1
4460; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.3
4461; PROLOG:       latch.3:
4462; PROLOG-NEXT:    %add.3 = add nuw nsw i64 %add.2, 1
4463; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.4
4464; PROLOG:       latch.4:
4465; PROLOG-NEXT:    %add.4 = add nuw nsw i64 %add.3, 1
4466; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.5
4467; PROLOG:       latch.5:
4468; PROLOG-NEXT:    %add.5 = add nuw nsw i64 %add.4, 1
4469; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.6
4470; PROLOG:       latch.6:
4471; PROLOG-NEXT:    %add.6 = add nuw nsw i64 %add.5, 1
4472; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.7
4473; PROLOG:       latch.7:
4474; PROLOG-NEXT:    %add.7 = add nuw nsw i64 %add.6, 1
4475; PROLOG-NEXT:    %i9.7 = icmp slt i64 %add.7, %sext
4476; PROLOG-NEXT:    br i1 %i9.7, label %header, label %latchexit.unr-lcssa
4477; PROLOG:       latchexit.unr-lcssa:
4478; PROLOG-NEXT:    br label %latchexit
4479; PROLOG:       latchexit:
4480; PROLOG-NEXT:    unreachable
4481; PROLOG:       loopexit2:
4482; PROLOG-NEXT:    ret i32 %shft
4483; PROLOG:       loopexit1.loopexit:
4484; 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 ]
4485; PROLOG-NEXT:    br label %loopexit1
4486; PROLOG:       loopexit1.loopexit1:
4487; PROLOG-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.prol ]
4488; PROLOG-NEXT:    br label %loopexit1
4489; PROLOG:       loopexit1:
4490; PROLOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
4491; PROLOG-NEXT:    ret i32 %sext3
4492;
4493; PROLOG-BLOCK-LABEL: @test7(
4494; PROLOG-BLOCK-NEXT:  bb:
4495; PROLOG-BLOCK-NEXT:    %i = icmp slt i32 undef, 2
4496; PROLOG-BLOCK-NEXT:    %sext = sext i32 undef to i64
4497; PROLOG-BLOCK-NEXT:    %shft = ashr exact i32 %arg, 16
4498; PROLOG-BLOCK-NEXT:    br i1 %i, label %loopexit2, label %preheader
4499; PROLOG-BLOCK:       preheader:
4500; PROLOG-BLOCK-NEXT:    %0 = add nsw i64 %sext, -1
4501; PROLOG-BLOCK-NEXT:    %1 = add nsw i64 %sext, -2
4502; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4503; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4504; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4505; PROLOG-BLOCK:       header.prol.preheader:
4506; PROLOG-BLOCK-NEXT:    br label %header.prol
4507; PROLOG-BLOCK:       header.prol:
4508; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1, label %latch.prol
4509; PROLOG-BLOCK:       latch.prol:
4510; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
4511; PROLOG-BLOCK:       header.prol.loopexit:
4512; PROLOG-BLOCK-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ 2, %latch.prol ]
4513; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4514; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchexit, label %preheader.new
4515; PROLOG-BLOCK:       preheader.new:
4516; PROLOG-BLOCK-NEXT:    br label %header
4517; PROLOG-BLOCK:       header:
4518; PROLOG-BLOCK-NEXT:    %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.1, %latch.1 ]
4519; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4520; PROLOG-BLOCK:       latch:
4521; PROLOG-BLOCK-NEXT:    %add = add nuw nsw i64 %i6, 1
4522; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4523; PROLOG-BLOCK:       latch.1:
4524; PROLOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4525; PROLOG-BLOCK-NEXT:    %i9.1 = icmp slt i64 %add.1, %sext
4526; PROLOG-BLOCK-NEXT:    br i1 %i9.1, label %header, label %latchexit.unr-lcssa, !llvm.loop !11
4527; PROLOG-BLOCK:       latchexit.unr-lcssa:
4528; PROLOG-BLOCK-NEXT:    br label %latchexit
4529; PROLOG-BLOCK:       latchexit:
4530; PROLOG-BLOCK-NEXT:    unreachable
4531; PROLOG-BLOCK:       loopexit2:
4532; PROLOG-BLOCK-NEXT:    ret i32 %shft
4533; PROLOG-BLOCK:       loopexit1.loopexit:
4534; PROLOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]
4535; PROLOG-BLOCK-NEXT:    br label %loopexit1
4536; PROLOG-BLOCK:       loopexit1:
4537; PROLOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.prol ], [ %sext3.ph, %loopexit1.loopexit ]
4538; PROLOG-BLOCK-NEXT:    ret i32 %sext3
4539;
4540bb:
4541  %i = icmp slt i32 undef, 2
4542  %sext = sext i32 undef to i64
4543  %shft = ashr exact i32 %arg, 16
4544  br i1 %i, label %loopexit2, label %preheader
4545
4546preheader:                                              ; preds = %bb2
4547  br label %header
4548
4549header:                                              ; preds = %latch, %preheader
4550  %i6 = phi i64 [ 1, %preheader ], [ %add, %latch ]
4551  br i1 false, label %loopexit1, label %latch
4552
4553latch:                                              ; preds = %header
4554  %add = add nuw nsw i64 %i6, 1
4555  %i9 = icmp slt i64 %add, %sext
4556  br i1 %i9, label %header, label %latchexit
4557
4558latchexit:                                             ; preds = %latch
4559  unreachable
4560
4561loopexit2:                                             ; preds = %bb2
4562  ret i32 %shft
4563
4564loopexit1:                                             ; preds = %header
4565  %sext3 = phi i32 [ %shft, %header ]
4566  ret i32 %sext3
4567}
4568
4569; Nested loop and inner loop is unrolled.  The tricky bit here is that
4570; several blocks in the inner loop fall out of the outer block when we
4571; use the epilogue block remainder strategy.
4572define void @test8() {
4573; EPILOG-LABEL: @test8(
4574; EPILOG-NEXT:  bb:
4575; EPILOG-NEXT:    br label %outerloop
4576; EPILOG:       outerloop.loopexit.loopexit:
4577; EPILOG-NEXT:    br label %outerloop.loopexit
4578; EPILOG:       outerloop.loopexit.loopexit1:
4579; EPILOG-NEXT:    br label %outerloop.loopexit
4580; EPILOG:       outerloop.loopexit:
4581; EPILOG-NEXT:    br label %outerloop
4582; EPILOG:       outerloop:
4583; EPILOG-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]
4584; EPILOG-NEXT:    %0 = sub i64 100, %i
4585; EPILOG-NEXT:    %1 = sub i64 99, %i
4586; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
4587; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
4588; EPILOG-NEXT:    br i1 %2, label %exit.unr-lcssa, label %outerloop.new
4589; EPILOG:       outerloop.new:
4590; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
4591; EPILOG-NEXT:    br label %innerH
4592; EPILOG:       innerH:
4593; EPILOG-NEXT:    %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.7, %latch.7 ]
4594; EPILOG-NEXT:    %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.7, %latch.7 ]
4595; EPILOG-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4596; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4597; EPILOG:       latch:
4598; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
4599; EPILOG-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
4600; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4601; EPILOG:       latch.1:
4602; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
4603; EPILOG-NEXT:    %i4.2 = add nuw nsw i64 %i4.1, 1
4604; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.2
4605; EPILOG:       latch.2:
4606; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
4607; EPILOG-NEXT:    %i4.3 = add nuw nsw i64 %i4.2, 1
4608; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.3
4609; EPILOG:       latch.3:
4610; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
4611; EPILOG-NEXT:    %i4.4 = add nuw nsw i64 %i4.3, 1
4612; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.4
4613; EPILOG:       latch.4:
4614; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
4615; EPILOG-NEXT:    %i4.5 = add nuw nsw i64 %i4.4, 1
4616; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.5
4617; EPILOG:       latch.5:
4618; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
4619; EPILOG-NEXT:    %i4.6 = add nuw nsw i64 %i4.5, 1
4620; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.6
4621; EPILOG:       latch.6:
4622; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
4623; EPILOG-NEXT:    %i4.7 = add nuw nsw i64 %i4.6, 1
4624; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.7
4625; EPILOG:       latch.7:
4626; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
4627; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
4628; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %innerH, label %exit.unr-lcssa.loopexit
4629; EPILOG:       exit.unr-lcssa.loopexit:
4630; EPILOG-NEXT:    %i3.unr.ph = phi i64 [ %i4.7, %latch.7 ]
4631; EPILOG-NEXT:    br label %exit.unr-lcssa
4632; EPILOG:       exit.unr-lcssa:
4633; EPILOG-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %exit.unr-lcssa.loopexit ]
4634; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4635; EPILOG-NEXT:    br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit
4636; EPILOG:       innerH.epil.preheader:
4637; EPILOG-NEXT:    br label %innerH.epil
4638; EPILOG:       innerH.epil:
4639; EPILOG-NEXT:    %i3.epil = phi i64 [ %i4.epil, %latch.epil ], [ %i3.unr, %innerH.epil.preheader ]
4640; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %innerH.epil.preheader ], [ %epil.iter.next, %latch.epil ]
4641; EPILOG-NEXT:    %i4.epil = add nuw nsw i64 %i3.epil, 1
4642; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit1, label %latch.epil
4643; EPILOG:       latch.epil:
4644; EPILOG-NEXT:    %i6.epil = icmp ult i64 %i4.epil, 100
4645; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
4646; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
4647; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %innerH.epil, label %exit.epilog-lcssa, !llvm.loop !12
4648; EPILOG:       exit.epilog-lcssa:
4649; EPILOG-NEXT:    br label %exit
4650; EPILOG:       exit.loopexit:
4651; EPILOG-NEXT:    br label %exit
4652; EPILOG:       exit:
4653; EPILOG-NEXT:    ret void
4654;
4655; EPILOG-BLOCK-LABEL: @test8(
4656; EPILOG-BLOCK-NEXT:  bb:
4657; EPILOG-BLOCK-NEXT:    br label %outerloop
4658; EPILOG-BLOCK:       outerloop.loopexit.loopexit:
4659; EPILOG-BLOCK-NEXT:    br label %outerloop.loopexit
4660; EPILOG-BLOCK:       outerloop.loopexit:
4661; EPILOG-BLOCK-NEXT:    br i1 false, label %exit.unr-lcssa.1, label %outerloop.new.1
4662; EPILOG-BLOCK:       outerloop.new.1:
4663; EPILOG-BLOCK-NEXT:    br label %innerH.1
4664; EPILOG-BLOCK:       innerH.1:
4665; EPILOG-BLOCK-NEXT:    %i3.1 = phi i64 [ 0, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ]
4666; EPILOG-BLOCK-NEXT:    %niter.1 = phi i64 [ 0, %outerloop.new.1 ], [ %niter.next.1.1, %latch.1.1 ]
4667; EPILOG-BLOCK-NEXT:    %i4.12 = add nuw nsw i64 %i3.1, 1
4668; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.14
4669; EPILOG-BLOCK:       latch.14:
4670; EPILOG-BLOCK-NEXT:    %niter.next.13 = add nuw nsw i64 %niter.1, 1
4671; EPILOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i4.12, 1
4672; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1
4673; EPILOG-BLOCK:       latch.1.1:
4674; EPILOG-BLOCK-NEXT:    %niter.next.1.1 = add i64 %niter.next.13, 1
4675; EPILOG-BLOCK-NEXT:    %niter.ncmp.1.1 = icmp ne i64 %niter.next.1.1, 100
4676; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit.1, !llvm.loop !12
4677; EPILOG-BLOCK:       exit.unr-lcssa.loopexit.1:
4678; EPILOG-BLOCK-NEXT:    br label %exit.unr-lcssa.1
4679; EPILOG-BLOCK:       outerloop.loopexit.loopexit.1:
4680; EPILOG-BLOCK-NEXT:    br label %outerloop.loopexit.1
4681; EPILOG-BLOCK:       exit.unr-lcssa.1:
4682; EPILOG-BLOCK-NEXT:    br i1 false, label %innerH.epil.preheader.1, label %exit.loopexit
4683; EPILOG-BLOCK:       innerH.epil.preheader.1:
4684; EPILOG-BLOCK-NEXT:    br label %innerH.epil.1
4685; EPILOG-BLOCK:       innerH.epil.1:
4686; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.epil
4687; EPILOG-BLOCK:       outerloop.loopexit.1:
4688; EPILOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !13
4689; EPILOG-BLOCK:       outerloop:
4690; EPILOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]
4691; EPILOG-BLOCK-NEXT:    %0 = sub i64 100, %i
4692; EPILOG-BLOCK-NEXT:    %1 = sub i64 99, %i
4693; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4694; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4695; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit.unr-lcssa, label %outerloop.new
4696; EPILOG-BLOCK:       outerloop.new:
4697; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
4698; EPILOG-BLOCK-NEXT:    br label %innerH
4699; EPILOG-BLOCK:       innerH:
4700; EPILOG-BLOCK-NEXT:    %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.1, %latch.1 ]
4701; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.1, %latch.1 ]
4702; EPILOG-BLOCK-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4703; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4704; EPILOG-BLOCK:       latch:
4705; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
4706; EPILOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
4707; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4708; EPILOG-BLOCK:       latch.1:
4709; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
4710; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
4711; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !12
4712; EPILOG-BLOCK:       exit.unr-lcssa.loopexit:
4713; EPILOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4714; EPILOG-BLOCK:       exit.unr-lcssa:
4715; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4716; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit
4717; EPILOG-BLOCK:       innerH.epil.preheader:
4718; EPILOG-BLOCK-NEXT:    br label %innerH.epil
4719; EPILOG-BLOCK:       innerH.epil:
4720; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.epil
4721; EPILOG-BLOCK:       latch.epil:
4722; EPILOG-BLOCK-NEXT:    br label %exit
4723; EPILOG-BLOCK:       exit.loopexit:
4724; EPILOG-BLOCK-NEXT:    br label %exit
4725; EPILOG-BLOCK:       exit:
4726; EPILOG-BLOCK-NEXT:    ret void
4727;
4728; PROLOG-LABEL: @test8(
4729; PROLOG-NEXT:  bb:
4730; PROLOG-NEXT:    br label %outerloop
4731; PROLOG:       outerloop.loopexit.loopexit:
4732; PROLOG-NEXT:    br label %outerloop.loopexit
4733; PROLOG:       outerloop.loopexit.loopexit1:
4734; PROLOG-NEXT:    br label %outerloop.loopexit
4735; PROLOG:       outerloop.loopexit:
4736; PROLOG-NEXT:    br label %outerloop
4737; PROLOG:       outerloop:
4738; PROLOG-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]
4739; PROLOG-NEXT:    %0 = sub i64 100, %i
4740; PROLOG-NEXT:    %1 = sub i64 99, %i
4741; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
4742; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4743; PROLOG-NEXT:    br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit
4744; PROLOG:       innerH.prol.preheader:
4745; PROLOG-NEXT:    br label %innerH.prol
4746; PROLOG:       innerH.prol:
4747; PROLOG-NEXT:    %i3.prol = phi i64 [ %i4.prol, %latch.prol ], [ %i, %innerH.prol.preheader ]
4748; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %innerH.prol.preheader ], [ %prol.iter.next, %latch.prol ]
4749; PROLOG-NEXT:    %i4.prol = add nuw nsw i64 %i3.prol, 1
4750; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit1, label %latch.prol
4751; PROLOG:       latch.prol:
4752; PROLOG-NEXT:    %i6.prol = icmp ult i64 %i4.prol, 100
4753; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
4754; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
4755; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %innerH.prol, label %innerH.prol.loopexit.unr-lcssa, !llvm.loop !12
4756; PROLOG:       innerH.prol.loopexit.unr-lcssa:
4757; PROLOG-NEXT:    %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ]
4758; PROLOG-NEXT:    br label %innerH.prol.loopexit
4759; PROLOG:       innerH.prol.loopexit:
4760; PROLOG-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %innerH.prol.loopexit.unr-lcssa ]
4761; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
4762; PROLOG-NEXT:    br i1 %2, label %exit.loopexit, label %outerloop.new
4763; PROLOG:       outerloop.new:
4764; PROLOG-NEXT:    br label %innerH
4765; PROLOG:       innerH:
4766; PROLOG-NEXT:    %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.7, %latch.7 ]
4767; PROLOG-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4768; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4769; PROLOG:       latch:
4770; PROLOG-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
4771; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4772; PROLOG:       latch.1:
4773; PROLOG-NEXT:    %i4.2 = add nuw nsw i64 %i4.1, 1
4774; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.2
4775; PROLOG:       latch.2:
4776; PROLOG-NEXT:    %i4.3 = add nuw nsw i64 %i4.2, 1
4777; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.3
4778; PROLOG:       latch.3:
4779; PROLOG-NEXT:    %i4.4 = add nuw nsw i64 %i4.3, 1
4780; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.4
4781; PROLOG:       latch.4:
4782; PROLOG-NEXT:    %i4.5 = add nuw nsw i64 %i4.4, 1
4783; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.5
4784; PROLOG:       latch.5:
4785; PROLOG-NEXT:    %i4.6 = add nuw nsw i64 %i4.5, 1
4786; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.6
4787; PROLOG:       latch.6:
4788; PROLOG-NEXT:    %i4.7 = add nuw nsw i64 %i4.6, 1
4789; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.7
4790; PROLOG:       latch.7:
4791; PROLOG-NEXT:    %i6.7 = icmp ult i64 %i4.7, 100
4792; PROLOG-NEXT:    br i1 %i6.7, label %innerH, label %exit.unr-lcssa
4793; PROLOG:       exit.unr-lcssa:
4794; PROLOG-NEXT:    br label %exit
4795; PROLOG:       exit.loopexit:
4796; PROLOG-NEXT:    br label %exit
4797; PROLOG:       exit:
4798; PROLOG-NEXT:    ret void
4799;
4800; PROLOG-BLOCK-LABEL: @test8(
4801; PROLOG-BLOCK-NEXT:  bb:
4802; PROLOG-BLOCK-NEXT:    br label %outerloop
4803; PROLOG-BLOCK:       outerloop.loopexit.loopexit:
4804; PROLOG-BLOCK-NEXT:    br label %outerloop.loopexit
4805; PROLOG-BLOCK:       outerloop.loopexit:
4806; PROLOG-BLOCK-NEXT:    br i1 false, label %innerH.prol.preheader.1, label %innerH.prol.loopexit.1
4807; PROLOG-BLOCK:       innerH.prol.preheader.1:
4808; PROLOG-BLOCK-NEXT:    br label %innerH.prol.1
4809; PROLOG-BLOCK:       innerH.prol.1:
4810; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.prol.1
4811; PROLOG-BLOCK:       latch.prol.1:
4812; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit.1
4813; PROLOG-BLOCK:       innerH.prol.loopexit.1:
4814; PROLOG-BLOCK-NEXT:    %i3.unr.1 = phi i64 [ 0, %outerloop.loopexit ], [ 1, %latch.prol.1 ]
4815; PROLOG-BLOCK-NEXT:    br i1 false, label %exit.loopexit, label %outerloop.new.1
4816; PROLOG-BLOCK:       outerloop.new.1:
4817; PROLOG-BLOCK-NEXT:    br label %innerH.1
4818; PROLOG-BLOCK:       innerH.1:
4819; PROLOG-BLOCK-NEXT:    %i3.1 = phi i64 [ %i3.unr.1, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ]
4820; PROLOG-BLOCK-NEXT:    %i4.11 = add nuw nsw i64 %i3.1, 1
4821; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.12
4822; PROLOG-BLOCK:       latch.12:
4823; PROLOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i4.11, 1
4824; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1
4825; PROLOG-BLOCK:       latch.1.1:
4826; PROLOG-BLOCK-NEXT:    %i6.1.1 = icmp ult i64 %i4.1.1, 100
4827; PROLOG-BLOCK-NEXT:    br i1 %i6.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit3, !llvm.loop !12
4828; PROLOG-BLOCK:       outerloop.loopexit.loopexit.1:
4829; PROLOG-BLOCK-NEXT:    br label %outerloop.loopexit.1
4830; PROLOG-BLOCK:       outerloop.loopexit.1:
4831; PROLOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !13
4832; PROLOG-BLOCK:       outerloop:
4833; PROLOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]
4834; PROLOG-BLOCK-NEXT:    %0 = sub i64 100, %i
4835; PROLOG-BLOCK-NEXT:    %1 = sub i64 99, %i
4836; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4837; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4838; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit
4839; PROLOG-BLOCK:       innerH.prol.preheader:
4840; PROLOG-BLOCK-NEXT:    br label %innerH.prol
4841; PROLOG-BLOCK:       innerH.prol:
4842; PROLOG-BLOCK-NEXT:    %i4.prol = add nuw nsw i64 %i, 1
4843; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.prol
4844; PROLOG-BLOCK:       latch.prol:
4845; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit
4846; PROLOG-BLOCK:       innerH.prol.loopexit:
4847; PROLOG-BLOCK-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i4.prol, %latch.prol ]
4848; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4849; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit.loopexit, label %outerloop.new
4850; PROLOG-BLOCK:       outerloop.new:
4851; PROLOG-BLOCK-NEXT:    br label %innerH
4852; PROLOG-BLOCK:       innerH:
4853; PROLOG-BLOCK-NEXT:    %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.1, %latch.1 ]
4854; PROLOG-BLOCK-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4855; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4856; PROLOG-BLOCK:       latch:
4857; PROLOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
4858; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4859; PROLOG-BLOCK:       latch.1:
4860; PROLOG-BLOCK-NEXT:    %i6.1 = icmp ult i64 %i4.1, 100
4861; PROLOG-BLOCK-NEXT:    br i1 %i6.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !12
4862; PROLOG-BLOCK:       exit.unr-lcssa.loopexit:
4863; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4864; PROLOG-BLOCK:       exit.unr-lcssa.loopexit3:
4865; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4866; PROLOG-BLOCK:       exit.unr-lcssa:
4867; PROLOG-BLOCK-NEXT:    br label %exit
4868; PROLOG-BLOCK:       exit.loopexit:
4869; PROLOG-BLOCK-NEXT:    br label %exit
4870; PROLOG-BLOCK:       exit:
4871; PROLOG-BLOCK-NEXT:    ret void
4872;
4873
4874bb:
4875  br label %outerloop
4876
4877outerloop:                                              ; preds = %innerH, %bb
4878  %i = phi i64 [ 3, %bb ], [ 0, %innerH ]
4879  br label %innerH
4880
4881innerH:                                              ; preds = %latch, %outerloop
4882  %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ]
4883  %i4 = add nuw nsw i64 %i3, 1
4884  br i1 false, label %outerloop, label %latch
4885
4886latch:                                              ; preds = %innerH
4887  %i6 = icmp ult i64 %i4, 100
4888  br i1 %i6, label %innerH, label %exit
4889
4890exit:                                              ; preds = %latch
4891  ret void
4892}
4893
4894declare i8 addrspace(1)* @foo(i32)
4895; inner loop prolog unrolled
4896; a value from outer loop is used in exit block of inner loop.
4897; Don't create VMap entries for such values (%trip).
4898define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) {
4899; EPILOG-LABEL: @test9(
4900; EPILOG-NEXT:  bb:
4901; EPILOG-NEXT:    %0 = add i32 %n, -1
4902; EPILOG-NEXT:    %1 = add i32 %n, -2
4903; EPILOG-NEXT:    br label %outerloopHdr
4904; EPILOG:       outerloopHdr:
4905; EPILOG-NEXT:    %trip = add i32 %n, -1
4906; EPILOG-NEXT:    %outercnd = icmp slt i32 0, %trip
4907; EPILOG-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
4908; EPILOG:       preheader:
4909; EPILOG-NEXT:    %i4 = zext i32 0 to i64
4910; EPILOG-NEXT:    %xtraiter = and i32 %0, 7
4911; EPILOG-NEXT:    %2 = icmp ult i32 %1, 7
4912; EPILOG-NEXT:    br i1 %2, label %outerLatch.loopexit.unr-lcssa, label %preheader.new
4913; EPILOG:       preheader.new:
4914; EPILOG-NEXT:    %unroll_iter = sub i32 %0, %xtraiter
4915; EPILOG-NEXT:    br label %header
4916; EPILOG:       header:
4917; EPILOG-NEXT:    %phi = phi i64 [ %i4, %preheader.new ], [ %iv.next.7, %latch.7 ]
4918; EPILOG-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ]
4919; EPILOG-NEXT:    br i1 true, label %latch, label %innerexit.loopexit
4920; EPILOG:       innerexit.loopexit:
4921; 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 ]
4922; EPILOG-NEXT:    br label %innerexit
4923; EPILOG:       innerexit.loopexit1:
4924; EPILOG-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.epil ]
4925; EPILOG-NEXT:    br label %innerexit
4926; EPILOG:       innerexit:
4927; EPILOG-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
4928; EPILOG-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
4929; EPILOG-NEXT:    ret i8 addrspace(1)* %i9
4930; EPILOG:       latch:
4931; EPILOG-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
4932; EPILOG-NEXT:    %niter.next = add nuw nsw i32 %niter, 1
4933; EPILOG-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit
4934; EPILOG:       latch.1:
4935; EPILOG-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
4936; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i32 %niter.next, 1
4937; EPILOG-NEXT:    br i1 true, label %latch.2, label %innerexit.loopexit
4938; EPILOG:       latch.2:
4939; EPILOG-NEXT:    %iv.next.2 = add nuw nsw i64 %iv.next.1, 1
4940; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i32 %niter.next.1, 1
4941; EPILOG-NEXT:    br i1 true, label %latch.3, label %innerexit.loopexit
4942; EPILOG:       latch.3:
4943; EPILOG-NEXT:    %iv.next.3 = add nuw nsw i64 %iv.next.2, 1
4944; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i32 %niter.next.2, 1
4945; EPILOG-NEXT:    br i1 true, label %latch.4, label %innerexit.loopexit
4946; EPILOG:       latch.4:
4947; EPILOG-NEXT:    %iv.next.4 = add nuw nsw i64 %iv.next.3, 1
4948; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i32 %niter.next.3, 1
4949; EPILOG-NEXT:    br i1 true, label %latch.5, label %innerexit.loopexit
4950; EPILOG:       latch.5:
4951; EPILOG-NEXT:    %iv.next.5 = add nuw nsw i64 %iv.next.4, 1
4952; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i32 %niter.next.4, 1
4953; EPILOG-NEXT:    br i1 true, label %latch.6, label %innerexit.loopexit
4954; EPILOG:       latch.6:
4955; EPILOG-NEXT:    %iv.next.6 = add nuw nsw i64 %iv.next.5, 1
4956; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i32 %niter.next.5, 1
4957; EPILOG-NEXT:    br i1 true, label %latch.7, label %innerexit.loopexit
4958; EPILOG:       latch.7:
4959; EPILOG-NEXT:    %iv.next.7 = add nuw nsw i64 %iv.next.6, 1
4960; EPILOG-NEXT:    %niter.next.7 = add i32 %niter.next.6, 1
4961; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i32 %niter.next.7, %unroll_iter
4962; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit
4963; EPILOG:       outerLatch.loopexit.unr-lcssa.loopexit:
4964; EPILOG-NEXT:    %phi.unr.ph = phi i64 [ %iv.next.7, %latch.7 ]
4965; EPILOG-NEXT:    br label %outerLatch.loopexit.unr-lcssa
4966; EPILOG:       outerLatch.loopexit.unr-lcssa:
4967; EPILOG-NEXT:    %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %outerLatch.loopexit.unr-lcssa.loopexit ]
4968; EPILOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
4969; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit
4970; EPILOG:       header.epil.preheader:
4971; EPILOG-NEXT:    br label %header.epil
4972; EPILOG:       header.epil:
4973; EPILOG-NEXT:    %phi.epil = phi i64 [ %phi.unr, %header.epil.preheader ], [ %iv.next.epil, %latch.epil ]
4974; EPILOG-NEXT:    %epil.iter = phi i32 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
4975; EPILOG-NEXT:    %i7.epil = trunc i64 %phi.epil to i32
4976; EPILOG-NEXT:    br i1 true, label %latch.epil, label %innerexit.loopexit1
4977; EPILOG:       latch.epil:
4978; EPILOG-NEXT:    %i11.epil = add nsw i32 %i7.epil, 1
4979; EPILOG-NEXT:    %innercnd.epil = icmp slt i32 %i11.epil, %trip
4980; EPILOG-NEXT:    %iv.next.epil = add nuw nsw i64 %phi.epil, 1
4981; EPILOG-NEXT:    %epil.iter.next = add i32 %epil.iter, 1
4982; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i32 %epil.iter.next, %xtraiter
4983; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %outerLatch.loopexit.epilog-lcssa, !llvm.loop !13
4984; EPILOG:       outerLatch.loopexit.epilog-lcssa:
4985; EPILOG-NEXT:    br label %outerLatch.loopexit
4986; EPILOG:       outerLatch.loopexit:
4987; EPILOG-NEXT:    br label %outerLatch
4988; EPILOG:       outerLatch:
4989; EPILOG-NEXT:    br label %outerloopHdr
4990;
4991; EPILOG-BLOCK-LABEL: @test9(
4992; EPILOG-BLOCK-NEXT:  bb:
4993; EPILOG-BLOCK-NEXT:    %0 = add i32 %n, -1
4994; EPILOG-BLOCK-NEXT:    %1 = add i32 %n, -2
4995; EPILOG-BLOCK-NEXT:    br label %outerloopHdr
4996; EPILOG-BLOCK:       outerloopHdr:
4997; EPILOG-BLOCK-NEXT:    %trip = add i32 %n, -1
4998; EPILOG-BLOCK-NEXT:    %outercnd = icmp slt i32 0, %trip
4999; EPILOG-BLOCK-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
5000; EPILOG-BLOCK:       preheader:
5001; EPILOG-BLOCK-NEXT:    %xtraiter = and i32 %0, 1
5002; EPILOG-BLOCK-NEXT:    %2 = icmp ult i32 %1, 1
5003; EPILOG-BLOCK-NEXT:    br i1 %2, label %outerLatch.loopexit.unr-lcssa, label %preheader.new
5004; EPILOG-BLOCK:       preheader.new:
5005; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i32 %0, %xtraiter
5006; EPILOG-BLOCK-NEXT:    br label %header
5007; EPILOG-BLOCK:       header:
5008; EPILOG-BLOCK-NEXT:    %phi = phi i64 [ 0, %preheader.new ], [ %iv.next.1, %latch.1 ]
5009; EPILOG-BLOCK-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ]
5010; EPILOG-BLOCK-NEXT:    br i1 true, label %latch, label %innerexit.loopexit.loopexit
5011; EPILOG-BLOCK:       innerexit.loopexit.loopexit:
5012; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ]
5013; EPILOG-BLOCK-NEXT:    br label %innerexit.loopexit
5014; EPILOG-BLOCK:       innerexit.loopexit.loopexit6:
5015; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph.ph7 = phi i32 [ %trip.1, %latch.15 ], [ %trip.1, %header.1 ]
5016; EPILOG-BLOCK-NEXT:    br label %innerexit.loopexit
5017; EPILOG-BLOCK:       innerexit.loopexit:
5018; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph7, %innerexit.loopexit.loopexit6 ]
5019; EPILOG-BLOCK-NEXT:    br label %innerexit
5020; EPILOG-BLOCK:       innerexit.loopexit1:
5021; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.epil ], [ %trip.1, %header.epil.1 ]
5022; EPILOG-BLOCK-NEXT:    br label %innerexit
5023; EPILOG-BLOCK:       innerexit:
5024; EPILOG-BLOCK-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
5025; EPILOG-BLOCK-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
5026; EPILOG-BLOCK-NEXT:    ret i8 addrspace(1)* %i9
5027; EPILOG-BLOCK:       latch:
5028; EPILOG-BLOCK-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
5029; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i32 %niter, 1
5030; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit.loopexit
5031; EPILOG-BLOCK:       latch.1:
5032; EPILOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
5033; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i32 %niter.next, 1
5034; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i32 %niter.next.1, %unroll_iter
5035; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit, !llvm.loop !14
5036; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa.loopexit:
5037; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit.unr-lcssa
5038; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa:
5039; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
5040; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit
5041; EPILOG-BLOCK:       header.epil.preheader:
5042; EPILOG-BLOCK-NEXT:    br label %header.epil
5043; EPILOG-BLOCK:       header.epil:
5044; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.epil, label %innerexit.loopexit1
5045; EPILOG-BLOCK:       latch.epil:
5046; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit
5047; EPILOG-BLOCK:       outerLatch.loopexit:
5048; EPILOG-BLOCK-NEXT:    br label %outerLatch
5049; EPILOG-BLOCK:       outerLatch:
5050; EPILOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -1
5051; EPILOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.1
5052; EPILOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.1
5053; EPILOG-BLOCK:       preheader.1:
5054; EPILOG-BLOCK-NEXT:    %xtraiter.1 = and i32 %0, 1
5055; EPILOG-BLOCK-NEXT:    %3 = icmp ult i32 %1, 1
5056; EPILOG-BLOCK-NEXT:    br i1 %3, label %outerLatch.loopexit.unr-lcssa.1, label %preheader.new.1
5057; EPILOG-BLOCK:       preheader.new.1:
5058; EPILOG-BLOCK-NEXT:    %unroll_iter.1 = sub i32 %0, %xtraiter.1
5059; EPILOG-BLOCK-NEXT:    br label %header.1
5060; EPILOG-BLOCK:       header.1:
5061; EPILOG-BLOCK-NEXT:    %phi.1 = phi i64 [ 0, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ]
5062; EPILOG-BLOCK-NEXT:    %niter.1 = phi i32 [ 0, %preheader.new.1 ], [ %niter.next.1.1, %latch.1.1 ]
5063; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.15, label %innerexit.loopexit.loopexit6
5064; EPILOG-BLOCK:       latch.15:
5065; EPILOG-BLOCK-NEXT:    %iv.next.13 = add nuw nsw i64 %phi.1, 1
5066; EPILOG-BLOCK-NEXT:    %niter.next.14 = add nuw nsw i32 %niter.1, 1
5067; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit6
5068; EPILOG-BLOCK:       latch.1.1:
5069; EPILOG-BLOCK-NEXT:    %iv.next.1.1 = add nuw nsw i64 %iv.next.13, 1
5070; EPILOG-BLOCK-NEXT:    %niter.next.1.1 = add i32 %niter.next.14, 1
5071; EPILOG-BLOCK-NEXT:    %niter.ncmp.1.1 = icmp ne i32 %niter.next.1.1, %unroll_iter.1
5072; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.loopexit.1, !llvm.loop !14
5073; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa.loopexit.1:
5074; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit.unr-lcssa.1
5075; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa.1:
5076; EPILOG-BLOCK-NEXT:    %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0
5077; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod.1, label %header.epil.preheader.1, label %outerLatch.loopexit.1
5078; EPILOG-BLOCK:       header.epil.preheader.1:
5079; EPILOG-BLOCK-NEXT:    br label %header.epil.1
5080; EPILOG-BLOCK:       header.epil.1:
5081; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.epil.1, label %innerexit.loopexit1
5082; EPILOG-BLOCK:       latch.epil.1:
5083; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit.1
5084; EPILOG-BLOCK:       outerLatch.loopexit.1:
5085; EPILOG-BLOCK-NEXT:    br label %outerLatch.1
5086; EPILOG-BLOCK:       outerLatch.1:
5087; EPILOG-BLOCK-NEXT:    br label %outerloopHdr, !llvm.loop !15
5088;
5089; PROLOG-LABEL: @test9(
5090; PROLOG-NEXT:  bb:
5091; PROLOG-NEXT:    %0 = add i32 %n, -1
5092; PROLOG-NEXT:    %1 = add i32 %n, -2
5093; PROLOG-NEXT:    br label %outerloopHdr
5094; PROLOG:       outerloopHdr:
5095; PROLOG-NEXT:    %trip = add i32 %n, -1
5096; PROLOG-NEXT:    %outercnd = icmp slt i32 0, %trip
5097; PROLOG-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
5098; PROLOG:       preheader:
5099; PROLOG-NEXT:    %i4 = zext i32 0 to i64
5100; PROLOG-NEXT:    %xtraiter = and i32 %0, 7
5101; PROLOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
5102; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
5103; PROLOG:       header.prol.preheader:
5104; PROLOG-NEXT:    br label %header.prol
5105; PROLOG:       header.prol:
5106; PROLOG-NEXT:    %phi.prol = phi i64 [ %i4, %header.prol.preheader ], [ %iv.next.prol, %latch.prol ]
5107; PROLOG-NEXT:    %prol.iter = phi i32 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
5108; PROLOG-NEXT:    %i7.prol = trunc i64 %phi.prol to i32
5109; PROLOG-NEXT:    br i1 true, label %latch.prol, label %innerexit.loopexit1
5110; PROLOG:       latch.prol:
5111; PROLOG-NEXT:    %i11.prol = add nsw i32 %i7.prol, 1
5112; PROLOG-NEXT:    %innercnd.prol = icmp slt i32 %i11.prol, %trip
5113; PROLOG-NEXT:    %iv.next.prol = add nuw nsw i64 %phi.prol, 1
5114; PROLOG-NEXT:    %prol.iter.next = add i32 %prol.iter, 1
5115; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i32 %prol.iter.next, %xtraiter
5116; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !13
5117; PROLOG:       header.prol.loopexit.unr-lcssa:
5118; PROLOG-NEXT:    %phi.unr.ph = phi i64 [ %iv.next.prol, %latch.prol ]
5119; PROLOG-NEXT:    br label %header.prol.loopexit
5120; PROLOG:       header.prol.loopexit:
5121; PROLOG-NEXT:    %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %header.prol.loopexit.unr-lcssa ]
5122; PROLOG-NEXT:    %2 = icmp ult i32 %1, 7
5123; PROLOG-NEXT:    br i1 %2, label %outerLatch.loopexit, label %preheader.new
5124; PROLOG:       preheader.new:
5125; PROLOG-NEXT:    br label %header
5126; PROLOG:       header:
5127; PROLOG-NEXT:    %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.7, %latch.7 ]
5128; PROLOG-NEXT:    br i1 true, label %latch, label %innerexit.loopexit
5129; PROLOG:       innerexit.loopexit:
5130; 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 ]
5131; PROLOG-NEXT:    br label %innerexit
5132; PROLOG:       innerexit.loopexit1:
5133; PROLOG-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ]
5134; PROLOG-NEXT:    br label %innerexit
5135; PROLOG:       innerexit:
5136; PROLOG-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
5137; PROLOG-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
5138; PROLOG-NEXT:    ret i8 addrspace(1)* %i9
5139; PROLOG:       latch:
5140; PROLOG-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
5141; PROLOG-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit
5142; PROLOG:       latch.1:
5143; PROLOG-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
5144; PROLOG-NEXT:    br i1 true, label %latch.2, label %innerexit.loopexit
5145; PROLOG:       latch.2:
5146; PROLOG-NEXT:    %iv.next.2 = add nuw nsw i64 %iv.next.1, 1
5147; PROLOG-NEXT:    br i1 true, label %latch.3, label %innerexit.loopexit
5148; PROLOG:       latch.3:
5149; PROLOG-NEXT:    %iv.next.3 = add nuw nsw i64 %iv.next.2, 1
5150; PROLOG-NEXT:    br i1 true, label %latch.4, label %innerexit.loopexit
5151; PROLOG:       latch.4:
5152; PROLOG-NEXT:    %iv.next.4 = add nuw nsw i64 %iv.next.3, 1
5153; PROLOG-NEXT:    br i1 true, label %latch.5, label %innerexit.loopexit
5154; PROLOG:       latch.5:
5155; PROLOG-NEXT:    %iv.next.5 = add nuw nsw i64 %iv.next.4, 1
5156; PROLOG-NEXT:    br i1 true, label %latch.6, label %innerexit.loopexit
5157; PROLOG:       latch.6:
5158; PROLOG-NEXT:    %iv.next.6 = add nuw nsw i64 %iv.next.5, 1
5159; PROLOG-NEXT:    %i7.7 = trunc i64 %iv.next.6 to i32
5160; PROLOG-NEXT:    br i1 true, label %latch.7, label %innerexit.loopexit
5161; PROLOG:       latch.7:
5162; PROLOG-NEXT:    %i11.7 = add nsw i32 %i7.7, 1
5163; PROLOG-NEXT:    %innercnd.7 = icmp slt i32 %i11.7, %trip
5164; PROLOG-NEXT:    %iv.next.7 = add nuw nsw i64 %iv.next.6, 1
5165; PROLOG-NEXT:    br i1 %innercnd.7, label %header, label %outerLatch.loopexit.unr-lcssa
5166; PROLOG:       outerLatch.loopexit.unr-lcssa:
5167; PROLOG-NEXT:    br label %outerLatch.loopexit
5168; PROLOG:       outerLatch.loopexit:
5169; PROLOG-NEXT:    br label %outerLatch
5170; PROLOG:       outerLatch:
5171; PROLOG-NEXT:    br label %outerloopHdr
5172;
5173; PROLOG-BLOCK-LABEL: @test9(
5174; PROLOG-BLOCK-NEXT:  bb:
5175; PROLOG-BLOCK-NEXT:    %0 = add i32 %n, -1
5176; PROLOG-BLOCK-NEXT:    %1 = add i32 %n, -2
5177; PROLOG-BLOCK-NEXT:    br label %outerloopHdr
5178; PROLOG-BLOCK:       outerloopHdr:
5179; PROLOG-BLOCK-NEXT:    %trip = add i32 %n, -1
5180; PROLOG-BLOCK-NEXT:    %outercnd = icmp slt i32 0, %trip
5181; PROLOG-BLOCK-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
5182; PROLOG-BLOCK:       preheader:
5183; PROLOG-BLOCK-NEXT:    %xtraiter = and i32 %0, 1
5184; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
5185; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
5186; PROLOG-BLOCK:       header.prol.preheader:
5187; PROLOG-BLOCK-NEXT:    br label %header.prol
5188; PROLOG-BLOCK:       header.prol:
5189; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.prol, label %innerexit.loopexit1
5190; PROLOG-BLOCK:       latch.prol:
5191; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
5192; PROLOG-BLOCK:       header.prol.loopexit:
5193; PROLOG-BLOCK-NEXT:    %phi.unr = phi i64 [ 0, %preheader ], [ 1, %latch.prol ]
5194; PROLOG-BLOCK-NEXT:    %2 = icmp ult i32 %1, 1
5195; PROLOG-BLOCK-NEXT:    br i1 %2, label %outerLatch.loopexit, label %preheader.new
5196; PROLOG-BLOCK:       preheader.new:
5197; PROLOG-BLOCK-NEXT:    br label %header
5198; PROLOG-BLOCK:       header:
5199; PROLOG-BLOCK-NEXT:    %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.1, %latch.1 ]
5200; PROLOG-BLOCK-NEXT:    br i1 true, label %latch, label %innerexit.loopexit.loopexit
5201; PROLOG-BLOCK:       innerexit.loopexit.loopexit:
5202; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ]
5203; PROLOG-BLOCK-NEXT:    br label %innerexit.loopexit
5204; PROLOG-BLOCK:       innerexit.loopexit.loopexit5:
5205; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph.ph6 = phi i32 [ %trip.1, %latch.14 ], [ %trip.1, %header.1 ]
5206; PROLOG-BLOCK-NEXT:    br label %innerexit.loopexit
5207; PROLOG-BLOCK:       innerexit.loopexit:
5208; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph6, %innerexit.loopexit.loopexit5 ]
5209; PROLOG-BLOCK-NEXT:    br label %innerexit
5210; PROLOG-BLOCK:       innerexit.loopexit1:
5211; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ], [ %trip.1, %header.prol.1 ]
5212; PROLOG-BLOCK-NEXT:    br label %innerexit
5213; PROLOG-BLOCK:       innerexit:
5214; PROLOG-BLOCK-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
5215; PROLOG-BLOCK-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
5216; PROLOG-BLOCK-NEXT:    ret i8 addrspace(1)* %i9
5217; PROLOG-BLOCK:       latch:
5218; PROLOG-BLOCK-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
5219; PROLOG-BLOCK-NEXT:    %i7.1 = trunc i64 %iv.next to i32
5220; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit.loopexit
5221; PROLOG-BLOCK:       latch.1:
5222; PROLOG-BLOCK-NEXT:    %i11.1 = add nsw i32 %i7.1, 1
5223; PROLOG-BLOCK-NEXT:    %innercnd.1 = icmp slt i32 %i11.1, %trip
5224; PROLOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
5225; PROLOG-BLOCK-NEXT:    br i1 %innercnd.1, label %header, label %outerLatch.loopexit.unr-lcssa, !llvm.loop !14
5226; PROLOG-BLOCK:       outerLatch.loopexit.unr-lcssa:
5227; PROLOG-BLOCK-NEXT:    br label %outerLatch.loopexit
5228; PROLOG-BLOCK:       outerLatch.loopexit:
5229; PROLOG-BLOCK-NEXT:    br label %outerLatch
5230; PROLOG-BLOCK:       outerLatch:
5231; PROLOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -1
5232; PROLOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.1
5233; PROLOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.1
5234; PROLOG-BLOCK:       preheader.1:
5235; PROLOG-BLOCK-NEXT:    %xtraiter.1 = and i32 %0, 1
5236; PROLOG-BLOCK-NEXT:    %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0
5237; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod.1, label %header.prol.preheader.1, label %header.prol.loopexit.1
5238; PROLOG-BLOCK:       header.prol.preheader.1:
5239; PROLOG-BLOCK-NEXT:    br label %header.prol.1
5240; PROLOG-BLOCK:       header.prol.1:
5241; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.prol.1, label %innerexit.loopexit1
5242; PROLOG-BLOCK:       latch.prol.1:
5243; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit.1
5244; PROLOG-BLOCK:       header.prol.loopexit.1:
5245; PROLOG-BLOCK-NEXT:    %phi.unr.1 = phi i64 [ 0, %preheader.1 ], [ 1, %latch.prol.1 ]
5246; PROLOG-BLOCK-NEXT:    %3 = icmp ult i32 %1, 1
5247; PROLOG-BLOCK-NEXT:    br i1 %3, label %outerLatch.loopexit.1, label %preheader.new.1
5248; PROLOG-BLOCK:       preheader.new.1:
5249; PROLOG-BLOCK-NEXT:    br label %header.1
5250; PROLOG-BLOCK:       header.1:
5251; PROLOG-BLOCK-NEXT:    %phi.1 = phi i64 [ %phi.unr.1, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ]
5252; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.14, label %innerexit.loopexit.loopexit5
5253; PROLOG-BLOCK:       latch.14:
5254; PROLOG-BLOCK-NEXT:    %iv.next.13 = add nuw nsw i64 %phi.1, 1
5255; PROLOG-BLOCK-NEXT:    %i7.1.1 = trunc i64 %iv.next.13 to i32
5256; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit5
5257; PROLOG-BLOCK:       latch.1.1:
5258; PROLOG-BLOCK-NEXT:    %i11.1.1 = add nsw i32 %i7.1.1, 1
5259; PROLOG-BLOCK-NEXT:    %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.1
5260; PROLOG-BLOCK-NEXT:    %iv.next.1.1 = add nuw nsw i64 %iv.next.13, 1
5261; PROLOG-BLOCK-NEXT:    br i1 %innercnd.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.1, !llvm.loop !14
5262; PROLOG-BLOCK:       outerLatch.loopexit.unr-lcssa.1:
5263; PROLOG-BLOCK-NEXT:    br label %outerLatch.loopexit.1
5264; PROLOG-BLOCK:       outerLatch.loopexit.1:
5265; PROLOG-BLOCK-NEXT:    br label %outerLatch.1
5266; PROLOG-BLOCK:       outerLatch.1:
5267; PROLOG-BLOCK-NEXT:    br label %outerloopHdr, !llvm.loop !15
5268;
5269bb:
5270  br label %outerloopHdr
5271
5272outerloopHdr:                                              ; preds = %outerLatch, %bb
5273  %trip = add i32 %n, -1
5274  %outercnd = icmp slt i32 0, %trip
5275  br i1 %outercnd, label %preheader, label %outerLatch
5276
5277preheader:                                              ; preds = %outerloopHdr
5278  %i4 = zext i32 0 to i64
5279  br label %header
5280
5281header:                                              ; preds = %latch, %preheader
5282  %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ]
5283  %i7 = trunc i64 %phi to i32
5284  br i1 true, label %latch, label %innerexit
5285
5286innerexit:                                              ; preds = %header
5287  %i9 = call i8 addrspace(1)* @foo(i32 %trip)
5288  ret i8 addrspace(1)* %i9
5289
5290latch:                                             ; preds = %header
5291  %i11 = add nsw i32 %i7, 1
5292  %innercnd = icmp slt i32 %i11, %trip
5293  %iv.next = add nuw nsw i64 %phi, 1
5294  br i1 %innercnd, label %header, label %outerLatch
5295
5296outerLatch:                                             ; preds = %latch, %outerloopHdr
5297  br label %outerloopHdr
5298}
5299
5300declare void @bar()
5301
5302; This is a case where we should be able to eliminate N-1 copies
5303; of the early exit test in the main loop when runtime unrolling
5304; by N.
5305define void @test10(i64 %trip, i64 %trip2) {
5306; EPILOG-LABEL: @test10(
5307; EPILOG-NEXT:  entry:
5308; EPILOG-NEXT:    %0 = add i64 %trip, -1
5309; EPILOG-NEXT:    %xtraiter = and i64 %trip, 7
5310; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
5311; EPILOG-NEXT:    br i1 %1, label %exit2.unr-lcssa, label %entry.new
5312; EPILOG:       entry.new:
5313; EPILOG-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
5314; EPILOG-NEXT:    br label %loop_header
5315; EPILOG:       loop_header:
5316; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5317; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
5318; EPILOG-NEXT:    call void @bar()
5319; EPILOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5320; EPILOG-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5321; EPILOG:       loop_latch:
5322; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5323; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5324; EPILOG-NEXT:    call void @bar()
5325; EPILOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5326; EPILOG-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5327; EPILOG:       loop_latch.1:
5328; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
5329; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
5330; EPILOG-NEXT:    call void @bar()
5331; EPILOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
5332; EPILOG-NEXT:    br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit
5333; EPILOG:       loop_latch.2:
5334; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
5335; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
5336; EPILOG-NEXT:    call void @bar()
5337; EPILOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
5338; EPILOG-NEXT:    br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit
5339; EPILOG:       loop_latch.3:
5340; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
5341; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
5342; EPILOG-NEXT:    call void @bar()
5343; EPILOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
5344; EPILOG-NEXT:    br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit
5345; EPILOG:       loop_latch.4:
5346; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
5347; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
5348; EPILOG-NEXT:    call void @bar()
5349; EPILOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
5350; EPILOG-NEXT:    br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit
5351; EPILOG:       loop_latch.5:
5352; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
5353; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
5354; EPILOG-NEXT:    call void @bar()
5355; EPILOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
5356; EPILOG-NEXT:    br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit
5357; EPILOG:       loop_latch.6:
5358; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
5359; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
5360; EPILOG-NEXT:    call void @bar()
5361; EPILOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
5362; EPILOG-NEXT:    br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit
5363; EPILOG:       loop_latch.7:
5364; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
5365; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
5366; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
5367; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit
5368; EPILOG:       exit1.loopexit:
5369; EPILOG-NEXT:    br label %exit1
5370; EPILOG:       exit1.loopexit1:
5371; EPILOG-NEXT:    br label %exit1
5372; EPILOG:       exit1:
5373; EPILOG-NEXT:    ret void
5374; EPILOG:       exit2.unr-lcssa.loopexit:
5375; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
5376; EPILOG-NEXT:    br label %exit2.unr-lcssa
5377; EPILOG:       exit2.unr-lcssa:
5378; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ]
5379; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5380; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5381; EPILOG:       loop_header.epil.preheader:
5382; EPILOG-NEXT:    br label %loop_header.epil
5383; EPILOG:       loop_header.epil:
5384; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
5385; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
5386; EPILOG-NEXT:    call void @bar()
5387; EPILOG-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil, %trip2
5388; EPILOG-NEXT:    br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1.loopexit1
5389; EPILOG:       loop_latch.epil:
5390; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
5391; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
5392; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
5393; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
5394; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !14
5395; EPILOG:       exit2.epilog-lcssa:
5396; EPILOG-NEXT:    br label %exit2
5397; EPILOG:       exit2:
5398; EPILOG-NEXT:    ret void
5399;
5400; EPILOG-BLOCK-LABEL: @test10(
5401; EPILOG-BLOCK-NEXT:  entry:
5402; EPILOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
5403; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
5404; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
5405; EPILOG-BLOCK-NEXT:    br i1 %1, label %exit2.unr-lcssa, label %entry.new
5406; EPILOG-BLOCK:       entry.new:
5407; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
5408; EPILOG-BLOCK-NEXT:    br label %loop_header
5409; EPILOG-BLOCK:       loop_header:
5410; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5411; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
5412; EPILOG-BLOCK-NEXT:    call void @bar()
5413; EPILOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5414; EPILOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5415; EPILOG-BLOCK:       loop_latch:
5416; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5417; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5418; EPILOG-BLOCK-NEXT:    call void @bar()
5419; EPILOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5420; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5421; EPILOG-BLOCK:       loop_latch.1:
5422; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5423; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
5424; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
5425; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !16
5426; EPILOG-BLOCK:       exit1.loopexit:
5427; EPILOG-BLOCK-NEXT:    br label %exit1
5428; EPILOG-BLOCK:       exit1:
5429; EPILOG-BLOCK-NEXT:    ret void
5430; EPILOG-BLOCK:       exit2.unr-lcssa.loopexit:
5431; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
5432; EPILOG-BLOCK-NEXT:    br label %exit2.unr-lcssa
5433; EPILOG-BLOCK:       exit2.unr-lcssa:
5434; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ]
5435; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5436; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5437; EPILOG-BLOCK:       loop_header.epil.preheader:
5438; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
5439; EPILOG-BLOCK:       loop_header.epil:
5440; EPILOG-BLOCK-NEXT:    call void @bar()
5441; EPILOG-BLOCK-NEXT:    %cmp_early.epil = icmp ne i64 %iv.unr, %trip2
5442; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1
5443; EPILOG-BLOCK:       loop_latch.epil:
5444; EPILOG-BLOCK-NEXT:    br label %exit2
5445; EPILOG-BLOCK:       exit2:
5446; EPILOG-BLOCK-NEXT:    ret void
5447;
5448; PROLOG-LABEL: @test10(
5449; PROLOG-NEXT:  entry:
5450; PROLOG-NEXT:    %0 = add i64 %trip, -1
5451; PROLOG-NEXT:    %xtraiter = and i64 %trip, 7
5452; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5453; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5454; PROLOG:       loop_header.prol.preheader:
5455; PROLOG-NEXT:    br label %loop_header.prol
5456; PROLOG:       loop_header.prol:
5457; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
5458; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
5459; PROLOG-NEXT:    call void @bar()
5460; PROLOG-NEXT:    %cmp_early.prol = icmp ne i64 %iv.prol, %trip2
5461; PROLOG-NEXT:    br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1.loopexit1
5462; PROLOG:       loop_latch.prol:
5463; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
5464; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
5465; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
5466; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
5467; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !14
5468; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
5469; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
5470; PROLOG-NEXT:    br label %loop_header.prol.loopexit
5471; PROLOG:       loop_header.prol.loopexit:
5472; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
5473; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
5474; PROLOG-NEXT:    br i1 %1, label %exit2, label %entry.new
5475; PROLOG:       entry.new:
5476; PROLOG-NEXT:    br label %loop_header
5477; PROLOG:       loop_header:
5478; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5479; PROLOG-NEXT:    call void @bar()
5480; PROLOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5481; PROLOG-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5482; PROLOG:       loop_latch:
5483; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
5484; PROLOG-NEXT:    call void @bar()
5485; PROLOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5486; PROLOG-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5487; PROLOG:       loop_latch.1:
5488; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5489; PROLOG-NEXT:    call void @bar()
5490; PROLOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
5491; PROLOG-NEXT:    br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit
5492; PROLOG:       loop_latch.2:
5493; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
5494; PROLOG-NEXT:    call void @bar()
5495; PROLOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
5496; PROLOG-NEXT:    br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit
5497; PROLOG:       loop_latch.3:
5498; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
5499; PROLOG-NEXT:    call void @bar()
5500; PROLOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
5501; PROLOG-NEXT:    br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit
5502; PROLOG:       loop_latch.4:
5503; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
5504; PROLOG-NEXT:    call void @bar()
5505; PROLOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
5506; PROLOG-NEXT:    br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit
5507; PROLOG:       loop_latch.5:
5508; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
5509; PROLOG-NEXT:    call void @bar()
5510; PROLOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
5511; PROLOG-NEXT:    br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit
5512; PROLOG:       loop_latch.6:
5513; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
5514; PROLOG-NEXT:    call void @bar()
5515; PROLOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
5516; PROLOG-NEXT:    br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit
5517; PROLOG:       loop_latch.7:
5518; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
5519; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
5520; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa
5521; PROLOG:       exit1.loopexit:
5522; PROLOG-NEXT:    br label %exit1
5523; PROLOG:       exit1.loopexit1:
5524; PROLOG-NEXT:    br label %exit1
5525; PROLOG:       exit1:
5526; PROLOG-NEXT:    ret void
5527; PROLOG:       exit2.unr-lcssa:
5528; PROLOG-NEXT:    br label %exit2
5529; PROLOG:       exit2:
5530; PROLOG-NEXT:    ret void
5531;
5532; PROLOG-BLOCK-LABEL: @test10(
5533; PROLOG-BLOCK-NEXT:  entry:
5534; PROLOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
5535; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
5536; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5537; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5538; PROLOG-BLOCK:       loop_header.prol.preheader:
5539; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
5540; PROLOG-BLOCK:       loop_header.prol:
5541; PROLOG-BLOCK-NEXT:    call void @bar()
5542; PROLOG-BLOCK-NEXT:    %cmp_early.prol = icmp ne i64 0, %trip2
5543; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1
5544; PROLOG-BLOCK:       loop_latch.prol:
5545; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
5546; PROLOG-BLOCK:       loop_header.prol.loopexit:
5547; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
5548; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
5549; PROLOG-BLOCK-NEXT:    br i1 %1, label %exit2, label %entry.new
5550; PROLOG-BLOCK:       entry.new:
5551; PROLOG-BLOCK-NEXT:    br label %loop_header
5552; PROLOG-BLOCK:       loop_header:
5553; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5554; PROLOG-BLOCK-NEXT:    call void @bar()
5555; PROLOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5556; PROLOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5557; PROLOG-BLOCK:       loop_latch:
5558; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
5559; PROLOG-BLOCK-NEXT:    call void @bar()
5560; PROLOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5561; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5562; PROLOG-BLOCK:       loop_latch.1:
5563; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5564; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
5565; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !16
5566; PROLOG-BLOCK:       exit1.loopexit:
5567; PROLOG-BLOCK-NEXT:    br label %exit1
5568; PROLOG-BLOCK:       exit1:
5569; PROLOG-BLOCK-NEXT:    ret void
5570; PROLOG-BLOCK:       exit2.unr-lcssa:
5571; PROLOG-BLOCK-NEXT:    br label %exit2
5572; PROLOG-BLOCK:       exit2:
5573; PROLOG-BLOCK-NEXT:    ret void
5574;
5575entry:
5576  br label %loop_header
5577
5578loop_header:
5579  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
5580  call void @bar()
5581  %cmp_early = icmp ne i64 %iv, %trip2
5582  br i1 %cmp_early, label %loop_latch, label %exit1
5583
5584loop_latch:
5585  %iv_next = add i64 %iv, 1
5586  %cmp = icmp ne i64 %iv_next, %trip
5587  br i1 %cmp, label %loop_header, label %exit2
5588
5589exit1:
5590  ret void
5591
5592exit2:
5593  ret void
5594}
5595
5596; With a loop invariant, we can eliminate the last N-1
5597; copies of the exit test in the unrolled main loop body.
5598define void @test11(i64 %trip, i1 %cond) {
5599; EPILOG-LABEL: @test11(
5600; EPILOG-NEXT:  entry:
5601; EPILOG-NEXT:    %0 = add i64 %trip, -1
5602; EPILOG-NEXT:    %xtraiter = and i64 %trip, 7
5603; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
5604; EPILOG-NEXT:    br i1 %1, label %exit2.unr-lcssa, label %entry.new
5605; EPILOG:       entry.new:
5606; EPILOG-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
5607; EPILOG-NEXT:    br label %loop_header
5608; EPILOG:       loop_header:
5609; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5610; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
5611; EPILOG-NEXT:    call void @bar()
5612; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5613; EPILOG:       loop_latch:
5614; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5615; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5616; EPILOG-NEXT:    call void @bar()
5617; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5618; EPILOG:       loop_latch.1:
5619; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
5620; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
5621; EPILOG-NEXT:    call void @bar()
5622; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.loopexit
5623; EPILOG:       loop_latch.2:
5624; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
5625; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
5626; EPILOG-NEXT:    call void @bar()
5627; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.loopexit
5628; EPILOG:       loop_latch.3:
5629; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
5630; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
5631; EPILOG-NEXT:    call void @bar()
5632; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.loopexit
5633; EPILOG:       loop_latch.4:
5634; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
5635; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
5636; EPILOG-NEXT:    call void @bar()
5637; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.loopexit
5638; EPILOG:       loop_latch.5:
5639; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
5640; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
5641; EPILOG-NEXT:    call void @bar()
5642; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.loopexit
5643; EPILOG:       loop_latch.6:
5644; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
5645; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
5646; EPILOG-NEXT:    call void @bar()
5647; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.loopexit
5648; EPILOG:       loop_latch.7:
5649; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
5650; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
5651; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
5652; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit
5653; EPILOG:       exit1.loopexit:
5654; EPILOG-NEXT:    br label %exit1
5655; EPILOG:       exit1.loopexit1:
5656; EPILOG-NEXT:    br label %exit1
5657; EPILOG:       exit1:
5658; EPILOG-NEXT:    ret void
5659; EPILOG:       exit2.unr-lcssa.loopexit:
5660; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
5661; EPILOG-NEXT:    br label %exit2.unr-lcssa
5662; EPILOG:       exit2.unr-lcssa:
5663; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ]
5664; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5665; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5666; EPILOG:       loop_header.epil.preheader:
5667; EPILOG-NEXT:    br label %loop_header.epil
5668; EPILOG:       loop_header.epil:
5669; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
5670; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
5671; EPILOG-NEXT:    call void @bar()
5672; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1.loopexit1
5673; EPILOG:       loop_latch.epil:
5674; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
5675; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
5676; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
5677; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
5678; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !15
5679; EPILOG:       exit2.epilog-lcssa:
5680; EPILOG-NEXT:    br label %exit2
5681; EPILOG:       exit2:
5682; EPILOG-NEXT:    ret void
5683;
5684; EPILOG-BLOCK-LABEL: @test11(
5685; EPILOG-BLOCK-NEXT:  entry:
5686; EPILOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
5687; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
5688; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
5689; EPILOG-BLOCK-NEXT:    br i1 %1, label %exit2.unr-lcssa, label %entry.new
5690; EPILOG-BLOCK:       entry.new:
5691; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
5692; EPILOG-BLOCK-NEXT:    br label %loop_header
5693; EPILOG-BLOCK:       loop_header:
5694; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5695; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
5696; EPILOG-BLOCK-NEXT:    call void @bar()
5697; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5698; EPILOG-BLOCK:       loop_latch:
5699; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5700; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5701; EPILOG-BLOCK-NEXT:    call void @bar()
5702; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5703; EPILOG-BLOCK:       loop_latch.1:
5704; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5705; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
5706; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
5707; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !17
5708; EPILOG-BLOCK:       exit1.loopexit:
5709; EPILOG-BLOCK-NEXT:    br label %exit1
5710; EPILOG-BLOCK:       exit1:
5711; EPILOG-BLOCK-NEXT:    ret void
5712; EPILOG-BLOCK:       exit2.unr-lcssa.loopexit:
5713; EPILOG-BLOCK-NEXT:    br label %exit2.unr-lcssa
5714; EPILOG-BLOCK:       exit2.unr-lcssa:
5715; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5716; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5717; EPILOG-BLOCK:       loop_header.epil.preheader:
5718; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
5719; EPILOG-BLOCK:       loop_header.epil:
5720; EPILOG-BLOCK-NEXT:    call void @bar()
5721; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1
5722; EPILOG-BLOCK:       loop_latch.epil:
5723; EPILOG-BLOCK-NEXT:    br label %exit2
5724; EPILOG-BLOCK:       exit2:
5725; EPILOG-BLOCK-NEXT:    ret void
5726;
5727; PROLOG-LABEL: @test11(
5728; PROLOG-NEXT:  entry:
5729; PROLOG-NEXT:    %0 = add i64 %trip, -1
5730; PROLOG-NEXT:    %xtraiter = and i64 %trip, 7
5731; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5732; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5733; PROLOG:       loop_header.prol.preheader:
5734; PROLOG-NEXT:    br label %loop_header.prol
5735; PROLOG:       loop_header.prol:
5736; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
5737; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
5738; PROLOG-NEXT:    call void @bar()
5739; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1.loopexit1
5740; PROLOG:       loop_latch.prol:
5741; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
5742; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
5743; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
5744; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
5745; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !15
5746; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
5747; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
5748; PROLOG-NEXT:    br label %loop_header.prol.loopexit
5749; PROLOG:       loop_header.prol.loopexit:
5750; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
5751; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
5752; PROLOG-NEXT:    br i1 %1, label %exit2, label %entry.new
5753; PROLOG:       entry.new:
5754; PROLOG-NEXT:    br label %loop_header
5755; PROLOG:       loop_header:
5756; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5757; PROLOG-NEXT:    call void @bar()
5758; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5759; PROLOG:       loop_latch:
5760; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
5761; PROLOG-NEXT:    call void @bar()
5762; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5763; PROLOG:       loop_latch.1:
5764; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5765; PROLOG-NEXT:    call void @bar()
5766; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.loopexit
5767; PROLOG:       loop_latch.2:
5768; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
5769; PROLOG-NEXT:    call void @bar()
5770; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.loopexit
5771; PROLOG:       loop_latch.3:
5772; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
5773; PROLOG-NEXT:    call void @bar()
5774; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.loopexit
5775; PROLOG:       loop_latch.4:
5776; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
5777; PROLOG-NEXT:    call void @bar()
5778; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.loopexit
5779; PROLOG:       loop_latch.5:
5780; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
5781; PROLOG-NEXT:    call void @bar()
5782; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.loopexit
5783; PROLOG:       loop_latch.6:
5784; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
5785; PROLOG-NEXT:    call void @bar()
5786; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.loopexit
5787; PROLOG:       loop_latch.7:
5788; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
5789; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
5790; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa
5791; PROLOG:       exit1.loopexit:
5792; PROLOG-NEXT:    br label %exit1
5793; PROLOG:       exit1.loopexit1:
5794; PROLOG-NEXT:    br label %exit1
5795; PROLOG:       exit1:
5796; PROLOG-NEXT:    ret void
5797; PROLOG:       exit2.unr-lcssa:
5798; PROLOG-NEXT:    br label %exit2
5799; PROLOG:       exit2:
5800; PROLOG-NEXT:    ret void
5801;
5802; PROLOG-BLOCK-LABEL: @test11(
5803; PROLOG-BLOCK-NEXT:  entry:
5804; PROLOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
5805; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
5806; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5807; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5808; PROLOG-BLOCK:       loop_header.prol.preheader:
5809; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
5810; PROLOG-BLOCK:       loop_header.prol:
5811; PROLOG-BLOCK-NEXT:    call void @bar()
5812; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1
5813; PROLOG-BLOCK:       loop_latch.prol:
5814; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
5815; PROLOG-BLOCK:       loop_header.prol.loopexit:
5816; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
5817; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
5818; PROLOG-BLOCK-NEXT:    br i1 %1, label %exit2, label %entry.new
5819; PROLOG-BLOCK:       entry.new:
5820; PROLOG-BLOCK-NEXT:    br label %loop_header
5821; PROLOG-BLOCK:       loop_header:
5822; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5823; PROLOG-BLOCK-NEXT:    call void @bar()
5824; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5825; PROLOG-BLOCK:       loop_latch:
5826; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
5827; PROLOG-BLOCK-NEXT:    call void @bar()
5828; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5829; PROLOG-BLOCK:       loop_latch.1:
5830; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5831; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
5832; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !17
5833; PROLOG-BLOCK:       exit1.loopexit:
5834; PROLOG-BLOCK-NEXT:    br label %exit1
5835; PROLOG-BLOCK:       exit1:
5836; PROLOG-BLOCK-NEXT:    ret void
5837; PROLOG-BLOCK:       exit2.unr-lcssa:
5838; PROLOG-BLOCK-NEXT:    br label %exit2
5839; PROLOG-BLOCK:       exit2:
5840; PROLOG-BLOCK-NEXT:    ret void
5841;
5842entry:
5843  br label %loop_header
5844
5845loop_header:
5846  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
5847  call void @bar()
5848  br i1 %cond, label %loop_latch, label %exit1
5849
5850loop_latch:
5851  %iv_next = add i64 %iv, 1
5852  %cmp = icmp ne i64 %iv_next, %trip
5853  br i1 %cmp, label %loop_header, label %exit2
5854
5855exit1:
5856  ret void
5857
5858exit2:
5859  ret void
5860}
5861
5862; Combine a computeable and invariant test to make sure
5863; the interaction of both doesn't do anything weird
5864define void @test12(i64 %trip, i64 %trip2, i1 %cond) {
5865; EPILOG-LABEL: @test12(
5866; EPILOG-NEXT:  entry:
5867; EPILOG-NEXT:    %0 = add i64 %trip, -1
5868; EPILOG-NEXT:    %xtraiter = and i64 %trip, 7
5869; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
5870; EPILOG-NEXT:    br i1 %1, label %exit1.unr-lcssa, label %entry.new
5871; EPILOG:       entry.new:
5872; EPILOG-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
5873; EPILOG-NEXT:    br label %loop_header
5874; EPILOG:       loop_header:
5875; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5876; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
5877; EPILOG-NEXT:    call void @bar()
5878; EPILOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5879; EPILOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
5880; EPILOG:       loop_exiting_bb2:
5881; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit
5882; EPILOG:       loop_latch:
5883; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5884; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5885; EPILOG-NEXT:    call void @bar()
5886; EPILOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5887; EPILOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
5888; EPILOG:       loop_exiting_bb2.1:
5889; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
5890; EPILOG:       loop_latch.1:
5891; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
5892; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
5893; EPILOG-NEXT:    call void @bar()
5894; EPILOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
5895; EPILOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit
5896; EPILOG:       loop_exiting_bb2.2:
5897; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit
5898; EPILOG:       loop_latch.2:
5899; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
5900; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
5901; EPILOG-NEXT:    call void @bar()
5902; EPILOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
5903; EPILOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit
5904; EPILOG:       loop_exiting_bb2.3:
5905; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit
5906; EPILOG:       loop_latch.3:
5907; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
5908; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
5909; EPILOG-NEXT:    call void @bar()
5910; EPILOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
5911; EPILOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit
5912; EPILOG:       loop_exiting_bb2.4:
5913; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit
5914; EPILOG:       loop_latch.4:
5915; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
5916; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
5917; EPILOG-NEXT:    call void @bar()
5918; EPILOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
5919; EPILOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit
5920; EPILOG:       loop_exiting_bb2.5:
5921; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit
5922; EPILOG:       loop_latch.5:
5923; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
5924; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
5925; EPILOG-NEXT:    call void @bar()
5926; EPILOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
5927; EPILOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit
5928; EPILOG:       loop_exiting_bb2.6:
5929; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit
5930; EPILOG:       loop_latch.6:
5931; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
5932; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
5933; EPILOG-NEXT:    call void @bar()
5934; EPILOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
5935; EPILOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit
5936; EPILOG:       loop_exiting_bb2.7:
5937; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit
5938; EPILOG:       loop_latch.7:
5939; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
5940; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
5941; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
5942; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
5943; EPILOG:       exit1.unr-lcssa.loopexit:
5944; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
5945; EPILOG-NEXT:    br label %exit1.unr-lcssa
5946; EPILOG:       exit1.unr-lcssa:
5947; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
5948; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5949; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
5950; EPILOG:       loop_header.epil.preheader:
5951; EPILOG-NEXT:    br label %loop_header.epil
5952; EPILOG:       loop_header.epil:
5953; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
5954; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
5955; EPILOG-NEXT:    call void @bar()
5956; EPILOG-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil, %trip2
5957; EPILOG-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1
5958; EPILOG:       loop_exiting_bb2.epil:
5959; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1
5960; EPILOG:       loop_latch.epil:
5961; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
5962; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
5963; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
5964; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
5965; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !16
5966; EPILOG:       exit1.epilog-lcssa.loopexit:
5967; EPILOG-NEXT:    br label %exit1.epilog-lcssa
5968; EPILOG:       exit1.epilog-lcssa.loopexit1:
5969; EPILOG-NEXT:    br label %exit1.epilog-lcssa
5970; EPILOG:       exit1.epilog-lcssa:
5971; EPILOG-NEXT:    br label %exit1
5972; EPILOG:       exit1:
5973; EPILOG-NEXT:    ret void
5974;
5975; EPILOG-BLOCK-LABEL: @test12(
5976; EPILOG-BLOCK-NEXT:  entry:
5977; EPILOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
5978; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
5979; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
5980; EPILOG-BLOCK-NEXT:    br i1 %1, label %exit1.unr-lcssa, label %entry.new
5981; EPILOG-BLOCK:       entry.new:
5982; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
5983; EPILOG-BLOCK-NEXT:    br label %loop_header
5984; EPILOG-BLOCK:       loop_header:
5985; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5986; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
5987; EPILOG-BLOCK-NEXT:    call void @bar()
5988; EPILOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5989; EPILOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
5990; EPILOG-BLOCK:       loop_exiting_bb2:
5991; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit
5992; EPILOG-BLOCK:       loop_latch:
5993; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5994; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5995; EPILOG-BLOCK-NEXT:    call void @bar()
5996; EPILOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5997; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
5998; EPILOG-BLOCK:       loop_exiting_bb2.1:
5999; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6000; EPILOG-BLOCK:       loop_latch.1:
6001; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6002; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
6003; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
6004; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18
6005; EPILOG-BLOCK:       exit1.unr-lcssa.loopexit:
6006; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
6007; EPILOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6008; EPILOG-BLOCK:       exit1.unr-lcssa:
6009; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
6010; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6011; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6012; EPILOG-BLOCK:       loop_header.epil.preheader:
6013; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
6014; EPILOG-BLOCK:       loop_header.epil:
6015; EPILOG-BLOCK-NEXT:    call void @bar()
6016; EPILOG-BLOCK-NEXT:    %cmp_early.epil = icmp ne i64 %iv.unr, %trip2
6017; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa
6018; EPILOG-BLOCK:       loop_exiting_bb2.epil:
6019; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa
6020; EPILOG-BLOCK:       loop_latch.epil:
6021; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6022; EPILOG-BLOCK:       exit1.epilog-lcssa.loopexit:
6023; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6024; EPILOG-BLOCK:       exit1.epilog-lcssa:
6025; EPILOG-BLOCK-NEXT:    br label %exit1
6026; EPILOG-BLOCK:       exit1:
6027; EPILOG-BLOCK-NEXT:    ret void
6028;
6029; PROLOG-LABEL: @test12(
6030; PROLOG-NEXT:  entry:
6031; PROLOG-NEXT:    %0 = add i64 %trip, -1
6032; PROLOG-NEXT:    %xtraiter = and i64 %trip, 7
6033; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6034; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6035; PROLOG:       loop_header.prol.preheader:
6036; PROLOG-NEXT:    br label %loop_header.prol
6037; PROLOG:       loop_header.prol:
6038; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
6039; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
6040; PROLOG-NEXT:    call void @bar()
6041; PROLOG-NEXT:    %cmp_early.prol = icmp ne i64 %iv.prol, %trip2
6042; PROLOG-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1
6043; PROLOG:       loop_exiting_bb2.prol:
6044; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1
6045; PROLOG:       loop_latch.prol:
6046; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
6047; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
6048; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
6049; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
6050; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !16
6051; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
6052; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
6053; PROLOG-NEXT:    br label %loop_header.prol.loopexit
6054; PROLOG:       loop_header.prol.loopexit:
6055; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
6056; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
6057; PROLOG-NEXT:    br i1 %1, label %exit1, label %entry.new
6058; PROLOG:       entry.new:
6059; PROLOG-NEXT:    br label %loop_header
6060; PROLOG:       loop_header:
6061; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6062; PROLOG-NEXT:    call void @bar()
6063; PROLOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6064; PROLOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6065; PROLOG:       loop_exiting_bb2:
6066; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit
6067; PROLOG:       loop_latch:
6068; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
6069; PROLOG-NEXT:    call void @bar()
6070; PROLOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6071; PROLOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6072; PROLOG:       loop_exiting_bb2.1:
6073; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6074; PROLOG:       loop_latch.1:
6075; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6076; PROLOG-NEXT:    call void @bar()
6077; PROLOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
6078; PROLOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit
6079; PROLOG:       loop_exiting_bb2.2:
6080; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.unr-lcssa.loopexit
6081; PROLOG:       loop_latch.2:
6082; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
6083; PROLOG-NEXT:    call void @bar()
6084; PROLOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
6085; PROLOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit
6086; PROLOG:       loop_exiting_bb2.3:
6087; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.unr-lcssa.loopexit
6088; PROLOG:       loop_latch.3:
6089; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
6090; PROLOG-NEXT:    call void @bar()
6091; PROLOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
6092; PROLOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit
6093; PROLOG:       loop_exiting_bb2.4:
6094; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.unr-lcssa.loopexit
6095; PROLOG:       loop_latch.4:
6096; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
6097; PROLOG-NEXT:    call void @bar()
6098; PROLOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
6099; PROLOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit
6100; PROLOG:       loop_exiting_bb2.5:
6101; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.unr-lcssa.loopexit
6102; PROLOG:       loop_latch.5:
6103; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
6104; PROLOG-NEXT:    call void @bar()
6105; PROLOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
6106; PROLOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit
6107; PROLOG:       loop_exiting_bb2.6:
6108; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.unr-lcssa.loopexit
6109; PROLOG:       loop_latch.6:
6110; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
6111; PROLOG-NEXT:    call void @bar()
6112; PROLOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
6113; PROLOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit
6114; PROLOG:       loop_exiting_bb2.7:
6115; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.unr-lcssa.loopexit
6116; PROLOG:       loop_latch.7:
6117; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
6118; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
6119; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6120; PROLOG:       exit1.unr-lcssa.loopexit:
6121; PROLOG-NEXT:    br label %exit1.unr-lcssa
6122; PROLOG:       exit1.unr-lcssa.loopexit1:
6123; PROLOG-NEXT:    br label %exit1.unr-lcssa
6124; PROLOG:       exit1.unr-lcssa:
6125; PROLOG-NEXT:    br label %exit1
6126; PROLOG:       exit1:
6127; PROLOG-NEXT:    ret void
6128;
6129; PROLOG-BLOCK-LABEL: @test12(
6130; PROLOG-BLOCK-NEXT:  entry:
6131; PROLOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
6132; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
6133; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6134; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6135; PROLOG-BLOCK:       loop_header.prol.preheader:
6136; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
6137; PROLOG-BLOCK:       loop_header.prol:
6138; PROLOG-BLOCK-NEXT:    call void @bar()
6139; PROLOG-BLOCK-NEXT:    %cmp_early.prol = icmp ne i64 0, %trip2
6140; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa
6141; PROLOG-BLOCK:       loop_exiting_bb2.prol:
6142; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa
6143; PROLOG-BLOCK:       loop_latch.prol:
6144; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
6145; PROLOG-BLOCK:       loop_header.prol.loopexit:
6146; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
6147; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
6148; PROLOG-BLOCK-NEXT:    br i1 %1, label %exit1, label %entry.new
6149; PROLOG-BLOCK:       entry.new:
6150; PROLOG-BLOCK-NEXT:    br label %loop_header
6151; PROLOG-BLOCK:       loop_header:
6152; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6153; PROLOG-BLOCK-NEXT:    call void @bar()
6154; PROLOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6155; PROLOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6156; PROLOG-BLOCK:       loop_exiting_bb2:
6157; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit
6158; PROLOG-BLOCK:       loop_latch:
6159; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
6160; PROLOG-BLOCK-NEXT:    call void @bar()
6161; PROLOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6162; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6163; PROLOG-BLOCK:       loop_exiting_bb2.1:
6164; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6165; PROLOG-BLOCK:       loop_latch.1:
6166; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6167; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
6168; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18
6169; PROLOG-BLOCK:       exit1.unr-lcssa.loopexit:
6170; PROLOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6171; PROLOG-BLOCK:       exit1.unr-lcssa:
6172; PROLOG-BLOCK-NEXT:    br label %exit1
6173; PROLOG-BLOCK:       exit1:
6174; PROLOG-BLOCK-NEXT:    ret void
6175;
6176entry:
6177  br label %loop_header
6178
6179loop_header:
6180  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
6181  call void @bar()
6182  %cmp_early = icmp ne i64 %iv, %trip2
6183  br i1 %cmp_early, label %loop_exiting_bb2, label %exit1
6184
6185loop_exiting_bb2:
6186  br i1 %cond, label %loop_latch, label %exit1
6187
6188loop_latch:
6189  %iv_next = add i64 %iv, 1
6190  %cmp = icmp ne i64 %iv_next, %trip
6191  br i1 %cmp, label %loop_header, label %exit1
6192
6193exit1:
6194  ret void
6195}
6196
6197declare i1 @unknown_cond()
6198
6199; Mix of computable and uncompatable exits
6200define void @test13(i64 %trip, i64 %trip2) {
6201; EPILOG-LABEL: @test13(
6202; EPILOG-NEXT:  entry:
6203; EPILOG-NEXT:    %0 = add i64 %trip, -1
6204; EPILOG-NEXT:    %xtraiter = and i64 %trip, 7
6205; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
6206; EPILOG-NEXT:    br i1 %1, label %exit1.unr-lcssa, label %entry.new
6207; EPILOG:       entry.new:
6208; EPILOG-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
6209; EPILOG-NEXT:    br label %loop_header
6210; EPILOG:       loop_header:
6211; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6212; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
6213; EPILOG-NEXT:    call void @bar()
6214; EPILOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6215; EPILOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6216; EPILOG:       loop_exiting_bb2:
6217; EPILOG-NEXT:    %unknown = call i1 @unknown_cond()
6218; EPILOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6219; EPILOG:       loop_latch:
6220; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
6221; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
6222; EPILOG-NEXT:    call void @bar()
6223; EPILOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6224; EPILOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6225; EPILOG:       loop_exiting_bb2.1:
6226; EPILOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
6227; EPILOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6228; EPILOG:       loop_latch.1:
6229; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
6230; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
6231; EPILOG-NEXT:    call void @bar()
6232; EPILOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
6233; EPILOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit
6234; EPILOG:       loop_exiting_bb2.2:
6235; EPILOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
6236; EPILOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit
6237; EPILOG:       loop_latch.2:
6238; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
6239; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
6240; EPILOG-NEXT:    call void @bar()
6241; EPILOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
6242; EPILOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit
6243; EPILOG:       loop_exiting_bb2.3:
6244; EPILOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
6245; EPILOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit
6246; EPILOG:       loop_latch.3:
6247; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
6248; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
6249; EPILOG-NEXT:    call void @bar()
6250; EPILOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
6251; EPILOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit
6252; EPILOG:       loop_exiting_bb2.4:
6253; EPILOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
6254; EPILOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit
6255; EPILOG:       loop_latch.4:
6256; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
6257; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
6258; EPILOG-NEXT:    call void @bar()
6259; EPILOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
6260; EPILOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit
6261; EPILOG:       loop_exiting_bb2.5:
6262; EPILOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
6263; EPILOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit
6264; EPILOG:       loop_latch.5:
6265; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
6266; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
6267; EPILOG-NEXT:    call void @bar()
6268; EPILOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
6269; EPILOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit
6270; EPILOG:       loop_exiting_bb2.6:
6271; EPILOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
6272; EPILOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit
6273; EPILOG:       loop_latch.6:
6274; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
6275; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
6276; EPILOG-NEXT:    call void @bar()
6277; EPILOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
6278; EPILOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit
6279; EPILOG:       loop_exiting_bb2.7:
6280; EPILOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
6281; EPILOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit
6282; EPILOG:       loop_latch.7:
6283; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
6284; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
6285; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
6286; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6287; EPILOG:       exit1.unr-lcssa.loopexit:
6288; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
6289; EPILOG-NEXT:    br label %exit1.unr-lcssa
6290; EPILOG:       exit1.unr-lcssa:
6291; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
6292; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6293; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6294; EPILOG:       loop_header.epil.preheader:
6295; EPILOG-NEXT:    br label %loop_header.epil
6296; EPILOG:       loop_header.epil:
6297; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
6298; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
6299; EPILOG-NEXT:    call void @bar()
6300; EPILOG-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil, %trip2
6301; EPILOG-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1
6302; EPILOG:       loop_exiting_bb2.epil:
6303; EPILOG-NEXT:    %unknown.epil = call i1 @unknown_cond()
6304; EPILOG-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1
6305; EPILOG:       loop_latch.epil:
6306; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
6307; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
6308; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
6309; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
6310; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !17
6311; EPILOG:       exit1.epilog-lcssa.loopexit:
6312; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6313; EPILOG:       exit1.epilog-lcssa.loopexit1:
6314; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6315; EPILOG:       exit1.epilog-lcssa:
6316; EPILOG-NEXT:    br label %exit1
6317; EPILOG:       exit1:
6318; EPILOG-NEXT:    ret void
6319;
6320; EPILOG-BLOCK-LABEL: @test13(
6321; EPILOG-BLOCK-NEXT:  entry:
6322; EPILOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
6323; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
6324; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
6325; EPILOG-BLOCK-NEXT:    br i1 %1, label %exit1.unr-lcssa, label %entry.new
6326; EPILOG-BLOCK:       entry.new:
6327; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
6328; EPILOG-BLOCK-NEXT:    br label %loop_header
6329; EPILOG-BLOCK:       loop_header:
6330; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6331; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
6332; EPILOG-BLOCK-NEXT:    call void @bar()
6333; EPILOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6334; EPILOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6335; EPILOG-BLOCK:       loop_exiting_bb2:
6336; EPILOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6337; EPILOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6338; EPILOG-BLOCK:       loop_latch:
6339; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
6340; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
6341; EPILOG-BLOCK-NEXT:    call void @bar()
6342; EPILOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6343; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6344; EPILOG-BLOCK:       loop_exiting_bb2.1:
6345; EPILOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6346; EPILOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6347; EPILOG-BLOCK:       loop_latch.1:
6348; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6349; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
6350; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
6351; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19
6352; EPILOG-BLOCK:       exit1.unr-lcssa.loopexit:
6353; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
6354; EPILOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6355; EPILOG-BLOCK:       exit1.unr-lcssa:
6356; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
6357; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6358; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6359; EPILOG-BLOCK:       loop_header.epil.preheader:
6360; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
6361; EPILOG-BLOCK:       loop_header.epil:
6362; EPILOG-BLOCK-NEXT:    call void @bar()
6363; EPILOG-BLOCK-NEXT:    %cmp_early.epil = icmp ne i64 %iv.unr, %trip2
6364; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa
6365; EPILOG-BLOCK:       loop_exiting_bb2.epil:
6366; EPILOG-BLOCK-NEXT:    %unknown.epil = call i1 @unknown_cond()
6367; EPILOG-BLOCK-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa
6368; EPILOG-BLOCK:       loop_latch.epil:
6369; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6370; EPILOG-BLOCK:       exit1.epilog-lcssa.loopexit:
6371; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6372; EPILOG-BLOCK:       exit1.epilog-lcssa:
6373; EPILOG-BLOCK-NEXT:    br label %exit1
6374; EPILOG-BLOCK:       exit1:
6375; EPILOG-BLOCK-NEXT:    ret void
6376;
6377; PROLOG-LABEL: @test13(
6378; PROLOG-NEXT:  entry:
6379; PROLOG-NEXT:    %0 = add i64 %trip, -1
6380; PROLOG-NEXT:    %xtraiter = and i64 %trip, 7
6381; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6382; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6383; PROLOG:       loop_header.prol.preheader:
6384; PROLOG-NEXT:    br label %loop_header.prol
6385; PROLOG:       loop_header.prol:
6386; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
6387; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
6388; PROLOG-NEXT:    call void @bar()
6389; PROLOG-NEXT:    %cmp_early.prol = icmp ne i64 %iv.prol, %trip2
6390; PROLOG-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1
6391; PROLOG:       loop_exiting_bb2.prol:
6392; PROLOG-NEXT:    %unknown.prol = call i1 @unknown_cond()
6393; PROLOG-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1
6394; PROLOG:       loop_latch.prol:
6395; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
6396; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
6397; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
6398; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
6399; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !17
6400; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
6401; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
6402; PROLOG-NEXT:    br label %loop_header.prol.loopexit
6403; PROLOG:       loop_header.prol.loopexit:
6404; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
6405; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
6406; PROLOG-NEXT:    br i1 %1, label %exit1, label %entry.new
6407; PROLOG:       entry.new:
6408; PROLOG-NEXT:    br label %loop_header
6409; PROLOG:       loop_header:
6410; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6411; PROLOG-NEXT:    call void @bar()
6412; PROLOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6413; PROLOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6414; PROLOG:       loop_exiting_bb2:
6415; PROLOG-NEXT:    %unknown = call i1 @unknown_cond()
6416; PROLOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6417; PROLOG:       loop_latch:
6418; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
6419; PROLOG-NEXT:    call void @bar()
6420; PROLOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6421; PROLOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6422; PROLOG:       loop_exiting_bb2.1:
6423; PROLOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
6424; PROLOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6425; PROLOG:       loop_latch.1:
6426; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6427; PROLOG-NEXT:    call void @bar()
6428; PROLOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
6429; PROLOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit
6430; PROLOG:       loop_exiting_bb2.2:
6431; PROLOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
6432; PROLOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit
6433; PROLOG:       loop_latch.2:
6434; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
6435; PROLOG-NEXT:    call void @bar()
6436; PROLOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
6437; PROLOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit
6438; PROLOG:       loop_exiting_bb2.3:
6439; PROLOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
6440; PROLOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit
6441; PROLOG:       loop_latch.3:
6442; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
6443; PROLOG-NEXT:    call void @bar()
6444; PROLOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
6445; PROLOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit
6446; PROLOG:       loop_exiting_bb2.4:
6447; PROLOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
6448; PROLOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit
6449; PROLOG:       loop_latch.4:
6450; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
6451; PROLOG-NEXT:    call void @bar()
6452; PROLOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
6453; PROLOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit
6454; PROLOG:       loop_exiting_bb2.5:
6455; PROLOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
6456; PROLOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit
6457; PROLOG:       loop_latch.5:
6458; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
6459; PROLOG-NEXT:    call void @bar()
6460; PROLOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
6461; PROLOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit
6462; PROLOG:       loop_exiting_bb2.6:
6463; PROLOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
6464; PROLOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit
6465; PROLOG:       loop_latch.6:
6466; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
6467; PROLOG-NEXT:    call void @bar()
6468; PROLOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
6469; PROLOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit
6470; PROLOG:       loop_exiting_bb2.7:
6471; PROLOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
6472; PROLOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit
6473; PROLOG:       loop_latch.7:
6474; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
6475; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
6476; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6477; PROLOG:       exit1.unr-lcssa.loopexit:
6478; PROLOG-NEXT:    br label %exit1.unr-lcssa
6479; PROLOG:       exit1.unr-lcssa.loopexit1:
6480; PROLOG-NEXT:    br label %exit1.unr-lcssa
6481; PROLOG:       exit1.unr-lcssa:
6482; PROLOG-NEXT:    br label %exit1
6483; PROLOG:       exit1:
6484; PROLOG-NEXT:    ret void
6485;
6486; PROLOG-BLOCK-LABEL: @test13(
6487; PROLOG-BLOCK-NEXT:  entry:
6488; PROLOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
6489; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
6490; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6491; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6492; PROLOG-BLOCK:       loop_header.prol.preheader:
6493; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
6494; PROLOG-BLOCK:       loop_header.prol:
6495; PROLOG-BLOCK-NEXT:    call void @bar()
6496; PROLOG-BLOCK-NEXT:    %cmp_early.prol = icmp ne i64 0, %trip2
6497; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa
6498; PROLOG-BLOCK:       loop_exiting_bb2.prol:
6499; PROLOG-BLOCK-NEXT:    %unknown.prol = call i1 @unknown_cond()
6500; PROLOG-BLOCK-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa
6501; PROLOG-BLOCK:       loop_latch.prol:
6502; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
6503; PROLOG-BLOCK:       loop_header.prol.loopexit:
6504; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
6505; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
6506; PROLOG-BLOCK-NEXT:    br i1 %1, label %exit1, label %entry.new
6507; PROLOG-BLOCK:       entry.new:
6508; PROLOG-BLOCK-NEXT:    br label %loop_header
6509; PROLOG-BLOCK:       loop_header:
6510; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6511; PROLOG-BLOCK-NEXT:    call void @bar()
6512; PROLOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6513; PROLOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6514; PROLOG-BLOCK:       loop_exiting_bb2:
6515; PROLOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6516; PROLOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6517; PROLOG-BLOCK:       loop_latch:
6518; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
6519; PROLOG-BLOCK-NEXT:    call void @bar()
6520; PROLOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6521; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6522; PROLOG-BLOCK:       loop_exiting_bb2.1:
6523; PROLOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6524; PROLOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6525; PROLOG-BLOCK:       loop_latch.1:
6526; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6527; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
6528; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19
6529; PROLOG-BLOCK:       exit1.unr-lcssa.loopexit:
6530; PROLOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6531; PROLOG-BLOCK:       exit1.unr-lcssa:
6532; PROLOG-BLOCK-NEXT:    br label %exit1
6533; PROLOG-BLOCK:       exit1:
6534; PROLOG-BLOCK-NEXT:    ret void
6535;
6536entry:
6537  br label %loop_header
6538
6539loop_header:
6540  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
6541  call void @bar()
6542  %cmp_early = icmp ne i64 %iv, %trip2
6543  br i1 %cmp_early, label %loop_exiting_bb2, label %exit1
6544
6545loop_exiting_bb2:
6546  %unknown = call i1 @unknown_cond()
6547  br i1 %unknown, label %loop_latch, label %exit1
6548
6549loop_latch:
6550  %iv_next = add i64 %iv, 1
6551  %cmp = icmp ne i64 %iv_next, %trip
6552  br i1 %cmp, label %loop_header, label %exit1
6553
6554exit1:
6555  ret void
6556}
6557
6558; Mix of invariant and (even in theory) uncomputable exits
6559define void @test14(i64 %trip, i1 %cond) {
6560; EPILOG-LABEL: @test14(
6561; EPILOG-NEXT:  entry:
6562; EPILOG-NEXT:    %0 = add i64 %trip, -1
6563; EPILOG-NEXT:    %xtraiter = and i64 %trip, 7
6564; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
6565; EPILOG-NEXT:    br i1 %1, label %exit1.unr-lcssa, label %entry.new
6566; EPILOG:       entry.new:
6567; EPILOG-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
6568; EPILOG-NEXT:    br label %loop_header
6569; EPILOG:       loop_header:
6570; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6571; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
6572; EPILOG-NEXT:    call void @bar()
6573; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6574; EPILOG:       loop_exiting_bb2:
6575; EPILOG-NEXT:    %unknown = call i1 @unknown_cond()
6576; EPILOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6577; EPILOG:       loop_latch:
6578; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
6579; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
6580; EPILOG-NEXT:    call void @bar()
6581; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6582; EPILOG:       loop_exiting_bb2.1:
6583; EPILOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
6584; EPILOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6585; EPILOG:       loop_latch.1:
6586; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
6587; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
6588; EPILOG-NEXT:    call void @bar()
6589; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit
6590; EPILOG:       loop_exiting_bb2.2:
6591; EPILOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
6592; EPILOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit
6593; EPILOG:       loop_latch.2:
6594; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
6595; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
6596; EPILOG-NEXT:    call void @bar()
6597; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit
6598; EPILOG:       loop_exiting_bb2.3:
6599; EPILOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
6600; EPILOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit
6601; EPILOG:       loop_latch.3:
6602; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
6603; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
6604; EPILOG-NEXT:    call void @bar()
6605; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit
6606; EPILOG:       loop_exiting_bb2.4:
6607; EPILOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
6608; EPILOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit
6609; EPILOG:       loop_latch.4:
6610; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
6611; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
6612; EPILOG-NEXT:    call void @bar()
6613; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit
6614; EPILOG:       loop_exiting_bb2.5:
6615; EPILOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
6616; EPILOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit
6617; EPILOG:       loop_latch.5:
6618; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
6619; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
6620; EPILOG-NEXT:    call void @bar()
6621; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit
6622; EPILOG:       loop_exiting_bb2.6:
6623; EPILOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
6624; EPILOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit
6625; EPILOG:       loop_latch.6:
6626; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
6627; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
6628; EPILOG-NEXT:    call void @bar()
6629; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit
6630; EPILOG:       loop_exiting_bb2.7:
6631; EPILOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
6632; EPILOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit
6633; EPILOG:       loop_latch.7:
6634; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
6635; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
6636; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
6637; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6638; EPILOG:       exit1.unr-lcssa.loopexit:
6639; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
6640; EPILOG-NEXT:    br label %exit1.unr-lcssa
6641; EPILOG:       exit1.unr-lcssa:
6642; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
6643; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6644; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6645; EPILOG:       loop_header.epil.preheader:
6646; EPILOG-NEXT:    br label %loop_header.epil
6647; EPILOG:       loop_header.epil:
6648; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
6649; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
6650; EPILOG-NEXT:    call void @bar()
6651; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1
6652; EPILOG:       loop_exiting_bb2.epil:
6653; EPILOG-NEXT:    %unknown.epil = call i1 @unknown_cond()
6654; EPILOG-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1
6655; EPILOG:       loop_latch.epil:
6656; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
6657; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
6658; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
6659; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
6660; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !18
6661; EPILOG:       exit1.epilog-lcssa.loopexit:
6662; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6663; EPILOG:       exit1.epilog-lcssa.loopexit1:
6664; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6665; EPILOG:       exit1.epilog-lcssa:
6666; EPILOG-NEXT:    br label %exit1
6667; EPILOG:       exit1:
6668; EPILOG-NEXT:    ret void
6669;
6670; EPILOG-BLOCK-LABEL: @test14(
6671; EPILOG-BLOCK-NEXT:  entry:
6672; EPILOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
6673; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
6674; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
6675; EPILOG-BLOCK-NEXT:    br i1 %1, label %exit1.unr-lcssa, label %entry.new
6676; EPILOG-BLOCK:       entry.new:
6677; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
6678; EPILOG-BLOCK-NEXT:    br label %loop_header
6679; EPILOG-BLOCK:       loop_header:
6680; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6681; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
6682; EPILOG-BLOCK-NEXT:    call void @bar()
6683; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6684; EPILOG-BLOCK:       loop_exiting_bb2:
6685; EPILOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6686; EPILOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6687; EPILOG-BLOCK:       loop_latch:
6688; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
6689; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
6690; EPILOG-BLOCK-NEXT:    call void @bar()
6691; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6692; EPILOG-BLOCK:       loop_exiting_bb2.1:
6693; EPILOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6694; EPILOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6695; EPILOG-BLOCK:       loop_latch.1:
6696; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6697; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
6698; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
6699; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !20
6700; EPILOG-BLOCK:       exit1.unr-lcssa.loopexit:
6701; EPILOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6702; EPILOG-BLOCK:       exit1.unr-lcssa:
6703; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6704; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6705; EPILOG-BLOCK:       loop_header.epil.preheader:
6706; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
6707; EPILOG-BLOCK:       loop_header.epil:
6708; EPILOG-BLOCK-NEXT:    call void @bar()
6709; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa
6710; EPILOG-BLOCK:       loop_exiting_bb2.epil:
6711; EPILOG-BLOCK-NEXT:    %unknown.epil = call i1 @unknown_cond()
6712; EPILOG-BLOCK-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa
6713; EPILOG-BLOCK:       loop_latch.epil:
6714; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6715; EPILOG-BLOCK:       exit1.epilog-lcssa.loopexit:
6716; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6717; EPILOG-BLOCK:       exit1.epilog-lcssa:
6718; EPILOG-BLOCK-NEXT:    br label %exit1
6719; EPILOG-BLOCK:       exit1:
6720; EPILOG-BLOCK-NEXT:    ret void
6721;
6722; PROLOG-LABEL: @test14(
6723; PROLOG-NEXT:  entry:
6724; PROLOG-NEXT:    %0 = add i64 %trip, -1
6725; PROLOG-NEXT:    %xtraiter = and i64 %trip, 7
6726; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6727; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6728; PROLOG:       loop_header.prol.preheader:
6729; PROLOG-NEXT:    br label %loop_header.prol
6730; PROLOG:       loop_header.prol:
6731; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
6732; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
6733; PROLOG-NEXT:    call void @bar()
6734; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1
6735; PROLOG:       loop_exiting_bb2.prol:
6736; PROLOG-NEXT:    %unknown.prol = call i1 @unknown_cond()
6737; PROLOG-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1
6738; PROLOG:       loop_latch.prol:
6739; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
6740; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
6741; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
6742; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
6743; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !18
6744; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
6745; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
6746; PROLOG-NEXT:    br label %loop_header.prol.loopexit
6747; PROLOG:       loop_header.prol.loopexit:
6748; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
6749; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
6750; PROLOG-NEXT:    br i1 %1, label %exit1, label %entry.new
6751; PROLOG:       entry.new:
6752; PROLOG-NEXT:    br label %loop_header
6753; PROLOG:       loop_header:
6754; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6755; PROLOG-NEXT:    call void @bar()
6756; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6757; PROLOG:       loop_exiting_bb2:
6758; PROLOG-NEXT:    %unknown = call i1 @unknown_cond()
6759; PROLOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6760; PROLOG:       loop_latch:
6761; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
6762; PROLOG-NEXT:    call void @bar()
6763; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6764; PROLOG:       loop_exiting_bb2.1:
6765; PROLOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
6766; PROLOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6767; PROLOG:       loop_latch.1:
6768; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6769; PROLOG-NEXT:    call void @bar()
6770; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit
6771; PROLOG:       loop_exiting_bb2.2:
6772; PROLOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
6773; PROLOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit
6774; PROLOG:       loop_latch.2:
6775; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
6776; PROLOG-NEXT:    call void @bar()
6777; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit
6778; PROLOG:       loop_exiting_bb2.3:
6779; PROLOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
6780; PROLOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit
6781; PROLOG:       loop_latch.3:
6782; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
6783; PROLOG-NEXT:    call void @bar()
6784; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit
6785; PROLOG:       loop_exiting_bb2.4:
6786; PROLOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
6787; PROLOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit
6788; PROLOG:       loop_latch.4:
6789; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
6790; PROLOG-NEXT:    call void @bar()
6791; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit
6792; PROLOG:       loop_exiting_bb2.5:
6793; PROLOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
6794; PROLOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit
6795; PROLOG:       loop_latch.5:
6796; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
6797; PROLOG-NEXT:    call void @bar()
6798; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit
6799; PROLOG:       loop_exiting_bb2.6:
6800; PROLOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
6801; PROLOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit
6802; PROLOG:       loop_latch.6:
6803; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
6804; PROLOG-NEXT:    call void @bar()
6805; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit
6806; PROLOG:       loop_exiting_bb2.7:
6807; PROLOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
6808; PROLOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit
6809; PROLOG:       loop_latch.7:
6810; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
6811; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
6812; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6813; PROLOG:       exit1.unr-lcssa.loopexit:
6814; PROLOG-NEXT:    br label %exit1.unr-lcssa
6815; PROLOG:       exit1.unr-lcssa.loopexit1:
6816; PROLOG-NEXT:    br label %exit1.unr-lcssa
6817; PROLOG:       exit1.unr-lcssa:
6818; PROLOG-NEXT:    br label %exit1
6819; PROLOG:       exit1:
6820; PROLOG-NEXT:    ret void
6821;
6822; PROLOG-BLOCK-LABEL: @test14(
6823; PROLOG-BLOCK-NEXT:  entry:
6824; PROLOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
6825; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
6826; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6827; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6828; PROLOG-BLOCK:       loop_header.prol.preheader:
6829; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
6830; PROLOG-BLOCK:       loop_header.prol:
6831; PROLOG-BLOCK-NEXT:    call void @bar()
6832; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa
6833; PROLOG-BLOCK:       loop_exiting_bb2.prol:
6834; PROLOG-BLOCK-NEXT:    %unknown.prol = call i1 @unknown_cond()
6835; PROLOG-BLOCK-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa
6836; PROLOG-BLOCK:       loop_latch.prol:
6837; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
6838; PROLOG-BLOCK:       loop_header.prol.loopexit:
6839; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
6840; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
6841; PROLOG-BLOCK-NEXT:    br i1 %1, label %exit1, label %entry.new
6842; PROLOG-BLOCK:       entry.new:
6843; PROLOG-BLOCK-NEXT:    br label %loop_header
6844; PROLOG-BLOCK:       loop_header:
6845; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6846; PROLOG-BLOCK-NEXT:    call void @bar()
6847; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6848; PROLOG-BLOCK:       loop_exiting_bb2:
6849; PROLOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6850; PROLOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6851; PROLOG-BLOCK:       loop_latch:
6852; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
6853; PROLOG-BLOCK-NEXT:    call void @bar()
6854; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6855; PROLOG-BLOCK:       loop_exiting_bb2.1:
6856; PROLOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6857; PROLOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6858; PROLOG-BLOCK:       loop_latch.1:
6859; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6860; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
6861; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !20
6862; PROLOG-BLOCK:       exit1.unr-lcssa.loopexit:
6863; PROLOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6864; PROLOG-BLOCK:       exit1.unr-lcssa:
6865; PROLOG-BLOCK-NEXT:    br label %exit1
6866; PROLOG-BLOCK:       exit1:
6867; PROLOG-BLOCK-NEXT:    ret void
6868;
6869entry:
6870  br label %loop_header
6871
6872loop_header:
6873  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
6874  call void @bar()
6875  br i1 %cond, label %loop_exiting_bb2, label %exit1
6876
6877loop_exiting_bb2:
6878  %unknown = call i1 @unknown_cond()
6879  br i1 %unknown, label %loop_latch, label %exit1
6880
6881loop_latch:
6882  %iv_next = add i64 %iv, 1
6883  %cmp = icmp ne i64 %iv_next, %trip
6884  br i1 %cmp, label %loop_header, label %exit1
6885
6886exit1:
6887  ret void
6888}
6889