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 [ %unroll_iter, %entry.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
38; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
39; EPILOG:       exit1.loopexit:
40; EPILOG-NEXT:    br label %exit1
41; EPILOG:       exit1.loopexit1:
42; EPILOG-NEXT:    br label %exit1
43; EPILOG:       exit1:
44; EPILOG-NEXT:    ret void
45; EPILOG:       exit2.loopexit.unr-lcssa.loopexit:
46; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
47; EPILOG-NEXT:    br label %exit2.loopexit.unr-lcssa
48; EPILOG:       exit2.loopexit.unr-lcssa:
49; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
50; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
51; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
52; EPILOG:       loop_header.epil.preheader:
53; EPILOG-NEXT:    br label %loop_header.epil
54; EPILOG:       loop_header.epil:
55; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
56; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ]
57; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil
58; EPILOG:       loop_exiting_bb1.epil:
59; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.epil, label %exit1.loopexit1
60; EPILOG:       loop_exiting_bb2.epil:
61; EPILOG-NEXT:    br i1 false, label %loop_latch.epil, label %exit3.loopexit2
62; EPILOG:       loop_latch.epil:
63; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
64; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
65; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
66; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
67; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !0
68; EPILOG:       exit2.loopexit.epilog-lcssa:
69; EPILOG-NEXT:    br label %exit2.loopexit
70; EPILOG:       exit2.loopexit:
71; EPILOG-NEXT:    ret void
72; EPILOG:       loop_exiting_bb1.1:
73; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
74; EPILOG:       loop_exiting_bb2.1:
75; EPILOG-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
76; EPILOG:       loop_latch.1:
77; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
78; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
79; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2
80; EPILOG:       loop_exiting_bb1.2:
81; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit
82; EPILOG:       loop_exiting_bb2.2:
83; EPILOG-NEXT:    br i1 false, label %loop_latch.2, label %exit3.loopexit
84; EPILOG:       loop_latch.2:
85; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
86; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
87; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3
88; EPILOG:       loop_exiting_bb1.3:
89; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit
90; EPILOG:       loop_exiting_bb2.3:
91; EPILOG-NEXT:    br i1 false, label %loop_latch.3, label %exit3.loopexit
92; EPILOG:       loop_latch.3:
93; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
94; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
95; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4
96; EPILOG:       loop_exiting_bb1.4:
97; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit
98; EPILOG:       loop_exiting_bb2.4:
99; EPILOG-NEXT:    br i1 false, label %loop_latch.4, label %exit3.loopexit
100; EPILOG:       loop_latch.4:
101; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
102; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
103; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5
104; EPILOG:       loop_exiting_bb1.5:
105; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit
106; EPILOG:       loop_exiting_bb2.5:
107; EPILOG-NEXT:    br i1 false, label %loop_latch.5, label %exit3.loopexit
108; EPILOG:       loop_latch.5:
109; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
110; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
111; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6
112; EPILOG:       loop_exiting_bb1.6:
113; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit
114; EPILOG:       loop_exiting_bb2.6:
115; EPILOG-NEXT:    br i1 false, label %loop_latch.6, label %exit3.loopexit
116; EPILOG:       loop_latch.6:
117; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
118; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
119; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7
120; EPILOG:       loop_exiting_bb1.7:
121; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit
122; EPILOG:       loop_exiting_bb2.7:
123; EPILOG-NEXT:    br i1 false, label %loop_latch.7, label %exit3.loopexit
124; EPILOG:       loop_latch.7:
125; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
126; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
127; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0
128; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit
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 [ %unroll_iter, %entry.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
154; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
155; EPILOG-BLOCK:       exit1.loopexit:
156; EPILOG-BLOCK-NEXT:    br label %exit1
157; EPILOG-BLOCK:       exit1:
158; EPILOG-BLOCK-NEXT:    ret void
159; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa.loopexit:
160; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit.unr-lcssa
161; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa:
162; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
163; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
164; EPILOG-BLOCK:       loop_header.epil.preheader:
165; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
166; EPILOG-BLOCK:       loop_header.epil:
167; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil
168; EPILOG-BLOCK:       loop_exiting_bb1.epil:
169; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.epil, label %exit1
170; EPILOG-BLOCK:       loop_exiting_bb2.epil:
171; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch.epil, label %exit3
172; EPILOG-BLOCK:       loop_latch.epil:
173; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit
174; EPILOG-BLOCK:       exit2.loopexit:
175; EPILOG-BLOCK-NEXT:    ret void
176; EPILOG-BLOCK:       loop_exiting_bb1.1:
177; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
178; EPILOG-BLOCK:       loop_exiting_bb2.1:
179; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
180; EPILOG-BLOCK:       loop_latch.1:
181; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
182; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
183; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0
184; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !0
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 [ %xtraiter, %loop_header.prol.preheader ], [ %prol.iter.sub, %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.sub = sub i64 %prol.iter, 1
206; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
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:       exit1.loopexit:
234; PROLOG-NEXT:    br label %exit1
235; PROLOG:       exit1.loopexit1:
236; PROLOG-NEXT:    br label %exit1
237; PROLOG:       exit1:
238; PROLOG-NEXT:    ret void
239; PROLOG:       exit2.loopexit.unr-lcssa:
240; PROLOG-NEXT:    br label %exit2.loopexit
241; PROLOG:       exit2.loopexit:
242; PROLOG-NEXT:    ret void
243; PROLOG:       loop_exiting_bb1.1:
244; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
245; PROLOG:       loop_exiting_bb2.1:
246; PROLOG-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
247; PROLOG:       loop_latch.1:
248; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
249; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2
250; PROLOG:       loop_exiting_bb1.2:
251; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit
252; PROLOG:       loop_exiting_bb2.2:
253; PROLOG-NEXT:    br i1 false, label %loop_latch.2, label %exit3.loopexit
254; PROLOG:       loop_latch.2:
255; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
256; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3
257; PROLOG:       loop_exiting_bb1.3:
258; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit
259; PROLOG:       loop_exiting_bb2.3:
260; PROLOG-NEXT:    br i1 false, label %loop_latch.3, label %exit3.loopexit
261; PROLOG:       loop_latch.3:
262; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
263; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4
264; PROLOG:       loop_exiting_bb1.4:
265; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit
266; PROLOG:       loop_exiting_bb2.4:
267; PROLOG-NEXT:    br i1 false, label %loop_latch.4, label %exit3.loopexit
268; PROLOG:       loop_latch.4:
269; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
270; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5
271; PROLOG:       loop_exiting_bb1.5:
272; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit
273; PROLOG:       loop_exiting_bb2.5:
274; PROLOG-NEXT:    br i1 false, label %loop_latch.5, label %exit3.loopexit
275; PROLOG:       loop_latch.5:
276; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
277; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6
278; PROLOG:       loop_exiting_bb1.6:
279; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit
280; PROLOG:       loop_exiting_bb2.6:
281; PROLOG-NEXT:    br i1 false, label %loop_latch.6, label %exit3.loopexit
282; PROLOG:       loop_latch.6:
283; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
284; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7
285; PROLOG:       loop_exiting_bb1.7:
286; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit
287; PROLOG:       loop_exiting_bb2.7:
288; PROLOG-NEXT:    br i1 false, label %loop_latch.7, label %exit3.loopexit
289; PROLOG:       loop_latch.7:
290; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
291; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
292; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa
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:       exit1.loopexit:
331; PROLOG-BLOCK-NEXT:    br label %exit1
332; PROLOG-BLOCK:       exit1:
333; PROLOG-BLOCK-NEXT:    ret void
334; PROLOG-BLOCK:       exit2.loopexit.unr-lcssa:
335; PROLOG-BLOCK-NEXT:    br label %exit2.loopexit
336; PROLOG-BLOCK:       exit2.loopexit:
337; PROLOG-BLOCK-NEXT:    ret void
338; PROLOG-BLOCK:       loop_exiting_bb1.1:
339; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
340; PROLOG-BLOCK:       loop_exiting_bb2.1:
341; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
342; PROLOG-BLOCK:       loop_latch.1:
343; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
344; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
345; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !0
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 [ %unroll_iter, %entry.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
406; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
407; EPILOG:       for.end.unr-lcssa.loopexit:
408; EPILOG-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %for.body.7 ]
409; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %for.body.7 ]
410; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %for.body.7 ]
411; EPILOG-NEXT:    br label %for.end.unr-lcssa
412; EPILOG:       for.end.unr-lcssa:
413; EPILOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ]
414; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ]
415; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ]
416; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
417; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %for.end
418; EPILOG:       header.epil.preheader:
419; EPILOG-NEXT:    br label %header.epil
420; EPILOG:       header.epil:
421; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %for.body.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
422; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %for.body.epil ], [ %sum.02.unr, %header.epil.preheader ]
423; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %for.body.epil ]
424; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil
425; EPILOG:       for.exiting_block.epil:
426; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
427; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit2, label %for.body.epil
428; EPILOG:       for.body.epil:
429; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
430; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
431; EPILOG-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
432; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
433; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
434; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
435; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
436; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %for.end.epilog-lcssa, !llvm.loop !2
437; EPILOG:       for.end.epilog-lcssa:
438; EPILOG-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %for.body.epil ]
439; EPILOG-NEXT:    br label %for.end
440; EPILOG:       for.end:
441; EPILOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %sum.0.lcssa.ph1, %for.end.epilog-lcssa ]
442; EPILOG-NEXT:    ret i32 %sum.0.lcssa
443; EPILOG:       for.exit2.loopexit:
444; 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 ]
445; EPILOG-NEXT:    br label %for.exit2
446; EPILOG:       for.exit2.loopexit2:
447; EPILOG-NEXT:    %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
448; EPILOG-NEXT:    br label %for.exit2
449; EPILOG:       for.exit2:
450; EPILOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
451; EPILOG-NEXT:    ret i32 %retval
452; EPILOG:       for.exiting_block.1:
453; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
454; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
455; EPILOG:       for.body.1:
456; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
457; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
458; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
459; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
460; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
461; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
462; EPILOG:       for.exiting_block.2:
463; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
464; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2
465; EPILOG:       for.body.2:
466; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
467; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
468; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
469; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
470; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
471; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
472; EPILOG:       for.exiting_block.3:
473; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
474; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3
475; EPILOG:       for.body.3:
476; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
477; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
478; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
479; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
480; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
481; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
482; EPILOG:       for.exiting_block.4:
483; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
484; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4
485; EPILOG:       for.body.4:
486; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
487; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
488; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
489; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
490; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
491; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
492; EPILOG:       for.exiting_block.5:
493; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
494; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5
495; EPILOG:       for.body.5:
496; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
497; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
498; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
499; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
500; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
501; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
502; EPILOG:       for.exiting_block.6:
503; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
504; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6
505; EPILOG:       for.body.6:
506; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
507; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
508; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
509; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
510; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
511; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
512; EPILOG:       for.exiting_block.7:
513; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
514; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7
515; EPILOG:       for.body.7:
516; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
517; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
518; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
519; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
520; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
521; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
522; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %for.end.unr-lcssa.loopexit, label %header
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 [ %unroll_iter, %entry.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
547; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
548; EPILOG-BLOCK:       for.end.unr-lcssa.loopexit:
549; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %for.body.1 ]
550; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %for.body.1 ]
551; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %for.body.1 ]
552; EPILOG-BLOCK-NEXT:    br label %for.end.unr-lcssa
553; EPILOG-BLOCK:       for.end.unr-lcssa:
554; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ]
555; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ]
556; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ]
557; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
558; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %for.end
559; EPILOG-BLOCK:       header.epil.preheader:
560; EPILOG-BLOCK-NEXT:    br label %header.epil
561; EPILOG-BLOCK:       header.epil:
562; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.epil
563; EPILOG-BLOCK:       for.exiting_block.epil:
564; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
565; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %for.body.epil
566; EPILOG-BLOCK:       for.body.epil:
567; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
568; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
569; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %3, %sum.02.unr
570; EPILOG-BLOCK-NEXT:    br label %for.end
571; EPILOG-BLOCK:       for.end:
572; EPILOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %add.epil, %for.body.epil ]
573; EPILOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
574; EPILOG-BLOCK:       for.exit2.loopexit:
575; EPILOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ]
576; EPILOG-BLOCK-NEXT:    br label %for.exit2
577; EPILOG-BLOCK:       for.exit2:
578; EPILOG-BLOCK-NEXT:    %retval = phi i32 [ %sum.02.unr, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ]
579; EPILOG-BLOCK-NEXT:    ret i32 %retval
580; EPILOG-BLOCK:       for.exiting_block.1:
581; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
582; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
583; EPILOG-BLOCK:       for.body.1:
584; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
585; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
586; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
587; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
588; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
589; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0
590; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %for.end.unr-lcssa.loopexit, label %header, !llvm.loop !2
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 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %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.sub = sub i64 %prol.iter, 1
615; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
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.end.unr-lcssa:
644; PROLOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %for.body.7 ]
645; PROLOG-NEXT:    br label %for.end
646; PROLOG:       for.end:
647; PROLOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ]
648; PROLOG-NEXT:    ret i32 %sum.0.lcssa
649; PROLOG:       for.exit2.loopexit:
650; 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 ]
651; PROLOG-NEXT:    br label %for.exit2
652; PROLOG:       for.exit2.loopexit1:
653; PROLOG-NEXT:    %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
654; PROLOG-NEXT:    br label %for.exit2
655; PROLOG:       for.exit2:
656; PROLOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
657; PROLOG-NEXT:    ret i32 %retval
658; PROLOG:       for.exiting_block.1:
659; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
660; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
661; PROLOG:       for.body.1:
662; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
663; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
664; PROLOG-NEXT:    %add.1 = add nsw i32 %4, %add
665; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
666; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
667; PROLOG:       for.exiting_block.2:
668; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
669; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2
670; PROLOG:       for.body.2:
671; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
672; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
673; PROLOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
674; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
675; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
676; PROLOG:       for.exiting_block.3:
677; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
678; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3
679; PROLOG:       for.body.3:
680; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
681; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
682; PROLOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
683; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
684; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
685; PROLOG:       for.exiting_block.4:
686; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
687; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4
688; PROLOG:       for.body.4:
689; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
690; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
691; PROLOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
692; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
693; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
694; PROLOG:       for.exiting_block.5:
695; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
696; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5
697; PROLOG:       for.body.5:
698; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
699; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
700; PROLOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
701; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
702; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
703; PROLOG:       for.exiting_block.6:
704; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
705; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6
706; PROLOG:       for.body.6:
707; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
708; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
709; PROLOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
710; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
711; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
712; PROLOG:       for.exiting_block.7:
713; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
714; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7
715; PROLOG:       for.body.7:
716; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
717; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
718; PROLOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
719; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
720; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
721; PROLOG-NEXT:    br i1 %exitcond.7, label %for.end.unr-lcssa, label %header
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.end.unr-lcssa:
761; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %for.body.1 ]
762; PROLOG-BLOCK-NEXT:    br label %for.end
763; PROLOG-BLOCK:       for.end:
764; PROLOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ]
765; PROLOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
766; PROLOG-BLOCK:       for.exit2.loopexit:
767; PROLOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ]
768; PROLOG-BLOCK-NEXT:    br label %for.exit2
769; PROLOG-BLOCK:       for.exit2:
770; PROLOG-BLOCK-NEXT:    %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ]
771; PROLOG-BLOCK-NEXT:    ret i32 %retval
772; PROLOG-BLOCK:       for.exiting_block.1:
773; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
774; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
775; PROLOG-BLOCK:       for.body.1:
776; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
777; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
778; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
779; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
780; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
781; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %for.end.unr-lcssa, label %header, !llvm.loop !2
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 [ %unroll_iter, %entry.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
846; EPILOG-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
847; EPILOG:       exit1.loopexit:
848; EPILOG-NEXT:    br label %exit1
849; EPILOG:       exit1.loopexit1:
850; EPILOG-NEXT:    br label %exit1
851; EPILOG:       exit1:
852; EPILOG-NEXT:    ret void
853; EPILOG:       exit2.loopexit.unr-lcssa.loopexit:
854; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
855; EPILOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
856; EPILOG-NEXT:    br label %exit2.loopexit.unr-lcssa
857; EPILOG:       exit2.loopexit.unr-lcssa:
858; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
859; EPILOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
860; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
861; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
862; EPILOG:       loop_header.epil.preheader:
863; EPILOG-NEXT:    br label %loop_header.epil
864; EPILOG:       loop_header.epil:
865; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
866; EPILOG-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]
867; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ]
868; EPILOG-NEXT:    br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil
869; EPILOG:       loop_exiting_bb1.epil:
870; EPILOG-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
871; EPILOG-NEXT:    i64 24, label %exit1.loopexit1
872; EPILOG-NEXT:    i64 42, label %exit3.loopexit2
873; EPILOG-NEXT:    ]
874; EPILOG:       loop_latch.epil:
875; EPILOG-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
876; EPILOG-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
877; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
878; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
879; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
880; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !3
881; EPILOG:       exit2.loopexit.epilog-lcssa:
882; EPILOG-NEXT:    br label %exit2.loopexit
883; EPILOG:       exit2.loopexit:
884; EPILOG-NEXT:    ret void
885; EPILOG:       loop_exiting_bb1.1:
886; EPILOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
887; EPILOG-NEXT:    i64 24, label %exit1.loopexit
888; EPILOG-NEXT:    i64 42, label %exit3.loopexit
889; EPILOG-NEXT:    ]
890; EPILOG:       loop_latch.1:
891; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
892; EPILOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
893; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
894; EPILOG-NEXT:    br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2
895; EPILOG:       loop_exiting_bb1.2:
896; EPILOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
897; EPILOG-NEXT:    i64 24, label %exit1.loopexit
898; EPILOG-NEXT:    i64 42, label %exit3.loopexit
899; EPILOG-NEXT:    ]
900; EPILOG:       loop_latch.2:
901; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
902; EPILOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
903; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
904; EPILOG-NEXT:    br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3
905; EPILOG:       loop_exiting_bb1.3:
906; EPILOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
907; EPILOG-NEXT:    i64 24, label %exit1.loopexit
908; EPILOG-NEXT:    i64 42, label %exit3.loopexit
909; EPILOG-NEXT:    ]
910; EPILOG:       loop_latch.3:
911; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
912; EPILOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
913; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
914; EPILOG-NEXT:    br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4
915; EPILOG:       loop_exiting_bb1.4:
916; EPILOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
917; EPILOG-NEXT:    i64 24, label %exit1.loopexit
918; EPILOG-NEXT:    i64 42, label %exit3.loopexit
919; EPILOG-NEXT:    ]
920; EPILOG:       loop_latch.4:
921; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
922; EPILOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
923; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
924; EPILOG-NEXT:    br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5
925; EPILOG:       loop_exiting_bb1.5:
926; EPILOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
927; EPILOG-NEXT:    i64 24, label %exit1.loopexit
928; EPILOG-NEXT:    i64 42, label %exit3.loopexit
929; EPILOG-NEXT:    ]
930; EPILOG:       loop_latch.5:
931; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
932; EPILOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
933; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
934; EPILOG-NEXT:    br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6
935; EPILOG:       loop_exiting_bb1.6:
936; EPILOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
937; EPILOG-NEXT:    i64 24, label %exit1.loopexit
938; EPILOG-NEXT:    i64 42, label %exit3.loopexit
939; EPILOG-NEXT:    ]
940; EPILOG:       loop_latch.6:
941; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
942; EPILOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
943; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
944; EPILOG-NEXT:    br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7
945; EPILOG:       loop_exiting_bb1.7:
946; EPILOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
947; EPILOG-NEXT:    i64 24, label %exit1.loopexit
948; EPILOG-NEXT:    i64 42, label %exit3.loopexit
949; EPILOG-NEXT:    ]
950; EPILOG:       loop_latch.7:
951; EPILOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
952; EPILOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
953; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
954; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0
955; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit
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 [ %unroll_iter, %entry.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
984; EPILOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
985; EPILOG-BLOCK:       exit1.loopexit:
986; EPILOG-BLOCK-NEXT:    br label %exit1
987; EPILOG-BLOCK:       exit1:
988; EPILOG-BLOCK-NEXT:    ret void
989; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa.loopexit:
990; EPILOG-BLOCK-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
991; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit.unr-lcssa
992; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa:
993; EPILOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
994; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
995; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
996; EPILOG-BLOCK:       loop_header.epil.preheader:
997; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
998; EPILOG-BLOCK:       loop_header.epil:
999; EPILOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil
1000; EPILOG-BLOCK:       loop_exiting_bb1.epil:
1001; EPILOG-BLOCK-NEXT:    switch i64 %sum.unr, label %loop_latch.epil [
1002; EPILOG-BLOCK-NEXT:    i64 24, label %exit1
1003; EPILOG-BLOCK-NEXT:    i64 42, label %exit3
1004; EPILOG-BLOCK-NEXT:    ]
1005; EPILOG-BLOCK:       loop_latch.epil:
1006; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit
1007; EPILOG-BLOCK:       exit2.loopexit:
1008; EPILOG-BLOCK-NEXT:    ret void
1009; EPILOG-BLOCK:       loop_exiting_bb1.1:
1010; EPILOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
1011; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
1012; EPILOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
1013; EPILOG-BLOCK-NEXT:    ]
1014; EPILOG-BLOCK:       loop_latch.1:
1015; EPILOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
1016; EPILOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
1017; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
1018; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0
1019; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !3
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 [ %xtraiter, %loop_header.prol.preheader ], [ %prol.iter.sub, %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.sub = sub i64 %prol.iter, 1
1044; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
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:       exit1.loopexit:
1077; PROLOG-NEXT:    br label %exit1
1078; PROLOG:       exit1.loopexit1:
1079; PROLOG-NEXT:    br label %exit1
1080; PROLOG:       exit1:
1081; PROLOG-NEXT:    ret void
1082; PROLOG:       exit2.loopexit.unr-lcssa:
1083; PROLOG-NEXT:    br label %exit2.loopexit
1084; PROLOG:       exit2.loopexit:
1085; PROLOG-NEXT:    ret void
1086; PROLOG:       loop_exiting_bb1.1:
1087; PROLOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
1088; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1089; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1090; PROLOG-NEXT:    ]
1091; PROLOG:       loop_latch.1:
1092; PROLOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
1093; PROLOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
1094; PROLOG-NEXT:    br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2
1095; PROLOG:       loop_exiting_bb1.2:
1096; PROLOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
1097; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1098; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1099; PROLOG-NEXT:    ]
1100; PROLOG:       loop_latch.2:
1101; PROLOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
1102; PROLOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
1103; PROLOG-NEXT:    br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3
1104; PROLOG:       loop_exiting_bb1.3:
1105; PROLOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
1106; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1107; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1108; PROLOG-NEXT:    ]
1109; PROLOG:       loop_latch.3:
1110; PROLOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
1111; PROLOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
1112; PROLOG-NEXT:    br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4
1113; PROLOG:       loop_exiting_bb1.4:
1114; PROLOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
1115; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1116; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1117; PROLOG-NEXT:    ]
1118; PROLOG:       loop_latch.4:
1119; PROLOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
1120; PROLOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
1121; PROLOG-NEXT:    br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5
1122; PROLOG:       loop_exiting_bb1.5:
1123; PROLOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
1124; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1125; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1126; PROLOG-NEXT:    ]
1127; PROLOG:       loop_latch.5:
1128; PROLOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
1129; PROLOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
1130; PROLOG-NEXT:    br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6
1131; PROLOG:       loop_exiting_bb1.6:
1132; PROLOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
1133; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1134; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1135; PROLOG-NEXT:    ]
1136; PROLOG:       loop_latch.6:
1137; PROLOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
1138; PROLOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
1139; PROLOG-NEXT:    br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7
1140; PROLOG:       loop_exiting_bb1.7:
1141; PROLOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
1142; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1143; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1144; PROLOG-NEXT:    ]
1145; PROLOG:       loop_latch.7:
1146; PROLOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
1147; PROLOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
1148; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
1149; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa
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:       exit1.loopexit:
1193; PROLOG-BLOCK-NEXT:    br label %exit1
1194; PROLOG-BLOCK:       exit1:
1195; PROLOG-BLOCK-NEXT:    ret void
1196; PROLOG-BLOCK:       exit2.loopexit.unr-lcssa:
1197; PROLOG-BLOCK-NEXT:    br label %exit2.loopexit
1198; PROLOG-BLOCK:       exit2.loopexit:
1199; PROLOG-BLOCK-NEXT:    ret void
1200; PROLOG-BLOCK:       loop_exiting_bb1.1:
1201; PROLOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
1202; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
1203; PROLOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
1204; PROLOG-BLOCK-NEXT:    ]
1205; PROLOG-BLOCK:       loop_latch.1:
1206; PROLOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
1207; PROLOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
1208; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
1209; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !3
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 [ %unroll_iter, %entry.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
1268; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.1
1269; EPILOG:       latchExit.unr-lcssa.loopexit:
1270; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
1271; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
1272; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
1273; EPILOG-NEXT:    br label %latchExit.unr-lcssa
1274; EPILOG:       latchExit.unr-lcssa:
1275; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1276; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1277; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1278; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1279; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1280; EPILOG:       header.epil.preheader:
1281; EPILOG-NEXT:    br label %header.epil
1282; EPILOG:       header.epil:
1283; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
1284; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
1285; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
1286; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit2, label %for.exiting_block.epil
1287; EPILOG:       for.exiting_block.epil:
1288; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1289; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit4, label %latch.epil
1290; EPILOG:       latch.epil:
1291; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
1292; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
1293; EPILOG-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
1294; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
1295; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
1296; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
1297; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
1298; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit2, !llvm.loop !4
1299; EPILOG:       latchExit.epilog-lcssa.loopexit:
1300; 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 ]
1301; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1302; EPILOG:       latchExit.epilog-lcssa.loopexit2:
1303; EPILOG-NEXT:    %result.ph1.ph3 = phi i32 [ 0, %header.epil ], [ %add.epil, %latch.epil ]
1304; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1305; EPILOG:       latchExit.epilog-lcssa:
1306; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph3, %latchExit.epilog-lcssa.loopexit2 ]
1307; EPILOG-NEXT:    br label %latchExit
1308; EPILOG:       latchExit:
1309; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1310; EPILOG-NEXT:    ret i32 %result
1311; EPILOG:       for.exit2.loopexit:
1312; EPILOG-NEXT:    br label %for.exit2
1313; EPILOG:       for.exit2.loopexit4:
1314; EPILOG-NEXT:    br label %for.exit2
1315; EPILOG:       for.exit2:
1316; EPILOG-NEXT:    ret i32 42
1317; EPILOG:       for.exiting_block.1:
1318; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1319; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1320; EPILOG:       latch.1:
1321; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1322; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1323; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
1324; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
1325; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
1326; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.2
1327; EPILOG:       for.exiting_block.2:
1328; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1329; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
1330; EPILOG:       latch.2:
1331; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1332; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
1333; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
1334; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
1335; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
1336; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.3
1337; EPILOG:       for.exiting_block.3:
1338; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1339; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
1340; EPILOG:       latch.3:
1341; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1342; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
1343; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
1344; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
1345; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
1346; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.4
1347; EPILOG:       for.exiting_block.4:
1348; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1349; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
1350; EPILOG:       latch.4:
1351; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
1352; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
1353; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
1354; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
1355; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
1356; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.5
1357; EPILOG:       for.exiting_block.5:
1358; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1359; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
1360; EPILOG:       latch.5:
1361; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
1362; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
1363; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
1364; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
1365; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
1366; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.6
1367; EPILOG:       for.exiting_block.6:
1368; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
1369; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
1370; EPILOG:       latch.6:
1371; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
1372; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
1373; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
1374; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
1375; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
1376; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.7
1377; EPILOG:       for.exiting_block.7:
1378; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
1379; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
1380; EPILOG:       latch.7:
1381; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
1382; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
1383; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
1384; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
1385; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
1386; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
1387; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
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 [ %unroll_iter, %entry.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
1412; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.1
1413; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
1414; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
1415; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
1416; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
1417; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
1418; EPILOG-BLOCK:       latchExit.unr-lcssa:
1419; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1420; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1421; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1422; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1423; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1424; EPILOG-BLOCK:       header.epil.preheader:
1425; EPILOG-BLOCK-NEXT:    br label %header.epil
1426; EPILOG-BLOCK:       header.epil:
1427; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa, label %for.exiting_block.epil
1428; EPILOG-BLOCK:       for.exiting_block.epil:
1429; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1430; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %latch.epil
1431; EPILOG-BLOCK:       latch.epil:
1432; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
1433; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
1434; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %3, %sum.02.unr
1435; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1436; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
1437; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ 0, %header ], [ 0, %latch ]
1438; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1439; EPILOG-BLOCK:       latchExit.epilog-lcssa:
1440; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 0, %header.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
1441; EPILOG-BLOCK-NEXT:    br label %latchExit
1442; EPILOG-BLOCK:       latchExit:
1443; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1444; EPILOG-BLOCK-NEXT:    ret i32 %result
1445; EPILOG-BLOCK:       for.exit2.loopexit:
1446; EPILOG-BLOCK-NEXT:    br label %for.exit2
1447; EPILOG-BLOCK:       for.exit2:
1448; EPILOG-BLOCK-NEXT:    ret i32 42
1449; EPILOG-BLOCK:       for.exiting_block.1:
1450; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1451; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1452; EPILOG-BLOCK:       latch.1:
1453; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1454; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1455; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
1456; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1457; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
1458; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0
1459; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !4
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 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %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.sub = sub i64 %prol.iter, 1
1484; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
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:       latchExit.unr-lcssa.loopexit:
1513; 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 ]
1514; PROLOG-NEXT:    br label %latchExit.unr-lcssa
1515; PROLOG:       latchExit.unr-lcssa.loopexit1:
1516; PROLOG-NEXT:    %result.ph.ph2 = phi i32 [ 0, %header.prol ]
1517; PROLOG-NEXT:    br label %latchExit.unr-lcssa
1518; PROLOG:       latchExit.unr-lcssa:
1519; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph2, %latchExit.unr-lcssa.loopexit1 ]
1520; PROLOG-NEXT:    br label %latchExit
1521; PROLOG:       latchExit:
1522; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
1523; PROLOG-NEXT:    ret i32 %result
1524; PROLOG:       for.exit2.loopexit:
1525; PROLOG-NEXT:    br label %for.exit2
1526; PROLOG:       for.exit2.loopexit3:
1527; PROLOG-NEXT:    br label %for.exit2
1528; PROLOG:       for.exit2:
1529; PROLOG-NEXT:    ret i32 42
1530; PROLOG:       for.exiting_block.1:
1531; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1532; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1533; PROLOG:       latch.1:
1534; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1535; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1536; PROLOG-NEXT:    %add.1 = add nsw i32 %4, %add
1537; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1538; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.2
1539; PROLOG:       for.exiting_block.2:
1540; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1541; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
1542; PROLOG:       latch.2:
1543; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1544; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
1545; PROLOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
1546; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
1547; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.3
1548; PROLOG:       for.exiting_block.3:
1549; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1550; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
1551; PROLOG:       latch.3:
1552; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1553; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
1554; PROLOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
1555; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
1556; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.4
1557; PROLOG:       for.exiting_block.4:
1558; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1559; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
1560; PROLOG:       latch.4:
1561; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
1562; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
1563; PROLOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
1564; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
1565; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.5
1566; PROLOG:       for.exiting_block.5:
1567; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1568; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
1569; PROLOG:       latch.5:
1570; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
1571; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
1572; PROLOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
1573; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
1574; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.6
1575; PROLOG:       for.exiting_block.6:
1576; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
1577; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
1578; PROLOG:       latch.6:
1579; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
1580; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
1581; PROLOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
1582; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
1583; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.7
1584; PROLOG:       for.exiting_block.7:
1585; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
1586; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
1587; PROLOG:       latch.7:
1588; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
1589; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
1590; PROLOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
1591; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
1592; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
1593; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
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:       latchExit.unr-lcssa.loopexit:
1633; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ %add.1, %latch.1 ]
1634; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
1635; PROLOG-BLOCK:       latchExit.unr-lcssa:
1636; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %header.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1637; PROLOG-BLOCK-NEXT:    br label %latchExit
1638; PROLOG-BLOCK:       latchExit:
1639; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
1640; PROLOG-BLOCK-NEXT:    ret i32 %result
1641; PROLOG-BLOCK:       for.exit2.loopexit:
1642; PROLOG-BLOCK-NEXT:    br label %for.exit2
1643; PROLOG-BLOCK:       for.exit2:
1644; PROLOG-BLOCK-NEXT:    ret i32 42
1645; PROLOG-BLOCK:       for.exiting_block.1:
1646; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1647; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1648; PROLOG-BLOCK:       latch.1:
1649; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1650; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1651; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
1652; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1653; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
1654; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !4
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 [ %unroll_iter, %entry.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
1712; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
1713; EPILOG:       latchExit.unr-lcssa.loopexit:
1714; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
1715; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
1716; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
1717; EPILOG-NEXT:    br label %latchExit.unr-lcssa
1718; EPILOG:       latchExit.unr-lcssa:
1719; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1720; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1721; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1722; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1723; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1724; EPILOG:       header.epil.preheader:
1725; EPILOG-NEXT:    br label %header.epil
1726; EPILOG:       header.epil:
1727; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
1728; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
1729; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
1730; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
1731; EPILOG:       for.exiting_block.epil:
1732; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1733; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
1734; EPILOG:       latch.epil:
1735; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
1736; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
1737; EPILOG-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
1738; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
1739; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
1740; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
1741; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
1742; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !5
1743; EPILOG:       latchExit.epilog-lcssa.loopexit:
1744; 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 ]
1745; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1746; EPILOG:       latchExit.epilog-lcssa.loopexit3:
1747; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ 2, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
1748; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1749; EPILOG:       latchExit.epilog-lcssa:
1750; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
1751; EPILOG-NEXT:    br label %latchExit
1752; EPILOG:       latchExit:
1753; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1754; EPILOG-NEXT:    ret i32 %result
1755; EPILOG:       for.exit2.loopexit:
1756; EPILOG-NEXT:    br label %for.exit2
1757; EPILOG:       for.exit2.loopexit2:
1758; EPILOG-NEXT:    br label %for.exit2
1759; EPILOG:       for.exit2:
1760; EPILOG-NEXT:    ret i32 42
1761; EPILOG:       for.exiting_block.1:
1762; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1763; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
1764; EPILOG:       latch.1:
1765; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1766; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1767; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
1768; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
1769; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
1770; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
1771; EPILOG:       for.exiting_block.2:
1772; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1773; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
1774; EPILOG:       latch.2:
1775; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1776; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
1777; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
1778; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
1779; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
1780; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
1781; EPILOG:       for.exiting_block.3:
1782; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1783; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
1784; EPILOG:       latch.3:
1785; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1786; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
1787; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
1788; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
1789; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
1790; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
1791; EPILOG:       for.exiting_block.4:
1792; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1793; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
1794; EPILOG:       latch.4:
1795; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
1796; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
1797; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
1798; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
1799; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
1800; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
1801; EPILOG:       for.exiting_block.5:
1802; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1803; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
1804; EPILOG:       latch.5:
1805; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
1806; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
1807; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
1808; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
1809; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
1810; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
1811; EPILOG:       for.exiting_block.6:
1812; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
1813; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
1814; EPILOG:       latch.6:
1815; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
1816; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
1817; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
1818; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
1819; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
1820; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
1821; EPILOG:       for.exiting_block.7:
1822; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
1823; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
1824; EPILOG:       latch.7:
1825; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
1826; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
1827; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
1828; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
1829; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
1830; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
1831; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
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 [ %unroll_iter, %entry.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
1856; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
1857; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
1858; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
1859; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
1860; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
1861; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
1862; EPILOG-BLOCK:       latchExit.unr-lcssa:
1863; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1864; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1865; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1866; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1867; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1868; EPILOG-BLOCK:       header.epil.preheader:
1869; EPILOG-BLOCK-NEXT:    br label %header.epil
1870; EPILOG-BLOCK:       header.epil:
1871; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
1872; EPILOG-BLOCK:       for.exiting_block.epil:
1873; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1874; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
1875; EPILOG-BLOCK:       latch.epil:
1876; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
1877; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
1878; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %3, %sum.02.unr
1879; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1880; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
1881; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ]
1882; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1883; EPILOG-BLOCK:       latchExit.epilog-lcssa:
1884; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 2, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
1885; EPILOG-BLOCK-NEXT:    br label %latchExit
1886; EPILOG-BLOCK:       latchExit:
1887; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1888; EPILOG-BLOCK-NEXT:    ret i32 %result
1889; EPILOG-BLOCK:       for.exit2.loopexit:
1890; EPILOG-BLOCK-NEXT:    br label %for.exit2
1891; EPILOG-BLOCK:       for.exit2:
1892; EPILOG-BLOCK-NEXT:    ret i32 42
1893; EPILOG-BLOCK:       for.exiting_block.1:
1894; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1895; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
1896; EPILOG-BLOCK:       latch.1:
1897; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1898; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1899; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
1900; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1901; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
1902; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0
1903; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5
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 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %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.sub = sub i64 %prol.iter, 1
1928; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
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:       latchExit.unr-lcssa.loopexit:
1957; 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 ]
1958; PROLOG-NEXT:    br label %latchExit.unr-lcssa
1959; PROLOG:       latchExit.unr-lcssa.loopexit2:
1960; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ 2, %for.exiting_block.prol ]
1961; PROLOG-NEXT:    br label %latchExit.unr-lcssa
1962; PROLOG:       latchExit.unr-lcssa:
1963; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]
1964; PROLOG-NEXT:    br label %latchExit
1965; PROLOG:       latchExit:
1966; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
1967; PROLOG-NEXT:    ret i32 %result
1968; PROLOG:       for.exit2.loopexit:
1969; PROLOG-NEXT:    br label %for.exit2
1970; PROLOG:       for.exit2.loopexit1:
1971; PROLOG-NEXT:    br label %for.exit2
1972; PROLOG:       for.exit2:
1973; PROLOG-NEXT:    ret i32 42
1974; PROLOG:       for.exiting_block.1:
1975; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1976; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
1977; PROLOG:       latch.1:
1978; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1979; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1980; PROLOG-NEXT:    %add.1 = add nsw i32 %4, %add
1981; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1982; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
1983; PROLOG:       for.exiting_block.2:
1984; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1985; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2
1986; PROLOG:       latch.2:
1987; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1988; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
1989; PROLOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
1990; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
1991; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
1992; PROLOG:       for.exiting_block.3:
1993; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1994; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3
1995; PROLOG:       latch.3:
1996; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1997; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
1998; PROLOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
1999; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
2000; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2001; PROLOG:       for.exiting_block.4:
2002; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2003; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4
2004; PROLOG:       latch.4:
2005; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2006; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
2007; PROLOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2008; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
2009; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2010; PROLOG:       for.exiting_block.5:
2011; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2012; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5
2013; PROLOG:       latch.5:
2014; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2015; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
2016; PROLOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2017; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
2018; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2019; PROLOG:       for.exiting_block.6:
2020; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2021; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6
2022; PROLOG:       latch.6:
2023; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2024; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
2025; PROLOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2026; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
2027; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2028; PROLOG:       for.exiting_block.7:
2029; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2030; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7
2031; PROLOG:       latch.7:
2032; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2033; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
2034; PROLOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2035; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2036; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
2037; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
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:       latchExit.unr-lcssa.loopexit:
2077; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
2078; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2079; PROLOG-BLOCK:       latchExit.unr-lcssa:
2080; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 2, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2081; PROLOG-BLOCK-NEXT:    br label %latchExit
2082; PROLOG-BLOCK:       latchExit:
2083; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2084; PROLOG-BLOCK-NEXT:    ret i32 %result
2085; PROLOG-BLOCK:       for.exit2.loopexit:
2086; PROLOG-BLOCK-NEXT:    br label %for.exit2
2087; PROLOG-BLOCK:       for.exit2:
2088; PROLOG-BLOCK-NEXT:    ret i32 42
2089; PROLOG-BLOCK:       for.exiting_block.1:
2090; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2091; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2092; PROLOG-BLOCK:       latch.1:
2093; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2094; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2095; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2096; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2097; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
2098; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5
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 [ %unroll_iter, %entry.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
2157; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2158; EPILOG:       latchExit.unr-lcssa.loopexit:
2159; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
2160; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
2161; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
2162; EPILOG-NEXT:    br label %latchExit.unr-lcssa
2163; EPILOG:       latchExit.unr-lcssa:
2164; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2165; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2166; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2167; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2168; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2169; EPILOG:       header.epil.preheader:
2170; EPILOG-NEXT:    br label %header.epil
2171; EPILOG:       header.epil:
2172; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
2173; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
2174; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
2175; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
2176; EPILOG:       for.exiting_block.epil:
2177; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2178; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
2179; EPILOG:       latch.epil:
2180; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
2181; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
2182; EPILOG-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
2183; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
2184; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
2185; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
2186; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
2187; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !6
2188; EPILOG:       latchExit.epilog-lcssa.loopexit:
2189; 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 ]
2190; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2191; EPILOG:       latchExit.epilog-lcssa.loopexit3:
2192; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
2193; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2194; EPILOG:       latchExit.epilog-lcssa:
2195; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
2196; EPILOG-NEXT:    br label %latchExit
2197; EPILOG:       latchExit:
2198; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2199; EPILOG-NEXT:    ret i32 %result
2200; EPILOG:       for.exit2.loopexit:
2201; EPILOG-NEXT:    br label %for.exit2
2202; EPILOG:       for.exit2.loopexit2:
2203; EPILOG-NEXT:    br label %for.exit2
2204; EPILOG:       for.exit2:
2205; EPILOG-NEXT:    ret i32 42
2206; EPILOG:       for.exiting_block.1:
2207; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2208; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2209; EPILOG:       latch.1:
2210; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2211; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2212; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
2213; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
2214; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
2215; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2216; EPILOG:       for.exiting_block.2:
2217; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2218; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
2219; EPILOG:       latch.2:
2220; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2221; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
2222; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
2223; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
2224; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
2225; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2226; EPILOG:       for.exiting_block.3:
2227; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2228; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
2229; EPILOG:       latch.3:
2230; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2231; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
2232; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
2233; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
2234; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
2235; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2236; EPILOG:       for.exiting_block.4:
2237; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2238; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
2239; EPILOG:       latch.4:
2240; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2241; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
2242; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2243; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
2244; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
2245; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2246; EPILOG:       for.exiting_block.5:
2247; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2248; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
2249; EPILOG:       latch.5:
2250; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2251; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
2252; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2253; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
2254; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
2255; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2256; EPILOG:       for.exiting_block.6:
2257; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2258; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
2259; EPILOG:       latch.6:
2260; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2261; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
2262; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2263; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
2264; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
2265; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2266; EPILOG:       for.exiting_block.7:
2267; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2268; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
2269; EPILOG:       latch.7:
2270; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2271; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
2272; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2273; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2274; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
2275; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
2276; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
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 [ %unroll_iter, %entry.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
2301; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2302; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2303; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
2304; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
2305; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
2306; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2307; EPILOG-BLOCK:       latchExit.unr-lcssa:
2308; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2309; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2310; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2311; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2312; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2313; EPILOG-BLOCK:       header.epil.preheader:
2314; EPILOG-BLOCK-NEXT:    br label %header.epil
2315; EPILOG-BLOCK:       header.epil:
2316; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
2317; EPILOG-BLOCK:       for.exiting_block.epil:
2318; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2319; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
2320; EPILOG-BLOCK:       latch.epil:
2321; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
2322; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
2323; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %3, %sum.02.unr
2324; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2325; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
2326; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ]
2327; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2328; EPILOG-BLOCK:       latchExit.epilog-lcssa:
2329; 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 ]
2330; EPILOG-BLOCK-NEXT:    br label %latchExit
2331; EPILOG-BLOCK:       latchExit:
2332; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2333; EPILOG-BLOCK-NEXT:    ret i32 %result
2334; EPILOG-BLOCK:       for.exit2.loopexit:
2335; EPILOG-BLOCK-NEXT:    br label %for.exit2
2336; EPILOG-BLOCK:       for.exit2:
2337; EPILOG-BLOCK-NEXT:    ret i32 42
2338; EPILOG-BLOCK:       for.exiting_block.1:
2339; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2340; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2341; EPILOG-BLOCK:       latch.1:
2342; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2343; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2344; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2345; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2346; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
2347; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0
2348; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6
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 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %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.sub = sub i64 %prol.iter, 1
2373; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
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:       latchExit.unr-lcssa.loopexit:
2402; 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 ]
2403; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2404; PROLOG:       latchExit.unr-lcssa.loopexit2:
2405; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ]
2406; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2407; PROLOG:       latchExit.unr-lcssa:
2408; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]
2409; PROLOG-NEXT:    br label %latchExit
2410; PROLOG:       latchExit:
2411; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2412; PROLOG-NEXT:    ret i32 %result
2413; PROLOG:       for.exit2.loopexit:
2414; PROLOG-NEXT:    br label %for.exit2
2415; PROLOG:       for.exit2.loopexit1:
2416; PROLOG-NEXT:    br label %for.exit2
2417; PROLOG:       for.exit2:
2418; PROLOG-NEXT:    ret i32 42
2419; PROLOG:       for.exiting_block.1:
2420; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2421; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2422; PROLOG:       latch.1:
2423; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2424; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2425; PROLOG-NEXT:    %add.1 = add nsw i32 %4, %add
2426; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2427; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2428; PROLOG:       for.exiting_block.2:
2429; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2430; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2
2431; PROLOG:       latch.2:
2432; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2433; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
2434; PROLOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
2435; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
2436; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2437; PROLOG:       for.exiting_block.3:
2438; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2439; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3
2440; PROLOG:       latch.3:
2441; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2442; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
2443; PROLOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
2444; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
2445; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2446; PROLOG:       for.exiting_block.4:
2447; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2448; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4
2449; PROLOG:       latch.4:
2450; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2451; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
2452; PROLOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2453; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
2454; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2455; PROLOG:       for.exiting_block.5:
2456; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2457; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5
2458; PROLOG:       latch.5:
2459; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2460; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
2461; PROLOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2462; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
2463; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2464; PROLOG:       for.exiting_block.6:
2465; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2466; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6
2467; PROLOG:       latch.6:
2468; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2469; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
2470; PROLOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2471; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
2472; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2473; PROLOG:       for.exiting_block.7:
2474; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2475; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7
2476; PROLOG:       latch.7:
2477; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2478; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
2479; PROLOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2480; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2481; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
2482; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
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:       latchExit.unr-lcssa.loopexit:
2522; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
2523; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2524; PROLOG-BLOCK:       latchExit.unr-lcssa:
2525; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2526; PROLOG-BLOCK-NEXT:    br label %latchExit
2527; PROLOG-BLOCK:       latchExit:
2528; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2529; PROLOG-BLOCK-NEXT:    ret i32 %result
2530; PROLOG-BLOCK:       for.exit2.loopexit:
2531; PROLOG-BLOCK-NEXT:    br label %for.exit2
2532; PROLOG-BLOCK:       for.exit2:
2533; PROLOG-BLOCK-NEXT:    ret i32 42
2534; PROLOG-BLOCK:       for.exiting_block.1:
2535; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2536; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2537; PROLOG-BLOCK:       latch.1:
2538; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2539; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2540; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2541; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2542; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
2543; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6
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 [ %unroll_iter, %entry.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
2603; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2604; EPILOG:       latchExit.unr-lcssa.loopexit:
2605; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
2606; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
2607; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
2608; EPILOG-NEXT:    br label %latchExit.unr-lcssa
2609; EPILOG:       latchExit.unr-lcssa:
2610; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2611; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2612; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2613; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2614; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2615; EPILOG:       header.epil.preheader:
2616; EPILOG-NEXT:    br label %header.epil
2617; EPILOG:       header.epil:
2618; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
2619; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
2620; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
2621; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
2622; EPILOG:       for.exiting_block.epil:
2623; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
2624; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
2625; EPILOG-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
2626; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2627; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
2628; EPILOG:       latch.epil:
2629; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
2630; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
2631; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
2632; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
2633; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !7
2634; EPILOG:       latchExit.epilog-lcssa.loopexit:
2635; 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 ]
2636; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2637; EPILOG:       latchExit.epilog-lcssa.loopexit3:
2638; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
2639; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2640; EPILOG:       latchExit.epilog-lcssa:
2641; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
2642; EPILOG-NEXT:    br label %latchExit
2643; EPILOG:       latchExit:
2644; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2645; EPILOG-NEXT:    ret i32 %result
2646; EPILOG:       for.exit2.loopexit:
2647; EPILOG-NEXT:    br label %for.exit2
2648; EPILOG:       for.exit2.loopexit2:
2649; EPILOG-NEXT:    br label %for.exit2
2650; EPILOG:       for.exit2:
2651; EPILOG-NEXT:    ret i32 42
2652; EPILOG:       for.exiting_block.1:
2653; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2654; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2655; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
2656; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2657; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2658; EPILOG:       latch.1:
2659; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
2660; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
2661; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2662; EPILOG:       for.exiting_block.2:
2663; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2664; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
2665; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
2666; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2667; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
2668; EPILOG:       latch.2:
2669; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
2670; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
2671; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2672; EPILOG:       for.exiting_block.3:
2673; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2674; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
2675; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
2676; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2677; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
2678; EPILOG:       latch.3:
2679; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
2680; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
2681; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2682; EPILOG:       for.exiting_block.4:
2683; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2684; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
2685; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2686; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2687; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
2688; EPILOG:       latch.4:
2689; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
2690; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
2691; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2692; EPILOG:       for.exiting_block.5:
2693; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2694; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
2695; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2696; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2697; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
2698; EPILOG:       latch.5:
2699; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
2700; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
2701; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2702; EPILOG:       for.exiting_block.6:
2703; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2704; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
2705; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2706; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2707; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
2708; EPILOG:       latch.6:
2709; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
2710; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
2711; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2712; EPILOG:       for.exiting_block.7:
2713; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2714; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
2715; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2716; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2717; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
2718; EPILOG:       latch.7:
2719; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2720; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
2721; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
2722; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
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 [ %unroll_iter, %entry.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
2747; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2748; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2749; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
2750; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
2751; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
2752; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2753; EPILOG-BLOCK:       latchExit.unr-lcssa:
2754; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2755; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2756; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2757; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2758; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2759; EPILOG-BLOCK:       header.epil.preheader:
2760; EPILOG-BLOCK-NEXT:    br label %header.epil
2761; EPILOG-BLOCK:       header.epil:
2762; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
2763; EPILOG-BLOCK:       for.exiting_block.epil:
2764; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
2765; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
2766; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %3, %sum.02.unr
2767; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2768; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
2769; EPILOG-BLOCK:       latch.epil:
2770; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2771; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
2772; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ]
2773; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2774; EPILOG-BLOCK:       latchExit.epilog-lcssa:
2775; 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 ]
2776; EPILOG-BLOCK-NEXT:    br label %latchExit
2777; EPILOG-BLOCK:       latchExit:
2778; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2779; EPILOG-BLOCK-NEXT:    ret i32 %result
2780; EPILOG-BLOCK:       for.exit2.loopexit:
2781; EPILOG-BLOCK-NEXT:    br label %for.exit2
2782; EPILOG-BLOCK:       for.exit2:
2783; EPILOG-BLOCK-NEXT:    ret i32 42
2784; EPILOG-BLOCK:       for.exiting_block.1:
2785; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2786; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2787; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2788; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2789; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2790; EPILOG-BLOCK:       latch.1:
2791; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2792; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
2793; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0
2794; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7
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 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %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.sub = sub i64 %prol.iter, 1
2819; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
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:       latchExit.unr-lcssa.loopexit:
2848; 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 ]
2849; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2850; PROLOG:       latchExit.unr-lcssa.loopexit2:
2851; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ]
2852; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2853; PROLOG:       latchExit.unr-lcssa:
2854; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]
2855; PROLOG-NEXT:    br label %latchExit
2856; PROLOG:       latchExit:
2857; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2858; PROLOG-NEXT:    ret i32 %result
2859; PROLOG:       for.exit2.loopexit:
2860; PROLOG-NEXT:    br label %for.exit2
2861; PROLOG:       for.exit2.loopexit1:
2862; PROLOG-NEXT:    br label %for.exit2
2863; PROLOG:       for.exit2:
2864; PROLOG-NEXT:    ret i32 42
2865; PROLOG:       for.exiting_block.1:
2866; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2867; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2868; PROLOG-NEXT:    %add.1 = add nsw i32 %4, %add
2869; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2870; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2871; PROLOG:       latch.1:
2872; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2873; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2874; PROLOG:       for.exiting_block.2:
2875; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2876; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
2877; PROLOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
2878; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2879; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2
2880; PROLOG:       latch.2:
2881; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
2882; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2883; PROLOG:       for.exiting_block.3:
2884; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2885; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
2886; PROLOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
2887; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2888; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3
2889; PROLOG:       latch.3:
2890; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
2891; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2892; PROLOG:       for.exiting_block.4:
2893; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2894; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
2895; PROLOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2896; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2897; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4
2898; PROLOG:       latch.4:
2899; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
2900; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2901; PROLOG:       for.exiting_block.5:
2902; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2903; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
2904; PROLOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2905; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2906; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5
2907; PROLOG:       latch.5:
2908; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
2909; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2910; PROLOG:       for.exiting_block.6:
2911; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2912; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
2913; PROLOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2914; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2915; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6
2916; PROLOG:       latch.6:
2917; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
2918; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2919; PROLOG:       for.exiting_block.7:
2920; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2921; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
2922; PROLOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2923; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2924; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7
2925; PROLOG:       latch.7:
2926; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2927; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
2928; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
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:       latchExit.unr-lcssa.loopexit:
2968; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
2969; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2970; PROLOG-BLOCK:       latchExit.unr-lcssa:
2971; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2972; PROLOG-BLOCK-NEXT:    br label %latchExit
2973; PROLOG-BLOCK:       latchExit:
2974; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2975; PROLOG-BLOCK-NEXT:    ret i32 %result
2976; PROLOG-BLOCK:       for.exit2.loopexit:
2977; PROLOG-BLOCK-NEXT:    br label %for.exit2
2978; PROLOG-BLOCK:       for.exit2:
2979; PROLOG-BLOCK-NEXT:    ret i32 42
2980; PROLOG-BLOCK:       for.exiting_block.1:
2981; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2982; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2983; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2984; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2985; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2986; PROLOG-BLOCK:       latch.1:
2987; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2988; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
2989; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7
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 [ %unroll_iter, %entry.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
3093; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3094; EPILOG:       exit1.loopexit:
3095; 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 ]
3096; EPILOG-NEXT:    br label %exit1
3097; EPILOG:       exit1.loopexit2:
3098; EPILOG-NEXT:    %result.ph3 = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ]
3099; EPILOG-NEXT:    br label %exit1
3100; EPILOG:       exit1:
3101; EPILOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph3, %exit1.loopexit2 ]
3102; EPILOG-NEXT:    ret i64 %result
3103; EPILOG:       latchexit.unr-lcssa.loopexit:
3104; EPILOG-NEXT:    %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3105; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
3106; EPILOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3107; EPILOG-NEXT:    br label %latchexit.unr-lcssa
3108; EPILOG:       latchexit.unr-lcssa:
3109; EPILOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ]
3110; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ]
3111; EPILOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ]
3112; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3113; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit
3114; EPILOG:       loop_header.epil.preheader:
3115; EPILOG-NEXT:    br label %loop_header.epil
3116; EPILOG:       loop_header.epil:
3117; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
3118; EPILOG-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]
3119; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ]
3120; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil
3121; EPILOG:       loop_exiting.epil:
3122; EPILOG-NEXT:    %ivy.epil = add i64 %iv.epil, %add
3123; EPILOG-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
3124; EPILOG-NEXT:    i64 24, label %exit1.loopexit2
3125; EPILOG-NEXT:    i64 42, label %exit1.loopexit2
3126; EPILOG-NEXT:    ]
3127; EPILOG:       loop_latch.epil:
3128; EPILOG-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
3129; EPILOG-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
3130; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
3131; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
3132; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
3133; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %latchexit.epilog-lcssa, !llvm.loop !8
3134; EPILOG:       latchexit.epilog-lcssa:
3135; EPILOG-NEXT:    %sum.next.lcssa.ph1 = phi i64 [ %sum.next.epil, %loop_latch.epil ]
3136; EPILOG-NEXT:    br label %latchexit
3137; EPILOG:       latchexit:
3138; EPILOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.lcssa.ph1, %latchexit.epilog-lcssa ]
3139; EPILOG-NEXT:    ret i64 %sum.next.lcssa
3140; EPILOG:       loop_exiting.1:
3141; EPILOG-NEXT:    %ivy.1 = add i64 %iv_next, %add
3142; EPILOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3143; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3144; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3145; EPILOG-NEXT:    ]
3146; EPILOG:       loop_latch.1:
3147; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3148; EPILOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3149; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
3150; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.2
3151; EPILOG:       loop_exiting.2:
3152; EPILOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add
3153; EPILOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
3154; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3155; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3156; EPILOG-NEXT:    ]
3157; EPILOG:       loop_latch.2:
3158; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
3159; EPILOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
3160; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
3161; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.3
3162; EPILOG:       loop_exiting.3:
3163; EPILOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add
3164; EPILOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
3165; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3166; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3167; EPILOG-NEXT:    ]
3168; EPILOG:       loop_latch.3:
3169; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
3170; EPILOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
3171; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
3172; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.4
3173; EPILOG:       loop_exiting.4:
3174; EPILOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add
3175; EPILOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
3176; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3177; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3178; EPILOG-NEXT:    ]
3179; EPILOG:       loop_latch.4:
3180; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
3181; EPILOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
3182; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
3183; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.5
3184; EPILOG:       loop_exiting.5:
3185; EPILOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add
3186; EPILOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
3187; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3188; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3189; EPILOG-NEXT:    ]
3190; EPILOG:       loop_latch.5:
3191; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
3192; EPILOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
3193; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
3194; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.6
3195; EPILOG:       loop_exiting.6:
3196; EPILOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add
3197; EPILOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
3198; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3199; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3200; EPILOG-NEXT:    ]
3201; EPILOG:       loop_latch.6:
3202; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
3203; EPILOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
3204; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
3205; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.7
3206; EPILOG:       loop_exiting.7:
3207; EPILOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add
3208; EPILOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
3209; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3210; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3211; EPILOG-NEXT:    ]
3212; EPILOG:       loop_latch.7:
3213; EPILOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
3214; EPILOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
3215; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
3216; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0
3217; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %latchexit.unr-lcssa.loopexit
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 [ %unroll_iter, %entry.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
3243; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3244; EPILOG-BLOCK:       exit1.loopexit:
3245; EPILOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]
3246; EPILOG-BLOCK-NEXT:    br label %exit1
3247; EPILOG-BLOCK:       exit1:
3248; EPILOG-BLOCK-NEXT:    %result = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ], [ %result.ph, %exit1.loopexit ]
3249; EPILOG-BLOCK-NEXT:    ret i64 %result
3250; EPILOG-BLOCK:       latchexit.unr-lcssa.loopexit:
3251; EPILOG-BLOCK-NEXT:    %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3252; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
3253; EPILOG-BLOCK-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3254; EPILOG-BLOCK-NEXT:    br label %latchexit.unr-lcssa
3255; EPILOG-BLOCK:       latchexit.unr-lcssa:
3256; EPILOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ]
3257; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ]
3258; EPILOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ]
3259; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3260; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit
3261; EPILOG-BLOCK:       loop_header.epil.preheader:
3262; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
3263; EPILOG-BLOCK:       loop_header.epil:
3264; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil
3265; EPILOG-BLOCK:       loop_exiting.epil:
3266; EPILOG-BLOCK-NEXT:    %ivy.epil = add i64 %iv.unr, %add
3267; EPILOG-BLOCK-NEXT:    switch i64 %sum.unr, label %loop_latch.epil [
3268; EPILOG-BLOCK-NEXT:    i64 24, label %exit1
3269; EPILOG-BLOCK-NEXT:    i64 42, label %exit1
3270; EPILOG-BLOCK-NEXT:    ]
3271; EPILOG-BLOCK:       loop_latch.epil:
3272; EPILOG-BLOCK-NEXT:    %sum.next.epil = add i64 %sum.unr, %add
3273; EPILOG-BLOCK-NEXT:    br label %latchexit
3274; EPILOG-BLOCK:       latchexit:
3275; EPILOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.epil, %loop_latch.epil ]
3276; EPILOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa
3277; EPILOG-BLOCK:       loop_exiting.1:
3278; EPILOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add
3279; EPILOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3280; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3281; EPILOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3282; EPILOG-BLOCK-NEXT:    ]
3283; EPILOG-BLOCK:       loop_latch.1:
3284; EPILOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3285; EPILOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3286; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
3287; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0
3288; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !8
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 [ %xtraiter, %loop_header.prol.preheader ], [ %prol.iter.sub, %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.sub = sub i64 %prol.iter, 1
3314; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
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:       exit1.loopexit:
3344; 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 ]
3345; PROLOG-NEXT:    br label %exit1
3346; PROLOG:       exit1.loopexit1:
3347; PROLOG-NEXT:    %result.ph2 = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ]
3348; PROLOG-NEXT:    br label %exit1
3349; PROLOG:       exit1:
3350; PROLOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph2, %exit1.loopexit1 ]
3351; PROLOG-NEXT:    ret i64 %result
3352; PROLOG:       latchexit.unr-lcssa:
3353; PROLOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3354; PROLOG-NEXT:    br label %latchexit
3355; PROLOG:       latchexit:
3356; PROLOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]
3357; PROLOG-NEXT:    ret i64 %sum.next.lcssa
3358; PROLOG:       loop_exiting.1:
3359; PROLOG-NEXT:    %ivy.1 = add i64 %iv_next, %add
3360; PROLOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3361; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3362; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3363; PROLOG-NEXT:    ]
3364; PROLOG:       loop_latch.1:
3365; PROLOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3366; PROLOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3367; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.2
3368; PROLOG:       loop_exiting.2:
3369; PROLOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add
3370; PROLOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
3371; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3372; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3373; PROLOG-NEXT:    ]
3374; PROLOG:       loop_latch.2:
3375; PROLOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
3376; PROLOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
3377; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.3
3378; PROLOG:       loop_exiting.3:
3379; PROLOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add
3380; PROLOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
3381; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3382; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3383; PROLOG-NEXT:    ]
3384; PROLOG:       loop_latch.3:
3385; PROLOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
3386; PROLOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
3387; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.4
3388; PROLOG:       loop_exiting.4:
3389; PROLOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add
3390; PROLOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
3391; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3392; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3393; PROLOG-NEXT:    ]
3394; PROLOG:       loop_latch.4:
3395; PROLOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
3396; PROLOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
3397; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.5
3398; PROLOG:       loop_exiting.5:
3399; PROLOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add
3400; PROLOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
3401; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3402; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3403; PROLOG-NEXT:    ]
3404; PROLOG:       loop_latch.5:
3405; PROLOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
3406; PROLOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
3407; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.6
3408; PROLOG:       loop_exiting.6:
3409; PROLOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add
3410; PROLOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
3411; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3412; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3413; PROLOG-NEXT:    ]
3414; PROLOG:       loop_latch.6:
3415; PROLOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
3416; PROLOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
3417; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.7
3418; PROLOG:       loop_exiting.7:
3419; PROLOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add
3420; PROLOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
3421; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3422; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3423; PROLOG-NEXT:    ]
3424; PROLOG:       loop_latch.7:
3425; PROLOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
3426; PROLOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
3427; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
3428; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %latchexit.unr-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:       exit1.loopexit:
3470; PROLOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]
3471; PROLOG-BLOCK-NEXT:    br label %exit1
3472; PROLOG-BLOCK:       exit1:
3473; PROLOG-BLOCK-NEXT:    %result = phi i64 [ %add, %loop_exiting.prol ], [ %add, %loop_exiting.prol ], [ %result.ph, %exit1.loopexit ]
3474; PROLOG-BLOCK-NEXT:    ret i64 %result
3475; PROLOG-BLOCK:       latchexit.unr-lcssa:
3476; PROLOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3477; PROLOG-BLOCK-NEXT:    br label %latchexit
3478; PROLOG-BLOCK:       latchexit:
3479; PROLOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]
3480; PROLOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa
3481; PROLOG-BLOCK:       loop_exiting.1:
3482; PROLOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add
3483; PROLOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3484; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3485; PROLOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3486; PROLOG-BLOCK-NEXT:    ]
3487; PROLOG-BLOCK:       loop_latch.1:
3488; PROLOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3489; PROLOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3490; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
3491; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %latchexit.unr-lcssa, !llvm.loop !8
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 [ %unroll_iter, %entry.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
3548; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
3549; EPILOG:       latch_exit.unr-lcssa.loopexit:
3550; EPILOG-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %latch.7 ]
3551; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
3552; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
3553; EPILOG-NEXT:    br label %latch_exit.unr-lcssa
3554; EPILOG:       latch_exit.unr-lcssa:
3555; EPILOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ]
3556; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3557; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3558; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3559; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit
3560; EPILOG:       header.epil.preheader:
3561; EPILOG-NEXT:    br label %header.epil
3562; EPILOG:       header.epil:
3563; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
3564; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
3565; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
3566; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil
3567; EPILOG:       for.exiting_block.epil:
3568; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
3569; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit2, label %latch.epil
3570; EPILOG:       latch.epil:
3571; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
3572; EPILOG-NEXT:    %load.epil = load i32, i32* %arrayidx.epil, align 4
3573; EPILOG-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.epil
3574; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
3575; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
3576; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
3577; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
3578; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latch_exit.epilog-lcssa, !llvm.loop !9
3579; EPILOG:       latch_exit.epilog-lcssa:
3580; EPILOG-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %latch.epil ]
3581; EPILOG-NEXT:    br label %latch_exit
3582; EPILOG:       latch_exit:
3583; EPILOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %sum.0.lcssa.ph1, %latch_exit.epilog-lcssa ]
3584; EPILOG-NEXT:    ret i32 %sum.0.lcssa
3585; EPILOG:       for.exit2.loopexit:
3586; 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 ]
3587; EPILOG-NEXT:    br label %for.exit2
3588; EPILOG:       for.exit2.loopexit2:
3589; EPILOG-NEXT:    %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
3590; EPILOG-NEXT:    br label %for.exit2
3591; EPILOG:       for.exit2:
3592; EPILOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
3593; EPILOG-NEXT:    %addx = add i32 %retval, %x
3594; EPILOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3595; EPILOG:       exit_true:
3596; EPILOG-NEXT:    ret i32 %retval
3597; EPILOG:       exit_false:
3598; EPILOG-NEXT:    ret i32 %addx
3599; EPILOG:       for.exiting_block.1:
3600; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3601; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3602; EPILOG:       latch.1:
3603; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3604; EPILOG-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
3605; EPILOG-NEXT:    %add.1 = add nsw i32 %load.1, %add
3606; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
3607; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
3608; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
3609; EPILOG:       for.exiting_block.2:
3610; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
3611; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
3612; EPILOG:       latch.2:
3613; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
3614; EPILOG-NEXT:    %load.2 = load i32, i32* %arrayidx.2, align 4
3615; EPILOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.1
3616; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
3617; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
3618; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
3619; EPILOG:       for.exiting_block.3:
3620; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
3621; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
3622; EPILOG:       latch.3:
3623; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
3624; EPILOG-NEXT:    %load.3 = load i32, i32* %arrayidx.3, align 4
3625; EPILOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.2
3626; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
3627; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
3628; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
3629; EPILOG:       for.exiting_block.4:
3630; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
3631; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
3632; EPILOG:       latch.4:
3633; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
3634; EPILOG-NEXT:    %load.4 = load i32, i32* %arrayidx.4, align 4
3635; EPILOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.3
3636; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
3637; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
3638; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
3639; EPILOG:       for.exiting_block.5:
3640; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
3641; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
3642; EPILOG:       latch.5:
3643; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
3644; EPILOG-NEXT:    %load.5 = load i32, i32* %arrayidx.5, align 4
3645; EPILOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.4
3646; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
3647; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
3648; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
3649; EPILOG:       for.exiting_block.6:
3650; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
3651; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
3652; EPILOG:       latch.6:
3653; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
3654; EPILOG-NEXT:    %load.6 = load i32, i32* %arrayidx.6, align 4
3655; EPILOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.5
3656; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
3657; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
3658; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
3659; EPILOG:       for.exiting_block.7:
3660; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
3661; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
3662; EPILOG:       latch.7:
3663; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
3664; EPILOG-NEXT:    %load.7 = load i32, i32* %arrayidx.7, align 4
3665; EPILOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.6
3666; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
3667; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
3668; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
3669; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latch_exit.unr-lcssa.loopexit, label %header
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 [ %unroll_iter, %entry.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
3694; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
3695; EPILOG-BLOCK:       latch_exit.unr-lcssa.loopexit:
3696; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %latch.1 ]
3697; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
3698; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
3699; EPILOG-BLOCK-NEXT:    br label %latch_exit.unr-lcssa
3700; EPILOG-BLOCK:       latch_exit.unr-lcssa:
3701; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ]
3702; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3703; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3704; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3705; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit
3706; EPILOG-BLOCK:       header.epil.preheader:
3707; EPILOG-BLOCK-NEXT:    br label %header.epil
3708; EPILOG-BLOCK:       header.epil:
3709; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.epil
3710; EPILOG-BLOCK:       for.exiting_block.epil:
3711; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
3712; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %latch.epil
3713; EPILOG-BLOCK:       latch.epil:
3714; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
3715; EPILOG-BLOCK-NEXT:    %load.epil = load i32, i32* %arrayidx.epil, align 4
3716; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.unr
3717; EPILOG-BLOCK-NEXT:    br label %latch_exit
3718; EPILOG-BLOCK:       latch_exit:
3719; EPILOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %add.epil, %latch.epil ]
3720; EPILOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
3721; EPILOG-BLOCK:       for.exit2.loopexit:
3722; EPILOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]
3723; EPILOG-BLOCK-NEXT:    br label %for.exit2
3724; EPILOG-BLOCK:       for.exit2:
3725; EPILOG-BLOCK-NEXT:    %retval = phi i32 [ %sum.02.unr, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ]
3726; EPILOG-BLOCK-NEXT:    %addx = add i32 %retval, %x
3727; EPILOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3728; EPILOG-BLOCK:       exit_true:
3729; EPILOG-BLOCK-NEXT:    ret i32 %retval
3730; EPILOG-BLOCK:       exit_false:
3731; EPILOG-BLOCK-NEXT:    ret i32 %addx
3732; EPILOG-BLOCK:       for.exiting_block.1:
3733; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3734; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3735; EPILOG-BLOCK:       latch.1:
3736; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3737; EPILOG-BLOCK-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
3738; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add
3739; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
3740; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
3741; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0
3742; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latch_exit.unr-lcssa.loopexit, label %header, !llvm.loop !9
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 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %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.sub = sub i64 %prol.iter, 1
3767; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
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:       latch_exit.unr-lcssa:
3796; PROLOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %latch.7 ]
3797; PROLOG-NEXT:    br label %latch_exit
3798; PROLOG:       latch_exit:
3799; PROLOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]
3800; PROLOG-NEXT:    ret i32 %sum.0.lcssa
3801; PROLOG:       for.exit2.loopexit:
3802; 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 ]
3803; PROLOG-NEXT:    br label %for.exit2
3804; PROLOG:       for.exit2.loopexit1:
3805; PROLOG-NEXT:    %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
3806; PROLOG-NEXT:    br label %for.exit2
3807; PROLOG:       for.exit2:
3808; PROLOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
3809; PROLOG-NEXT:    %addx = add i32 %retval, %x
3810; PROLOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3811; PROLOG:       exit_true:
3812; PROLOG-NEXT:    ret i32 %retval
3813; PROLOG:       exit_false:
3814; PROLOG-NEXT:    ret i32 %addx
3815; PROLOG:       for.exiting_block.1:
3816; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3817; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3818; PROLOG:       latch.1:
3819; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3820; PROLOG-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
3821; PROLOG-NEXT:    %add.1 = add nsw i32 %load.1, %add
3822; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
3823; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
3824; PROLOG:       for.exiting_block.2:
3825; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
3826; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
3827; PROLOG:       latch.2:
3828; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
3829; PROLOG-NEXT:    %load.2 = load i32, i32* %arrayidx.2, align 4
3830; PROLOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.1
3831; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
3832; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
3833; PROLOG:       for.exiting_block.3:
3834; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
3835; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
3836; PROLOG:       latch.3:
3837; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
3838; PROLOG-NEXT:    %load.3 = load i32, i32* %arrayidx.3, align 4
3839; PROLOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.2
3840; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
3841; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
3842; PROLOG:       for.exiting_block.4:
3843; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
3844; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
3845; PROLOG:       latch.4:
3846; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
3847; PROLOG-NEXT:    %load.4 = load i32, i32* %arrayidx.4, align 4
3848; PROLOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.3
3849; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
3850; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
3851; PROLOG:       for.exiting_block.5:
3852; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
3853; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
3854; PROLOG:       latch.5:
3855; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
3856; PROLOG-NEXT:    %load.5 = load i32, i32* %arrayidx.5, align 4
3857; PROLOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.4
3858; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
3859; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
3860; PROLOG:       for.exiting_block.6:
3861; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
3862; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
3863; PROLOG:       latch.6:
3864; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
3865; PROLOG-NEXT:    %load.6 = load i32, i32* %arrayidx.6, align 4
3866; PROLOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.5
3867; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
3868; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
3869; PROLOG:       for.exiting_block.7:
3870; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
3871; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
3872; PROLOG:       latch.7:
3873; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
3874; PROLOG-NEXT:    %load.7 = load i32, i32* %arrayidx.7, align 4
3875; PROLOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.6
3876; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
3877; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
3878; PROLOG-NEXT:    br i1 %exitcond.7, label %latch_exit.unr-lcssa, label %header
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:       latch_exit.unr-lcssa:
3918; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %latch.1 ]
3919; PROLOG-BLOCK-NEXT:    br label %latch_exit
3920; PROLOG-BLOCK:       latch_exit:
3921; PROLOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]
3922; PROLOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
3923; PROLOG-BLOCK:       for.exit2.loopexit:
3924; PROLOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]
3925; PROLOG-BLOCK-NEXT:    br label %for.exit2
3926; PROLOG-BLOCK:       for.exit2:
3927; PROLOG-BLOCK-NEXT:    %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ]
3928; PROLOG-BLOCK-NEXT:    %addx = add i32 %retval, %x
3929; PROLOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3930; PROLOG-BLOCK:       exit_true:
3931; PROLOG-BLOCK-NEXT:    ret i32 %retval
3932; PROLOG-BLOCK:       exit_false:
3933; PROLOG-BLOCK-NEXT:    ret i32 %addx
3934; PROLOG-BLOCK:       for.exiting_block.1:
3935; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3936; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3937; PROLOG-BLOCK:       latch.1:
3938; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3939; PROLOG-BLOCK-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
3940; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add
3941; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
3942; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
3943; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latch_exit.unr-lcssa, label %header, !llvm.loop !9
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 [ %unroll_iter, %preheader.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
4006; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4007; EPILOG:       latchexit.unr-lcssa.loopexit:
4008; EPILOG-NEXT:    %i6.unr.ph = phi i64 [ %add.7, %latch.7 ]
4009; EPILOG-NEXT:    br label %latchexit.unr-lcssa
4010; EPILOG:       latchexit.unr-lcssa:
4011; EPILOG-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ]
4012; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4013; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit
4014; EPILOG:       header.epil.preheader:
4015; EPILOG-NEXT:    br label %header.epil
4016; EPILOG:       header.epil:
4017; EPILOG-NEXT:    %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ], [ %add.epil, %latch.epil ]
4018; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
4019; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit1, label %latch.epil
4020; EPILOG:       latch.epil:
4021; EPILOG-NEXT:    %add.epil = add nuw nsw i64 %i6.epil, 1
4022; EPILOG-NEXT:    %i9.epil = icmp slt i64 %add.epil, %sext
4023; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
4024; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
4025; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchexit.epilog-lcssa, !llvm.loop !10
4026; EPILOG:       latchexit.epilog-lcssa:
4027; EPILOG-NEXT:    br label %latchexit
4028; EPILOG:       latchexit:
4029; EPILOG-NEXT:    unreachable
4030; EPILOG:       loopexit2:
4031; EPILOG-NEXT:    ret i32 %shft
4032; EPILOG:       loopexit1.loopexit:
4033; 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 ]
4034; EPILOG-NEXT:    br label %loopexit1
4035; EPILOG:       loopexit1.loopexit1:
4036; EPILOG-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.epil ]
4037; EPILOG-NEXT:    br label %loopexit1
4038; EPILOG:       loopexit1:
4039; EPILOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
4040; EPILOG-NEXT:    ret i32 %sext3
4041; EPILOG:       latch.1:
4042; EPILOG-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4043; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
4044; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.2
4045; EPILOG:       latch.2:
4046; EPILOG-NEXT:    %add.2 = add nuw nsw i64 %add.1, 1
4047; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
4048; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.3
4049; EPILOG:       latch.3:
4050; EPILOG-NEXT:    %add.3 = add nuw nsw i64 %add.2, 1
4051; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
4052; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.4
4053; EPILOG:       latch.4:
4054; EPILOG-NEXT:    %add.4 = add nuw nsw i64 %add.3, 1
4055; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
4056; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.5
4057; EPILOG:       latch.5:
4058; EPILOG-NEXT:    %add.5 = add nuw nsw i64 %add.4, 1
4059; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
4060; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.6
4061; EPILOG:       latch.6:
4062; EPILOG-NEXT:    %add.6 = add nuw nsw i64 %add.5, 1
4063; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
4064; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.7
4065; EPILOG:       latch.7:
4066; EPILOG-NEXT:    %add.7 = add nuw nsw i64 %add.6, 1
4067; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
4068; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0
4069; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %latchexit.unr-lcssa.loopexit
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 [ %unroll_iter, %preheader.new ], [ %niter.nsub.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.nsub = sub i64 %niter, 1
4093; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4094; EPILOG-BLOCK:       latchexit.unr-lcssa.loopexit:
4095; EPILOG-BLOCK-NEXT:    br label %latchexit.unr-lcssa
4096; EPILOG-BLOCK:       latchexit.unr-lcssa:
4097; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4098; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit
4099; EPILOG-BLOCK:       header.epil.preheader:
4100; EPILOG-BLOCK-NEXT:    br label %header.epil
4101; EPILOG-BLOCK:       header.epil:
4102; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1, label %latch.epil
4103; EPILOG-BLOCK:       latch.epil:
4104; EPILOG-BLOCK-NEXT:    br label %latchexit
4105; EPILOG-BLOCK:       latchexit:
4106; EPILOG-BLOCK-NEXT:    unreachable
4107; EPILOG-BLOCK:       loopexit2:
4108; EPILOG-BLOCK-NEXT:    ret i32 %shft
4109; EPILOG-BLOCK:       loopexit1.loopexit:
4110; EPILOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]
4111; EPILOG-BLOCK-NEXT:    br label %loopexit1
4112; EPILOG-BLOCK:       loopexit1:
4113; EPILOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.epil ], [ %sext3.ph, %loopexit1.loopexit ]
4114; EPILOG-BLOCK-NEXT:    ret i32 %sext3
4115; EPILOG-BLOCK:       latch.1:
4116; EPILOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4117; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
4118; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0
4119; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !10
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 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %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.sub = sub i64 %prol.iter, 1
4143; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
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:       latchexit.unr-lcssa:
4161; PROLOG-NEXT:    br label %latchexit
4162; PROLOG:       latchexit:
4163; PROLOG-NEXT:    unreachable
4164; PROLOG:       loopexit2:
4165; PROLOG-NEXT:    ret i32 %shft
4166; PROLOG:       loopexit1.loopexit:
4167; 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 ]
4168; PROLOG-NEXT:    br label %loopexit1
4169; PROLOG:       loopexit1.loopexit1:
4170; PROLOG-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.prol ]
4171; PROLOG-NEXT:    br label %loopexit1
4172; PROLOG:       loopexit1:
4173; PROLOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
4174; PROLOG-NEXT:    ret i32 %sext3
4175; PROLOG:       latch.1:
4176; PROLOG-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4177; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.2
4178; PROLOG:       latch.2:
4179; PROLOG-NEXT:    %add.2 = add nuw nsw i64 %add.1, 1
4180; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.3
4181; PROLOG:       latch.3:
4182; PROLOG-NEXT:    %add.3 = add nuw nsw i64 %add.2, 1
4183; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.4
4184; PROLOG:       latch.4:
4185; PROLOG-NEXT:    %add.4 = add nuw nsw i64 %add.3, 1
4186; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.5
4187; PROLOG:       latch.5:
4188; PROLOG-NEXT:    %add.5 = add nuw nsw i64 %add.4, 1
4189; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.6
4190; PROLOG:       latch.6:
4191; PROLOG-NEXT:    %add.6 = add nuw nsw i64 %add.5, 1
4192; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.7
4193; PROLOG:       latch.7:
4194; PROLOG-NEXT:    %add.7 = add nuw nsw i64 %add.6, 1
4195; PROLOG-NEXT:    %i9.7 = icmp slt i64 %add.7, %sext
4196; PROLOG-NEXT:    br i1 %i9.7, label %header, label %latchexit.unr-lcssa
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:       latchexit.unr-lcssa:
4229; PROLOG-BLOCK-NEXT:    br label %latchexit
4230; PROLOG-BLOCK:       latchexit:
4231; PROLOG-BLOCK-NEXT:    unreachable
4232; PROLOG-BLOCK:       loopexit2:
4233; PROLOG-BLOCK-NEXT:    ret i32 %shft
4234; PROLOG-BLOCK:       loopexit1.loopexit:
4235; PROLOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]
4236; PROLOG-BLOCK-NEXT:    br label %loopexit1
4237; PROLOG-BLOCK:       loopexit1:
4238; PROLOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.prol ], [ %sext3.ph, %loopexit1.loopexit ]
4239; PROLOG-BLOCK-NEXT:    ret i32 %sext3
4240; PROLOG-BLOCK:       latch.1:
4241; PROLOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4242; PROLOG-BLOCK-NEXT:    %i9.1 = icmp slt i64 %add.1, %sext
4243; PROLOG-BLOCK-NEXT:    br i1 %i9.1, label %header, label %latchexit.unr-lcssa, !llvm.loop !10
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 [ %unroll_iter, %outerloop.new ], [ %niter.nsub.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.nsub = sub 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:       exit.unr-lcssa.loopexit:
4307; EPILOG-NEXT:    %i3.unr.ph = phi i64 [ %i4.7, %latch.7 ]
4308; EPILOG-NEXT:    br label %exit.unr-lcssa
4309; EPILOG:       exit.unr-lcssa:
4310; EPILOG-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %exit.unr-lcssa.loopexit ]
4311; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4312; EPILOG-NEXT:    br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit
4313; EPILOG:       innerH.epil.preheader:
4314; EPILOG-NEXT:    br label %innerH.epil
4315; EPILOG:       innerH.epil:
4316; EPILOG-NEXT:    %i3.epil = phi i64 [ %i4.epil, %latch.epil ], [ %i3.unr, %innerH.epil.preheader ]
4317; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %innerH.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
4318; EPILOG-NEXT:    %i4.epil = add nuw nsw i64 %i3.epil, 1
4319; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit1, label %latch.epil
4320; EPILOG:       latch.epil:
4321; EPILOG-NEXT:    %i6.epil = icmp ult i64 %i4.epil, 100
4322; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
4323; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
4324; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %innerH.epil, label %exit.epilog-lcssa, !llvm.loop !11
4325; EPILOG:       exit.epilog-lcssa:
4326; EPILOG-NEXT:    br label %exit
4327; EPILOG:       exit.loopexit:
4328; EPILOG-NEXT:    br label %exit
4329; EPILOG:       exit:
4330; EPILOG-NEXT:    ret void
4331; EPILOG:       latch.1:
4332; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
4333; EPILOG-NEXT:    %i4.2 = add nuw nsw i64 %i4.1, 1
4334; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.2
4335; EPILOG:       latch.2:
4336; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
4337; EPILOG-NEXT:    %i4.3 = add nuw nsw i64 %i4.2, 1
4338; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.3
4339; EPILOG:       latch.3:
4340; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
4341; EPILOG-NEXT:    %i4.4 = add nuw nsw i64 %i4.3, 1
4342; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.4
4343; EPILOG:       latch.4:
4344; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
4345; EPILOG-NEXT:    %i4.5 = add nuw nsw i64 %i4.4, 1
4346; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.5
4347; EPILOG:       latch.5:
4348; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
4349; EPILOG-NEXT:    %i4.6 = add nuw nsw i64 %i4.5, 1
4350; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.6
4351; EPILOG:       latch.6:
4352; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
4353; EPILOG-NEXT:    %i4.7 = add nuw nsw i64 %i4.6, 1
4354; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.7
4355; EPILOG:       latch.7:
4356; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
4357; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0
4358; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %innerH, label %exit.unr-lcssa.loopexit
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:
4368; EPILOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]
4369; EPILOG-BLOCK-NEXT:    %0 = sub i64 100, %i
4370; EPILOG-BLOCK-NEXT:    %1 = sub i64 99, %i
4371; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4372; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4373; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit.unr-lcssa, label %outerloop.new
4374; EPILOG-BLOCK:       outerloop.new:
4375; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
4376; EPILOG-BLOCK-NEXT:    br label %innerH
4377; EPILOG-BLOCK:       innerH:
4378; EPILOG-BLOCK-NEXT:    %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.1, %latch.1 ]
4379; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %outerloop.new ], [ %niter.nsub.1, %latch.1 ]
4380; EPILOG-BLOCK-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4381; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4382; EPILOG-BLOCK:       latch:
4383; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
4384; EPILOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
4385; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4386; EPILOG-BLOCK:       exit.unr-lcssa.loopexit:
4387; EPILOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4388; EPILOG-BLOCK:       exit.unr-lcssa:
4389; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4390; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit
4391; EPILOG-BLOCK:       innerH.epil.preheader:
4392; EPILOG-BLOCK-NEXT:    br label %innerH.epil
4393; EPILOG-BLOCK:       innerH.epil:
4394; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.epil
4395; EPILOG-BLOCK:       latch.epil:
4396; EPILOG-BLOCK-NEXT:    br label %exit
4397; EPILOG-BLOCK:       exit.loopexit:
4398; EPILOG-BLOCK-NEXT:    br label %exit
4399; EPILOG-BLOCK:       exit:
4400; EPILOG-BLOCK-NEXT:    ret void
4401; EPILOG-BLOCK:       latch.1:
4402; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
4403; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0
4404; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !11
4405; EPILOG-BLOCK:       outerloop.new.1:
4406; EPILOG-BLOCK-NEXT:    br label %innerH.1
4407; EPILOG-BLOCK:       innerH.1:
4408; EPILOG-BLOCK-NEXT:    %i3.1 = phi i64 [ 0, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ]
4409; EPILOG-BLOCK-NEXT:    %niter.1 = phi i64 [ 100, %outerloop.new.1 ], [ %niter.nsub.1.1, %latch.1.1 ]
4410; EPILOG-BLOCK-NEXT:    %i4.11 = add nuw nsw i64 %i3.1, 1
4411; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.13
4412; EPILOG-BLOCK:       latch.13:
4413; EPILOG-BLOCK-NEXT:    %niter.nsub.12 = sub i64 %niter.1, 1
4414; EPILOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i4.11, 1
4415; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1
4416; EPILOG-BLOCK:       latch.1.1:
4417; EPILOG-BLOCK-NEXT:    %niter.nsub.1.1 = sub i64 %niter.nsub.12, 1
4418; EPILOG-BLOCK-NEXT:    %niter.ncmp.1.1 = icmp ne i64 %niter.nsub.1.1, 0
4419; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit.1, !llvm.loop !11
4420; EPILOG-BLOCK:       exit.unr-lcssa.loopexit.1:
4421; EPILOG-BLOCK-NEXT:    br label %exit.unr-lcssa.1
4422; EPILOG-BLOCK:       outerloop.loopexit.loopexit.1:
4423; EPILOG-BLOCK-NEXT:    br label %outerloop.loopexit.1
4424; EPILOG-BLOCK:       exit.unr-lcssa.1:
4425; EPILOG-BLOCK-NEXT:    br i1 false, label %innerH.epil.preheader.1, label %exit.loopexit
4426; EPILOG-BLOCK:       innerH.epil.preheader.1:
4427; EPILOG-BLOCK-NEXT:    br label %innerH.epil.1
4428; EPILOG-BLOCK:       innerH.epil.1:
4429; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.epil
4430; EPILOG-BLOCK:       outerloop.loopexit.1:
4431; EPILOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !12
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 [ %xtraiter, %innerH.prol.preheader ], [ %prol.iter.sub, %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.sub = sub i64 %prol.iter, 1
4459; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
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:       exit.unr-lcssa:
4478; PROLOG-NEXT:    br label %exit
4479; PROLOG:       exit.loopexit:
4480; PROLOG-NEXT:    br label %exit
4481; PROLOG:       exit:
4482; PROLOG-NEXT:    ret void
4483; PROLOG:       latch.1:
4484; PROLOG-NEXT:    %i4.2 = add nuw nsw i64 %i4.1, 1
4485; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.2
4486; PROLOG:       latch.2:
4487; PROLOG-NEXT:    %i4.3 = add nuw nsw i64 %i4.2, 1
4488; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.3
4489; PROLOG:       latch.3:
4490; PROLOG-NEXT:    %i4.4 = add nuw nsw i64 %i4.3, 1
4491; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.4
4492; PROLOG:       latch.4:
4493; PROLOG-NEXT:    %i4.5 = add nuw nsw i64 %i4.4, 1
4494; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.5
4495; PROLOG:       latch.5:
4496; PROLOG-NEXT:    %i4.6 = add nuw nsw i64 %i4.5, 1
4497; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.6
4498; PROLOG:       latch.6:
4499; PROLOG-NEXT:    %i4.7 = add nuw nsw i64 %i4.6, 1
4500; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.7
4501; PROLOG:       latch.7:
4502; PROLOG-NEXT:    %i6.7 = icmp ult i64 %i4.7, 100
4503; PROLOG-NEXT:    br i1 %i6.7, label %innerH, label %exit.unr-lcssa
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:       outerloop:
4513; PROLOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]
4514; PROLOG-BLOCK-NEXT:    %0 = sub i64 100, %i
4515; PROLOG-BLOCK-NEXT:    %1 = sub i64 99, %i
4516; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4517; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4518; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit
4519; PROLOG-BLOCK:       innerH.prol.preheader:
4520; PROLOG-BLOCK-NEXT:    br label %innerH.prol
4521; PROLOG-BLOCK:       innerH.prol:
4522; PROLOG-BLOCK-NEXT:    %i4.prol = add nuw nsw i64 %i, 1
4523; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.prol
4524; PROLOG-BLOCK:       latch.prol:
4525; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit
4526; PROLOG-BLOCK:       innerH.prol.loopexit:
4527; PROLOG-BLOCK-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i4.prol, %latch.prol ]
4528; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4529; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit.loopexit, label %outerloop.new
4530; PROLOG-BLOCK:       outerloop.new:
4531; PROLOG-BLOCK-NEXT:    br label %innerH
4532; PROLOG-BLOCK:       innerH:
4533; PROLOG-BLOCK-NEXT:    %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.1, %latch.1 ]
4534; PROLOG-BLOCK-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4535; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4536; PROLOG-BLOCK:       latch:
4537; PROLOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
4538; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4539; PROLOG-BLOCK:       exit.unr-lcssa.loopexit:
4540; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4541; PROLOG-BLOCK:       exit.unr-lcssa.loopexit3:
4542; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4543; PROLOG-BLOCK:       exit.unr-lcssa:
4544; PROLOG-BLOCK-NEXT:    br label %exit
4545; PROLOG-BLOCK:       exit.loopexit:
4546; PROLOG-BLOCK-NEXT:    br label %exit
4547; PROLOG-BLOCK:       exit:
4548; PROLOG-BLOCK-NEXT:    ret void
4549; PROLOG-BLOCK:       latch.1:
4550; PROLOG-BLOCK-NEXT:    %i6.1 = icmp ult i64 %i4.1, 100
4551; PROLOG-BLOCK-NEXT:    br i1 %i6.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !11
4552; PROLOG-BLOCK:       innerH.prol.preheader.1:
4553; PROLOG-BLOCK-NEXT:    br label %innerH.prol.1
4554; PROLOG-BLOCK:       innerH.prol.1:
4555; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.prol.1
4556; PROLOG-BLOCK:       latch.prol.1:
4557; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit.1
4558; PROLOG-BLOCK:       innerH.prol.loopexit.1:
4559; PROLOG-BLOCK-NEXT:    %i3.unr.1 = phi i64 [ 0, %outerloop.loopexit ], [ 1, %latch.prol.1 ]
4560; PROLOG-BLOCK-NEXT:    br i1 false, label %exit.loopexit, label %outerloop.new.1
4561; PROLOG-BLOCK:       outerloop.new.1:
4562; PROLOG-BLOCK-NEXT:    br label %innerH.1
4563; PROLOG-BLOCK:       innerH.1:
4564; PROLOG-BLOCK-NEXT:    %i3.1 = phi i64 [ %i3.unr.1, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ]
4565; PROLOG-BLOCK-NEXT:    %i4.11 = add nuw nsw i64 %i3.1, 1
4566; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.12
4567; PROLOG-BLOCK:       latch.12:
4568; PROLOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i4.11, 1
4569; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1
4570; PROLOG-BLOCK:       latch.1.1:
4571; PROLOG-BLOCK-NEXT:    %i6.1.1 = icmp ult i64 %i4.1.1, 100
4572; PROLOG-BLOCK-NEXT:    br i1 %i6.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit3, !llvm.loop !11
4573; PROLOG-BLOCK:       outerloop.loopexit.loopexit.1:
4574; PROLOG-BLOCK-NEXT:    br label %outerloop.loopexit.1
4575; PROLOG-BLOCK:       outerloop.loopexit.1:
4576; PROLOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !12
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 [ %unroll_iter, %preheader.new ], [ %niter.nsub.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.nsub = sub i32 %niter, 1
4638; EPILOG-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit
4639; EPILOG:       outerLatch.loopexit.unr-lcssa.loopexit:
4640; EPILOG-NEXT:    %phi.unr.ph = phi i64 [ %iv.next.7, %latch.7 ]
4641; EPILOG-NEXT:    br label %outerLatch.loopexit.unr-lcssa
4642; EPILOG:       outerLatch.loopexit.unr-lcssa:
4643; EPILOG-NEXT:    %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %outerLatch.loopexit.unr-lcssa.loopexit ]
4644; EPILOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
4645; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit
4646; EPILOG:       header.epil.preheader:
4647; EPILOG-NEXT:    br label %header.epil
4648; EPILOG:       header.epil:
4649; EPILOG-NEXT:    %phi.epil = phi i64 [ %phi.unr, %header.epil.preheader ], [ %iv.next.epil, %latch.epil ]
4650; EPILOG-NEXT:    %epil.iter = phi i32 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
4651; EPILOG-NEXT:    %i7.epil = trunc i64 %phi.epil to i32
4652; EPILOG-NEXT:    br i1 true, label %latch.epil, label %innerexit.loopexit1
4653; EPILOG:       latch.epil:
4654; EPILOG-NEXT:    %i11.epil = add nsw i32 %i7.epil, 1
4655; EPILOG-NEXT:    %innercnd.epil = icmp slt i32 %i11.epil, %trip
4656; EPILOG-NEXT:    %iv.next.epil = add nuw nsw i64 %phi.epil, 1
4657; EPILOG-NEXT:    %epil.iter.sub = sub i32 %epil.iter, 1
4658; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i32 %epil.iter.sub, 0
4659; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %outerLatch.loopexit.epilog-lcssa, !llvm.loop !12
4660; EPILOG:       outerLatch.loopexit.epilog-lcssa:
4661; EPILOG-NEXT:    br label %outerLatch.loopexit
4662; EPILOG:       outerLatch.loopexit:
4663; EPILOG-NEXT:    br label %outerLatch
4664; EPILOG:       outerLatch:
4665; EPILOG-NEXT:    br label %outerloopHdr
4666; EPILOG:       latch.1:
4667; EPILOG-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
4668; EPILOG-NEXT:    %niter.nsub.1 = sub i32 %niter.nsub, 1
4669; EPILOG-NEXT:    br i1 true, label %latch.2, label %innerexit.loopexit
4670; EPILOG:       latch.2:
4671; EPILOG-NEXT:    %iv.next.2 = add nuw nsw i64 %iv.next.1, 1
4672; EPILOG-NEXT:    %niter.nsub.2 = sub i32 %niter.nsub.1, 1
4673; EPILOG-NEXT:    br i1 true, label %latch.3, label %innerexit.loopexit
4674; EPILOG:       latch.3:
4675; EPILOG-NEXT:    %iv.next.3 = add nuw nsw i64 %iv.next.2, 1
4676; EPILOG-NEXT:    %niter.nsub.3 = sub i32 %niter.nsub.2, 1
4677; EPILOG-NEXT:    br i1 true, label %latch.4, label %innerexit.loopexit
4678; EPILOG:       latch.4:
4679; EPILOG-NEXT:    %iv.next.4 = add nuw nsw i64 %iv.next.3, 1
4680; EPILOG-NEXT:    %niter.nsub.4 = sub i32 %niter.nsub.3, 1
4681; EPILOG-NEXT:    br i1 true, label %latch.5, label %innerexit.loopexit
4682; EPILOG:       latch.5:
4683; EPILOG-NEXT:    %iv.next.5 = add nuw nsw i64 %iv.next.4, 1
4684; EPILOG-NEXT:    %niter.nsub.5 = sub i32 %niter.nsub.4, 1
4685; EPILOG-NEXT:    br i1 true, label %latch.6, label %innerexit.loopexit
4686; EPILOG:       latch.6:
4687; EPILOG-NEXT:    %iv.next.6 = add nuw nsw i64 %iv.next.5, 1
4688; EPILOG-NEXT:    %niter.nsub.6 = sub i32 %niter.nsub.5, 1
4689; EPILOG-NEXT:    br i1 true, label %latch.7, label %innerexit.loopexit
4690; EPILOG:       latch.7:
4691; EPILOG-NEXT:    %iv.next.7 = add nuw nsw i64 %iv.next.6, 1
4692; EPILOG-NEXT:    %niter.nsub.7 = sub i32 %niter.nsub.6, 1
4693; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i32 %niter.nsub.7, 0
4694; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit
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 [ %unroll_iter, %preheader.new ], [ %niter.nsub.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.nsub = sub i32 %niter, 1
4735; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit.loopexit
4736; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa.loopexit:
4737; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit.unr-lcssa
4738; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa:
4739; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
4740; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit
4741; EPILOG-BLOCK:       header.epil.preheader:
4742; EPILOG-BLOCK-NEXT:    br label %header.epil
4743; EPILOG-BLOCK:       header.epil:
4744; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.epil, label %innerexit.loopexit1
4745; EPILOG-BLOCK:       latch.epil:
4746; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit
4747; EPILOG-BLOCK:       outerLatch.loopexit:
4748; EPILOG-BLOCK-NEXT:    br label %outerLatch
4749; EPILOG-BLOCK:       outerLatch:
4750; EPILOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -1
4751; EPILOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.1
4752; EPILOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.1
4753; EPILOG-BLOCK:       latch.1:
4754; EPILOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
4755; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i32 %niter.nsub, 1
4756; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i32 %niter.nsub.1, 0
4757; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit, !llvm.loop !13
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 [ %unroll_iter.1, %preheader.new.1 ], [ %niter.nsub.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.nsub.14 = sub 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.nsub.1.1 = sub i32 %niter.nsub.14, 1
4776; EPILOG-BLOCK-NEXT:    %niter.ncmp.1.1 = icmp ne i32 %niter.nsub.1.1, 0
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 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %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.sub = sub i32 %prol.iter, 1
4820; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i32 %prol.iter.sub, 0
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:       outerLatch.loopexit.unr-lcssa:
4848; PROLOG-NEXT:    br label %outerLatch.loopexit
4849; PROLOG:       outerLatch.loopexit:
4850; PROLOG-NEXT:    br label %outerLatch
4851; PROLOG:       outerLatch:
4852; PROLOG-NEXT:    br label %outerloopHdr
4853; PROLOG:       latch.1:
4854; PROLOG-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
4855; PROLOG-NEXT:    br i1 true, label %latch.2, label %innerexit.loopexit
4856; PROLOG:       latch.2:
4857; PROLOG-NEXT:    %iv.next.2 = add nuw nsw i64 %iv.next.1, 1
4858; PROLOG-NEXT:    br i1 true, label %latch.3, label %innerexit.loopexit
4859; PROLOG:       latch.3:
4860; PROLOG-NEXT:    %iv.next.3 = add nuw nsw i64 %iv.next.2, 1
4861; PROLOG-NEXT:    br i1 true, label %latch.4, label %innerexit.loopexit
4862; PROLOG:       latch.4:
4863; PROLOG-NEXT:    %iv.next.4 = add nuw nsw i64 %iv.next.3, 1
4864; PROLOG-NEXT:    br i1 true, label %latch.5, label %innerexit.loopexit
4865; PROLOG:       latch.5:
4866; PROLOG-NEXT:    %iv.next.5 = add nuw nsw i64 %iv.next.4, 1
4867; PROLOG-NEXT:    br i1 true, label %latch.6, label %innerexit.loopexit
4868; PROLOG:       latch.6:
4869; PROLOG-NEXT:    %iv.next.6 = add nuw nsw i64 %iv.next.5, 1
4870; PROLOG-NEXT:    %i7.7 = trunc i64 %iv.next.6 to i32
4871; PROLOG-NEXT:    br i1 true, label %latch.7, label %innerexit.loopexit
4872; PROLOG:       latch.7:
4873; PROLOG-NEXT:    %i11.7 = add nsw i32 %i7.7, 1
4874; PROLOG-NEXT:    %innercnd.7 = icmp slt i32 %i11.7, %trip
4875; PROLOG-NEXT:    %iv.next.7 = add nuw nsw i64 %iv.next.6, 1
4876; PROLOG-NEXT:    br i1 %innercnd.7, label %header, label %outerLatch.loopexit.unr-lcssa
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:       outerLatch.loopexit.unr-lcssa:
4927; PROLOG-BLOCK-NEXT:    br label %outerLatch.loopexit
4928; PROLOG-BLOCK:       outerLatch.loopexit:
4929; PROLOG-BLOCK-NEXT:    br label %outerLatch
4930; PROLOG-BLOCK:       outerLatch:
4931; PROLOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -1
4932; PROLOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.1
4933; PROLOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.1
4934; PROLOG-BLOCK:       latch.1:
4935; PROLOG-BLOCK-NEXT:    %i11.1 = add nsw i32 %i7.1, 1
4936; PROLOG-BLOCK-NEXT:    %innercnd.1 = icmp slt i32 %i11.1, %trip
4937; PROLOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
4938; PROLOG-BLOCK-NEXT:    br i1 %innercnd.1, label %header, label %outerLatch.loopexit.unr-lcssa, !llvm.loop !13
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