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; FIXME: Support multiple exiting blocks to the unique exit block (LatchExit).
3021; Only 2 blocks in loop: header and latch where both exit to same LatchExit.
3022define void @unique_exit(i32 %arg) {
3023; CHECK-LABEL: @unique_exit(
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; two exiting and two exit blocks.
3067; the non-latch exiting block has duplicate edges to the non-latch exit block.
3068define i64 @test5(i64 %trip, i64 %add, i1 %cond) {
3069; EPILOG-LABEL: @test5(
3070; EPILOG-NEXT:  entry:
3071; EPILOG-NEXT:    %0 = add i64 %trip, -1
3072; EPILOG-NEXT:    %xtraiter = and i64 %trip, 7
3073; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
3074; EPILOG-NEXT:    br i1 %1, label %latchexit.unr-lcssa, label %entry.new
3075; EPILOG:       entry.new:
3076; EPILOG-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
3077; EPILOG-NEXT:    br label %loop_header
3078; EPILOG:       loop_header:
3079; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
3080; EPILOG-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
3081; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
3082; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3083; EPILOG:       loop_exiting:
3084; EPILOG-NEXT:    %ivy = add i64 %iv, %add
3085; EPILOG-NEXT:    switch i64 %sum, label %loop_latch [
3086; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3087; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3088; EPILOG-NEXT:    ]
3089; EPILOG:       loop_latch:
3090; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3091; EPILOG-NEXT:    %sum.next = add i64 %sum, %add
3092; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
3093; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3094; EPILOG:       loop_exiting.1:
3095; EPILOG-NEXT:    %ivy.1 = add i64 %iv_next, %add
3096; EPILOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3097; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3098; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3099; EPILOG-NEXT:    ]
3100; EPILOG:       loop_latch.1:
3101; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3102; EPILOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3103; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
3104; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.2
3105; EPILOG:       loop_exiting.2:
3106; EPILOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add
3107; EPILOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
3108; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3109; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3110; EPILOG-NEXT:    ]
3111; EPILOG:       loop_latch.2:
3112; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
3113; EPILOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
3114; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
3115; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.3
3116; EPILOG:       loop_exiting.3:
3117; EPILOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add
3118; EPILOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
3119; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3120; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3121; EPILOG-NEXT:    ]
3122; EPILOG:       loop_latch.3:
3123; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
3124; EPILOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
3125; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
3126; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.4
3127; EPILOG:       loop_exiting.4:
3128; EPILOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add
3129; EPILOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
3130; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3131; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3132; EPILOG-NEXT:    ]
3133; EPILOG:       loop_latch.4:
3134; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
3135; EPILOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
3136; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
3137; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.5
3138; EPILOG:       loop_exiting.5:
3139; EPILOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add
3140; EPILOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
3141; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3142; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3143; EPILOG-NEXT:    ]
3144; EPILOG:       loop_latch.5:
3145; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
3146; EPILOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
3147; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
3148; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.6
3149; EPILOG:       loop_exiting.6:
3150; EPILOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add
3151; EPILOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
3152; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3153; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3154; EPILOG-NEXT:    ]
3155; EPILOG:       loop_latch.6:
3156; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
3157; EPILOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
3158; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
3159; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.7
3160; EPILOG:       loop_exiting.7:
3161; EPILOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add
3162; EPILOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
3163; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3164; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3165; EPILOG-NEXT:    ]
3166; EPILOG:       loop_latch.7:
3167; EPILOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
3168; EPILOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
3169; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
3170; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
3171; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %latchexit.unr-lcssa.loopexit
3172; EPILOG:       exit1.loopexit:
3173; 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 ]
3174; EPILOG-NEXT:    br label %exit1
3175; EPILOG:       exit1.loopexit2:
3176; EPILOG-NEXT:    %result.ph3 = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ]
3177; EPILOG-NEXT:    br label %exit1
3178; EPILOG:       exit1:
3179; EPILOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph3, %exit1.loopexit2 ]
3180; EPILOG-NEXT:    ret i64 %result
3181; EPILOG:       latchexit.unr-lcssa.loopexit:
3182; EPILOG-NEXT:    %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3183; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
3184; EPILOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3185; EPILOG-NEXT:    br label %latchexit.unr-lcssa
3186; EPILOG:       latchexit.unr-lcssa:
3187; EPILOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ]
3188; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ]
3189; EPILOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ]
3190; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3191; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit
3192; EPILOG:       loop_header.epil.preheader:
3193; EPILOG-NEXT:    br label %loop_header.epil
3194; EPILOG:       loop_header.epil:
3195; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
3196; EPILOG-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]
3197; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
3198; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil
3199; EPILOG:       loop_exiting.epil:
3200; EPILOG-NEXT:    %ivy.epil = add i64 %iv.epil, %add
3201; EPILOG-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
3202; EPILOG-NEXT:    i64 24, label %exit1.loopexit2
3203; EPILOG-NEXT:    i64 42, label %exit1.loopexit2
3204; EPILOG-NEXT:    ]
3205; EPILOG:       loop_latch.epil:
3206; EPILOG-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
3207; EPILOG-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
3208; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
3209; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
3210; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
3211; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %latchexit.epilog-lcssa, !llvm.loop !8
3212; EPILOG:       latchexit.epilog-lcssa:
3213; EPILOG-NEXT:    %sum.next.lcssa.ph1 = phi i64 [ %sum.next.epil, %loop_latch.epil ]
3214; EPILOG-NEXT:    br label %latchexit
3215; EPILOG:       latchexit:
3216; EPILOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.lcssa.ph1, %latchexit.epilog-lcssa ]
3217; EPILOG-NEXT:    ret i64 %sum.next.lcssa
3218;
3219; EPILOG-BLOCK-LABEL: @test5(
3220; EPILOG-BLOCK-NEXT:  entry:
3221; EPILOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
3222; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
3223; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
3224; EPILOG-BLOCK-NEXT:    br i1 %1, label %latchexit.unr-lcssa, label %entry.new
3225; EPILOG-BLOCK:       entry.new:
3226; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
3227; EPILOG-BLOCK-NEXT:    br label %loop_header
3228; EPILOG-BLOCK:       loop_header:
3229; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
3230; EPILOG-BLOCK-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
3231; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
3232; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3233; EPILOG-BLOCK:       loop_exiting:
3234; EPILOG-BLOCK-NEXT:    %ivy = add i64 %iv, %add
3235; EPILOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
3236; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3237; EPILOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3238; EPILOG-BLOCK-NEXT:    ]
3239; EPILOG-BLOCK:       loop_latch:
3240; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3241; EPILOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
3242; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
3243; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3244; EPILOG-BLOCK:       loop_exiting.1:
3245; EPILOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add
3246; EPILOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3247; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3248; EPILOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3249; EPILOG-BLOCK-NEXT:    ]
3250; EPILOG-BLOCK:       loop_latch.1:
3251; EPILOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3252; EPILOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3253; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
3254; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
3255; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !8
3256; EPILOG-BLOCK:       exit1.loopexit:
3257; EPILOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]
3258; EPILOG-BLOCK-NEXT:    br label %exit1
3259; EPILOG-BLOCK:       exit1:
3260; EPILOG-BLOCK-NEXT:    %result = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ], [ %result.ph, %exit1.loopexit ]
3261; EPILOG-BLOCK-NEXT:    ret i64 %result
3262; EPILOG-BLOCK:       latchexit.unr-lcssa.loopexit:
3263; EPILOG-BLOCK-NEXT:    %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3264; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
3265; EPILOG-BLOCK-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3266; EPILOG-BLOCK-NEXT:    br label %latchexit.unr-lcssa
3267; EPILOG-BLOCK:       latchexit.unr-lcssa:
3268; EPILOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ]
3269; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ]
3270; EPILOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ]
3271; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3272; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit
3273; EPILOG-BLOCK:       loop_header.epil.preheader:
3274; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
3275; EPILOG-BLOCK:       loop_header.epil:
3276; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil
3277; EPILOG-BLOCK:       loop_exiting.epil:
3278; EPILOG-BLOCK-NEXT:    %ivy.epil = add i64 %iv.unr, %add
3279; EPILOG-BLOCK-NEXT:    switch i64 %sum.unr, label %loop_latch.epil [
3280; EPILOG-BLOCK-NEXT:    i64 24, label %exit1
3281; EPILOG-BLOCK-NEXT:    i64 42, label %exit1
3282; EPILOG-BLOCK-NEXT:    ]
3283; EPILOG-BLOCK:       loop_latch.epil:
3284; EPILOG-BLOCK-NEXT:    %sum.next.epil = add i64 %sum.unr, %add
3285; EPILOG-BLOCK-NEXT:    br label %latchexit
3286; EPILOG-BLOCK:       latchexit:
3287; EPILOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.epil, %loop_latch.epil ]
3288; EPILOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa
3289;
3290; PROLOG-LABEL: @test5(
3291; PROLOG-NEXT:  entry:
3292; PROLOG-NEXT:    %0 = add i64 %trip, -1
3293; PROLOG-NEXT:    %xtraiter = and i64 %trip, 7
3294; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3295; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
3296; PROLOG:       loop_header.prol.preheader:
3297; PROLOG-NEXT:    br label %loop_header.prol
3298; PROLOG:       loop_header.prol:
3299; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
3300; PROLOG-NEXT:    %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ]
3301; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
3302; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol
3303; PROLOG:       loop_exiting.prol:
3304; PROLOG-NEXT:    %ivy.prol = add i64 %iv.prol, %add
3305; PROLOG-NEXT:    switch i64 %sum.prol, label %loop_latch.prol [
3306; PROLOG-NEXT:    i64 24, label %exit1.loopexit1
3307; PROLOG-NEXT:    i64 42, label %exit1.loopexit1
3308; PROLOG-NEXT:    ]
3309; PROLOG:       loop_latch.prol:
3310; PROLOG-NEXT:    %iv_next.prol = add nuw nsw i64 %iv.prol, 1
3311; PROLOG-NEXT:    %sum.next.prol = add i64 %sum.prol, %add
3312; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
3313; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
3314; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
3315; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !8
3316; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
3317; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
3318; PROLOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
3319; PROLOG-NEXT:    %sum.next.lcssa.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
3320; PROLOG-NEXT:    br label %loop_header.prol.loopexit
3321; PROLOG:       loop_header.prol.loopexit:
3322; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
3323; PROLOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
3324; PROLOG-NEXT:    %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %sum.next.lcssa.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
3325; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
3326; PROLOG-NEXT:    br i1 %1, label %latchexit, label %entry.new
3327; PROLOG:       entry.new:
3328; PROLOG-NEXT:    br label %loop_header
3329; PROLOG:       loop_header:
3330; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
3331; PROLOG-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
3332; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3333; PROLOG:       loop_exiting:
3334; PROLOG-NEXT:    %ivy = add i64 %iv, %add
3335; PROLOG-NEXT:    switch i64 %sum, label %loop_latch [
3336; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3337; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3338; PROLOG-NEXT:    ]
3339; PROLOG:       loop_latch:
3340; PROLOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3341; PROLOG-NEXT:    %sum.next = add i64 %sum, %add
3342; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3343; PROLOG:       loop_exiting.1:
3344; PROLOG-NEXT:    %ivy.1 = add i64 %iv_next, %add
3345; PROLOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3346; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3347; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3348; PROLOG-NEXT:    ]
3349; PROLOG:       loop_latch.1:
3350; PROLOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3351; PROLOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3352; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.2
3353; PROLOG:       loop_exiting.2:
3354; PROLOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add
3355; PROLOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
3356; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3357; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3358; PROLOG-NEXT:    ]
3359; PROLOG:       loop_latch.2:
3360; PROLOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
3361; PROLOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
3362; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.3
3363; PROLOG:       loop_exiting.3:
3364; PROLOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add
3365; PROLOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
3366; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3367; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3368; PROLOG-NEXT:    ]
3369; PROLOG:       loop_latch.3:
3370; PROLOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
3371; PROLOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
3372; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.4
3373; PROLOG:       loop_exiting.4:
3374; PROLOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add
3375; PROLOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
3376; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3377; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3378; PROLOG-NEXT:    ]
3379; PROLOG:       loop_latch.4:
3380; PROLOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
3381; PROLOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
3382; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.5
3383; PROLOG:       loop_exiting.5:
3384; PROLOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add
3385; PROLOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
3386; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3387; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3388; PROLOG-NEXT:    ]
3389; PROLOG:       loop_latch.5:
3390; PROLOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
3391; PROLOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
3392; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.6
3393; PROLOG:       loop_exiting.6:
3394; PROLOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add
3395; PROLOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
3396; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3397; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3398; PROLOG-NEXT:    ]
3399; PROLOG:       loop_latch.6:
3400; PROLOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
3401; PROLOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
3402; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.7
3403; PROLOG:       loop_exiting.7:
3404; PROLOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add
3405; PROLOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
3406; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3407; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3408; PROLOG-NEXT:    ]
3409; PROLOG:       loop_latch.7:
3410; PROLOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
3411; PROLOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
3412; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
3413; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %latchexit.unr-lcssa
3414; PROLOG:       exit1.loopexit:
3415; 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 ]
3416; PROLOG-NEXT:    br label %exit1
3417; PROLOG:       exit1.loopexit1:
3418; PROLOG-NEXT:    %result.ph2 = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ]
3419; PROLOG-NEXT:    br label %exit1
3420; PROLOG:       exit1:
3421; PROLOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph2, %exit1.loopexit1 ]
3422; PROLOG-NEXT:    ret i64 %result
3423; PROLOG:       latchexit.unr-lcssa:
3424; PROLOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3425; PROLOG-NEXT:    br label %latchexit
3426; PROLOG:       latchexit:
3427; PROLOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]
3428; PROLOG-NEXT:    ret i64 %sum.next.lcssa
3429;
3430; PROLOG-BLOCK-LABEL: @test5(
3431; PROLOG-BLOCK-NEXT:  entry:
3432; PROLOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
3433; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
3434; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3435; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
3436; PROLOG-BLOCK:       loop_header.prol.preheader:
3437; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
3438; PROLOG-BLOCK:       loop_header.prol:
3439; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol
3440; PROLOG-BLOCK:       loop_exiting.prol:
3441; PROLOG-BLOCK-NEXT:    switch i64 0, label %loop_latch.prol [
3442; PROLOG-BLOCK-NEXT:    i64 24, label %exit1
3443; PROLOG-BLOCK-NEXT:    i64 42, label %exit1
3444; PROLOG-BLOCK-NEXT:    ]
3445; PROLOG-BLOCK:       loop_latch.prol:
3446; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
3447; PROLOG-BLOCK:       loop_header.prol.loopexit:
3448; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
3449; PROLOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %add, %loop_latch.prol ]
3450; PROLOG-BLOCK-NEXT:    %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %add, %loop_latch.prol ]
3451; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
3452; PROLOG-BLOCK-NEXT:    br i1 %1, label %latchexit, label %entry.new
3453; PROLOG-BLOCK:       entry.new:
3454; PROLOG-BLOCK-NEXT:    br label %loop_header
3455; PROLOG-BLOCK:       loop_header:
3456; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
3457; PROLOG-BLOCK-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
3458; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3459; PROLOG-BLOCK:       loop_exiting:
3460; PROLOG-BLOCK-NEXT:    %ivy = add i64 %iv, %add
3461; PROLOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
3462; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3463; PROLOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3464; PROLOG-BLOCK-NEXT:    ]
3465; PROLOG-BLOCK:       loop_latch:
3466; PROLOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3467; PROLOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
3468; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3469; PROLOG-BLOCK:       loop_exiting.1:
3470; PROLOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add
3471; PROLOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3472; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3473; PROLOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3474; PROLOG-BLOCK-NEXT:    ]
3475; PROLOG-BLOCK:       loop_latch.1:
3476; PROLOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3477; PROLOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3478; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
3479; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %latchexit.unr-lcssa, !llvm.loop !8
3480; PROLOG-BLOCK:       exit1.loopexit:
3481; PROLOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]
3482; PROLOG-BLOCK-NEXT:    br label %exit1
3483; PROLOG-BLOCK:       exit1:
3484; PROLOG-BLOCK-NEXT:    %result = phi i64 [ %add, %loop_exiting.prol ], [ %add, %loop_exiting.prol ], [ %result.ph, %exit1.loopexit ]
3485; PROLOG-BLOCK-NEXT:    ret i64 %result
3486; PROLOG-BLOCK:       latchexit.unr-lcssa:
3487; PROLOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3488; PROLOG-BLOCK-NEXT:    br label %latchexit
3489; PROLOG-BLOCK:       latchexit:
3490; PROLOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]
3491; PROLOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa
3492;
3493
3494entry:
3495  br label %loop_header
3496
3497loop_header:
3498  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
3499  %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ]
3500  br i1 %cond, label %loop_latch, label %loop_exiting
3501
3502loop_exiting:
3503  %ivy = add i64 %iv, %add
3504  switch i64 %sum, label %loop_latch [
3505  i64 24, label %exit1
3506  i64 42, label %exit1
3507  ]
3508
3509loop_latch:
3510  %iv_next = add nuw nsw i64 %iv, 1
3511  %sum.next = add i64 %sum, %add
3512  %cmp = icmp ne i64 %iv_next, %trip
3513  br i1 %cmp, label %loop_header, label %latchexit
3514
3515exit1:
3516  %result = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ]
3517  ret i64 %result
3518
3519latchexit:
3520  ret i64 %sum.next
3521}
3522
3523; test when exit blocks have successors.
3524define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) {
3525; EPILOG-LABEL: @test6(
3526; EPILOG-NEXT:  entry:
3527; EPILOG-NEXT:    %0 = add i64 %n, -1
3528; EPILOG-NEXT:    %xtraiter = and i64 %n, 7
3529; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
3530; EPILOG-NEXT:    br i1 %1, label %latch_exit.unr-lcssa, label %entry.new
3531; EPILOG:       entry.new:
3532; EPILOG-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
3533; EPILOG-NEXT:    br label %header
3534; EPILOG:       header:
3535; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
3536; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
3537; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
3538; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
3539; EPILOG:       for.exiting_block:
3540; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
3541; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
3542; EPILOG:       latch:
3543; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3544; EPILOG-NEXT:    %load = load i32, i32* %arrayidx, align 4
3545; EPILOG-NEXT:    %add = add nsw i32 %load, %sum.02
3546; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
3547; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
3548; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
3549; EPILOG:       for.exiting_block.1:
3550; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3551; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3552; EPILOG:       latch.1:
3553; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3554; EPILOG-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
3555; EPILOG-NEXT:    %add.1 = add nsw i32 %load.1, %add
3556; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
3557; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
3558; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
3559; EPILOG:       for.exiting_block.2:
3560; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
3561; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
3562; EPILOG:       latch.2:
3563; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
3564; EPILOG-NEXT:    %load.2 = load i32, i32* %arrayidx.2, align 4
3565; EPILOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.1
3566; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
3567; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
3568; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
3569; EPILOG:       for.exiting_block.3:
3570; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
3571; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
3572; EPILOG:       latch.3:
3573; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
3574; EPILOG-NEXT:    %load.3 = load i32, i32* %arrayidx.3, align 4
3575; EPILOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.2
3576; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
3577; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
3578; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
3579; EPILOG:       for.exiting_block.4:
3580; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
3581; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
3582; EPILOG:       latch.4:
3583; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
3584; EPILOG-NEXT:    %load.4 = load i32, i32* %arrayidx.4, align 4
3585; EPILOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.3
3586; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
3587; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
3588; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
3589; EPILOG:       for.exiting_block.5:
3590; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
3591; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
3592; EPILOG:       latch.5:
3593; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
3594; EPILOG-NEXT:    %load.5 = load i32, i32* %arrayidx.5, align 4
3595; EPILOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.4
3596; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
3597; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
3598; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
3599; EPILOG:       for.exiting_block.6:
3600; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
3601; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
3602; EPILOG:       latch.6:
3603; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
3604; EPILOG-NEXT:    %load.6 = load i32, i32* %arrayidx.6, align 4
3605; EPILOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.5
3606; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
3607; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
3608; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
3609; EPILOG:       for.exiting_block.7:
3610; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
3611; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
3612; EPILOG:       latch.7:
3613; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
3614; EPILOG-NEXT:    %load.7 = load i32, i32* %arrayidx.7, align 4
3615; EPILOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.6
3616; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
3617; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
3618; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
3619; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latch_exit.unr-lcssa.loopexit, label %header
3620; EPILOG:       latch_exit.unr-lcssa.loopexit:
3621; EPILOG-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %latch.7 ]
3622; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
3623; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
3624; EPILOG-NEXT:    br label %latch_exit.unr-lcssa
3625; EPILOG:       latch_exit.unr-lcssa:
3626; EPILOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ]
3627; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3628; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3629; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3630; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit
3631; EPILOG:       header.epil.preheader:
3632; EPILOG-NEXT:    br label %header.epil
3633; EPILOG:       header.epil:
3634; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
3635; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
3636; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
3637; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil
3638; EPILOG:       for.exiting_block.epil:
3639; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
3640; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit2, label %latch.epil
3641; EPILOG:       latch.epil:
3642; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
3643; EPILOG-NEXT:    %load.epil = load i32, i32* %arrayidx.epil, align 4
3644; EPILOG-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.epil
3645; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
3646; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
3647; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
3648; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
3649; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latch_exit.epilog-lcssa, !llvm.loop !9
3650; EPILOG:       latch_exit.epilog-lcssa:
3651; EPILOG-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %latch.epil ]
3652; EPILOG-NEXT:    br label %latch_exit
3653; EPILOG:       latch_exit:
3654; EPILOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %sum.0.lcssa.ph1, %latch_exit.epilog-lcssa ]
3655; EPILOG-NEXT:    ret i32 %sum.0.lcssa
3656; EPILOG:       for.exit2.loopexit:
3657; 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 ]
3658; EPILOG-NEXT:    br label %for.exit2
3659; EPILOG:       for.exit2.loopexit2:
3660; EPILOG-NEXT:    %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
3661; EPILOG-NEXT:    br label %for.exit2
3662; EPILOG:       for.exit2:
3663; EPILOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
3664; EPILOG-NEXT:    %addx = add i32 %retval, %x
3665; EPILOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3666; EPILOG:       exit_true:
3667; EPILOG-NEXT:    ret i32 %retval
3668; EPILOG:       exit_false:
3669; EPILOG-NEXT:    ret i32 %addx
3670;
3671; EPILOG-BLOCK-LABEL: @test6(
3672; EPILOG-BLOCK-NEXT:  entry:
3673; EPILOG-BLOCK-NEXT:    %0 = add i64 %n, -1
3674; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
3675; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
3676; EPILOG-BLOCK-NEXT:    br i1 %1, label %latch_exit.unr-lcssa, label %entry.new
3677; EPILOG-BLOCK:       entry.new:
3678; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
3679; EPILOG-BLOCK-NEXT:    br label %header
3680; EPILOG-BLOCK:       header:
3681; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
3682; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
3683; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
3684; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
3685; EPILOG-BLOCK:       for.exiting_block:
3686; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
3687; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
3688; EPILOG-BLOCK:       latch:
3689; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3690; EPILOG-BLOCK-NEXT:    %load = load i32, i32* %arrayidx, align 4
3691; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %load, %sum.02
3692; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
3693; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
3694; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
3695; EPILOG-BLOCK:       for.exiting_block.1:
3696; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3697; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3698; EPILOG-BLOCK:       latch.1:
3699; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3700; EPILOG-BLOCK-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
3701; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add
3702; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
3703; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
3704; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
3705; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latch_exit.unr-lcssa.loopexit, label %header, !llvm.loop !9
3706; EPILOG-BLOCK:       latch_exit.unr-lcssa.loopexit:
3707; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %latch.1 ]
3708; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
3709; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
3710; EPILOG-BLOCK-NEXT:    br label %latch_exit.unr-lcssa
3711; EPILOG-BLOCK:       latch_exit.unr-lcssa:
3712; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ]
3713; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3714; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3715; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3716; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit
3717; EPILOG-BLOCK:       header.epil.preheader:
3718; EPILOG-BLOCK-NEXT:    br label %header.epil
3719; EPILOG-BLOCK:       header.epil:
3720; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.epil
3721; EPILOG-BLOCK:       for.exiting_block.epil:
3722; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
3723; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %latch.epil
3724; EPILOG-BLOCK:       latch.epil:
3725; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
3726; EPILOG-BLOCK-NEXT:    %load.epil = load i32, i32* %arrayidx.epil, align 4
3727; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.unr
3728; EPILOG-BLOCK-NEXT:    br label %latch_exit
3729; EPILOG-BLOCK:       latch_exit:
3730; EPILOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %add.epil, %latch.epil ]
3731; EPILOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
3732; EPILOG-BLOCK:       for.exit2.loopexit:
3733; EPILOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]
3734; EPILOG-BLOCK-NEXT:    br label %for.exit2
3735; EPILOG-BLOCK:       for.exit2:
3736; EPILOG-BLOCK-NEXT:    %retval = phi i32 [ %sum.02.unr, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ]
3737; EPILOG-BLOCK-NEXT:    %addx = add i32 %retval, %x
3738; EPILOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3739; EPILOG-BLOCK:       exit_true:
3740; EPILOG-BLOCK-NEXT:    ret i32 %retval
3741; EPILOG-BLOCK:       exit_false:
3742; EPILOG-BLOCK-NEXT:    ret i32 %addx
3743;
3744; PROLOG-LABEL: @test6(
3745; PROLOG-NEXT:  entry:
3746; PROLOG-NEXT:    %0 = add i64 %n, -1
3747; PROLOG-NEXT:    %xtraiter = and i64 %n, 7
3748; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3749; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
3750; PROLOG:       header.prol.preheader:
3751; PROLOG-NEXT:    br label %header.prol
3752; PROLOG:       header.prol:
3753; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
3754; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
3755; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
3756; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol
3757; PROLOG:       for.exiting_block.prol:
3758; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
3759; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit1, label %latch.prol
3760; PROLOG:       latch.prol:
3761; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
3762; PROLOG-NEXT:    %load.prol = load i32, i32* %arrayidx.prol, align 4
3763; PROLOG-NEXT:    %add.prol = add nsw i32 %load.prol, %sum.02.prol
3764; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
3765; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
3766; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
3767; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
3768; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !9
3769; PROLOG:       header.prol.loopexit.unr-lcssa:
3770; PROLOG-NEXT:    %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %latch.prol ]
3771; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
3772; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
3773; PROLOG-NEXT:    br label %header.prol.loopexit
3774; PROLOG:       header.prol.loopexit:
3775; PROLOG-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ]
3776; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
3777; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
3778; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
3779; PROLOG-NEXT:    br i1 %1, label %latch_exit, label %entry.new
3780; PROLOG:       entry.new:
3781; PROLOG-NEXT:    br label %header
3782; PROLOG:       header:
3783; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
3784; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
3785; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
3786; PROLOG:       for.exiting_block:
3787; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
3788; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
3789; PROLOG:       latch:
3790; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3791; PROLOG-NEXT:    %load = load i32, i32* %arrayidx, align 4
3792; PROLOG-NEXT:    %add = add nsw i32 %load, %sum.02
3793; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
3794; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
3795; PROLOG:       for.exiting_block.1:
3796; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3797; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3798; PROLOG:       latch.1:
3799; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3800; PROLOG-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
3801; PROLOG-NEXT:    %add.1 = add nsw i32 %load.1, %add
3802; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
3803; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
3804; PROLOG:       for.exiting_block.2:
3805; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
3806; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
3807; PROLOG:       latch.2:
3808; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
3809; PROLOG-NEXT:    %load.2 = load i32, i32* %arrayidx.2, align 4
3810; PROLOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.1
3811; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
3812; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
3813; PROLOG:       for.exiting_block.3:
3814; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
3815; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
3816; PROLOG:       latch.3:
3817; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
3818; PROLOG-NEXT:    %load.3 = load i32, i32* %arrayidx.3, align 4
3819; PROLOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.2
3820; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
3821; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
3822; PROLOG:       for.exiting_block.4:
3823; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
3824; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
3825; PROLOG:       latch.4:
3826; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
3827; PROLOG-NEXT:    %load.4 = load i32, i32* %arrayidx.4, align 4
3828; PROLOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.3
3829; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
3830; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
3831; PROLOG:       for.exiting_block.5:
3832; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
3833; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
3834; PROLOG:       latch.5:
3835; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
3836; PROLOG-NEXT:    %load.5 = load i32, i32* %arrayidx.5, align 4
3837; PROLOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.4
3838; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
3839; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
3840; PROLOG:       for.exiting_block.6:
3841; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
3842; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
3843; PROLOG:       latch.6:
3844; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
3845; PROLOG-NEXT:    %load.6 = load i32, i32* %arrayidx.6, align 4
3846; PROLOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.5
3847; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
3848; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
3849; PROLOG:       for.exiting_block.7:
3850; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
3851; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
3852; PROLOG:       latch.7:
3853; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
3854; PROLOG-NEXT:    %load.7 = load i32, i32* %arrayidx.7, align 4
3855; PROLOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.6
3856; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
3857; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
3858; PROLOG-NEXT:    br i1 %exitcond.7, label %latch_exit.unr-lcssa, label %header
3859; PROLOG:       latch_exit.unr-lcssa:
3860; PROLOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %latch.7 ]
3861; PROLOG-NEXT:    br label %latch_exit
3862; PROLOG:       latch_exit:
3863; PROLOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]
3864; PROLOG-NEXT:    ret i32 %sum.0.lcssa
3865; PROLOG:       for.exit2.loopexit:
3866; 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 ]
3867; PROLOG-NEXT:    br label %for.exit2
3868; PROLOG:       for.exit2.loopexit1:
3869; PROLOG-NEXT:    %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
3870; PROLOG-NEXT:    br label %for.exit2
3871; PROLOG:       for.exit2:
3872; PROLOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
3873; PROLOG-NEXT:    %addx = add i32 %retval, %x
3874; PROLOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3875; PROLOG:       exit_true:
3876; PROLOG-NEXT:    ret i32 %retval
3877; PROLOG:       exit_false:
3878; PROLOG-NEXT:    ret i32 %addx
3879;
3880; PROLOG-BLOCK-LABEL: @test6(
3881; PROLOG-BLOCK-NEXT:  entry:
3882; PROLOG-BLOCK-NEXT:    %0 = add i64 %n, -1
3883; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
3884; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3885; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
3886; PROLOG-BLOCK:       header.prol.preheader:
3887; PROLOG-BLOCK-NEXT:    br label %header.prol
3888; PROLOG-BLOCK:       header.prol:
3889; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.prol
3890; PROLOG-BLOCK:       for.exiting_block.prol:
3891; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
3892; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %latch.prol
3893; PROLOG-BLOCK:       latch.prol:
3894; PROLOG-BLOCK-NEXT:    %load.prol = load i32, i32* %a, align 4
3895; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
3896; PROLOG-BLOCK:       header.prol.loopexit:
3897; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %load.prol, %latch.prol ]
3898; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
3899; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %load.prol, %latch.prol ]
3900; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
3901; PROLOG-BLOCK-NEXT:    br i1 %1, label %latch_exit, label %entry.new
3902; PROLOG-BLOCK:       entry.new:
3903; PROLOG-BLOCK-NEXT:    br label %header
3904; PROLOG-BLOCK:       header:
3905; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
3906; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
3907; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
3908; PROLOG-BLOCK:       for.exiting_block:
3909; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
3910; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
3911; PROLOG-BLOCK:       latch:
3912; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3913; PROLOG-BLOCK-NEXT:    %load = load i32, i32* %arrayidx, align 4
3914; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %load, %sum.02
3915; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
3916; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
3917; PROLOG-BLOCK:       for.exiting_block.1:
3918; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3919; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3920; PROLOG-BLOCK:       latch.1:
3921; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3922; PROLOG-BLOCK-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
3923; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add
3924; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
3925; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
3926; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latch_exit.unr-lcssa, label %header, !llvm.loop !9
3927; PROLOG-BLOCK:       latch_exit.unr-lcssa:
3928; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %latch.1 ]
3929; PROLOG-BLOCK-NEXT:    br label %latch_exit
3930; PROLOG-BLOCK:       latch_exit:
3931; PROLOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]
3932; PROLOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
3933; PROLOG-BLOCK:       for.exit2.loopexit:
3934; PROLOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]
3935; PROLOG-BLOCK-NEXT:    br label %for.exit2
3936; PROLOG-BLOCK:       for.exit2:
3937; PROLOG-BLOCK-NEXT:    %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ]
3938; PROLOG-BLOCK-NEXT:    %addx = add i32 %retval, %x
3939; PROLOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3940; PROLOG-BLOCK:       exit_true:
3941; PROLOG-BLOCK-NEXT:    ret i32 %retval
3942; PROLOG-BLOCK:       exit_false:
3943; PROLOG-BLOCK-NEXT:    ret i32 %addx
3944;
3945
3946entry:
3947  br label %header
3948
3949header:
3950  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
3951  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
3952  br i1 false, label %for.exit2, label %for.exiting_block
3953
3954for.exiting_block:
3955  %cmp = icmp eq i64 %n, 42
3956  br i1 %cmp, label %for.exit2, label %latch
3957
3958latch:
3959  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3960  %load = load i32, i32* %arrayidx, align 4
3961  %add = add nsw i32 %load, %sum.02
3962  %indvars.iv.next = add i64 %indvars.iv, 1
3963  %exitcond = icmp eq i64 %indvars.iv.next, %n
3964  br i1 %exitcond, label %latch_exit, label %header
3965
3966latch_exit:
3967  %sum.0.lcssa = phi i32 [ %add, %latch ]
3968  ret i32 %sum.0.lcssa
3969
3970for.exit2:
3971  %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ]
3972  %addx = add i32 %retval, %x
3973  br i1 %cond, label %exit_true, label %exit_false
3974
3975exit_true:
3976  ret i32 %retval
3977
3978exit_false:
3979  ret i32 %addx
3980}
3981
3982; test when value in exit block does not have VMap.
3983define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) {
3984; EPILOG-LABEL: @test7(
3985; EPILOG-NEXT:  bb:
3986; EPILOG-NEXT:    %i = icmp slt i32 undef, 2
3987; EPILOG-NEXT:    %sext = sext i32 undef to i64
3988; EPILOG-NEXT:    %shft = ashr exact i32 %arg, 16
3989; EPILOG-NEXT:    br i1 %i, label %loopexit2, label %preheader
3990; EPILOG:       preheader:
3991; EPILOG-NEXT:    %0 = add nsw i64 %sext, -1
3992; EPILOG-NEXT:    %1 = add nsw i64 %sext, -2
3993; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
3994; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
3995; EPILOG-NEXT:    br i1 %2, label %latchexit.unr-lcssa, label %preheader.new
3996; EPILOG:       preheader.new:
3997; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
3998; EPILOG-NEXT:    br label %header
3999; EPILOG:       header:
4000; EPILOG-NEXT:    %i6 = phi i64 [ 1, %preheader.new ], [ %add.7, %latch.7 ]
4001; EPILOG-NEXT:    %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ]
4002; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4003; EPILOG:       latch:
4004; EPILOG-NEXT:    %add = add nuw nsw i64 %i6, 1
4005; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
4006; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4007; EPILOG:       latch.1:
4008; EPILOG-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4009; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
4010; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.2
4011; EPILOG:       latch.2:
4012; EPILOG-NEXT:    %add.2 = add nuw nsw i64 %add.1, 1
4013; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
4014; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.3
4015; EPILOG:       latch.3:
4016; EPILOG-NEXT:    %add.3 = add nuw nsw i64 %add.2, 1
4017; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
4018; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.4
4019; EPILOG:       latch.4:
4020; EPILOG-NEXT:    %add.4 = add nuw nsw i64 %add.3, 1
4021; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
4022; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.5
4023; EPILOG:       latch.5:
4024; EPILOG-NEXT:    %add.5 = add nuw nsw i64 %add.4, 1
4025; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
4026; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.6
4027; EPILOG:       latch.6:
4028; EPILOG-NEXT:    %add.6 = add nuw nsw i64 %add.5, 1
4029; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
4030; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.7
4031; EPILOG:       latch.7:
4032; EPILOG-NEXT:    %add.7 = add nuw nsw i64 %add.6, 1
4033; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
4034; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
4035; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %latchexit.unr-lcssa.loopexit
4036; EPILOG:       latchexit.unr-lcssa.loopexit:
4037; EPILOG-NEXT:    %i6.unr.ph = phi i64 [ %add.7, %latch.7 ]
4038; EPILOG-NEXT:    br label %latchexit.unr-lcssa
4039; EPILOG:       latchexit.unr-lcssa:
4040; EPILOG-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ]
4041; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4042; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit
4043; EPILOG:       header.epil.preheader:
4044; EPILOG-NEXT:    br label %header.epil
4045; EPILOG:       header.epil:
4046; EPILOG-NEXT:    %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ], [ %add.epil, %latch.epil ]
4047; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
4048; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit1, label %latch.epil
4049; EPILOG:       latch.epil:
4050; EPILOG-NEXT:    %add.epil = add nuw nsw i64 %i6.epil, 1
4051; EPILOG-NEXT:    %i9.epil = icmp slt i64 %add.epil, %sext
4052; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
4053; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
4054; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchexit.epilog-lcssa, !llvm.loop !10
4055; EPILOG:       latchexit.epilog-lcssa:
4056; EPILOG-NEXT:    br label %latchexit
4057; EPILOG:       latchexit:
4058; EPILOG-NEXT:    unreachable
4059; EPILOG:       loopexit2:
4060; EPILOG-NEXT:    ret i32 %shft
4061; EPILOG:       loopexit1.loopexit:
4062; 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 ]
4063; EPILOG-NEXT:    br label %loopexit1
4064; EPILOG:       loopexit1.loopexit1:
4065; EPILOG-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.epil ]
4066; EPILOG-NEXT:    br label %loopexit1
4067; EPILOG:       loopexit1:
4068; EPILOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
4069; EPILOG-NEXT:    ret i32 %sext3
4070;
4071; EPILOG-BLOCK-LABEL: @test7(
4072; EPILOG-BLOCK-NEXT:  bb:
4073; EPILOG-BLOCK-NEXT:    %i = icmp slt i32 undef, 2
4074; EPILOG-BLOCK-NEXT:    %sext = sext i32 undef to i64
4075; EPILOG-BLOCK-NEXT:    %shft = ashr exact i32 %arg, 16
4076; EPILOG-BLOCK-NEXT:    br i1 %i, label %loopexit2, label %preheader
4077; EPILOG-BLOCK:       preheader:
4078; EPILOG-BLOCK-NEXT:    %0 = add nsw i64 %sext, -1
4079; EPILOG-BLOCK-NEXT:    %1 = add nsw i64 %sext, -2
4080; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4081; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4082; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchexit.unr-lcssa, label %preheader.new
4083; EPILOG-BLOCK:       preheader.new:
4084; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
4085; EPILOG-BLOCK-NEXT:    br label %header
4086; EPILOG-BLOCK:       header:
4087; EPILOG-BLOCK-NEXT:    %i6 = phi i64 [ 1, %preheader.new ], [ %add.1, %latch.1 ]
4088; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ]
4089; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4090; EPILOG-BLOCK:       latch:
4091; EPILOG-BLOCK-NEXT:    %add = add nuw nsw i64 %i6, 1
4092; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
4093; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4094; EPILOG-BLOCK:       latch.1:
4095; EPILOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4096; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
4097; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
4098; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !10
4099; EPILOG-BLOCK:       latchexit.unr-lcssa.loopexit:
4100; EPILOG-BLOCK-NEXT:    br label %latchexit.unr-lcssa
4101; EPILOG-BLOCK:       latchexit.unr-lcssa:
4102; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4103; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit
4104; EPILOG-BLOCK:       header.epil.preheader:
4105; EPILOG-BLOCK-NEXT:    br label %header.epil
4106; EPILOG-BLOCK:       header.epil:
4107; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1, label %latch.epil
4108; EPILOG-BLOCK:       latch.epil:
4109; EPILOG-BLOCK-NEXT:    br label %latchexit
4110; EPILOG-BLOCK:       latchexit:
4111; EPILOG-BLOCK-NEXT:    unreachable
4112; EPILOG-BLOCK:       loopexit2:
4113; EPILOG-BLOCK-NEXT:    ret i32 %shft
4114; EPILOG-BLOCK:       loopexit1.loopexit:
4115; EPILOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]
4116; EPILOG-BLOCK-NEXT:    br label %loopexit1
4117; EPILOG-BLOCK:       loopexit1:
4118; EPILOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.epil ], [ %sext3.ph, %loopexit1.loopexit ]
4119; EPILOG-BLOCK-NEXT:    ret i32 %sext3
4120;
4121; PROLOG-LABEL: @test7(
4122; PROLOG-NEXT:  bb:
4123; PROLOG-NEXT:    %i = icmp slt i32 undef, 2
4124; PROLOG-NEXT:    %sext = sext i32 undef to i64
4125; PROLOG-NEXT:    %shft = ashr exact i32 %arg, 16
4126; PROLOG-NEXT:    br i1 %i, label %loopexit2, label %preheader
4127; PROLOG:       preheader:
4128; PROLOG-NEXT:    %0 = add nsw i64 %sext, -1
4129; PROLOG-NEXT:    %1 = add nsw i64 %sext, -2
4130; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
4131; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4132; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4133; PROLOG:       header.prol.preheader:
4134; PROLOG-NEXT:    br label %header.prol
4135; PROLOG:       header.prol:
4136; PROLOG-NEXT:    %i6.prol = phi i64 [ 1, %header.prol.preheader ], [ %add.prol, %latch.prol ]
4137; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
4138; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit1, label %latch.prol
4139; PROLOG:       latch.prol:
4140; PROLOG-NEXT:    %add.prol = add nuw nsw i64 %i6.prol, 1
4141; PROLOG-NEXT:    %i9.prol = icmp slt i64 %add.prol, %sext
4142; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
4143; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
4144; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !10
4145; PROLOG:       header.prol.loopexit.unr-lcssa:
4146; PROLOG-NEXT:    %i6.unr.ph = phi i64 [ %add.prol, %latch.prol ]
4147; PROLOG-NEXT:    br label %header.prol.loopexit
4148; PROLOG:       header.prol.loopexit:
4149; PROLOG-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %header.prol.loopexit.unr-lcssa ]
4150; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
4151; PROLOG-NEXT:    br i1 %2, label %latchexit, label %preheader.new
4152; PROLOG:       preheader.new:
4153; PROLOG-NEXT:    br label %header
4154; PROLOG:       header:
4155; PROLOG-NEXT:    %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.7, %latch.7 ]
4156; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4157; PROLOG:       latch:
4158; PROLOG-NEXT:    %add = add nuw nsw i64 %i6, 1
4159; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4160; PROLOG:       latch.1:
4161; PROLOG-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4162; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.2
4163; PROLOG:       latch.2:
4164; PROLOG-NEXT:    %add.2 = add nuw nsw i64 %add.1, 1
4165; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.3
4166; PROLOG:       latch.3:
4167; PROLOG-NEXT:    %add.3 = add nuw nsw i64 %add.2, 1
4168; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.4
4169; PROLOG:       latch.4:
4170; PROLOG-NEXT:    %add.4 = add nuw nsw i64 %add.3, 1
4171; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.5
4172; PROLOG:       latch.5:
4173; PROLOG-NEXT:    %add.5 = add nuw nsw i64 %add.4, 1
4174; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.6
4175; PROLOG:       latch.6:
4176; PROLOG-NEXT:    %add.6 = add nuw nsw i64 %add.5, 1
4177; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.7
4178; PROLOG:       latch.7:
4179; PROLOG-NEXT:    %add.7 = add nuw nsw i64 %add.6, 1
4180; PROLOG-NEXT:    %i9.7 = icmp slt i64 %add.7, %sext
4181; PROLOG-NEXT:    br i1 %i9.7, label %header, label %latchexit.unr-lcssa
4182; PROLOG:       latchexit.unr-lcssa:
4183; PROLOG-NEXT:    br label %latchexit
4184; PROLOG:       latchexit:
4185; PROLOG-NEXT:    unreachable
4186; PROLOG:       loopexit2:
4187; PROLOG-NEXT:    ret i32 %shft
4188; PROLOG:       loopexit1.loopexit:
4189; 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 ]
4190; PROLOG-NEXT:    br label %loopexit1
4191; PROLOG:       loopexit1.loopexit1:
4192; PROLOG-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.prol ]
4193; PROLOG-NEXT:    br label %loopexit1
4194; PROLOG:       loopexit1:
4195; PROLOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
4196; PROLOG-NEXT:    ret i32 %sext3
4197;
4198; PROLOG-BLOCK-LABEL: @test7(
4199; PROLOG-BLOCK-NEXT:  bb:
4200; PROLOG-BLOCK-NEXT:    %i = icmp slt i32 undef, 2
4201; PROLOG-BLOCK-NEXT:    %sext = sext i32 undef to i64
4202; PROLOG-BLOCK-NEXT:    %shft = ashr exact i32 %arg, 16
4203; PROLOG-BLOCK-NEXT:    br i1 %i, label %loopexit2, label %preheader
4204; PROLOG-BLOCK:       preheader:
4205; PROLOG-BLOCK-NEXT:    %0 = add nsw i64 %sext, -1
4206; PROLOG-BLOCK-NEXT:    %1 = add nsw i64 %sext, -2
4207; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4208; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4209; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4210; PROLOG-BLOCK:       header.prol.preheader:
4211; PROLOG-BLOCK-NEXT:    br label %header.prol
4212; PROLOG-BLOCK:       header.prol:
4213; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1, label %latch.prol
4214; PROLOG-BLOCK:       latch.prol:
4215; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
4216; PROLOG-BLOCK:       header.prol.loopexit:
4217; PROLOG-BLOCK-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ 2, %latch.prol ]
4218; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4219; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchexit, label %preheader.new
4220; PROLOG-BLOCK:       preheader.new:
4221; PROLOG-BLOCK-NEXT:    br label %header
4222; PROLOG-BLOCK:       header:
4223; PROLOG-BLOCK-NEXT:    %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.1, %latch.1 ]
4224; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4225; PROLOG-BLOCK:       latch:
4226; PROLOG-BLOCK-NEXT:    %add = add nuw nsw i64 %i6, 1
4227; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4228; PROLOG-BLOCK:       latch.1:
4229; PROLOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4230; PROLOG-BLOCK-NEXT:    %i9.1 = icmp slt i64 %add.1, %sext
4231; PROLOG-BLOCK-NEXT:    br i1 %i9.1, label %header, label %latchexit.unr-lcssa, !llvm.loop !10
4232; PROLOG-BLOCK:       latchexit.unr-lcssa:
4233; PROLOG-BLOCK-NEXT:    br label %latchexit
4234; PROLOG-BLOCK:       latchexit:
4235; PROLOG-BLOCK-NEXT:    unreachable
4236; PROLOG-BLOCK:       loopexit2:
4237; PROLOG-BLOCK-NEXT:    ret i32 %shft
4238; PROLOG-BLOCK:       loopexit1.loopexit:
4239; PROLOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]
4240; PROLOG-BLOCK-NEXT:    br label %loopexit1
4241; PROLOG-BLOCK:       loopexit1:
4242; PROLOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.prol ], [ %sext3.ph, %loopexit1.loopexit ]
4243; PROLOG-BLOCK-NEXT:    ret i32 %sext3
4244;
4245bb:
4246  %i = icmp slt i32 undef, 2
4247  %sext = sext i32 undef to i64
4248  %shft = ashr exact i32 %arg, 16
4249  br i1 %i, label %loopexit2, label %preheader
4250
4251preheader:                                              ; preds = %bb2
4252  br label %header
4253
4254header:                                              ; preds = %latch, %preheader
4255  %i6 = phi i64 [ 1, %preheader ], [ %add, %latch ]
4256  br i1 false, label %loopexit1, label %latch
4257
4258latch:                                              ; preds = %header
4259  %add = add nuw nsw i64 %i6, 1
4260  %i9 = icmp slt i64 %add, %sext
4261  br i1 %i9, label %header, label %latchexit
4262
4263latchexit:                                             ; preds = %latch
4264  unreachable
4265
4266loopexit2:                                             ; preds = %bb2
4267  ret i32 %shft
4268
4269loopexit1:                                             ; preds = %header
4270  %sext3 = phi i32 [ %shft, %header ]
4271  ret i32 %sext3
4272}
4273
4274; Nested loop and inner loop is unrolled.  The tricky bit here is that
4275; several blocks in the inner loop fall out of the outer block when we
4276; use the epilogue block remainder strategy.
4277define void @test8() {
4278; EPILOG-LABEL: @test8(
4279; EPILOG-NEXT:  bb:
4280; EPILOG-NEXT:    br label %outerloop
4281; EPILOG:       outerloop.loopexit.loopexit:
4282; EPILOG-NEXT:    br label %outerloop.loopexit
4283; EPILOG:       outerloop.loopexit.loopexit1:
4284; EPILOG-NEXT:    br label %outerloop.loopexit
4285; EPILOG:       outerloop.loopexit:
4286; EPILOG-NEXT:    br label %outerloop
4287; EPILOG:       outerloop:
4288; EPILOG-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]
4289; EPILOG-NEXT:    %0 = sub i64 100, %i
4290; EPILOG-NEXT:    %1 = sub i64 99, %i
4291; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
4292; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
4293; EPILOG-NEXT:    br i1 %2, label %exit.unr-lcssa, label %outerloop.new
4294; EPILOG:       outerloop.new:
4295; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
4296; EPILOG-NEXT:    br label %innerH
4297; EPILOG:       innerH:
4298; EPILOG-NEXT:    %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.7, %latch.7 ]
4299; EPILOG-NEXT:    %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.7, %latch.7 ]
4300; EPILOG-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4301; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4302; EPILOG:       latch:
4303; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
4304; EPILOG-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
4305; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4306; EPILOG:       latch.1:
4307; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
4308; EPILOG-NEXT:    %i4.2 = add nuw nsw i64 %i4.1, 1
4309; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.2
4310; EPILOG:       latch.2:
4311; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
4312; EPILOG-NEXT:    %i4.3 = add nuw nsw i64 %i4.2, 1
4313; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.3
4314; EPILOG:       latch.3:
4315; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
4316; EPILOG-NEXT:    %i4.4 = add nuw nsw i64 %i4.3, 1
4317; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.4
4318; EPILOG:       latch.4:
4319; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
4320; EPILOG-NEXT:    %i4.5 = add nuw nsw i64 %i4.4, 1
4321; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.5
4322; EPILOG:       latch.5:
4323; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
4324; EPILOG-NEXT:    %i4.6 = add nuw nsw i64 %i4.5, 1
4325; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.6
4326; EPILOG:       latch.6:
4327; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
4328; EPILOG-NEXT:    %i4.7 = add nuw nsw i64 %i4.6, 1
4329; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.7
4330; EPILOG:       latch.7:
4331; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
4332; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
4333; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %innerH, label %exit.unr-lcssa.loopexit
4334; EPILOG:       exit.unr-lcssa.loopexit:
4335; EPILOG-NEXT:    %i3.unr.ph = phi i64 [ %i4.7, %latch.7 ]
4336; EPILOG-NEXT:    br label %exit.unr-lcssa
4337; EPILOG:       exit.unr-lcssa:
4338; EPILOG-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %exit.unr-lcssa.loopexit ]
4339; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4340; EPILOG-NEXT:    br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit
4341; EPILOG:       innerH.epil.preheader:
4342; EPILOG-NEXT:    br label %innerH.epil
4343; EPILOG:       innerH.epil:
4344; EPILOG-NEXT:    %i3.epil = phi i64 [ %i4.epil, %latch.epil ], [ %i3.unr, %innerH.epil.preheader ]
4345; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %innerH.epil.preheader ], [ %epil.iter.next, %latch.epil ]
4346; EPILOG-NEXT:    %i4.epil = add nuw nsw i64 %i3.epil, 1
4347; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit1, label %latch.epil
4348; EPILOG:       latch.epil:
4349; EPILOG-NEXT:    %i6.epil = icmp ult i64 %i4.epil, 100
4350; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
4351; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
4352; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %innerH.epil, label %exit.epilog-lcssa, !llvm.loop !11
4353; EPILOG:       exit.epilog-lcssa:
4354; EPILOG-NEXT:    br label %exit
4355; EPILOG:       exit.loopexit:
4356; EPILOG-NEXT:    br label %exit
4357; EPILOG:       exit:
4358; EPILOG-NEXT:    ret void
4359;
4360; EPILOG-BLOCK-LABEL: @test8(
4361; EPILOG-BLOCK-NEXT:  bb:
4362; EPILOG-BLOCK-NEXT:    br label %outerloop
4363; EPILOG-BLOCK:       outerloop.loopexit.loopexit:
4364; EPILOG-BLOCK-NEXT:    br label %outerloop.loopexit
4365; EPILOG-BLOCK:       outerloop.loopexit:
4366; EPILOG-BLOCK-NEXT:    br i1 false, label %exit.unr-lcssa.1, label %outerloop.new.1
4367; EPILOG-BLOCK:       outerloop.new.1:
4368; EPILOG-BLOCK-NEXT:    br label %innerH.1
4369; EPILOG-BLOCK:       innerH.1:
4370; EPILOG-BLOCK-NEXT:    %i3.1 = phi i64 [ 0, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ]
4371; EPILOG-BLOCK-NEXT:    %niter.1 = phi i64 [ 0, %outerloop.new.1 ], [ %niter.next.1.1, %latch.1.1 ]
4372; EPILOG-BLOCK-NEXT:    %i4.12 = add nuw nsw i64 %i3.1, 1
4373; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.14
4374; EPILOG-BLOCK:       latch.14:
4375; EPILOG-BLOCK-NEXT:    %niter.next.13 = add nuw nsw i64 %niter.1, 1
4376; EPILOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i4.12, 1
4377; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1
4378; EPILOG-BLOCK:       latch.1.1:
4379; EPILOG-BLOCK-NEXT:    %niter.next.1.1 = add i64 %niter.next.13, 1
4380; EPILOG-BLOCK-NEXT:    %niter.ncmp.1.1 = icmp ne i64 %niter.next.1.1, 100
4381; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit.1, !llvm.loop !11
4382; EPILOG-BLOCK:       exit.unr-lcssa.loopexit.1:
4383; EPILOG-BLOCK-NEXT:    br label %exit.unr-lcssa.1
4384; EPILOG-BLOCK:       outerloop.loopexit.loopexit.1:
4385; EPILOG-BLOCK-NEXT:    br label %outerloop.loopexit.1
4386; EPILOG-BLOCK:       exit.unr-lcssa.1:
4387; EPILOG-BLOCK-NEXT:    br i1 false, label %innerH.epil.preheader.1, label %exit.loopexit
4388; EPILOG-BLOCK:       innerH.epil.preheader.1:
4389; EPILOG-BLOCK-NEXT:    br label %innerH.epil.1
4390; EPILOG-BLOCK:       innerH.epil.1:
4391; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.epil
4392; EPILOG-BLOCK:       outerloop.loopexit.1:
4393; EPILOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !12
4394; EPILOG-BLOCK:       outerloop:
4395; EPILOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]
4396; EPILOG-BLOCK-NEXT:    %0 = sub i64 100, %i
4397; EPILOG-BLOCK-NEXT:    %1 = sub i64 99, %i
4398; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4399; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4400; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit.unr-lcssa, label %outerloop.new
4401; EPILOG-BLOCK:       outerloop.new:
4402; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
4403; EPILOG-BLOCK-NEXT:    br label %innerH
4404; EPILOG-BLOCK:       innerH:
4405; EPILOG-BLOCK-NEXT:    %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.1, %latch.1 ]
4406; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.1, %latch.1 ]
4407; EPILOG-BLOCK-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4408; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4409; EPILOG-BLOCK:       latch:
4410; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
4411; EPILOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
4412; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4413; EPILOG-BLOCK:       latch.1:
4414; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
4415; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
4416; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !11
4417; EPILOG-BLOCK:       exit.unr-lcssa.loopexit:
4418; EPILOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4419; EPILOG-BLOCK:       exit.unr-lcssa:
4420; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4421; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit
4422; EPILOG-BLOCK:       innerH.epil.preheader:
4423; EPILOG-BLOCK-NEXT:    br label %innerH.epil
4424; EPILOG-BLOCK:       innerH.epil:
4425; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.epil
4426; EPILOG-BLOCK:       latch.epil:
4427; EPILOG-BLOCK-NEXT:    br label %exit
4428; EPILOG-BLOCK:       exit.loopexit:
4429; EPILOG-BLOCK-NEXT:    br label %exit
4430; EPILOG-BLOCK:       exit:
4431; EPILOG-BLOCK-NEXT:    ret void
4432;
4433; PROLOG-LABEL: @test8(
4434; PROLOG-NEXT:  bb:
4435; PROLOG-NEXT:    br label %outerloop
4436; PROLOG:       outerloop.loopexit.loopexit:
4437; PROLOG-NEXT:    br label %outerloop.loopexit
4438; PROLOG:       outerloop.loopexit.loopexit1:
4439; PROLOG-NEXT:    br label %outerloop.loopexit
4440; PROLOG:       outerloop.loopexit:
4441; PROLOG-NEXT:    br label %outerloop
4442; PROLOG:       outerloop:
4443; PROLOG-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]
4444; PROLOG-NEXT:    %0 = sub i64 100, %i
4445; PROLOG-NEXT:    %1 = sub i64 99, %i
4446; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
4447; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4448; PROLOG-NEXT:    br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit
4449; PROLOG:       innerH.prol.preheader:
4450; PROLOG-NEXT:    br label %innerH.prol
4451; PROLOG:       innerH.prol:
4452; PROLOG-NEXT:    %i3.prol = phi i64 [ %i4.prol, %latch.prol ], [ %i, %innerH.prol.preheader ]
4453; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %innerH.prol.preheader ], [ %prol.iter.next, %latch.prol ]
4454; PROLOG-NEXT:    %i4.prol = add nuw nsw i64 %i3.prol, 1
4455; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit1, label %latch.prol
4456; PROLOG:       latch.prol:
4457; PROLOG-NEXT:    %i6.prol = icmp ult i64 %i4.prol, 100
4458; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
4459; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
4460; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %innerH.prol, label %innerH.prol.loopexit.unr-lcssa, !llvm.loop !11
4461; PROLOG:       innerH.prol.loopexit.unr-lcssa:
4462; PROLOG-NEXT:    %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ]
4463; PROLOG-NEXT:    br label %innerH.prol.loopexit
4464; PROLOG:       innerH.prol.loopexit:
4465; PROLOG-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %innerH.prol.loopexit.unr-lcssa ]
4466; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
4467; PROLOG-NEXT:    br i1 %2, label %exit.loopexit, label %outerloop.new
4468; PROLOG:       outerloop.new:
4469; PROLOG-NEXT:    br label %innerH
4470; PROLOG:       innerH:
4471; PROLOG-NEXT:    %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.7, %latch.7 ]
4472; PROLOG-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4473; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4474; PROLOG:       latch:
4475; PROLOG-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
4476; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4477; PROLOG:       latch.1:
4478; PROLOG-NEXT:    %i4.2 = add nuw nsw i64 %i4.1, 1
4479; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.2
4480; PROLOG:       latch.2:
4481; PROLOG-NEXT:    %i4.3 = add nuw nsw i64 %i4.2, 1
4482; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.3
4483; PROLOG:       latch.3:
4484; PROLOG-NEXT:    %i4.4 = add nuw nsw i64 %i4.3, 1
4485; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.4
4486; PROLOG:       latch.4:
4487; PROLOG-NEXT:    %i4.5 = add nuw nsw i64 %i4.4, 1
4488; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.5
4489; PROLOG:       latch.5:
4490; PROLOG-NEXT:    %i4.6 = add nuw nsw i64 %i4.5, 1
4491; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.6
4492; PROLOG:       latch.6:
4493; PROLOG-NEXT:    %i4.7 = add nuw nsw i64 %i4.6, 1
4494; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.7
4495; PROLOG:       latch.7:
4496; PROLOG-NEXT:    %i6.7 = icmp ult i64 %i4.7, 100
4497; PROLOG-NEXT:    br i1 %i6.7, label %innerH, label %exit.unr-lcssa
4498; PROLOG:       exit.unr-lcssa:
4499; PROLOG-NEXT:    br label %exit
4500; PROLOG:       exit.loopexit:
4501; PROLOG-NEXT:    br label %exit
4502; PROLOG:       exit:
4503; PROLOG-NEXT:    ret void
4504;
4505; PROLOG-BLOCK-LABEL: @test8(
4506; PROLOG-BLOCK-NEXT:  bb:
4507; PROLOG-BLOCK-NEXT:    br label %outerloop
4508; PROLOG-BLOCK:       outerloop.loopexit.loopexit:
4509; PROLOG-BLOCK-NEXT:    br label %outerloop.loopexit
4510; PROLOG-BLOCK:       outerloop.loopexit:
4511; PROLOG-BLOCK-NEXT:    br i1 false, label %innerH.prol.preheader.1, label %innerH.prol.loopexit.1
4512; PROLOG-BLOCK:       innerH.prol.preheader.1:
4513; PROLOG-BLOCK-NEXT:    br label %innerH.prol.1
4514; PROLOG-BLOCK:       innerH.prol.1:
4515; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.prol.1
4516; PROLOG-BLOCK:       latch.prol.1:
4517; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit.1
4518; PROLOG-BLOCK:       innerH.prol.loopexit.1:
4519; PROLOG-BLOCK-NEXT:    %i3.unr.1 = phi i64 [ 0, %outerloop.loopexit ], [ 1, %latch.prol.1 ]
4520; PROLOG-BLOCK-NEXT:    br i1 false, label %exit.loopexit, label %outerloop.new.1
4521; PROLOG-BLOCK:       outerloop.new.1:
4522; PROLOG-BLOCK-NEXT:    br label %innerH.1
4523; PROLOG-BLOCK:       innerH.1:
4524; PROLOG-BLOCK-NEXT:    %i3.1 = phi i64 [ %i3.unr.1, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ]
4525; PROLOG-BLOCK-NEXT:    %i4.11 = add nuw nsw i64 %i3.1, 1
4526; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.12
4527; PROLOG-BLOCK:       latch.12:
4528; PROLOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i4.11, 1
4529; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1
4530; PROLOG-BLOCK:       latch.1.1:
4531; PROLOG-BLOCK-NEXT:    %i6.1.1 = icmp ult i64 %i4.1.1, 100
4532; PROLOG-BLOCK-NEXT:    br i1 %i6.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit3, !llvm.loop !11
4533; PROLOG-BLOCK:       outerloop.loopexit.loopexit.1:
4534; PROLOG-BLOCK-NEXT:    br label %outerloop.loopexit.1
4535; PROLOG-BLOCK:       outerloop.loopexit.1:
4536; PROLOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !12
4537; PROLOG-BLOCK:       outerloop:
4538; PROLOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]
4539; PROLOG-BLOCK-NEXT:    %0 = sub i64 100, %i
4540; PROLOG-BLOCK-NEXT:    %1 = sub i64 99, %i
4541; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4542; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4543; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit
4544; PROLOG-BLOCK:       innerH.prol.preheader:
4545; PROLOG-BLOCK-NEXT:    br label %innerH.prol
4546; PROLOG-BLOCK:       innerH.prol:
4547; PROLOG-BLOCK-NEXT:    %i4.prol = add nuw nsw i64 %i, 1
4548; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.prol
4549; PROLOG-BLOCK:       latch.prol:
4550; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit
4551; PROLOG-BLOCK:       innerH.prol.loopexit:
4552; PROLOG-BLOCK-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i4.prol, %latch.prol ]
4553; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4554; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit.loopexit, label %outerloop.new
4555; PROLOG-BLOCK:       outerloop.new:
4556; PROLOG-BLOCK-NEXT:    br label %innerH
4557; PROLOG-BLOCK:       innerH:
4558; PROLOG-BLOCK-NEXT:    %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.1, %latch.1 ]
4559; PROLOG-BLOCK-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4560; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4561; PROLOG-BLOCK:       latch:
4562; PROLOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
4563; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4564; PROLOG-BLOCK:       latch.1:
4565; PROLOG-BLOCK-NEXT:    %i6.1 = icmp ult i64 %i4.1, 100
4566; PROLOG-BLOCK-NEXT:    br i1 %i6.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !11
4567; PROLOG-BLOCK:       exit.unr-lcssa.loopexit:
4568; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4569; PROLOG-BLOCK:       exit.unr-lcssa.loopexit3:
4570; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4571; PROLOG-BLOCK:       exit.unr-lcssa:
4572; PROLOG-BLOCK-NEXT:    br label %exit
4573; PROLOG-BLOCK:       exit.loopexit:
4574; PROLOG-BLOCK-NEXT:    br label %exit
4575; PROLOG-BLOCK:       exit:
4576; PROLOG-BLOCK-NEXT:    ret void
4577;
4578
4579bb:
4580  br label %outerloop
4581
4582outerloop:                                              ; preds = %innerH, %bb
4583  %i = phi i64 [ 3, %bb ], [ 0, %innerH ]
4584  br label %innerH
4585
4586innerH:                                              ; preds = %latch, %outerloop
4587  %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ]
4588  %i4 = add nuw nsw i64 %i3, 1
4589  br i1 false, label %outerloop, label %latch
4590
4591latch:                                              ; preds = %innerH
4592  %i6 = icmp ult i64 %i4, 100
4593  br i1 %i6, label %innerH, label %exit
4594
4595exit:                                              ; preds = %latch
4596  ret void
4597}
4598
4599declare i8 addrspace(1)* @foo(i32)
4600; inner loop prolog unrolled
4601; a value from outer loop is used in exit block of inner loop.
4602; Don't create VMap entries for such values (%trip).
4603define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) {
4604; EPILOG-LABEL: @test9(
4605; EPILOG-NEXT:  bb:
4606; EPILOG-NEXT:    %0 = add i32 %n, -1
4607; EPILOG-NEXT:    %1 = add i32 %n, -2
4608; EPILOG-NEXT:    br label %outerloopHdr
4609; EPILOG:       outerloopHdr:
4610; EPILOG-NEXT:    %trip = add i32 %n, -1
4611; EPILOG-NEXT:    %outercnd = icmp slt i32 0, %trip
4612; EPILOG-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
4613; EPILOG:       preheader:
4614; EPILOG-NEXT:    %i4 = zext i32 0 to i64
4615; EPILOG-NEXT:    %xtraiter = and i32 %0, 7
4616; EPILOG-NEXT:    %2 = icmp ult i32 %1, 7
4617; EPILOG-NEXT:    br i1 %2, label %outerLatch.loopexit.unr-lcssa, label %preheader.new
4618; EPILOG:       preheader.new:
4619; EPILOG-NEXT:    %unroll_iter = sub i32 %0, %xtraiter
4620; EPILOG-NEXT:    br label %header
4621; EPILOG:       header:
4622; EPILOG-NEXT:    %phi = phi i64 [ %i4, %preheader.new ], [ %iv.next.7, %latch.7 ]
4623; EPILOG-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ]
4624; EPILOG-NEXT:    br i1 true, label %latch, label %innerexit.loopexit
4625; EPILOG:       innerexit.loopexit:
4626; 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 ]
4627; EPILOG-NEXT:    br label %innerexit
4628; EPILOG:       innerexit.loopexit1:
4629; EPILOG-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.epil ]
4630; EPILOG-NEXT:    br label %innerexit
4631; EPILOG:       innerexit:
4632; EPILOG-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
4633; EPILOG-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
4634; EPILOG-NEXT:    ret i8 addrspace(1)* %i9
4635; EPILOG:       latch:
4636; EPILOG-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
4637; EPILOG-NEXT:    %niter.next = add nuw nsw i32 %niter, 1
4638; EPILOG-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit
4639; EPILOG:       latch.1:
4640; EPILOG-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
4641; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i32 %niter.next, 1
4642; EPILOG-NEXT:    br i1 true, label %latch.2, label %innerexit.loopexit
4643; EPILOG:       latch.2:
4644; EPILOG-NEXT:    %iv.next.2 = add nuw nsw i64 %iv.next.1, 1
4645; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i32 %niter.next.1, 1
4646; EPILOG-NEXT:    br i1 true, label %latch.3, label %innerexit.loopexit
4647; EPILOG:       latch.3:
4648; EPILOG-NEXT:    %iv.next.3 = add nuw nsw i64 %iv.next.2, 1
4649; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i32 %niter.next.2, 1
4650; EPILOG-NEXT:    br i1 true, label %latch.4, label %innerexit.loopexit
4651; EPILOG:       latch.4:
4652; EPILOG-NEXT:    %iv.next.4 = add nuw nsw i64 %iv.next.3, 1
4653; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i32 %niter.next.3, 1
4654; EPILOG-NEXT:    br i1 true, label %latch.5, label %innerexit.loopexit
4655; EPILOG:       latch.5:
4656; EPILOG-NEXT:    %iv.next.5 = add nuw nsw i64 %iv.next.4, 1
4657; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i32 %niter.next.4, 1
4658; EPILOG-NEXT:    br i1 true, label %latch.6, label %innerexit.loopexit
4659; EPILOG:       latch.6:
4660; EPILOG-NEXT:    %iv.next.6 = add nuw nsw i64 %iv.next.5, 1
4661; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i32 %niter.next.5, 1
4662; EPILOG-NEXT:    br i1 true, label %latch.7, label %innerexit.loopexit
4663; EPILOG:       latch.7:
4664; EPILOG-NEXT:    %iv.next.7 = add nuw nsw i64 %iv.next.6, 1
4665; EPILOG-NEXT:    %niter.next.7 = add i32 %niter.next.6, 1
4666; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i32 %niter.next.7, %unroll_iter
4667; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit
4668; EPILOG:       outerLatch.loopexit.unr-lcssa.loopexit:
4669; EPILOG-NEXT:    %phi.unr.ph = phi i64 [ %iv.next.7, %latch.7 ]
4670; EPILOG-NEXT:    br label %outerLatch.loopexit.unr-lcssa
4671; EPILOG:       outerLatch.loopexit.unr-lcssa:
4672; EPILOG-NEXT:    %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %outerLatch.loopexit.unr-lcssa.loopexit ]
4673; EPILOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
4674; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit
4675; EPILOG:       header.epil.preheader:
4676; EPILOG-NEXT:    br label %header.epil
4677; EPILOG:       header.epil:
4678; EPILOG-NEXT:    %phi.epil = phi i64 [ %phi.unr, %header.epil.preheader ], [ %iv.next.epil, %latch.epil ]
4679; EPILOG-NEXT:    %epil.iter = phi i32 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
4680; EPILOG-NEXT:    %i7.epil = trunc i64 %phi.epil to i32
4681; EPILOG-NEXT:    br i1 true, label %latch.epil, label %innerexit.loopexit1
4682; EPILOG:       latch.epil:
4683; EPILOG-NEXT:    %i11.epil = add nsw i32 %i7.epil, 1
4684; EPILOG-NEXT:    %innercnd.epil = icmp slt i32 %i11.epil, %trip
4685; EPILOG-NEXT:    %iv.next.epil = add nuw nsw i64 %phi.epil, 1
4686; EPILOG-NEXT:    %epil.iter.next = add i32 %epil.iter, 1
4687; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i32 %epil.iter.next, %xtraiter
4688; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %outerLatch.loopexit.epilog-lcssa, !llvm.loop !12
4689; EPILOG:       outerLatch.loopexit.epilog-lcssa:
4690; EPILOG-NEXT:    br label %outerLatch.loopexit
4691; EPILOG:       outerLatch.loopexit:
4692; EPILOG-NEXT:    br label %outerLatch
4693; EPILOG:       outerLatch:
4694; EPILOG-NEXT:    br label %outerloopHdr
4695;
4696; EPILOG-BLOCK-LABEL: @test9(
4697; EPILOG-BLOCK-NEXT:  bb:
4698; EPILOG-BLOCK-NEXT:    %0 = add i32 %n, -1
4699; EPILOG-BLOCK-NEXT:    %1 = add i32 %n, -2
4700; EPILOG-BLOCK-NEXT:    br label %outerloopHdr
4701; EPILOG-BLOCK:       outerloopHdr:
4702; EPILOG-BLOCK-NEXT:    %trip = add i32 %n, -1
4703; EPILOG-BLOCK-NEXT:    %outercnd = icmp slt i32 0, %trip
4704; EPILOG-BLOCK-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
4705; EPILOG-BLOCK:       preheader:
4706; EPILOG-BLOCK-NEXT:    %xtraiter = and i32 %0, 1
4707; EPILOG-BLOCK-NEXT:    %2 = icmp ult i32 %1, 1
4708; EPILOG-BLOCK-NEXT:    br i1 %2, label %outerLatch.loopexit.unr-lcssa, label %preheader.new
4709; EPILOG-BLOCK:       preheader.new:
4710; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i32 %0, %xtraiter
4711; EPILOG-BLOCK-NEXT:    br label %header
4712; EPILOG-BLOCK:       header:
4713; EPILOG-BLOCK-NEXT:    %phi = phi i64 [ 0, %preheader.new ], [ %iv.next.1, %latch.1 ]
4714; EPILOG-BLOCK-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ]
4715; EPILOG-BLOCK-NEXT:    br i1 true, label %latch, label %innerexit.loopexit.loopexit
4716; EPILOG-BLOCK:       innerexit.loopexit.loopexit:
4717; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ]
4718; EPILOG-BLOCK-NEXT:    br label %innerexit.loopexit
4719; EPILOG-BLOCK:       innerexit.loopexit.loopexit6:
4720; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph.ph7 = phi i32 [ %trip.1, %latch.15 ], [ %trip.1, %header.1 ]
4721; EPILOG-BLOCK-NEXT:    br label %innerexit.loopexit
4722; EPILOG-BLOCK:       innerexit.loopexit:
4723; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph7, %innerexit.loopexit.loopexit6 ]
4724; EPILOG-BLOCK-NEXT:    br label %innerexit
4725; EPILOG-BLOCK:       innerexit.loopexit1:
4726; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.epil ], [ %trip.1, %header.epil.1 ]
4727; EPILOG-BLOCK-NEXT:    br label %innerexit
4728; EPILOG-BLOCK:       innerexit:
4729; EPILOG-BLOCK-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
4730; EPILOG-BLOCK-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
4731; EPILOG-BLOCK-NEXT:    ret i8 addrspace(1)* %i9
4732; EPILOG-BLOCK:       latch:
4733; EPILOG-BLOCK-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
4734; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i32 %niter, 1
4735; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit.loopexit
4736; EPILOG-BLOCK:       latch.1:
4737; EPILOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
4738; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i32 %niter.next, 1
4739; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i32 %niter.next.1, %unroll_iter
4740; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit, !llvm.loop !13
4741; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa.loopexit:
4742; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit.unr-lcssa
4743; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa:
4744; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
4745; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit
4746; EPILOG-BLOCK:       header.epil.preheader:
4747; EPILOG-BLOCK-NEXT:    br label %header.epil
4748; EPILOG-BLOCK:       header.epil:
4749; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.epil, label %innerexit.loopexit1
4750; EPILOG-BLOCK:       latch.epil:
4751; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit
4752; EPILOG-BLOCK:       outerLatch.loopexit:
4753; EPILOG-BLOCK-NEXT:    br label %outerLatch
4754; EPILOG-BLOCK:       outerLatch:
4755; EPILOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -1
4756; EPILOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.1
4757; EPILOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.1
4758; EPILOG-BLOCK:       preheader.1:
4759; EPILOG-BLOCK-NEXT:    %xtraiter.1 = and i32 %0, 1
4760; EPILOG-BLOCK-NEXT:    %3 = icmp ult i32 %1, 1
4761; EPILOG-BLOCK-NEXT:    br i1 %3, label %outerLatch.loopexit.unr-lcssa.1, label %preheader.new.1
4762; EPILOG-BLOCK:       preheader.new.1:
4763; EPILOG-BLOCK-NEXT:    %unroll_iter.1 = sub i32 %0, %xtraiter.1
4764; EPILOG-BLOCK-NEXT:    br label %header.1
4765; EPILOG-BLOCK:       header.1:
4766; EPILOG-BLOCK-NEXT:    %phi.1 = phi i64 [ 0, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ]
4767; EPILOG-BLOCK-NEXT:    %niter.1 = phi i32 [ 0, %preheader.new.1 ], [ %niter.next.1.1, %latch.1.1 ]
4768; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.15, label %innerexit.loopexit.loopexit6
4769; EPILOG-BLOCK:       latch.15:
4770; EPILOG-BLOCK-NEXT:    %iv.next.13 = add nuw nsw i64 %phi.1, 1
4771; EPILOG-BLOCK-NEXT:    %niter.next.14 = add nuw nsw i32 %niter.1, 1
4772; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit6
4773; EPILOG-BLOCK:       latch.1.1:
4774; EPILOG-BLOCK-NEXT:    %iv.next.1.1 = add nuw nsw i64 %iv.next.13, 1
4775; EPILOG-BLOCK-NEXT:    %niter.next.1.1 = add i32 %niter.next.14, 1
4776; EPILOG-BLOCK-NEXT:    %niter.ncmp.1.1 = icmp ne i32 %niter.next.1.1, %unroll_iter.1
4777; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.loopexit.1, !llvm.loop !13
4778; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa.loopexit.1:
4779; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit.unr-lcssa.1
4780; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa.1:
4781; EPILOG-BLOCK-NEXT:    %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0
4782; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod.1, label %header.epil.preheader.1, label %outerLatch.loopexit.1
4783; EPILOG-BLOCK:       header.epil.preheader.1:
4784; EPILOG-BLOCK-NEXT:    br label %header.epil.1
4785; EPILOG-BLOCK:       header.epil.1:
4786; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.epil.1, label %innerexit.loopexit1
4787; EPILOG-BLOCK:       latch.epil.1:
4788; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit.1
4789; EPILOG-BLOCK:       outerLatch.loopexit.1:
4790; EPILOG-BLOCK-NEXT:    br label %outerLatch.1
4791; EPILOG-BLOCK:       outerLatch.1:
4792; EPILOG-BLOCK-NEXT:    br label %outerloopHdr, !llvm.loop !14
4793;
4794; PROLOG-LABEL: @test9(
4795; PROLOG-NEXT:  bb:
4796; PROLOG-NEXT:    %0 = add i32 %n, -1
4797; PROLOG-NEXT:    %1 = add i32 %n, -2
4798; PROLOG-NEXT:    br label %outerloopHdr
4799; PROLOG:       outerloopHdr:
4800; PROLOG-NEXT:    %trip = add i32 %n, -1
4801; PROLOG-NEXT:    %outercnd = icmp slt i32 0, %trip
4802; PROLOG-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
4803; PROLOG:       preheader:
4804; PROLOG-NEXT:    %i4 = zext i32 0 to i64
4805; PROLOG-NEXT:    %xtraiter = and i32 %0, 7
4806; PROLOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
4807; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4808; PROLOG:       header.prol.preheader:
4809; PROLOG-NEXT:    br label %header.prol
4810; PROLOG:       header.prol:
4811; PROLOG-NEXT:    %phi.prol = phi i64 [ %i4, %header.prol.preheader ], [ %iv.next.prol, %latch.prol ]
4812; PROLOG-NEXT:    %prol.iter = phi i32 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
4813; PROLOG-NEXT:    %i7.prol = trunc i64 %phi.prol to i32
4814; PROLOG-NEXT:    br i1 true, label %latch.prol, label %innerexit.loopexit1
4815; PROLOG:       latch.prol:
4816; PROLOG-NEXT:    %i11.prol = add nsw i32 %i7.prol, 1
4817; PROLOG-NEXT:    %innercnd.prol = icmp slt i32 %i11.prol, %trip
4818; PROLOG-NEXT:    %iv.next.prol = add nuw nsw i64 %phi.prol, 1
4819; PROLOG-NEXT:    %prol.iter.next = add i32 %prol.iter, 1
4820; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i32 %prol.iter.next, %xtraiter
4821; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !12
4822; PROLOG:       header.prol.loopexit.unr-lcssa:
4823; PROLOG-NEXT:    %phi.unr.ph = phi i64 [ %iv.next.prol, %latch.prol ]
4824; PROLOG-NEXT:    br label %header.prol.loopexit
4825; PROLOG:       header.prol.loopexit:
4826; PROLOG-NEXT:    %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %header.prol.loopexit.unr-lcssa ]
4827; PROLOG-NEXT:    %2 = icmp ult i32 %1, 7
4828; PROLOG-NEXT:    br i1 %2, label %outerLatch.loopexit, label %preheader.new
4829; PROLOG:       preheader.new:
4830; PROLOG-NEXT:    br label %header
4831; PROLOG:       header:
4832; PROLOG-NEXT:    %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.7, %latch.7 ]
4833; PROLOG-NEXT:    br i1 true, label %latch, label %innerexit.loopexit
4834; PROLOG:       innerexit.loopexit:
4835; 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 ]
4836; PROLOG-NEXT:    br label %innerexit
4837; PROLOG:       innerexit.loopexit1:
4838; PROLOG-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ]
4839; PROLOG-NEXT:    br label %innerexit
4840; PROLOG:       innerexit:
4841; PROLOG-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
4842; PROLOG-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
4843; PROLOG-NEXT:    ret i8 addrspace(1)* %i9
4844; PROLOG:       latch:
4845; PROLOG-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
4846; PROLOG-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit
4847; PROLOG:       latch.1:
4848; PROLOG-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
4849; PROLOG-NEXT:    br i1 true, label %latch.2, label %innerexit.loopexit
4850; PROLOG:       latch.2:
4851; PROLOG-NEXT:    %iv.next.2 = add nuw nsw i64 %iv.next.1, 1
4852; PROLOG-NEXT:    br i1 true, label %latch.3, label %innerexit.loopexit
4853; PROLOG:       latch.3:
4854; PROLOG-NEXT:    %iv.next.3 = add nuw nsw i64 %iv.next.2, 1
4855; PROLOG-NEXT:    br i1 true, label %latch.4, label %innerexit.loopexit
4856; PROLOG:       latch.4:
4857; PROLOG-NEXT:    %iv.next.4 = add nuw nsw i64 %iv.next.3, 1
4858; PROLOG-NEXT:    br i1 true, label %latch.5, label %innerexit.loopexit
4859; PROLOG:       latch.5:
4860; PROLOG-NEXT:    %iv.next.5 = add nuw nsw i64 %iv.next.4, 1
4861; PROLOG-NEXT:    br i1 true, label %latch.6, label %innerexit.loopexit
4862; PROLOG:       latch.6:
4863; PROLOG-NEXT:    %iv.next.6 = add nuw nsw i64 %iv.next.5, 1
4864; PROLOG-NEXT:    %i7.7 = trunc i64 %iv.next.6 to i32
4865; PROLOG-NEXT:    br i1 true, label %latch.7, label %innerexit.loopexit
4866; PROLOG:       latch.7:
4867; PROLOG-NEXT:    %i11.7 = add nsw i32 %i7.7, 1
4868; PROLOG-NEXT:    %innercnd.7 = icmp slt i32 %i11.7, %trip
4869; PROLOG-NEXT:    %iv.next.7 = add nuw nsw i64 %iv.next.6, 1
4870; PROLOG-NEXT:    br i1 %innercnd.7, label %header, label %outerLatch.loopexit.unr-lcssa
4871; PROLOG:       outerLatch.loopexit.unr-lcssa:
4872; PROLOG-NEXT:    br label %outerLatch.loopexit
4873; PROLOG:       outerLatch.loopexit:
4874; PROLOG-NEXT:    br label %outerLatch
4875; PROLOG:       outerLatch:
4876; PROLOG-NEXT:    br label %outerloopHdr
4877;
4878; PROLOG-BLOCK-LABEL: @test9(
4879; PROLOG-BLOCK-NEXT:  bb:
4880; PROLOG-BLOCK-NEXT:    %0 = add i32 %n, -1
4881; PROLOG-BLOCK-NEXT:    %1 = add i32 %n, -2
4882; PROLOG-BLOCK-NEXT:    br label %outerloopHdr
4883; PROLOG-BLOCK:       outerloopHdr:
4884; PROLOG-BLOCK-NEXT:    %trip = add i32 %n, -1
4885; PROLOG-BLOCK-NEXT:    %outercnd = icmp slt i32 0, %trip
4886; PROLOG-BLOCK-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
4887; PROLOG-BLOCK:       preheader:
4888; PROLOG-BLOCK-NEXT:    %xtraiter = and i32 %0, 1
4889; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
4890; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4891; PROLOG-BLOCK:       header.prol.preheader:
4892; PROLOG-BLOCK-NEXT:    br label %header.prol
4893; PROLOG-BLOCK:       header.prol:
4894; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.prol, label %innerexit.loopexit1
4895; PROLOG-BLOCK:       latch.prol:
4896; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
4897; PROLOG-BLOCK:       header.prol.loopexit:
4898; PROLOG-BLOCK-NEXT:    %phi.unr = phi i64 [ 0, %preheader ], [ 1, %latch.prol ]
4899; PROLOG-BLOCK-NEXT:    %2 = icmp ult i32 %1, 1
4900; PROLOG-BLOCK-NEXT:    br i1 %2, label %outerLatch.loopexit, label %preheader.new
4901; PROLOG-BLOCK:       preheader.new:
4902; PROLOG-BLOCK-NEXT:    br label %header
4903; PROLOG-BLOCK:       header:
4904; PROLOG-BLOCK-NEXT:    %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.1, %latch.1 ]
4905; PROLOG-BLOCK-NEXT:    br i1 true, label %latch, label %innerexit.loopexit.loopexit
4906; PROLOG-BLOCK:       innerexit.loopexit.loopexit:
4907; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ]
4908; PROLOG-BLOCK-NEXT:    br label %innerexit.loopexit
4909; PROLOG-BLOCK:       innerexit.loopexit.loopexit5:
4910; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph.ph6 = phi i32 [ %trip.1, %latch.14 ], [ %trip.1, %header.1 ]
4911; PROLOG-BLOCK-NEXT:    br label %innerexit.loopexit
4912; PROLOG-BLOCK:       innerexit.loopexit:
4913; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph6, %innerexit.loopexit.loopexit5 ]
4914; PROLOG-BLOCK-NEXT:    br label %innerexit
4915; PROLOG-BLOCK:       innerexit.loopexit1:
4916; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ], [ %trip.1, %header.prol.1 ]
4917; PROLOG-BLOCK-NEXT:    br label %innerexit
4918; PROLOG-BLOCK:       innerexit:
4919; PROLOG-BLOCK-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
4920; PROLOG-BLOCK-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
4921; PROLOG-BLOCK-NEXT:    ret i8 addrspace(1)* %i9
4922; PROLOG-BLOCK:       latch:
4923; PROLOG-BLOCK-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
4924; PROLOG-BLOCK-NEXT:    %i7.1 = trunc i64 %iv.next to i32
4925; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit.loopexit
4926; PROLOG-BLOCK:       latch.1:
4927; PROLOG-BLOCK-NEXT:    %i11.1 = add nsw i32 %i7.1, 1
4928; PROLOG-BLOCK-NEXT:    %innercnd.1 = icmp slt i32 %i11.1, %trip
4929; PROLOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
4930; PROLOG-BLOCK-NEXT:    br i1 %innercnd.1, label %header, label %outerLatch.loopexit.unr-lcssa, !llvm.loop !13
4931; PROLOG-BLOCK:       outerLatch.loopexit.unr-lcssa:
4932; PROLOG-BLOCK-NEXT:    br label %outerLatch.loopexit
4933; PROLOG-BLOCK:       outerLatch.loopexit:
4934; PROLOG-BLOCK-NEXT:    br label %outerLatch
4935; PROLOG-BLOCK:       outerLatch:
4936; PROLOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -1
4937; PROLOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.1
4938; PROLOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.1
4939; PROLOG-BLOCK:       preheader.1:
4940; PROLOG-BLOCK-NEXT:    %xtraiter.1 = and i32 %0, 1
4941; PROLOG-BLOCK-NEXT:    %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0
4942; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod.1, label %header.prol.preheader.1, label %header.prol.loopexit.1
4943; PROLOG-BLOCK:       header.prol.preheader.1:
4944; PROLOG-BLOCK-NEXT:    br label %header.prol.1
4945; PROLOG-BLOCK:       header.prol.1:
4946; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.prol.1, label %innerexit.loopexit1
4947; PROLOG-BLOCK:       latch.prol.1:
4948; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit.1
4949; PROLOG-BLOCK:       header.prol.loopexit.1:
4950; PROLOG-BLOCK-NEXT:    %phi.unr.1 = phi i64 [ 0, %preheader.1 ], [ 1, %latch.prol.1 ]
4951; PROLOG-BLOCK-NEXT:    %3 = icmp ult i32 %1, 1
4952; PROLOG-BLOCK-NEXT:    br i1 %3, label %outerLatch.loopexit.1, label %preheader.new.1
4953; PROLOG-BLOCK:       preheader.new.1:
4954; PROLOG-BLOCK-NEXT:    br label %header.1
4955; PROLOG-BLOCK:       header.1:
4956; PROLOG-BLOCK-NEXT:    %phi.1 = phi i64 [ %phi.unr.1, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ]
4957; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.14, label %innerexit.loopexit.loopexit5
4958; PROLOG-BLOCK:       latch.14:
4959; PROLOG-BLOCK-NEXT:    %iv.next.13 = add nuw nsw i64 %phi.1, 1
4960; PROLOG-BLOCK-NEXT:    %i7.1.1 = trunc i64 %iv.next.13 to i32
4961; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit5
4962; PROLOG-BLOCK:       latch.1.1:
4963; PROLOG-BLOCK-NEXT:    %i11.1.1 = add nsw i32 %i7.1.1, 1
4964; PROLOG-BLOCK-NEXT:    %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.1
4965; PROLOG-BLOCK-NEXT:    %iv.next.1.1 = add nuw nsw i64 %iv.next.13, 1
4966; PROLOG-BLOCK-NEXT:    br i1 %innercnd.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.1, !llvm.loop !13
4967; PROLOG-BLOCK:       outerLatch.loopexit.unr-lcssa.1:
4968; PROLOG-BLOCK-NEXT:    br label %outerLatch.loopexit.1
4969; PROLOG-BLOCK:       outerLatch.loopexit.1:
4970; PROLOG-BLOCK-NEXT:    br label %outerLatch.1
4971; PROLOG-BLOCK:       outerLatch.1:
4972; PROLOG-BLOCK-NEXT:    br label %outerloopHdr, !llvm.loop !14
4973;
4974bb:
4975  br label %outerloopHdr
4976
4977outerloopHdr:                                              ; preds = %outerLatch, %bb
4978  %trip = add i32 %n, -1
4979  %outercnd = icmp slt i32 0, %trip
4980  br i1 %outercnd, label %preheader, label %outerLatch
4981
4982preheader:                                              ; preds = %outerloopHdr
4983  %i4 = zext i32 0 to i64
4984  br label %header
4985
4986header:                                              ; preds = %latch, %preheader
4987  %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ]
4988  %i7 = trunc i64 %phi to i32
4989  br i1 true, label %latch, label %innerexit
4990
4991innerexit:                                              ; preds = %header
4992  %i9 = call i8 addrspace(1)* @foo(i32 %trip)
4993  ret i8 addrspace(1)* %i9
4994
4995latch:                                             ; preds = %header
4996  %i11 = add nsw i32 %i7, 1
4997  %innercnd = icmp slt i32 %i11, %trip
4998  %iv.next = add nuw nsw i64 %phi, 1
4999  br i1 %innercnd, label %header, label %outerLatch
5000
5001outerLatch:                                             ; preds = %latch, %outerloopHdr
5002  br label %outerloopHdr
5003}
5004
5005declare void @bar()
5006
5007; This is a case where we should be able to eliminate N-1 copies
5008; of the early exit test in the main loop when runtime unrolling
5009; by N.
5010define void @test10(i64 %trip, i64 %trip2) {
5011; EPILOG-LABEL: @test10(
5012; EPILOG-NEXT:  entry:
5013; EPILOG-NEXT:    %0 = add i64 %trip, -1
5014; EPILOG-NEXT:    %xtraiter = and i64 %trip, 7
5015; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
5016; EPILOG-NEXT:    br i1 %1, label %exit2.unr-lcssa, label %entry.new
5017; EPILOG:       entry.new:
5018; EPILOG-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
5019; EPILOG-NEXT:    br label %loop_header
5020; EPILOG:       loop_header:
5021; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5022; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
5023; EPILOG-NEXT:    call void @bar()
5024; EPILOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5025; EPILOG-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5026; EPILOG:       loop_latch:
5027; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5028; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5029; EPILOG-NEXT:    call void @bar()
5030; EPILOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5031; EPILOG-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5032; EPILOG:       loop_latch.1:
5033; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
5034; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
5035; EPILOG-NEXT:    call void @bar()
5036; EPILOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
5037; EPILOG-NEXT:    br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit
5038; EPILOG:       loop_latch.2:
5039; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
5040; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
5041; EPILOG-NEXT:    call void @bar()
5042; EPILOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
5043; EPILOG-NEXT:    br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit
5044; EPILOG:       loop_latch.3:
5045; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
5046; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
5047; EPILOG-NEXT:    call void @bar()
5048; EPILOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
5049; EPILOG-NEXT:    br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit
5050; EPILOG:       loop_latch.4:
5051; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
5052; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
5053; EPILOG-NEXT:    call void @bar()
5054; EPILOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
5055; EPILOG-NEXT:    br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit
5056; EPILOG:       loop_latch.5:
5057; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
5058; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
5059; EPILOG-NEXT:    call void @bar()
5060; EPILOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
5061; EPILOG-NEXT:    br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit
5062; EPILOG:       loop_latch.6:
5063; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
5064; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
5065; EPILOG-NEXT:    call void @bar()
5066; EPILOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
5067; EPILOG-NEXT:    br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit
5068; EPILOG:       loop_latch.7:
5069; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
5070; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
5071; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
5072; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit
5073; EPILOG:       exit1.loopexit:
5074; EPILOG-NEXT:    br label %exit1
5075; EPILOG:       exit1.loopexit1:
5076; EPILOG-NEXT:    br label %exit1
5077; EPILOG:       exit1:
5078; EPILOG-NEXT:    ret void
5079; EPILOG:       exit2.unr-lcssa.loopexit:
5080; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
5081; EPILOG-NEXT:    br label %exit2.unr-lcssa
5082; EPILOG:       exit2.unr-lcssa:
5083; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ]
5084; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5085; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5086; EPILOG:       loop_header.epil.preheader:
5087; EPILOG-NEXT:    br label %loop_header.epil
5088; EPILOG:       loop_header.epil:
5089; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
5090; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
5091; EPILOG-NEXT:    call void @bar()
5092; EPILOG-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil, %trip2
5093; EPILOG-NEXT:    br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1.loopexit1
5094; EPILOG:       loop_latch.epil:
5095; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
5096; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
5097; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
5098; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
5099; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !13
5100; EPILOG:       exit2.epilog-lcssa:
5101; EPILOG-NEXT:    br label %exit2
5102; EPILOG:       exit2:
5103; EPILOG-NEXT:    ret void
5104;
5105; EPILOG-BLOCK-LABEL: @test10(
5106; EPILOG-BLOCK-NEXT:  entry:
5107; EPILOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
5108; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
5109; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
5110; EPILOG-BLOCK-NEXT:    br i1 %1, label %exit2.unr-lcssa, label %entry.new
5111; EPILOG-BLOCK:       entry.new:
5112; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
5113; EPILOG-BLOCK-NEXT:    br label %loop_header
5114; EPILOG-BLOCK:       loop_header:
5115; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5116; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
5117; EPILOG-BLOCK-NEXT:    call void @bar()
5118; EPILOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5119; EPILOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5120; EPILOG-BLOCK:       loop_latch:
5121; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5122; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5123; EPILOG-BLOCK-NEXT:    call void @bar()
5124; EPILOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5125; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5126; EPILOG-BLOCK:       loop_latch.1:
5127; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5128; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
5129; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
5130; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !15
5131; EPILOG-BLOCK:       exit1.loopexit:
5132; EPILOG-BLOCK-NEXT:    br label %exit1
5133; EPILOG-BLOCK:       exit1:
5134; EPILOG-BLOCK-NEXT:    ret void
5135; EPILOG-BLOCK:       exit2.unr-lcssa.loopexit:
5136; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
5137; EPILOG-BLOCK-NEXT:    br label %exit2.unr-lcssa
5138; EPILOG-BLOCK:       exit2.unr-lcssa:
5139; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ]
5140; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5141; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5142; EPILOG-BLOCK:       loop_header.epil.preheader:
5143; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
5144; EPILOG-BLOCK:       loop_header.epil:
5145; EPILOG-BLOCK-NEXT:    call void @bar()
5146; EPILOG-BLOCK-NEXT:    %cmp_early.epil = icmp ne i64 %iv.unr, %trip2
5147; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1
5148; EPILOG-BLOCK:       loop_latch.epil:
5149; EPILOG-BLOCK-NEXT:    br label %exit2
5150; EPILOG-BLOCK:       exit2:
5151; EPILOG-BLOCK-NEXT:    ret void
5152;
5153; PROLOG-LABEL: @test10(
5154; PROLOG-NEXT:  entry:
5155; PROLOG-NEXT:    %0 = add i64 %trip, -1
5156; PROLOG-NEXT:    %xtraiter = and i64 %trip, 7
5157; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5158; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5159; PROLOG:       loop_header.prol.preheader:
5160; PROLOG-NEXT:    br label %loop_header.prol
5161; PROLOG:       loop_header.prol:
5162; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
5163; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
5164; PROLOG-NEXT:    call void @bar()
5165; PROLOG-NEXT:    %cmp_early.prol = icmp ne i64 %iv.prol, %trip2
5166; PROLOG-NEXT:    br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1.loopexit1
5167; PROLOG:       loop_latch.prol:
5168; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
5169; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
5170; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
5171; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
5172; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !13
5173; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
5174; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
5175; PROLOG-NEXT:    br label %loop_header.prol.loopexit
5176; PROLOG:       loop_header.prol.loopexit:
5177; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
5178; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
5179; PROLOG-NEXT:    br i1 %1, label %exit2, label %entry.new
5180; PROLOG:       entry.new:
5181; PROLOG-NEXT:    br label %loop_header
5182; PROLOG:       loop_header:
5183; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5184; PROLOG-NEXT:    call void @bar()
5185; PROLOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5186; PROLOG-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5187; PROLOG:       loop_latch:
5188; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
5189; PROLOG-NEXT:    call void @bar()
5190; PROLOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5191; PROLOG-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5192; PROLOG:       loop_latch.1:
5193; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5194; PROLOG-NEXT:    call void @bar()
5195; PROLOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
5196; PROLOG-NEXT:    br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit
5197; PROLOG:       loop_latch.2:
5198; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
5199; PROLOG-NEXT:    call void @bar()
5200; PROLOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
5201; PROLOG-NEXT:    br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit
5202; PROLOG:       loop_latch.3:
5203; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
5204; PROLOG-NEXT:    call void @bar()
5205; PROLOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
5206; PROLOG-NEXT:    br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit
5207; PROLOG:       loop_latch.4:
5208; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
5209; PROLOG-NEXT:    call void @bar()
5210; PROLOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
5211; PROLOG-NEXT:    br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit
5212; PROLOG:       loop_latch.5:
5213; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
5214; PROLOG-NEXT:    call void @bar()
5215; PROLOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
5216; PROLOG-NEXT:    br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit
5217; PROLOG:       loop_latch.6:
5218; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
5219; PROLOG-NEXT:    call void @bar()
5220; PROLOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
5221; PROLOG-NEXT:    br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit
5222; PROLOG:       loop_latch.7:
5223; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
5224; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
5225; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa
5226; PROLOG:       exit1.loopexit:
5227; PROLOG-NEXT:    br label %exit1
5228; PROLOG:       exit1.loopexit1:
5229; PROLOG-NEXT:    br label %exit1
5230; PROLOG:       exit1:
5231; PROLOG-NEXT:    ret void
5232; PROLOG:       exit2.unr-lcssa:
5233; PROLOG-NEXT:    br label %exit2
5234; PROLOG:       exit2:
5235; PROLOG-NEXT:    ret void
5236;
5237; PROLOG-BLOCK-LABEL: @test10(
5238; PROLOG-BLOCK-NEXT:  entry:
5239; PROLOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
5240; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
5241; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5242; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5243; PROLOG-BLOCK:       loop_header.prol.preheader:
5244; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
5245; PROLOG-BLOCK:       loop_header.prol:
5246; PROLOG-BLOCK-NEXT:    call void @bar()
5247; PROLOG-BLOCK-NEXT:    %cmp_early.prol = icmp ne i64 0, %trip2
5248; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1
5249; PROLOG-BLOCK:       loop_latch.prol:
5250; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
5251; PROLOG-BLOCK:       loop_header.prol.loopexit:
5252; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
5253; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
5254; PROLOG-BLOCK-NEXT:    br i1 %1, label %exit2, label %entry.new
5255; PROLOG-BLOCK:       entry.new:
5256; PROLOG-BLOCK-NEXT:    br label %loop_header
5257; PROLOG-BLOCK:       loop_header:
5258; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5259; PROLOG-BLOCK-NEXT:    call void @bar()
5260; PROLOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5261; PROLOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5262; PROLOG-BLOCK:       loop_latch:
5263; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
5264; PROLOG-BLOCK-NEXT:    call void @bar()
5265; PROLOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5266; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5267; PROLOG-BLOCK:       loop_latch.1:
5268; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5269; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
5270; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !15
5271; PROLOG-BLOCK:       exit1.loopexit:
5272; PROLOG-BLOCK-NEXT:    br label %exit1
5273; PROLOG-BLOCK:       exit1:
5274; PROLOG-BLOCK-NEXT:    ret void
5275; PROLOG-BLOCK:       exit2.unr-lcssa:
5276; PROLOG-BLOCK-NEXT:    br label %exit2
5277; PROLOG-BLOCK:       exit2:
5278; PROLOG-BLOCK-NEXT:    ret void
5279;
5280entry:
5281  br label %loop_header
5282
5283loop_header:
5284  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
5285  call void @bar()
5286  %cmp_early = icmp ne i64 %iv, %trip2
5287  br i1 %cmp_early, label %loop_latch, label %exit1
5288
5289loop_latch:
5290  %iv_next = add i64 %iv, 1
5291  %cmp = icmp ne i64 %iv_next, %trip
5292  br i1 %cmp, label %loop_header, label %exit2
5293
5294exit1:
5295  ret void
5296
5297exit2:
5298  ret void
5299}
5300
5301; With a loop invariant, we can eliminate the last N-1
5302; copies of the exit test in the unrolled main loop body.
5303define void @test11(i64 %trip, i1 %cond) {
5304; EPILOG-LABEL: @test11(
5305; EPILOG-NEXT:  entry:
5306; EPILOG-NEXT:    %0 = add i64 %trip, -1
5307; EPILOG-NEXT:    %xtraiter = and i64 %trip, 7
5308; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
5309; EPILOG-NEXT:    br i1 %1, label %exit2.unr-lcssa, label %entry.new
5310; EPILOG:       entry.new:
5311; EPILOG-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
5312; EPILOG-NEXT:    br label %loop_header
5313; EPILOG:       loop_header:
5314; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5315; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
5316; EPILOG-NEXT:    call void @bar()
5317; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5318; EPILOG:       loop_latch:
5319; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5320; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5321; EPILOG-NEXT:    call void @bar()
5322; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5323; EPILOG:       loop_latch.1:
5324; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
5325; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
5326; EPILOG-NEXT:    call void @bar()
5327; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.loopexit
5328; EPILOG:       loop_latch.2:
5329; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
5330; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
5331; EPILOG-NEXT:    call void @bar()
5332; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.loopexit
5333; EPILOG:       loop_latch.3:
5334; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
5335; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
5336; EPILOG-NEXT:    call void @bar()
5337; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.loopexit
5338; EPILOG:       loop_latch.4:
5339; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
5340; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
5341; EPILOG-NEXT:    call void @bar()
5342; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.loopexit
5343; EPILOG:       loop_latch.5:
5344; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
5345; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
5346; EPILOG-NEXT:    call void @bar()
5347; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.loopexit
5348; EPILOG:       loop_latch.6:
5349; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
5350; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
5351; EPILOG-NEXT:    call void @bar()
5352; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.loopexit
5353; EPILOG:       loop_latch.7:
5354; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
5355; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
5356; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
5357; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit
5358; EPILOG:       exit1.loopexit:
5359; EPILOG-NEXT:    br label %exit1
5360; EPILOG:       exit1.loopexit1:
5361; EPILOG-NEXT:    br label %exit1
5362; EPILOG:       exit1:
5363; EPILOG-NEXT:    ret void
5364; EPILOG:       exit2.unr-lcssa.loopexit:
5365; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
5366; EPILOG-NEXT:    br label %exit2.unr-lcssa
5367; EPILOG:       exit2.unr-lcssa:
5368; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ]
5369; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5370; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5371; EPILOG:       loop_header.epil.preheader:
5372; EPILOG-NEXT:    br label %loop_header.epil
5373; EPILOG:       loop_header.epil:
5374; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
5375; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
5376; EPILOG-NEXT:    call void @bar()
5377; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1.loopexit1
5378; EPILOG:       loop_latch.epil:
5379; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
5380; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
5381; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
5382; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
5383; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !14
5384; EPILOG:       exit2.epilog-lcssa:
5385; EPILOG-NEXT:    br label %exit2
5386; EPILOG:       exit2:
5387; EPILOG-NEXT:    ret void
5388;
5389; EPILOG-BLOCK-LABEL: @test11(
5390; EPILOG-BLOCK-NEXT:  entry:
5391; EPILOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
5392; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
5393; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
5394; EPILOG-BLOCK-NEXT:    br i1 %1, label %exit2.unr-lcssa, label %entry.new
5395; EPILOG-BLOCK:       entry.new:
5396; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
5397; EPILOG-BLOCK-NEXT:    br label %loop_header
5398; EPILOG-BLOCK:       loop_header:
5399; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5400; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
5401; EPILOG-BLOCK-NEXT:    call void @bar()
5402; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5403; EPILOG-BLOCK:       loop_latch:
5404; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5405; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5406; EPILOG-BLOCK-NEXT:    call void @bar()
5407; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5408; EPILOG-BLOCK:       loop_latch.1:
5409; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5410; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
5411; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
5412; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !16
5413; EPILOG-BLOCK:       exit1.loopexit:
5414; EPILOG-BLOCK-NEXT:    br label %exit1
5415; EPILOG-BLOCK:       exit1:
5416; EPILOG-BLOCK-NEXT:    ret void
5417; EPILOG-BLOCK:       exit2.unr-lcssa.loopexit:
5418; EPILOG-BLOCK-NEXT:    br label %exit2.unr-lcssa
5419; EPILOG-BLOCK:       exit2.unr-lcssa:
5420; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5421; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5422; EPILOG-BLOCK:       loop_header.epil.preheader:
5423; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
5424; EPILOG-BLOCK:       loop_header.epil:
5425; EPILOG-BLOCK-NEXT:    call void @bar()
5426; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1
5427; EPILOG-BLOCK:       loop_latch.epil:
5428; EPILOG-BLOCK-NEXT:    br label %exit2
5429; EPILOG-BLOCK:       exit2:
5430; EPILOG-BLOCK-NEXT:    ret void
5431;
5432; PROLOG-LABEL: @test11(
5433; PROLOG-NEXT:  entry:
5434; PROLOG-NEXT:    %0 = add i64 %trip, -1
5435; PROLOG-NEXT:    %xtraiter = and i64 %trip, 7
5436; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5437; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5438; PROLOG:       loop_header.prol.preheader:
5439; PROLOG-NEXT:    br label %loop_header.prol
5440; PROLOG:       loop_header.prol:
5441; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
5442; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
5443; PROLOG-NEXT:    call void @bar()
5444; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1.loopexit1
5445; PROLOG:       loop_latch.prol:
5446; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
5447; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
5448; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
5449; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
5450; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !14
5451; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
5452; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
5453; PROLOG-NEXT:    br label %loop_header.prol.loopexit
5454; PROLOG:       loop_header.prol.loopexit:
5455; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
5456; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
5457; PROLOG-NEXT:    br i1 %1, label %exit2, label %entry.new
5458; PROLOG:       entry.new:
5459; PROLOG-NEXT:    br label %loop_header
5460; PROLOG:       loop_header:
5461; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5462; PROLOG-NEXT:    call void @bar()
5463; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5464; PROLOG:       loop_latch:
5465; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
5466; PROLOG-NEXT:    call void @bar()
5467; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5468; PROLOG:       loop_latch.1:
5469; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5470; PROLOG-NEXT:    call void @bar()
5471; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.loopexit
5472; PROLOG:       loop_latch.2:
5473; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
5474; PROLOG-NEXT:    call void @bar()
5475; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.loopexit
5476; PROLOG:       loop_latch.3:
5477; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
5478; PROLOG-NEXT:    call void @bar()
5479; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.loopexit
5480; PROLOG:       loop_latch.4:
5481; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
5482; PROLOG-NEXT:    call void @bar()
5483; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.loopexit
5484; PROLOG:       loop_latch.5:
5485; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
5486; PROLOG-NEXT:    call void @bar()
5487; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.loopexit
5488; PROLOG:       loop_latch.6:
5489; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
5490; PROLOG-NEXT:    call void @bar()
5491; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.loopexit
5492; PROLOG:       loop_latch.7:
5493; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
5494; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
5495; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa
5496; PROLOG:       exit1.loopexit:
5497; PROLOG-NEXT:    br label %exit1
5498; PROLOG:       exit1.loopexit1:
5499; PROLOG-NEXT:    br label %exit1
5500; PROLOG:       exit1:
5501; PROLOG-NEXT:    ret void
5502; PROLOG:       exit2.unr-lcssa:
5503; PROLOG-NEXT:    br label %exit2
5504; PROLOG:       exit2:
5505; PROLOG-NEXT:    ret void
5506;
5507; PROLOG-BLOCK-LABEL: @test11(
5508; PROLOG-BLOCK-NEXT:  entry:
5509; PROLOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
5510; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
5511; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5512; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5513; PROLOG-BLOCK:       loop_header.prol.preheader:
5514; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
5515; PROLOG-BLOCK:       loop_header.prol:
5516; PROLOG-BLOCK-NEXT:    call void @bar()
5517; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1
5518; PROLOG-BLOCK:       loop_latch.prol:
5519; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
5520; PROLOG-BLOCK:       loop_header.prol.loopexit:
5521; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
5522; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
5523; PROLOG-BLOCK-NEXT:    br i1 %1, label %exit2, label %entry.new
5524; PROLOG-BLOCK:       entry.new:
5525; PROLOG-BLOCK-NEXT:    br label %loop_header
5526; PROLOG-BLOCK:       loop_header:
5527; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5528; PROLOG-BLOCK-NEXT:    call void @bar()
5529; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5530; PROLOG-BLOCK:       loop_latch:
5531; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
5532; PROLOG-BLOCK-NEXT:    call void @bar()
5533; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5534; PROLOG-BLOCK:       loop_latch.1:
5535; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5536; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
5537; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !16
5538; PROLOG-BLOCK:       exit1.loopexit:
5539; PROLOG-BLOCK-NEXT:    br label %exit1
5540; PROLOG-BLOCK:       exit1:
5541; PROLOG-BLOCK-NEXT:    ret void
5542; PROLOG-BLOCK:       exit2.unr-lcssa:
5543; PROLOG-BLOCK-NEXT:    br label %exit2
5544; PROLOG-BLOCK:       exit2:
5545; PROLOG-BLOCK-NEXT:    ret void
5546;
5547entry:
5548  br label %loop_header
5549
5550loop_header:
5551  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
5552  call void @bar()
5553  br i1 %cond, label %loop_latch, label %exit1
5554
5555loop_latch:
5556  %iv_next = add i64 %iv, 1
5557  %cmp = icmp ne i64 %iv_next, %trip
5558  br i1 %cmp, label %loop_header, label %exit2
5559
5560exit1:
5561  ret void
5562
5563exit2:
5564  ret void
5565}
5566
5567; Combine a computeable and invariant test to make sure
5568; the interaction of both doesn't do anything weird
5569define void @test12(i64 %trip, i64 %trip2, i1 %cond) {
5570; EPILOG-LABEL: @test12(
5571; EPILOG-NEXT:  entry:
5572; EPILOG-NEXT:    %0 = add i64 %trip, -1
5573; EPILOG-NEXT:    %xtraiter = and i64 %trip, 7
5574; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
5575; EPILOG-NEXT:    br i1 %1, label %exit1.unr-lcssa, label %entry.new
5576; EPILOG:       entry.new:
5577; EPILOG-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
5578; EPILOG-NEXT:    br label %loop_header
5579; EPILOG:       loop_header:
5580; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5581; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
5582; EPILOG-NEXT:    call void @bar()
5583; EPILOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5584; EPILOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
5585; EPILOG:       loop_exiting_bb2:
5586; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit
5587; EPILOG:       loop_latch:
5588; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5589; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5590; EPILOG-NEXT:    call void @bar()
5591; EPILOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5592; EPILOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
5593; EPILOG:       loop_exiting_bb2.1:
5594; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
5595; EPILOG:       loop_latch.1:
5596; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
5597; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
5598; EPILOG-NEXT:    call void @bar()
5599; EPILOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
5600; EPILOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit
5601; EPILOG:       loop_exiting_bb2.2:
5602; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit
5603; EPILOG:       loop_latch.2:
5604; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
5605; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
5606; EPILOG-NEXT:    call void @bar()
5607; EPILOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
5608; EPILOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit
5609; EPILOG:       loop_exiting_bb2.3:
5610; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit
5611; EPILOG:       loop_latch.3:
5612; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
5613; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
5614; EPILOG-NEXT:    call void @bar()
5615; EPILOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
5616; EPILOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit
5617; EPILOG:       loop_exiting_bb2.4:
5618; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit
5619; EPILOG:       loop_latch.4:
5620; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
5621; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
5622; EPILOG-NEXT:    call void @bar()
5623; EPILOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
5624; EPILOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit
5625; EPILOG:       loop_exiting_bb2.5:
5626; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit
5627; EPILOG:       loop_latch.5:
5628; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
5629; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
5630; EPILOG-NEXT:    call void @bar()
5631; EPILOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
5632; EPILOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit
5633; EPILOG:       loop_exiting_bb2.6:
5634; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit
5635; EPILOG:       loop_latch.6:
5636; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
5637; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
5638; EPILOG-NEXT:    call void @bar()
5639; EPILOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
5640; EPILOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit
5641; EPILOG:       loop_exiting_bb2.7:
5642; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit
5643; EPILOG:       loop_latch.7:
5644; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
5645; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
5646; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
5647; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
5648; EPILOG:       exit1.unr-lcssa.loopexit:
5649; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
5650; EPILOG-NEXT:    br label %exit1.unr-lcssa
5651; EPILOG:       exit1.unr-lcssa:
5652; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
5653; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5654; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
5655; EPILOG:       loop_header.epil.preheader:
5656; EPILOG-NEXT:    br label %loop_header.epil
5657; EPILOG:       loop_header.epil:
5658; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
5659; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
5660; EPILOG-NEXT:    call void @bar()
5661; EPILOG-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil, %trip2
5662; EPILOG-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1
5663; EPILOG:       loop_exiting_bb2.epil:
5664; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1
5665; EPILOG:       loop_latch.epil:
5666; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
5667; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
5668; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
5669; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
5670; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !15
5671; EPILOG:       exit1.epilog-lcssa.loopexit:
5672; EPILOG-NEXT:    br label %exit1.epilog-lcssa
5673; EPILOG:       exit1.epilog-lcssa.loopexit1:
5674; EPILOG-NEXT:    br label %exit1.epilog-lcssa
5675; EPILOG:       exit1.epilog-lcssa:
5676; EPILOG-NEXT:    br label %exit1
5677; EPILOG:       exit1:
5678; EPILOG-NEXT:    ret void
5679;
5680; EPILOG-BLOCK-LABEL: @test12(
5681; EPILOG-BLOCK-NEXT:  entry:
5682; EPILOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
5683; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
5684; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
5685; EPILOG-BLOCK-NEXT:    br i1 %1, label %exit1.unr-lcssa, label %entry.new
5686; EPILOG-BLOCK:       entry.new:
5687; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
5688; EPILOG-BLOCK-NEXT:    br label %loop_header
5689; EPILOG-BLOCK:       loop_header:
5690; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5691; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
5692; EPILOG-BLOCK-NEXT:    call void @bar()
5693; EPILOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5694; EPILOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
5695; EPILOG-BLOCK:       loop_exiting_bb2:
5696; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit
5697; EPILOG-BLOCK:       loop_latch:
5698; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5699; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5700; EPILOG-BLOCK-NEXT:    call void @bar()
5701; EPILOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5702; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
5703; EPILOG-BLOCK:       loop_exiting_bb2.1:
5704; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
5705; EPILOG-BLOCK:       loop_latch.1:
5706; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5707; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
5708; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
5709; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !17
5710; EPILOG-BLOCK:       exit1.unr-lcssa.loopexit:
5711; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
5712; EPILOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
5713; EPILOG-BLOCK:       exit1.unr-lcssa:
5714; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
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 %exit1
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:    %cmp_early.epil = icmp ne i64 %iv.unr, %trip2
5722; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa
5723; EPILOG-BLOCK:       loop_exiting_bb2.epil:
5724; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa
5725; EPILOG-BLOCK:       loop_latch.epil:
5726; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
5727; EPILOG-BLOCK:       exit1.epilog-lcssa.loopexit:
5728; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
5729; EPILOG-BLOCK:       exit1.epilog-lcssa:
5730; EPILOG-BLOCK-NEXT:    br label %exit1
5731; EPILOG-BLOCK:       exit1:
5732; EPILOG-BLOCK-NEXT:    ret void
5733;
5734; PROLOG-LABEL: @test12(
5735; PROLOG-NEXT:  entry:
5736; PROLOG-NEXT:    %0 = add i64 %trip, -1
5737; PROLOG-NEXT:    %xtraiter = and i64 %trip, 7
5738; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5739; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5740; PROLOG:       loop_header.prol.preheader:
5741; PROLOG-NEXT:    br label %loop_header.prol
5742; PROLOG:       loop_header.prol:
5743; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
5744; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
5745; PROLOG-NEXT:    call void @bar()
5746; PROLOG-NEXT:    %cmp_early.prol = icmp ne i64 %iv.prol, %trip2
5747; PROLOG-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1
5748; PROLOG:       loop_exiting_bb2.prol:
5749; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1
5750; PROLOG:       loop_latch.prol:
5751; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
5752; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
5753; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
5754; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
5755; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !15
5756; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
5757; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
5758; PROLOG-NEXT:    br label %loop_header.prol.loopexit
5759; PROLOG:       loop_header.prol.loopexit:
5760; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
5761; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
5762; PROLOG-NEXT:    br i1 %1, label %exit1, label %entry.new
5763; PROLOG:       entry.new:
5764; PROLOG-NEXT:    br label %loop_header
5765; PROLOG:       loop_header:
5766; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5767; PROLOG-NEXT:    call void @bar()
5768; PROLOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5769; PROLOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
5770; PROLOG:       loop_exiting_bb2:
5771; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit
5772; PROLOG:       loop_latch:
5773; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
5774; PROLOG-NEXT:    call void @bar()
5775; PROLOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5776; PROLOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
5777; PROLOG:       loop_exiting_bb2.1:
5778; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
5779; PROLOG:       loop_latch.1:
5780; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5781; PROLOG-NEXT:    call void @bar()
5782; PROLOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
5783; PROLOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit
5784; PROLOG:       loop_exiting_bb2.2:
5785; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.unr-lcssa.loopexit
5786; PROLOG:       loop_latch.2:
5787; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
5788; PROLOG-NEXT:    call void @bar()
5789; PROLOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
5790; PROLOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit
5791; PROLOG:       loop_exiting_bb2.3:
5792; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.unr-lcssa.loopexit
5793; PROLOG:       loop_latch.3:
5794; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
5795; PROLOG-NEXT:    call void @bar()
5796; PROLOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
5797; PROLOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit
5798; PROLOG:       loop_exiting_bb2.4:
5799; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.unr-lcssa.loopexit
5800; PROLOG:       loop_latch.4:
5801; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
5802; PROLOG-NEXT:    call void @bar()
5803; PROLOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
5804; PROLOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit
5805; PROLOG:       loop_exiting_bb2.5:
5806; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.unr-lcssa.loopexit
5807; PROLOG:       loop_latch.5:
5808; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
5809; PROLOG-NEXT:    call void @bar()
5810; PROLOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
5811; PROLOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit
5812; PROLOG:       loop_exiting_bb2.6:
5813; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.unr-lcssa.loopexit
5814; PROLOG:       loop_latch.6:
5815; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
5816; PROLOG-NEXT:    call void @bar()
5817; PROLOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
5818; PROLOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit
5819; PROLOG:       loop_exiting_bb2.7:
5820; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.unr-lcssa.loopexit
5821; PROLOG:       loop_latch.7:
5822; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
5823; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
5824; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
5825; PROLOG:       exit1.unr-lcssa.loopexit:
5826; PROLOG-NEXT:    br label %exit1.unr-lcssa
5827; PROLOG:       exit1.unr-lcssa.loopexit1:
5828; PROLOG-NEXT:    br label %exit1.unr-lcssa
5829; PROLOG:       exit1.unr-lcssa:
5830; PROLOG-NEXT:    br label %exit1
5831; PROLOG:       exit1:
5832; PROLOG-NEXT:    ret void
5833;
5834; PROLOG-BLOCK-LABEL: @test12(
5835; PROLOG-BLOCK-NEXT:  entry:
5836; PROLOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
5837; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
5838; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5839; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5840; PROLOG-BLOCK:       loop_header.prol.preheader:
5841; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
5842; PROLOG-BLOCK:       loop_header.prol:
5843; PROLOG-BLOCK-NEXT:    call void @bar()
5844; PROLOG-BLOCK-NEXT:    %cmp_early.prol = icmp ne i64 0, %trip2
5845; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa
5846; PROLOG-BLOCK:       loop_exiting_bb2.prol:
5847; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa
5848; PROLOG-BLOCK:       loop_latch.prol:
5849; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
5850; PROLOG-BLOCK:       loop_header.prol.loopexit:
5851; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
5852; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
5853; PROLOG-BLOCK-NEXT:    br i1 %1, label %exit1, label %entry.new
5854; PROLOG-BLOCK:       entry.new:
5855; PROLOG-BLOCK-NEXT:    br label %loop_header
5856; PROLOG-BLOCK:       loop_header:
5857; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5858; PROLOG-BLOCK-NEXT:    call void @bar()
5859; PROLOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5860; PROLOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
5861; PROLOG-BLOCK:       loop_exiting_bb2:
5862; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit
5863; PROLOG-BLOCK:       loop_latch:
5864; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
5865; PROLOG-BLOCK-NEXT:    call void @bar()
5866; PROLOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5867; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
5868; PROLOG-BLOCK:       loop_exiting_bb2.1:
5869; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
5870; PROLOG-BLOCK:       loop_latch.1:
5871; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5872; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
5873; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !17
5874; PROLOG-BLOCK:       exit1.unr-lcssa.loopexit:
5875; PROLOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
5876; PROLOG-BLOCK:       exit1.unr-lcssa:
5877; PROLOG-BLOCK-NEXT:    br label %exit1
5878; PROLOG-BLOCK:       exit1:
5879; PROLOG-BLOCK-NEXT:    ret void
5880;
5881entry:
5882  br label %loop_header
5883
5884loop_header:
5885  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
5886  call void @bar()
5887  %cmp_early = icmp ne i64 %iv, %trip2
5888  br i1 %cmp_early, label %loop_exiting_bb2, label %exit1
5889
5890loop_exiting_bb2:
5891  br i1 %cond, label %loop_latch, label %exit1
5892
5893loop_latch:
5894  %iv_next = add i64 %iv, 1
5895  %cmp = icmp ne i64 %iv_next, %trip
5896  br i1 %cmp, label %loop_header, label %exit1
5897
5898exit1:
5899  ret void
5900}
5901
5902declare i1 @unknown_cond()
5903
5904; Mix of computable and uncompatable exits
5905define void @test13(i64 %trip, i64 %trip2) {
5906; EPILOG-LABEL: @test13(
5907; EPILOG-NEXT:  entry:
5908; EPILOG-NEXT:    %0 = add i64 %trip, -1
5909; EPILOG-NEXT:    %xtraiter = and i64 %trip, 7
5910; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
5911; EPILOG-NEXT:    br i1 %1, label %exit1.unr-lcssa, label %entry.new
5912; EPILOG:       entry.new:
5913; EPILOG-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
5914; EPILOG-NEXT:    br label %loop_header
5915; EPILOG:       loop_header:
5916; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5917; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
5918; EPILOG-NEXT:    call void @bar()
5919; EPILOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5920; EPILOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
5921; EPILOG:       loop_exiting_bb2:
5922; EPILOG-NEXT:    %unknown = call i1 @unknown_cond()
5923; EPILOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
5924; EPILOG:       loop_latch:
5925; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
5926; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5927; EPILOG-NEXT:    call void @bar()
5928; EPILOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5929; EPILOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
5930; EPILOG:       loop_exiting_bb2.1:
5931; EPILOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
5932; EPILOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
5933; EPILOG:       loop_latch.1:
5934; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
5935; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
5936; EPILOG-NEXT:    call void @bar()
5937; EPILOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
5938; EPILOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit
5939; EPILOG:       loop_exiting_bb2.2:
5940; EPILOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
5941; EPILOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit
5942; EPILOG:       loop_latch.2:
5943; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
5944; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
5945; EPILOG-NEXT:    call void @bar()
5946; EPILOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
5947; EPILOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit
5948; EPILOG:       loop_exiting_bb2.3:
5949; EPILOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
5950; EPILOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit
5951; EPILOG:       loop_latch.3:
5952; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
5953; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
5954; EPILOG-NEXT:    call void @bar()
5955; EPILOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
5956; EPILOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit
5957; EPILOG:       loop_exiting_bb2.4:
5958; EPILOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
5959; EPILOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit
5960; EPILOG:       loop_latch.4:
5961; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
5962; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
5963; EPILOG-NEXT:    call void @bar()
5964; EPILOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
5965; EPILOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit
5966; EPILOG:       loop_exiting_bb2.5:
5967; EPILOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
5968; EPILOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit
5969; EPILOG:       loop_latch.5:
5970; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
5971; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
5972; EPILOG-NEXT:    call void @bar()
5973; EPILOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
5974; EPILOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit
5975; EPILOG:       loop_exiting_bb2.6:
5976; EPILOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
5977; EPILOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit
5978; EPILOG:       loop_latch.6:
5979; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
5980; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
5981; EPILOG-NEXT:    call void @bar()
5982; EPILOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
5983; EPILOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit
5984; EPILOG:       loop_exiting_bb2.7:
5985; EPILOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
5986; EPILOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit
5987; EPILOG:       loop_latch.7:
5988; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
5989; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
5990; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
5991; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
5992; EPILOG:       exit1.unr-lcssa.loopexit:
5993; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
5994; EPILOG-NEXT:    br label %exit1.unr-lcssa
5995; EPILOG:       exit1.unr-lcssa:
5996; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
5997; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5998; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
5999; EPILOG:       loop_header.epil.preheader:
6000; EPILOG-NEXT:    br label %loop_header.epil
6001; EPILOG:       loop_header.epil:
6002; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
6003; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
6004; EPILOG-NEXT:    call void @bar()
6005; EPILOG-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil, %trip2
6006; EPILOG-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1
6007; EPILOG:       loop_exiting_bb2.epil:
6008; EPILOG-NEXT:    %unknown.epil = call i1 @unknown_cond()
6009; EPILOG-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1
6010; EPILOG:       loop_latch.epil:
6011; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
6012; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
6013; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
6014; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
6015; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !16
6016; EPILOG:       exit1.epilog-lcssa.loopexit:
6017; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6018; EPILOG:       exit1.epilog-lcssa.loopexit1:
6019; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6020; EPILOG:       exit1.epilog-lcssa:
6021; EPILOG-NEXT:    br label %exit1
6022; EPILOG:       exit1:
6023; EPILOG-NEXT:    ret void
6024;
6025; EPILOG-BLOCK-LABEL: @test13(
6026; EPILOG-BLOCK-NEXT:  entry:
6027; EPILOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
6028; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
6029; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
6030; EPILOG-BLOCK-NEXT:    br i1 %1, label %exit1.unr-lcssa, label %entry.new
6031; EPILOG-BLOCK:       entry.new:
6032; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
6033; EPILOG-BLOCK-NEXT:    br label %loop_header
6034; EPILOG-BLOCK:       loop_header:
6035; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6036; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
6037; EPILOG-BLOCK-NEXT:    call void @bar()
6038; EPILOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6039; EPILOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6040; EPILOG-BLOCK:       loop_exiting_bb2:
6041; EPILOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6042; EPILOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6043; EPILOG-BLOCK:       loop_latch:
6044; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
6045; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
6046; EPILOG-BLOCK-NEXT:    call void @bar()
6047; EPILOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6048; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6049; EPILOG-BLOCK:       loop_exiting_bb2.1:
6050; EPILOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6051; EPILOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6052; EPILOG-BLOCK:       loop_latch.1:
6053; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6054; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
6055; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
6056; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18
6057; EPILOG-BLOCK:       exit1.unr-lcssa.loopexit:
6058; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
6059; EPILOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6060; EPILOG-BLOCK:       exit1.unr-lcssa:
6061; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
6062; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6063; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6064; EPILOG-BLOCK:       loop_header.epil.preheader:
6065; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
6066; EPILOG-BLOCK:       loop_header.epil:
6067; EPILOG-BLOCK-NEXT:    call void @bar()
6068; EPILOG-BLOCK-NEXT:    %cmp_early.epil = icmp ne i64 %iv.unr, %trip2
6069; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa
6070; EPILOG-BLOCK:       loop_exiting_bb2.epil:
6071; EPILOG-BLOCK-NEXT:    %unknown.epil = call i1 @unknown_cond()
6072; EPILOG-BLOCK-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa
6073; EPILOG-BLOCK:       loop_latch.epil:
6074; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6075; EPILOG-BLOCK:       exit1.epilog-lcssa.loopexit:
6076; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6077; EPILOG-BLOCK:       exit1.epilog-lcssa:
6078; EPILOG-BLOCK-NEXT:    br label %exit1
6079; EPILOG-BLOCK:       exit1:
6080; EPILOG-BLOCK-NEXT:    ret void
6081;
6082; PROLOG-LABEL: @test13(
6083; PROLOG-NEXT:  entry:
6084; PROLOG-NEXT:    %0 = add i64 %trip, -1
6085; PROLOG-NEXT:    %xtraiter = and i64 %trip, 7
6086; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6087; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6088; PROLOG:       loop_header.prol.preheader:
6089; PROLOG-NEXT:    br label %loop_header.prol
6090; PROLOG:       loop_header.prol:
6091; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
6092; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
6093; PROLOG-NEXT:    call void @bar()
6094; PROLOG-NEXT:    %cmp_early.prol = icmp ne i64 %iv.prol, %trip2
6095; PROLOG-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1
6096; PROLOG:       loop_exiting_bb2.prol:
6097; PROLOG-NEXT:    %unknown.prol = call i1 @unknown_cond()
6098; PROLOG-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1
6099; PROLOG:       loop_latch.prol:
6100; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
6101; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
6102; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
6103; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
6104; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !16
6105; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
6106; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
6107; PROLOG-NEXT:    br label %loop_header.prol.loopexit
6108; PROLOG:       loop_header.prol.loopexit:
6109; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
6110; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
6111; PROLOG-NEXT:    br i1 %1, label %exit1, label %entry.new
6112; PROLOG:       entry.new:
6113; PROLOG-NEXT:    br label %loop_header
6114; PROLOG:       loop_header:
6115; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6116; PROLOG-NEXT:    call void @bar()
6117; PROLOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6118; PROLOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6119; PROLOG:       loop_exiting_bb2:
6120; PROLOG-NEXT:    %unknown = call i1 @unknown_cond()
6121; PROLOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6122; PROLOG:       loop_latch:
6123; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
6124; PROLOG-NEXT:    call void @bar()
6125; PROLOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6126; PROLOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6127; PROLOG:       loop_exiting_bb2.1:
6128; PROLOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
6129; PROLOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6130; PROLOG:       loop_latch.1:
6131; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6132; PROLOG-NEXT:    call void @bar()
6133; PROLOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
6134; PROLOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit
6135; PROLOG:       loop_exiting_bb2.2:
6136; PROLOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
6137; PROLOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit
6138; PROLOG:       loop_latch.2:
6139; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
6140; PROLOG-NEXT:    call void @bar()
6141; PROLOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
6142; PROLOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit
6143; PROLOG:       loop_exiting_bb2.3:
6144; PROLOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
6145; PROLOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit
6146; PROLOG:       loop_latch.3:
6147; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
6148; PROLOG-NEXT:    call void @bar()
6149; PROLOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
6150; PROLOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit
6151; PROLOG:       loop_exiting_bb2.4:
6152; PROLOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
6153; PROLOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit
6154; PROLOG:       loop_latch.4:
6155; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
6156; PROLOG-NEXT:    call void @bar()
6157; PROLOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
6158; PROLOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit
6159; PROLOG:       loop_exiting_bb2.5:
6160; PROLOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
6161; PROLOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit
6162; PROLOG:       loop_latch.5:
6163; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
6164; PROLOG-NEXT:    call void @bar()
6165; PROLOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
6166; PROLOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit
6167; PROLOG:       loop_exiting_bb2.6:
6168; PROLOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
6169; PROLOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit
6170; PROLOG:       loop_latch.6:
6171; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
6172; PROLOG-NEXT:    call void @bar()
6173; PROLOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
6174; PROLOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit
6175; PROLOG:       loop_exiting_bb2.7:
6176; PROLOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
6177; PROLOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit
6178; PROLOG:       loop_latch.7:
6179; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
6180; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
6181; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6182; PROLOG:       exit1.unr-lcssa.loopexit:
6183; PROLOG-NEXT:    br label %exit1.unr-lcssa
6184; PROLOG:       exit1.unr-lcssa.loopexit1:
6185; PROLOG-NEXT:    br label %exit1.unr-lcssa
6186; PROLOG:       exit1.unr-lcssa:
6187; PROLOG-NEXT:    br label %exit1
6188; PROLOG:       exit1:
6189; PROLOG-NEXT:    ret void
6190;
6191; PROLOG-BLOCK-LABEL: @test13(
6192; PROLOG-BLOCK-NEXT:  entry:
6193; PROLOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
6194; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
6195; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6196; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6197; PROLOG-BLOCK:       loop_header.prol.preheader:
6198; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
6199; PROLOG-BLOCK:       loop_header.prol:
6200; PROLOG-BLOCK-NEXT:    call void @bar()
6201; PROLOG-BLOCK-NEXT:    %cmp_early.prol = icmp ne i64 0, %trip2
6202; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa
6203; PROLOG-BLOCK:       loop_exiting_bb2.prol:
6204; PROLOG-BLOCK-NEXT:    %unknown.prol = call i1 @unknown_cond()
6205; PROLOG-BLOCK-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa
6206; PROLOG-BLOCK:       loop_latch.prol:
6207; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
6208; PROLOG-BLOCK:       loop_header.prol.loopexit:
6209; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
6210; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
6211; PROLOG-BLOCK-NEXT:    br i1 %1, label %exit1, label %entry.new
6212; PROLOG-BLOCK:       entry.new:
6213; PROLOG-BLOCK-NEXT:    br label %loop_header
6214; PROLOG-BLOCK:       loop_header:
6215; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6216; PROLOG-BLOCK-NEXT:    call void @bar()
6217; PROLOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6218; PROLOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6219; PROLOG-BLOCK:       loop_exiting_bb2:
6220; PROLOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6221; PROLOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6222; PROLOG-BLOCK:       loop_latch:
6223; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
6224; PROLOG-BLOCK-NEXT:    call void @bar()
6225; PROLOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6226; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6227; PROLOG-BLOCK:       loop_exiting_bb2.1:
6228; PROLOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6229; PROLOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6230; PROLOG-BLOCK:       loop_latch.1:
6231; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6232; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
6233; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18
6234; PROLOG-BLOCK:       exit1.unr-lcssa.loopexit:
6235; PROLOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6236; PROLOG-BLOCK:       exit1.unr-lcssa:
6237; PROLOG-BLOCK-NEXT:    br label %exit1
6238; PROLOG-BLOCK:       exit1:
6239; PROLOG-BLOCK-NEXT:    ret void
6240;
6241entry:
6242  br label %loop_header
6243
6244loop_header:
6245  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
6246  call void @bar()
6247  %cmp_early = icmp ne i64 %iv, %trip2
6248  br i1 %cmp_early, label %loop_exiting_bb2, label %exit1
6249
6250loop_exiting_bb2:
6251  %unknown = call i1 @unknown_cond()
6252  br i1 %unknown, label %loop_latch, label %exit1
6253
6254loop_latch:
6255  %iv_next = add i64 %iv, 1
6256  %cmp = icmp ne i64 %iv_next, %trip
6257  br i1 %cmp, label %loop_header, label %exit1
6258
6259exit1:
6260  ret void
6261}
6262
6263; Mix of invariant and (even in theory) uncomputable exits
6264define void @test14(i64 %trip, i1 %cond) {
6265; EPILOG-LABEL: @test14(
6266; EPILOG-NEXT:  entry:
6267; EPILOG-NEXT:    %0 = add i64 %trip, -1
6268; EPILOG-NEXT:    %xtraiter = and i64 %trip, 7
6269; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
6270; EPILOG-NEXT:    br i1 %1, label %exit1.unr-lcssa, label %entry.new
6271; EPILOG:       entry.new:
6272; EPILOG-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
6273; EPILOG-NEXT:    br label %loop_header
6274; EPILOG:       loop_header:
6275; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6276; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
6277; EPILOG-NEXT:    call void @bar()
6278; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6279; EPILOG:       loop_exiting_bb2:
6280; EPILOG-NEXT:    %unknown = call i1 @unknown_cond()
6281; EPILOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6282; EPILOG:       loop_latch:
6283; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
6284; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
6285; EPILOG-NEXT:    call void @bar()
6286; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6287; EPILOG:       loop_exiting_bb2.1:
6288; EPILOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
6289; EPILOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6290; EPILOG:       loop_latch.1:
6291; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
6292; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
6293; EPILOG-NEXT:    call void @bar()
6294; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit
6295; EPILOG:       loop_exiting_bb2.2:
6296; EPILOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
6297; EPILOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit
6298; EPILOG:       loop_latch.2:
6299; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
6300; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
6301; EPILOG-NEXT:    call void @bar()
6302; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit
6303; EPILOG:       loop_exiting_bb2.3:
6304; EPILOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
6305; EPILOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit
6306; EPILOG:       loop_latch.3:
6307; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
6308; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
6309; EPILOG-NEXT:    call void @bar()
6310; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit
6311; EPILOG:       loop_exiting_bb2.4:
6312; EPILOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
6313; EPILOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit
6314; EPILOG:       loop_latch.4:
6315; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
6316; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
6317; EPILOG-NEXT:    call void @bar()
6318; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit
6319; EPILOG:       loop_exiting_bb2.5:
6320; EPILOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
6321; EPILOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit
6322; EPILOG:       loop_latch.5:
6323; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
6324; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
6325; EPILOG-NEXT:    call void @bar()
6326; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit
6327; EPILOG:       loop_exiting_bb2.6:
6328; EPILOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
6329; EPILOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit
6330; EPILOG:       loop_latch.6:
6331; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
6332; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
6333; EPILOG-NEXT:    call void @bar()
6334; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit
6335; EPILOG:       loop_exiting_bb2.7:
6336; EPILOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
6337; EPILOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit
6338; EPILOG:       loop_latch.7:
6339; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
6340; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
6341; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
6342; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6343; EPILOG:       exit1.unr-lcssa.loopexit:
6344; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
6345; EPILOG-NEXT:    br label %exit1.unr-lcssa
6346; EPILOG:       exit1.unr-lcssa:
6347; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
6348; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6349; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6350; EPILOG:       loop_header.epil.preheader:
6351; EPILOG-NEXT:    br label %loop_header.epil
6352; EPILOG:       loop_header.epil:
6353; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
6354; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
6355; EPILOG-NEXT:    call void @bar()
6356; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1
6357; EPILOG:       loop_exiting_bb2.epil:
6358; EPILOG-NEXT:    %unknown.epil = call i1 @unknown_cond()
6359; EPILOG-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1
6360; EPILOG:       loop_latch.epil:
6361; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
6362; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
6363; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
6364; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
6365; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !17
6366; EPILOG:       exit1.epilog-lcssa.loopexit:
6367; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6368; EPILOG:       exit1.epilog-lcssa.loopexit1:
6369; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6370; EPILOG:       exit1.epilog-lcssa:
6371; EPILOG-NEXT:    br label %exit1
6372; EPILOG:       exit1:
6373; EPILOG-NEXT:    ret void
6374;
6375; EPILOG-BLOCK-LABEL: @test14(
6376; EPILOG-BLOCK-NEXT:  entry:
6377; EPILOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
6378; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
6379; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
6380; EPILOG-BLOCK-NEXT:    br i1 %1, label %exit1.unr-lcssa, label %entry.new
6381; EPILOG-BLOCK:       entry.new:
6382; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
6383; EPILOG-BLOCK-NEXT:    br label %loop_header
6384; EPILOG-BLOCK:       loop_header:
6385; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6386; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
6387; EPILOG-BLOCK-NEXT:    call void @bar()
6388; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6389; EPILOG-BLOCK:       loop_exiting_bb2:
6390; EPILOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6391; EPILOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6392; EPILOG-BLOCK:       loop_latch:
6393; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
6394; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
6395; EPILOG-BLOCK-NEXT:    call void @bar()
6396; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6397; EPILOG-BLOCK:       loop_exiting_bb2.1:
6398; EPILOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6399; EPILOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6400; EPILOG-BLOCK:       loop_latch.1:
6401; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6402; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
6403; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
6404; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19
6405; EPILOG-BLOCK:       exit1.unr-lcssa.loopexit:
6406; EPILOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6407; EPILOG-BLOCK:       exit1.unr-lcssa:
6408; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6409; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6410; EPILOG-BLOCK:       loop_header.epil.preheader:
6411; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
6412; EPILOG-BLOCK:       loop_header.epil:
6413; EPILOG-BLOCK-NEXT:    call void @bar()
6414; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa
6415; EPILOG-BLOCK:       loop_exiting_bb2.epil:
6416; EPILOG-BLOCK-NEXT:    %unknown.epil = call i1 @unknown_cond()
6417; EPILOG-BLOCK-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa
6418; EPILOG-BLOCK:       loop_latch.epil:
6419; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6420; EPILOG-BLOCK:       exit1.epilog-lcssa.loopexit:
6421; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6422; EPILOG-BLOCK:       exit1.epilog-lcssa:
6423; EPILOG-BLOCK-NEXT:    br label %exit1
6424; EPILOG-BLOCK:       exit1:
6425; EPILOG-BLOCK-NEXT:    ret void
6426;
6427; PROLOG-LABEL: @test14(
6428; PROLOG-NEXT:  entry:
6429; PROLOG-NEXT:    %0 = add i64 %trip, -1
6430; PROLOG-NEXT:    %xtraiter = and i64 %trip, 7
6431; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6432; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6433; PROLOG:       loop_header.prol.preheader:
6434; PROLOG-NEXT:    br label %loop_header.prol
6435; PROLOG:       loop_header.prol:
6436; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
6437; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
6438; PROLOG-NEXT:    call void @bar()
6439; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1
6440; PROLOG:       loop_exiting_bb2.prol:
6441; PROLOG-NEXT:    %unknown.prol = call i1 @unknown_cond()
6442; PROLOG-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1
6443; PROLOG:       loop_latch.prol:
6444; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
6445; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
6446; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
6447; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
6448; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !17
6449; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
6450; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
6451; PROLOG-NEXT:    br label %loop_header.prol.loopexit
6452; PROLOG:       loop_header.prol.loopexit:
6453; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
6454; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
6455; PROLOG-NEXT:    br i1 %1, label %exit1, label %entry.new
6456; PROLOG:       entry.new:
6457; PROLOG-NEXT:    br label %loop_header
6458; PROLOG:       loop_header:
6459; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6460; PROLOG-NEXT:    call void @bar()
6461; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6462; PROLOG:       loop_exiting_bb2:
6463; PROLOG-NEXT:    %unknown = call i1 @unknown_cond()
6464; PROLOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6465; PROLOG:       loop_latch:
6466; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
6467; PROLOG-NEXT:    call void @bar()
6468; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6469; PROLOG:       loop_exiting_bb2.1:
6470; PROLOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
6471; PROLOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6472; PROLOG:       loop_latch.1:
6473; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6474; PROLOG-NEXT:    call void @bar()
6475; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit
6476; PROLOG:       loop_exiting_bb2.2:
6477; PROLOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
6478; PROLOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit
6479; PROLOG:       loop_latch.2:
6480; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
6481; PROLOG-NEXT:    call void @bar()
6482; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit
6483; PROLOG:       loop_exiting_bb2.3:
6484; PROLOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
6485; PROLOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit
6486; PROLOG:       loop_latch.3:
6487; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
6488; PROLOG-NEXT:    call void @bar()
6489; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit
6490; PROLOG:       loop_exiting_bb2.4:
6491; PROLOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
6492; PROLOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit
6493; PROLOG:       loop_latch.4:
6494; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
6495; PROLOG-NEXT:    call void @bar()
6496; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit
6497; PROLOG:       loop_exiting_bb2.5:
6498; PROLOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
6499; PROLOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit
6500; PROLOG:       loop_latch.5:
6501; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
6502; PROLOG-NEXT:    call void @bar()
6503; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit
6504; PROLOG:       loop_exiting_bb2.6:
6505; PROLOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
6506; PROLOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit
6507; PROLOG:       loop_latch.6:
6508; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
6509; PROLOG-NEXT:    call void @bar()
6510; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit
6511; PROLOG:       loop_exiting_bb2.7:
6512; PROLOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
6513; PROLOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit
6514; PROLOG:       loop_latch.7:
6515; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
6516; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
6517; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6518; PROLOG:       exit1.unr-lcssa.loopexit:
6519; PROLOG-NEXT:    br label %exit1.unr-lcssa
6520; PROLOG:       exit1.unr-lcssa.loopexit1:
6521; PROLOG-NEXT:    br label %exit1.unr-lcssa
6522; PROLOG:       exit1.unr-lcssa:
6523; PROLOG-NEXT:    br label %exit1
6524; PROLOG:       exit1:
6525; PROLOG-NEXT:    ret void
6526;
6527; PROLOG-BLOCK-LABEL: @test14(
6528; PROLOG-BLOCK-NEXT:  entry:
6529; PROLOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
6530; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
6531; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6532; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6533; PROLOG-BLOCK:       loop_header.prol.preheader:
6534; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
6535; PROLOG-BLOCK:       loop_header.prol:
6536; PROLOG-BLOCK-NEXT:    call void @bar()
6537; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa
6538; PROLOG-BLOCK:       loop_exiting_bb2.prol:
6539; PROLOG-BLOCK-NEXT:    %unknown.prol = call i1 @unknown_cond()
6540; PROLOG-BLOCK-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa
6541; PROLOG-BLOCK:       loop_latch.prol:
6542; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
6543; PROLOG-BLOCK:       loop_header.prol.loopexit:
6544; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
6545; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
6546; PROLOG-BLOCK-NEXT:    br i1 %1, label %exit1, label %entry.new
6547; PROLOG-BLOCK:       entry.new:
6548; PROLOG-BLOCK-NEXT:    br label %loop_header
6549; PROLOG-BLOCK:       loop_header:
6550; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6551; PROLOG-BLOCK-NEXT:    call void @bar()
6552; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6553; PROLOG-BLOCK:       loop_exiting_bb2:
6554; PROLOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6555; PROLOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6556; PROLOG-BLOCK:       loop_latch:
6557; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
6558; PROLOG-BLOCK-NEXT:    call void @bar()
6559; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6560; PROLOG-BLOCK:       loop_exiting_bb2.1:
6561; PROLOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6562; PROLOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6563; PROLOG-BLOCK:       loop_latch.1:
6564; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6565; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
6566; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19
6567; PROLOG-BLOCK:       exit1.unr-lcssa.loopexit:
6568; PROLOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6569; PROLOG-BLOCK:       exit1.unr-lcssa:
6570; PROLOG-BLOCK-NEXT:    br label %exit1
6571; PROLOG-BLOCK:       exit1:
6572; PROLOG-BLOCK-NEXT:    ret void
6573;
6574entry:
6575  br label %loop_header
6576
6577loop_header:
6578  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
6579  call void @bar()
6580  br i1 %cond, label %loop_exiting_bb2, label %exit1
6581
6582loop_exiting_bb2:
6583  %unknown = call i1 @unknown_cond()
6584  br i1 %unknown, label %loop_latch, label %exit1
6585
6586loop_latch:
6587  %iv_next = add i64 %iv, 1
6588  %cmp = icmp ne i64 %iv_next, %trip
6589  br i1 %cmp, label %loop_header, label %exit1
6590
6591exit1:
6592  ret void
6593}
6594