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:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
161; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit.unr-lcssa
162; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa:
163; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
164; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
165; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
166; EPILOG-BLOCK:       loop_header.epil.preheader:
167; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
168; EPILOG-BLOCK:       loop_header.epil:
169; EPILOG-BLOCK-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ]
170; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil
171; EPILOG-BLOCK:       loop_exiting_bb1.epil:
172; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.epil, label %exit1
173; EPILOG-BLOCK:       loop_exiting_bb2.epil:
174; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch.epil, label %exit3
175; EPILOG-BLOCK:       loop_latch.epil:
176; EPILOG-BLOCK-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
177; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
178; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit.epilog-lcssa
179; EPILOG-BLOCK:       exit2.loopexit.epilog-lcssa:
180; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit
181; EPILOG-BLOCK:       exit2.loopexit:
182; EPILOG-BLOCK-NEXT:    ret void
183; EPILOG-BLOCK:       loop_exiting_bb1.1:
184; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
185; EPILOG-BLOCK:       loop_exiting_bb2.1:
186; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
187; EPILOG-BLOCK:       loop_latch.1:
188; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
189; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
190; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0
191; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !0
192;
193; PROLOG-LABEL: @test1(
194; PROLOG-NEXT:  entry:
195; PROLOG-NEXT:    %0 = add i64 %trip, -1
196; PROLOG-NEXT:    %xtraiter = and i64 %trip, 7
197; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
198; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
199; PROLOG:       loop_header.prol.preheader:
200; PROLOG-NEXT:    br label %loop_header.prol
201; PROLOG:       loop_header.prol:
202; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
203; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ]
204; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol
205; PROLOG:       loop_exiting_bb1.prol:
206; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.prol, label %exit1.loopexit1
207; PROLOG:       loop_exiting_bb2.prol:
208; PROLOG-NEXT:    br i1 false, label %loop_latch.prol, label %exit3.loopexit2
209; PROLOG:       loop_latch.prol:
210; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
211; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
212; PROLOG-NEXT:    %prol.iter.sub = sub i64 %prol.iter, 1
213; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
214; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !0
215; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
216; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
217; PROLOG-NEXT:    br label %loop_header.prol.loopexit
218; PROLOG:       loop_header.prol.loopexit:
219; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
220; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
221; PROLOG-NEXT:    br i1 %1, label %exit2.loopexit, label %entry.new
222; PROLOG:       entry.new:
223; PROLOG-NEXT:    br label %loop_header
224; PROLOG:       loop_header:
225; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
226; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
227; PROLOG:       loop_exiting_bb1:
228; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
229; PROLOG:       loop_exiting_bb2:
230; PROLOG-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
231; PROLOG:       exit3.loopexit:
232; PROLOG-NEXT:    br label %exit3
233; PROLOG:       exit3.loopexit2:
234; PROLOG-NEXT:    br label %exit3
235; PROLOG:       exit3:
236; PROLOG-NEXT:    ret void
237; PROLOG:       loop_latch:
238; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
239; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
240; PROLOG:       exit1.loopexit:
241; PROLOG-NEXT:    br label %exit1
242; PROLOG:       exit1.loopexit1:
243; PROLOG-NEXT:    br label %exit1
244; PROLOG:       exit1:
245; PROLOG-NEXT:    ret void
246; PROLOG:       exit2.loopexit.unr-lcssa:
247; PROLOG-NEXT:    br label %exit2.loopexit
248; PROLOG:       exit2.loopexit:
249; PROLOG-NEXT:    ret void
250; PROLOG:       loop_exiting_bb1.1:
251; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
252; PROLOG:       loop_exiting_bb2.1:
253; PROLOG-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
254; PROLOG:       loop_latch.1:
255; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
256; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2
257; PROLOG:       loop_exiting_bb1.2:
258; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit
259; PROLOG:       loop_exiting_bb2.2:
260; PROLOG-NEXT:    br i1 false, label %loop_latch.2, label %exit3.loopexit
261; PROLOG:       loop_latch.2:
262; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
263; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3
264; PROLOG:       loop_exiting_bb1.3:
265; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit
266; PROLOG:       loop_exiting_bb2.3:
267; PROLOG-NEXT:    br i1 false, label %loop_latch.3, label %exit3.loopexit
268; PROLOG:       loop_latch.3:
269; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
270; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4
271; PROLOG:       loop_exiting_bb1.4:
272; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit
273; PROLOG:       loop_exiting_bb2.4:
274; PROLOG-NEXT:    br i1 false, label %loop_latch.4, label %exit3.loopexit
275; PROLOG:       loop_latch.4:
276; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
277; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5
278; PROLOG:       loop_exiting_bb1.5:
279; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit
280; PROLOG:       loop_exiting_bb2.5:
281; PROLOG-NEXT:    br i1 false, label %loop_latch.5, label %exit3.loopexit
282; PROLOG:       loop_latch.5:
283; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
284; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6
285; PROLOG:       loop_exiting_bb1.6:
286; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit
287; PROLOG:       loop_exiting_bb2.6:
288; PROLOG-NEXT:    br i1 false, label %loop_latch.6, label %exit3.loopexit
289; PROLOG:       loop_latch.6:
290; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
291; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7
292; PROLOG:       loop_exiting_bb1.7:
293; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit
294; PROLOG:       loop_exiting_bb2.7:
295; PROLOG-NEXT:    br i1 false, label %loop_latch.7, label %exit3.loopexit
296; PROLOG:       loop_latch.7:
297; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
298; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
299; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa
300;
301; PROLOG-BLOCK-LABEL: @test1(
302; PROLOG-BLOCK-NEXT:  entry:
303; PROLOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
304; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
305; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
306; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
307; PROLOG-BLOCK:       loop_header.prol.preheader:
308; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
309; PROLOG-BLOCK:       loop_header.prol:
310; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol
311; PROLOG-BLOCK:       loop_exiting_bb1.prol:
312; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.prol, label %exit1
313; PROLOG-BLOCK:       loop_exiting_bb2.prol:
314; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch.prol, label %exit3
315; PROLOG-BLOCK:       loop_latch.prol:
316; PROLOG-BLOCK-NEXT:    %iv_next.prol = add i64 0, 1
317; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
318; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
319; PROLOG-BLOCK:       loop_header.prol.loopexit:
320; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv_next.prol, %loop_latch.prol ]
321; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
322; PROLOG-BLOCK-NEXT:    br i1 %1, label %exit2.loopexit, label %entry.new
323; PROLOG-BLOCK:       entry.new:
324; PROLOG-BLOCK-NEXT:    br label %loop_header
325; PROLOG-BLOCK:       loop_header:
326; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
327; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
328; PROLOG-BLOCK:       loop_exiting_bb1:
329; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
330; PROLOG-BLOCK:       loop_exiting_bb2:
331; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
332; PROLOG-BLOCK:       exit3.loopexit:
333; PROLOG-BLOCK-NEXT:    br label %exit3
334; PROLOG-BLOCK:       exit3:
335; PROLOG-BLOCK-NEXT:    ret void
336; PROLOG-BLOCK:       loop_latch:
337; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
338; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
339; PROLOG-BLOCK:       exit1.loopexit:
340; PROLOG-BLOCK-NEXT:    br label %exit1
341; PROLOG-BLOCK:       exit1:
342; PROLOG-BLOCK-NEXT:    ret void
343; PROLOG-BLOCK:       exit2.loopexit.unr-lcssa:
344; PROLOG-BLOCK-NEXT:    br label %exit2.loopexit
345; PROLOG-BLOCK:       exit2.loopexit:
346; PROLOG-BLOCK-NEXT:    ret void
347; PROLOG-BLOCK:       loop_exiting_bb1.1:
348; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
349; PROLOG-BLOCK:       loop_exiting_bb2.1:
350; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
351; PROLOG-BLOCK:       loop_latch.1:
352; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
353; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
354; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !0
355;
356
357entry:
358  br label %loop_header
359
360loop_header:
361  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
362  br i1 %cond, label %loop_latch, label %loop_exiting_bb1
363
364loop_exiting_bb1:
365  br i1 false, label %loop_exiting_bb2, label %exit1
366
367loop_exiting_bb2:
368  br i1 false, label %loop_latch, label %exit3
369
370exit3:
371  ret void
372
373loop_latch:
374  %iv_next = add i64 %iv, 1
375  %cmp = icmp ne i64 %iv_next, %trip
376  br i1 %cmp, label %loop_header, label %exit2.loopexit
377
378exit1:
379  ret void
380
381exit2.loopexit:
382  ret void
383}
384
385
386; test with three exiting and two exit blocks.
387; The non-latch exit block has 2 unique predecessors.
388; There are 2 values passed to the exit blocks that are calculated at every iteration.
389; %sum.02 and %add. Both of these are incoming values for phi from every exiting
390; unrolled block.
391define i32 @test2(i32* nocapture %a, i64 %n) {
392; EPILOG-LABEL: @test2(
393; EPILOG-NEXT:  entry:
394; EPILOG-NEXT:    %0 = add i64 %n, -1
395; EPILOG-NEXT:    %xtraiter = and i64 %n, 7
396; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
397; EPILOG-NEXT:    br i1 %1, label %for.end.unr-lcssa, label %entry.new
398; EPILOG:       entry.new:
399; EPILOG-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
400; EPILOG-NEXT:    br label %header
401; EPILOG:       header:
402; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ]
403; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %for.body.7 ]
404; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %for.body.7 ]
405; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
406; EPILOG:       for.exiting_block:
407; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
408; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
409; EPILOG:       for.body:
410; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
411; EPILOG-NEXT:    %2 = load i32, i32* %arrayidx, align 4
412; EPILOG-NEXT:    %add = add nsw i32 %2, %sum.02
413; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
414; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
415; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
416; EPILOG:       for.end.unr-lcssa.loopexit:
417; EPILOG-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %for.body.7 ]
418; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %for.body.7 ]
419; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %for.body.7 ]
420; EPILOG-NEXT:    br label %for.end.unr-lcssa
421; EPILOG:       for.end.unr-lcssa:
422; EPILOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ]
423; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ]
424; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ]
425; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
426; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %for.end
427; EPILOG:       header.epil.preheader:
428; EPILOG-NEXT:    br label %header.epil
429; EPILOG:       header.epil:
430; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %for.body.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
431; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %for.body.epil ], [ %sum.02.unr, %header.epil.preheader ]
432; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %for.body.epil ]
433; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil
434; EPILOG:       for.exiting_block.epil:
435; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
436; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit2, label %for.body.epil
437; EPILOG:       for.body.epil:
438; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
439; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
440; EPILOG-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
441; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
442; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
443; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
444; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
445; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %for.end.epilog-lcssa, !llvm.loop !2
446; EPILOG:       for.end.epilog-lcssa:
447; EPILOG-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %for.body.epil ]
448; EPILOG-NEXT:    br label %for.end
449; EPILOG:       for.end:
450; EPILOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %sum.0.lcssa.ph1, %for.end.epilog-lcssa ]
451; EPILOG-NEXT:    ret i32 %sum.0.lcssa
452; EPILOG:       for.exit2.loopexit:
453; 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 ]
454; EPILOG-NEXT:    br label %for.exit2
455; EPILOG:       for.exit2.loopexit2:
456; EPILOG-NEXT:    %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
457; EPILOG-NEXT:    br label %for.exit2
458; EPILOG:       for.exit2:
459; EPILOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
460; EPILOG-NEXT:    ret i32 %retval
461; EPILOG:       for.exiting_block.1:
462; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
463; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
464; EPILOG:       for.body.1:
465; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
466; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
467; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
468; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
469; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
470; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
471; EPILOG:       for.exiting_block.2:
472; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
473; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2
474; EPILOG:       for.body.2:
475; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
476; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
477; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
478; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
479; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
480; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
481; EPILOG:       for.exiting_block.3:
482; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
483; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3
484; EPILOG:       for.body.3:
485; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
486; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
487; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
488; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
489; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
490; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
491; EPILOG:       for.exiting_block.4:
492; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
493; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4
494; EPILOG:       for.body.4:
495; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
496; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
497; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
498; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
499; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
500; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
501; EPILOG:       for.exiting_block.5:
502; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
503; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5
504; EPILOG:       for.body.5:
505; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
506; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
507; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
508; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
509; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
510; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
511; EPILOG:       for.exiting_block.6:
512; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
513; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6
514; EPILOG:       for.body.6:
515; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
516; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
517; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
518; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
519; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
520; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
521; EPILOG:       for.exiting_block.7:
522; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
523; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7
524; EPILOG:       for.body.7:
525; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
526; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
527; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
528; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
529; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
530; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
531; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %for.end.unr-lcssa.loopexit, label %header
532;
533; EPILOG-BLOCK-LABEL: @test2(
534; EPILOG-BLOCK-NEXT:  entry:
535; EPILOG-BLOCK-NEXT:    %0 = add i64 %n, -1
536; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
537; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
538; EPILOG-BLOCK-NEXT:    br i1 %1, label %for.end.unr-lcssa, label %entry.new
539; EPILOG-BLOCK:       entry.new:
540; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
541; EPILOG-BLOCK-NEXT:    br label %header
542; EPILOG-BLOCK:       header:
543; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ]
544; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %for.body.1 ]
545; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %for.body.1 ]
546; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
547; EPILOG-BLOCK:       for.exiting_block:
548; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
549; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
550; EPILOG-BLOCK:       for.body:
551; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
552; EPILOG-BLOCK-NEXT:    %2 = load i32, i32* %arrayidx, align 4
553; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %2, %sum.02
554; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
555; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
556; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
557; EPILOG-BLOCK:       for.end.unr-lcssa.loopexit:
558; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %for.body.1 ]
559; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %for.body.1 ]
560; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %for.body.1 ]
561; EPILOG-BLOCK-NEXT:    br label %for.end.unr-lcssa
562; EPILOG-BLOCK:       for.end.unr-lcssa:
563; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ]
564; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ]
565; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ]
566; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
567; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %for.end
568; EPILOG-BLOCK:       header.epil.preheader:
569; EPILOG-BLOCK-NEXT:    br label %header.epil
570; EPILOG-BLOCK:       header.epil:
571; EPILOG-BLOCK-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.unr, %header.epil.preheader ]
572; EPILOG-BLOCK-NEXT:    %sum.02.epil = phi i32 [ %sum.02.unr, %header.epil.preheader ]
573; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.epil
574; EPILOG-BLOCK:       for.exiting_block.epil:
575; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
576; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %for.body.epil
577; EPILOG-BLOCK:       for.body.epil:
578; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
579; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
580; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
581; EPILOG-BLOCK-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
582; EPILOG-BLOCK-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
583; EPILOG-BLOCK-NEXT:    br label %for.end.epilog-lcssa
584; EPILOG-BLOCK:       for.end.epilog-lcssa:
585; EPILOG-BLOCK-NEXT:    br label %for.end
586; EPILOG-BLOCK:       for.end:
587; EPILOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %add.epil, %for.end.epilog-lcssa ]
588; EPILOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
589; EPILOG-BLOCK:       for.exit2.loopexit:
590; EPILOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ]
591; EPILOG-BLOCK-NEXT:    br label %for.exit2
592; EPILOG-BLOCK:       for.exit2:
593; EPILOG-BLOCK-NEXT:    %retval = phi i32 [ %sum.02.epil, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ]
594; EPILOG-BLOCK-NEXT:    ret i32 %retval
595; EPILOG-BLOCK:       for.exiting_block.1:
596; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
597; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
598; EPILOG-BLOCK:       for.body.1:
599; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
600; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
601; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
602; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
603; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
604; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0
605; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %for.end.unr-lcssa.loopexit, label %header, !llvm.loop !2
606;
607; PROLOG-LABEL: @test2(
608; PROLOG-NEXT:  entry:
609; PROLOG-NEXT:    %0 = add i64 %n, -1
610; PROLOG-NEXT:    %xtraiter = and i64 %n, 7
611; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
612; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
613; PROLOG:       header.prol.preheader:
614; PROLOG-NEXT:    br label %header.prol
615; PROLOG:       header.prol:
616; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %for.body.prol ], [ 0, %header.prol.preheader ]
617; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %for.body.prol ], [ 0, %header.prol.preheader ]
618; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %for.body.prol ]
619; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol
620; PROLOG:       for.exiting_block.prol:
621; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
622; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit1, label %for.body.prol
623; PROLOG:       for.body.prol:
624; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
625; PROLOG-NEXT:    %1 = load i32, i32* %arrayidx.prol, align 4
626; PROLOG-NEXT:    %add.prol = add nsw i32 %1, %sum.02.prol
627; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
628; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
629; PROLOG-NEXT:    %prol.iter.sub = sub i64 %prol.iter, 1
630; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
631; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !2
632; PROLOG:       header.prol.loopexit.unr-lcssa:
633; PROLOG-NEXT:    %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %for.body.prol ]
634; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %for.body.prol ]
635; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %for.body.prol ]
636; PROLOG-NEXT:    br label %header.prol.loopexit
637; PROLOG:       header.prol.loopexit:
638; PROLOG-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ]
639; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
640; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
641; PROLOG-NEXT:    %2 = icmp ult i64 %0, 7
642; PROLOG-NEXT:    br i1 %2, label %for.end, label %entry.new
643; PROLOG:       entry.new:
644; PROLOG-NEXT:    br label %header
645; PROLOG:       header:
646; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ]
647; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %for.body.7 ]
648; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
649; PROLOG:       for.exiting_block:
650; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
651; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
652; PROLOG:       for.body:
653; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
654; PROLOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
655; PROLOG-NEXT:    %add = add nsw i32 %3, %sum.02
656; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
657; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
658; PROLOG:       for.end.unr-lcssa:
659; PROLOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %for.body.7 ]
660; PROLOG-NEXT:    br label %for.end
661; PROLOG:       for.end:
662; PROLOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ]
663; PROLOG-NEXT:    ret i32 %sum.0.lcssa
664; PROLOG:       for.exit2.loopexit:
665; 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 ]
666; PROLOG-NEXT:    br label %for.exit2
667; PROLOG:       for.exit2.loopexit1:
668; PROLOG-NEXT:    %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
669; PROLOG-NEXT:    br label %for.exit2
670; PROLOG:       for.exit2:
671; PROLOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
672; PROLOG-NEXT:    ret i32 %retval
673; PROLOG:       for.exiting_block.1:
674; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
675; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
676; PROLOG:       for.body.1:
677; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
678; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
679; PROLOG-NEXT:    %add.1 = add nsw i32 %4, %add
680; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
681; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
682; PROLOG:       for.exiting_block.2:
683; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
684; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2
685; PROLOG:       for.body.2:
686; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
687; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
688; PROLOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
689; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
690; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
691; PROLOG:       for.exiting_block.3:
692; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
693; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3
694; PROLOG:       for.body.3:
695; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
696; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
697; PROLOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
698; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
699; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
700; PROLOG:       for.exiting_block.4:
701; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
702; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4
703; PROLOG:       for.body.4:
704; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
705; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
706; PROLOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
707; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
708; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
709; PROLOG:       for.exiting_block.5:
710; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
711; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5
712; PROLOG:       for.body.5:
713; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
714; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
715; PROLOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
716; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
717; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
718; PROLOG:       for.exiting_block.6:
719; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
720; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6
721; PROLOG:       for.body.6:
722; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
723; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
724; PROLOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
725; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
726; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
727; PROLOG:       for.exiting_block.7:
728; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
729; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7
730; PROLOG:       for.body.7:
731; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
732; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
733; PROLOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
734; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
735; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
736; PROLOG-NEXT:    br i1 %exitcond.7, label %for.end.unr-lcssa, label %header
737;
738; PROLOG-BLOCK-LABEL: @test2(
739; PROLOG-BLOCK-NEXT:  entry:
740; PROLOG-BLOCK-NEXT:    %0 = add i64 %n, -1
741; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
742; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
743; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
744; PROLOG-BLOCK:       header.prol.preheader:
745; PROLOG-BLOCK-NEXT:    br label %header.prol
746; PROLOG-BLOCK:       header.prol:
747; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.prol
748; PROLOG-BLOCK:       for.exiting_block.prol:
749; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
750; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %for.body.prol
751; PROLOG-BLOCK:       for.body.prol:
752; PROLOG-BLOCK-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 0
753; PROLOG-BLOCK-NEXT:    %1 = load i32, i32* %arrayidx.prol, align 4
754; PROLOG-BLOCK-NEXT:    %add.prol = add nsw i32 %1, 0
755; PROLOG-BLOCK-NEXT:    %indvars.iv.next.prol = add i64 0, 1
756; PROLOG-BLOCK-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
757; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
758; PROLOG-BLOCK:       header.prol.loopexit:
759; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %add.prol, %for.body.prol ]
760; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.next.prol, %for.body.prol ]
761; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %add.prol, %for.body.prol ]
762; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %0, 1
763; PROLOG-BLOCK-NEXT:    br i1 %2, label %for.end, label %entry.new
764; PROLOG-BLOCK:       entry.new:
765; PROLOG-BLOCK-NEXT:    br label %header
766; PROLOG-BLOCK:       header:
767; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ]
768; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %for.body.1 ]
769; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
770; PROLOG-BLOCK:       for.exiting_block:
771; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
772; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
773; PROLOG-BLOCK:       for.body:
774; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
775; PROLOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
776; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
777; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
778; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
779; PROLOG-BLOCK:       for.end.unr-lcssa:
780; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %for.body.1 ]
781; PROLOG-BLOCK-NEXT:    br label %for.end
782; PROLOG-BLOCK:       for.end:
783; PROLOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ]
784; PROLOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
785; PROLOG-BLOCK:       for.exit2.loopexit:
786; PROLOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ]
787; PROLOG-BLOCK-NEXT:    br label %for.exit2
788; PROLOG-BLOCK:       for.exit2:
789; PROLOG-BLOCK-NEXT:    %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ]
790; PROLOG-BLOCK-NEXT:    ret i32 %retval
791; PROLOG-BLOCK:       for.exiting_block.1:
792; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
793; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
794; PROLOG-BLOCK:       for.body.1:
795; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
796; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
797; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
798; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
799; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
800; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %for.end.unr-lcssa, label %header, !llvm.loop !2
801;
802
803
804entry:
805  br label %header
806
807header:
808  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
809  %sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ]
810  br i1 false, label %for.exit2, label %for.exiting_block
811
812for.exiting_block:
813  %cmp = icmp eq i64 %n, 42
814  br i1 %cmp, label %for.exit2, label %for.body
815
816for.body:
817  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
818  %0 = load i32, i32* %arrayidx, align 4
819  %add = add nsw i32 %0, %sum.02
820  %indvars.iv.next = add i64 %indvars.iv, 1
821  %exitcond = icmp eq i64 %indvars.iv.next, %n
822  br i1 %exitcond, label %for.end, label %header
823
824for.end:                                          ; preds = %for.body
825  %sum.0.lcssa = phi i32 [ %add, %for.body ]
826  ret i32 %sum.0.lcssa
827
828for.exit2:
829  %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ]
830  ret i32 %retval
831}
832
833; test with two exiting and three exit blocks.
834; the non-latch exiting block has a switch.
835define void @test3(i64 %trip, i64 %add) {
836; EPILOG-LABEL: @test3(
837; EPILOG-NEXT:  entry:
838; EPILOG-NEXT:    %0 = add i64 %trip, -1
839; EPILOG-NEXT:    %xtraiter = and i64 %trip, 7
840; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
841; EPILOG-NEXT:    br i1 %1, label %exit2.loopexit.unr-lcssa, label %entry.new
842; EPILOG:       entry.new:
843; EPILOG-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
844; EPILOG-NEXT:    br label %loop_header
845; EPILOG:       loop_header:
846; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
847; EPILOG-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
848; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ]
849; EPILOG-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
850; EPILOG:       loop_exiting_bb1:
851; EPILOG-NEXT:    switch i64 %sum, label %loop_latch [
852; EPILOG-NEXT:    i64 24, label %exit1.loopexit
853; EPILOG-NEXT:    i64 42, label %exit3.loopexit
854; EPILOG-NEXT:    ]
855; EPILOG:       exit3.loopexit:
856; EPILOG-NEXT:    br label %exit3
857; EPILOG:       exit3.loopexit2:
858; EPILOG-NEXT:    br label %exit3
859; EPILOG:       exit3:
860; EPILOG-NEXT:    ret void
861; EPILOG:       loop_latch:
862; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
863; EPILOG-NEXT:    %sum.next = add i64 %sum, %add
864; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
865; EPILOG-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
866; EPILOG:       exit1.loopexit:
867; EPILOG-NEXT:    br label %exit1
868; EPILOG:       exit1.loopexit1:
869; EPILOG-NEXT:    br label %exit1
870; EPILOG:       exit1:
871; EPILOG-NEXT:    ret void
872; EPILOG:       exit2.loopexit.unr-lcssa.loopexit:
873; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
874; EPILOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
875; EPILOG-NEXT:    br label %exit2.loopexit.unr-lcssa
876; EPILOG:       exit2.loopexit.unr-lcssa:
877; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
878; EPILOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
879; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
880; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
881; EPILOG:       loop_header.epil.preheader:
882; EPILOG-NEXT:    br label %loop_header.epil
883; EPILOG:       loop_header.epil:
884; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
885; EPILOG-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]
886; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ]
887; EPILOG-NEXT:    br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil
888; EPILOG:       loop_exiting_bb1.epil:
889; EPILOG-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
890; EPILOG-NEXT:    i64 24, label %exit1.loopexit1
891; EPILOG-NEXT:    i64 42, label %exit3.loopexit2
892; EPILOG-NEXT:    ]
893; EPILOG:       loop_latch.epil:
894; EPILOG-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
895; EPILOG-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
896; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
897; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
898; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
899; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !3
900; EPILOG:       exit2.loopexit.epilog-lcssa:
901; EPILOG-NEXT:    br label %exit2.loopexit
902; EPILOG:       exit2.loopexit:
903; EPILOG-NEXT:    ret void
904; EPILOG:       loop_exiting_bb1.1:
905; EPILOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
906; EPILOG-NEXT:    i64 24, label %exit1.loopexit
907; EPILOG-NEXT:    i64 42, label %exit3.loopexit
908; EPILOG-NEXT:    ]
909; EPILOG:       loop_latch.1:
910; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
911; EPILOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
912; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
913; EPILOG-NEXT:    br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2
914; EPILOG:       loop_exiting_bb1.2:
915; EPILOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
916; EPILOG-NEXT:    i64 24, label %exit1.loopexit
917; EPILOG-NEXT:    i64 42, label %exit3.loopexit
918; EPILOG-NEXT:    ]
919; EPILOG:       loop_latch.2:
920; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
921; EPILOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
922; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
923; EPILOG-NEXT:    br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3
924; EPILOG:       loop_exiting_bb1.3:
925; EPILOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
926; EPILOG-NEXT:    i64 24, label %exit1.loopexit
927; EPILOG-NEXT:    i64 42, label %exit3.loopexit
928; EPILOG-NEXT:    ]
929; EPILOG:       loop_latch.3:
930; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
931; EPILOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
932; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
933; EPILOG-NEXT:    br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4
934; EPILOG:       loop_exiting_bb1.4:
935; EPILOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
936; EPILOG-NEXT:    i64 24, label %exit1.loopexit
937; EPILOG-NEXT:    i64 42, label %exit3.loopexit
938; EPILOG-NEXT:    ]
939; EPILOG:       loop_latch.4:
940; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
941; EPILOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
942; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
943; EPILOG-NEXT:    br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5
944; EPILOG:       loop_exiting_bb1.5:
945; EPILOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
946; EPILOG-NEXT:    i64 24, label %exit1.loopexit
947; EPILOG-NEXT:    i64 42, label %exit3.loopexit
948; EPILOG-NEXT:    ]
949; EPILOG:       loop_latch.5:
950; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
951; EPILOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
952; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
953; EPILOG-NEXT:    br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6
954; EPILOG:       loop_exiting_bb1.6:
955; EPILOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
956; EPILOG-NEXT:    i64 24, label %exit1.loopexit
957; EPILOG-NEXT:    i64 42, label %exit3.loopexit
958; EPILOG-NEXT:    ]
959; EPILOG:       loop_latch.6:
960; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
961; EPILOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
962; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
963; EPILOG-NEXT:    br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7
964; EPILOG:       loop_exiting_bb1.7:
965; EPILOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
966; EPILOG-NEXT:    i64 24, label %exit1.loopexit
967; EPILOG-NEXT:    i64 42, label %exit3.loopexit
968; EPILOG-NEXT:    ]
969; EPILOG:       loop_latch.7:
970; EPILOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
971; EPILOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
972; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
973; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0
974; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit
975;
976; EPILOG-BLOCK-LABEL: @test3(
977; EPILOG-BLOCK-NEXT:  entry:
978; EPILOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
979; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
980; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
981; EPILOG-BLOCK-NEXT:    br i1 %1, label %exit2.loopexit.unr-lcssa, label %entry.new
982; EPILOG-BLOCK:       entry.new:
983; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
984; EPILOG-BLOCK-NEXT:    br label %loop_header
985; EPILOG-BLOCK:       loop_header:
986; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
987; EPILOG-BLOCK-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
988; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %loop_latch.1 ]
989; EPILOG-BLOCK-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
990; EPILOG-BLOCK:       loop_exiting_bb1:
991; EPILOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
992; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
993; EPILOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
994; EPILOG-BLOCK-NEXT:    ]
995; EPILOG-BLOCK:       exit3.loopexit:
996; EPILOG-BLOCK-NEXT:    br label %exit3
997; EPILOG-BLOCK:       exit3:
998; EPILOG-BLOCK-NEXT:    ret void
999; EPILOG-BLOCK:       loop_latch:
1000; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
1001; EPILOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
1002; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
1003; EPILOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
1004; EPILOG-BLOCK:       exit1.loopexit:
1005; EPILOG-BLOCK-NEXT:    br label %exit1
1006; EPILOG-BLOCK:       exit1:
1007; EPILOG-BLOCK-NEXT:    ret void
1008; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa.loopexit:
1009; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
1010; EPILOG-BLOCK-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
1011; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit.unr-lcssa
1012; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa:
1013; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
1014; EPILOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
1015; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1016; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
1017; EPILOG-BLOCK:       loop_header.epil.preheader:
1018; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
1019; EPILOG-BLOCK:       loop_header.epil:
1020; EPILOG-BLOCK-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ]
1021; EPILOG-BLOCK-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ]
1022; EPILOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil
1023; EPILOG-BLOCK:       loop_exiting_bb1.epil:
1024; EPILOG-BLOCK-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
1025; EPILOG-BLOCK-NEXT:    i64 24, label %exit1
1026; EPILOG-BLOCK-NEXT:    i64 42, label %exit3
1027; EPILOG-BLOCK-NEXT:    ]
1028; EPILOG-BLOCK:       loop_latch.epil:
1029; EPILOG-BLOCK-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
1030; EPILOG-BLOCK-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
1031; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
1032; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit.epilog-lcssa
1033; EPILOG-BLOCK:       exit2.loopexit.epilog-lcssa:
1034; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit
1035; EPILOG-BLOCK:       exit2.loopexit:
1036; EPILOG-BLOCK-NEXT:    ret void
1037; EPILOG-BLOCK:       loop_exiting_bb1.1:
1038; EPILOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
1039; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
1040; EPILOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
1041; EPILOG-BLOCK-NEXT:    ]
1042; EPILOG-BLOCK:       loop_latch.1:
1043; EPILOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
1044; EPILOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
1045; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
1046; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0
1047; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !3
1048;
1049; PROLOG-LABEL: @test3(
1050; PROLOG-NEXT:  entry:
1051; PROLOG-NEXT:    %0 = add i64 %trip, -1
1052; PROLOG-NEXT:    %xtraiter = and i64 %trip, 7
1053; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1054; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
1055; PROLOG:       loop_header.prol.preheader:
1056; PROLOG-NEXT:    br label %loop_header.prol
1057; PROLOG:       loop_header.prol:
1058; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
1059; PROLOG-NEXT:    %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ]
1060; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ]
1061; PROLOG-NEXT:    br i1 undef, label %loop_latch.prol, label %loop_exiting_bb1.prol
1062; PROLOG:       loop_exiting_bb1.prol:
1063; PROLOG-NEXT:    switch i64 %sum.prol, label %loop_latch.prol [
1064; PROLOG-NEXT:    i64 24, label %exit1.loopexit1
1065; PROLOG-NEXT:    i64 42, label %exit3.loopexit2
1066; PROLOG-NEXT:    ]
1067; PROLOG:       loop_latch.prol:
1068; PROLOG-NEXT:    %iv_next.prol = add nuw nsw i64 %iv.prol, 1
1069; PROLOG-NEXT:    %sum.next.prol = add i64 %sum.prol, %add
1070; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
1071; PROLOG-NEXT:    %prol.iter.sub = sub i64 %prol.iter, 1
1072; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
1073; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !3
1074; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
1075; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
1076; PROLOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
1077; PROLOG-NEXT:    br label %loop_header.prol.loopexit
1078; PROLOG:       loop_header.prol.loopexit:
1079; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
1080; PROLOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
1081; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
1082; PROLOG-NEXT:    br i1 %1, label %exit2.loopexit, label %entry.new
1083; PROLOG:       entry.new:
1084; PROLOG-NEXT:    br label %loop_header
1085; PROLOG:       loop_header:
1086; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
1087; PROLOG-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
1088; PROLOG-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
1089; PROLOG:       loop_exiting_bb1:
1090; PROLOG-NEXT:    switch i64 %sum, label %loop_latch [
1091; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1092; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1093; PROLOG-NEXT:    ]
1094; PROLOG:       exit3.loopexit:
1095; PROLOG-NEXT:    br label %exit3
1096; PROLOG:       exit3.loopexit2:
1097; PROLOG-NEXT:    br label %exit3
1098; PROLOG:       exit3:
1099; PROLOG-NEXT:    ret void
1100; PROLOG:       loop_latch:
1101; PROLOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
1102; PROLOG-NEXT:    %sum.next = add i64 %sum, %add
1103; PROLOG-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
1104; PROLOG:       exit1.loopexit:
1105; PROLOG-NEXT:    br label %exit1
1106; PROLOG:       exit1.loopexit1:
1107; PROLOG-NEXT:    br label %exit1
1108; PROLOG:       exit1:
1109; PROLOG-NEXT:    ret void
1110; PROLOG:       exit2.loopexit.unr-lcssa:
1111; PROLOG-NEXT:    br label %exit2.loopexit
1112; PROLOG:       exit2.loopexit:
1113; PROLOG-NEXT:    ret void
1114; PROLOG:       loop_exiting_bb1.1:
1115; PROLOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
1116; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1117; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1118; PROLOG-NEXT:    ]
1119; PROLOG:       loop_latch.1:
1120; PROLOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
1121; PROLOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
1122; PROLOG-NEXT:    br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2
1123; PROLOG:       loop_exiting_bb1.2:
1124; PROLOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
1125; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1126; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1127; PROLOG-NEXT:    ]
1128; PROLOG:       loop_latch.2:
1129; PROLOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
1130; PROLOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
1131; PROLOG-NEXT:    br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3
1132; PROLOG:       loop_exiting_bb1.3:
1133; PROLOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
1134; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1135; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1136; PROLOG-NEXT:    ]
1137; PROLOG:       loop_latch.3:
1138; PROLOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
1139; PROLOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
1140; PROLOG-NEXT:    br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4
1141; PROLOG:       loop_exiting_bb1.4:
1142; PROLOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
1143; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1144; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1145; PROLOG-NEXT:    ]
1146; PROLOG:       loop_latch.4:
1147; PROLOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
1148; PROLOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
1149; PROLOG-NEXT:    br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5
1150; PROLOG:       loop_exiting_bb1.5:
1151; PROLOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
1152; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1153; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1154; PROLOG-NEXT:    ]
1155; PROLOG:       loop_latch.5:
1156; PROLOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
1157; PROLOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
1158; PROLOG-NEXT:    br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6
1159; PROLOG:       loop_exiting_bb1.6:
1160; PROLOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
1161; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1162; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1163; PROLOG-NEXT:    ]
1164; PROLOG:       loop_latch.6:
1165; PROLOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
1166; PROLOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
1167; PROLOG-NEXT:    br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7
1168; PROLOG:       loop_exiting_bb1.7:
1169; PROLOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
1170; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1171; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1172; PROLOG-NEXT:    ]
1173; PROLOG:       loop_latch.7:
1174; PROLOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
1175; PROLOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
1176; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
1177; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa
1178;
1179; PROLOG-BLOCK-LABEL: @test3(
1180; PROLOG-BLOCK-NEXT:  entry:
1181; PROLOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
1182; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
1183; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1184; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
1185; PROLOG-BLOCK:       loop_header.prol.preheader:
1186; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
1187; PROLOG-BLOCK:       loop_header.prol:
1188; PROLOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.prol, label %loop_exiting_bb1.prol
1189; PROLOG-BLOCK:       loop_exiting_bb1.prol:
1190; PROLOG-BLOCK-NEXT:    switch i64 0, label %loop_latch.prol [
1191; PROLOG-BLOCK-NEXT:    i64 24, label %exit1
1192; PROLOG-BLOCK-NEXT:    i64 42, label %exit3
1193; PROLOG-BLOCK-NEXT:    ]
1194; PROLOG-BLOCK:       loop_latch.prol:
1195; PROLOG-BLOCK-NEXT:    %iv_next.prol = add nuw nsw i64 0, 1
1196; PROLOG-BLOCK-NEXT:    %sum.next.prol = add i64 0, %add
1197; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
1198; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
1199; PROLOG-BLOCK:       loop_header.prol.loopexit:
1200; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv_next.prol, %loop_latch.prol ]
1201; PROLOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.next.prol, %loop_latch.prol ]
1202; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
1203; PROLOG-BLOCK-NEXT:    br i1 %1, label %exit2.loopexit, label %entry.new
1204; PROLOG-BLOCK:       entry.new:
1205; PROLOG-BLOCK-NEXT:    br label %loop_header
1206; PROLOG-BLOCK:       loop_header:
1207; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
1208; PROLOG-BLOCK-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
1209; PROLOG-BLOCK-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
1210; PROLOG-BLOCK:       loop_exiting_bb1:
1211; PROLOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
1212; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
1213; PROLOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
1214; PROLOG-BLOCK-NEXT:    ]
1215; PROLOG-BLOCK:       exit3.loopexit:
1216; PROLOG-BLOCK-NEXT:    br label %exit3
1217; PROLOG-BLOCK:       exit3:
1218; PROLOG-BLOCK-NEXT:    ret void
1219; PROLOG-BLOCK:       loop_latch:
1220; PROLOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
1221; PROLOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
1222; PROLOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
1223; PROLOG-BLOCK:       exit1.loopexit:
1224; PROLOG-BLOCK-NEXT:    br label %exit1
1225; PROLOG-BLOCK:       exit1:
1226; PROLOG-BLOCK-NEXT:    ret void
1227; PROLOG-BLOCK:       exit2.loopexit.unr-lcssa:
1228; PROLOG-BLOCK-NEXT:    br label %exit2.loopexit
1229; PROLOG-BLOCK:       exit2.loopexit:
1230; PROLOG-BLOCK-NEXT:    ret void
1231; PROLOG-BLOCK:       loop_exiting_bb1.1:
1232; PROLOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
1233; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
1234; PROLOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
1235; PROLOG-BLOCK-NEXT:    ]
1236; PROLOG-BLOCK:       loop_latch.1:
1237; PROLOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
1238; PROLOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
1239; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
1240; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !3
1241;
1242
1243entry:
1244  br label %loop_header
1245
1246loop_header:
1247  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
1248  %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ]
1249  br i1 undef, label %loop_latch, label %loop_exiting_bb1
1250
1251loop_exiting_bb1:
1252  switch i64 %sum, label %loop_latch [
1253  i64 24, label %exit1
1254  i64 42, label %exit3
1255  ]
1256
1257exit3:
1258  ret void
1259
1260loop_latch:
1261  %iv_next = add nuw nsw i64 %iv, 1
1262  %sum.next = add i64 %sum, %add
1263  %cmp = icmp ne i64 %iv_next, %trip
1264  br i1 %cmp, label %loop_header, label %exit2.loopexit
1265
1266exit1:
1267  ret void
1268
1269exit2.loopexit:
1270  ret void
1271}
1272
1273; FIXME: Support multiple exiting blocks to the same latch exit block.
1274; Three exiting blocks where header and latch exit to same LatchExit.
1275define i32 @hdr_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) {
1276; EPILOG-LABEL: @hdr_latch_same_exit(
1277; EPILOG-NEXT:  entry:
1278; EPILOG-NEXT:    %0 = add i64 %n, -1
1279; EPILOG-NEXT:    %xtraiter = and i64 %n, 7
1280; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
1281; EPILOG-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
1282; EPILOG:       entry.new:
1283; EPILOG-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
1284; EPILOG-NEXT:    br label %header
1285; EPILOG:       header:
1286; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
1287; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
1288; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %latch.7 ]
1289; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block
1290; EPILOG:       for.exiting_block:
1291; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
1292; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1293; EPILOG:       latch:
1294; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1295; EPILOG-NEXT:    %2 = load i32, i32* %arrayidx, align 4
1296; EPILOG-NEXT:    %add = add nsw i32 %2, %sum.02
1297; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1298; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
1299; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.1
1300; EPILOG:       latchExit.unr-lcssa.loopexit:
1301; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
1302; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
1303; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
1304; EPILOG-NEXT:    br label %latchExit.unr-lcssa
1305; EPILOG:       latchExit.unr-lcssa:
1306; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1307; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1308; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1309; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1310; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1311; EPILOG:       header.epil.preheader:
1312; EPILOG-NEXT:    br label %header.epil
1313; EPILOG:       header.epil:
1314; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
1315; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
1316; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
1317; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit2, label %for.exiting_block.epil
1318; EPILOG:       for.exiting_block.epil:
1319; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1320; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit4, label %latch.epil
1321; EPILOG:       latch.epil:
1322; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
1323; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
1324; EPILOG-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
1325; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
1326; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
1327; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
1328; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
1329; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit2, !llvm.loop !4
1330; EPILOG:       latchExit.epilog-lcssa.loopexit:
1331; 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 ]
1332; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1333; EPILOG:       latchExit.epilog-lcssa.loopexit2:
1334; EPILOG-NEXT:    %result.ph1.ph3 = phi i32 [ 0, %header.epil ], [ %add.epil, %latch.epil ]
1335; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1336; EPILOG:       latchExit.epilog-lcssa:
1337; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph3, %latchExit.epilog-lcssa.loopexit2 ]
1338; EPILOG-NEXT:    br label %latchExit
1339; EPILOG:       latchExit:
1340; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1341; EPILOG-NEXT:    ret i32 %result
1342; EPILOG:       for.exit2.loopexit:
1343; EPILOG-NEXT:    br label %for.exit2
1344; EPILOG:       for.exit2.loopexit4:
1345; EPILOG-NEXT:    br label %for.exit2
1346; EPILOG:       for.exit2:
1347; EPILOG-NEXT:    ret i32 42
1348; EPILOG:       for.exiting_block.1:
1349; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1350; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1351; EPILOG:       latch.1:
1352; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1353; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1354; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
1355; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
1356; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
1357; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.2
1358; EPILOG:       for.exiting_block.2:
1359; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1360; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
1361; EPILOG:       latch.2:
1362; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1363; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
1364; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
1365; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
1366; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
1367; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.3
1368; EPILOG:       for.exiting_block.3:
1369; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1370; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
1371; EPILOG:       latch.3:
1372; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1373; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
1374; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
1375; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
1376; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
1377; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.4
1378; EPILOG:       for.exiting_block.4:
1379; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1380; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
1381; EPILOG:       latch.4:
1382; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
1383; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
1384; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
1385; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
1386; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
1387; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.5
1388; EPILOG:       for.exiting_block.5:
1389; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1390; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
1391; EPILOG:       latch.5:
1392; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
1393; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
1394; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
1395; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
1396; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
1397; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.6
1398; EPILOG:       for.exiting_block.6:
1399; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
1400; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
1401; EPILOG:       latch.6:
1402; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
1403; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
1404; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
1405; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
1406; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
1407; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.7
1408; EPILOG:       for.exiting_block.7:
1409; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
1410; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
1411; EPILOG:       latch.7:
1412; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
1413; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
1414; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
1415; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
1416; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
1417; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
1418; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
1419;
1420; EPILOG-BLOCK-LABEL: @hdr_latch_same_exit(
1421; EPILOG-BLOCK-NEXT:  entry:
1422; EPILOG-BLOCK-NEXT:    %0 = add i64 %n, -1
1423; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
1424; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
1425; EPILOG-BLOCK-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
1426; EPILOG-BLOCK:       entry.new:
1427; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
1428; EPILOG-BLOCK-NEXT:    br label %header
1429; EPILOG-BLOCK:       header:
1430; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
1431; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
1432; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %latch.1 ]
1433; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block
1434; EPILOG-BLOCK:       for.exiting_block:
1435; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
1436; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1437; EPILOG-BLOCK:       latch:
1438; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1439; EPILOG-BLOCK-NEXT:    %2 = load i32, i32* %arrayidx, align 4
1440; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %2, %sum.02
1441; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1442; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
1443; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.1
1444; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
1445; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
1446; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
1447; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
1448; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
1449; EPILOG-BLOCK:       latchExit.unr-lcssa:
1450; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1451; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1452; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1453; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1454; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1455; EPILOG-BLOCK:       header.epil.preheader:
1456; EPILOG-BLOCK-NEXT:    br label %header.epil
1457; EPILOG-BLOCK:       header.epil:
1458; EPILOG-BLOCK-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.unr, %header.epil.preheader ]
1459; EPILOG-BLOCK-NEXT:    %sum.02.epil = phi i32 [ %sum.02.unr, %header.epil.preheader ]
1460; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa, label %for.exiting_block.epil
1461; EPILOG-BLOCK:       for.exiting_block.epil:
1462; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1463; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %latch.epil
1464; EPILOG-BLOCK:       latch.epil:
1465; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
1466; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
1467; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
1468; EPILOG-BLOCK-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
1469; EPILOG-BLOCK-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
1470; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1471; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
1472; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ 0, %header ], [ 0, %latch ]
1473; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1474; EPILOG-BLOCK:       latchExit.epilog-lcssa:
1475; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 0, %header.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
1476; EPILOG-BLOCK-NEXT:    br label %latchExit
1477; EPILOG-BLOCK:       latchExit:
1478; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1479; EPILOG-BLOCK-NEXT:    ret i32 %result
1480; EPILOG-BLOCK:       for.exit2.loopexit:
1481; EPILOG-BLOCK-NEXT:    br label %for.exit2
1482; EPILOG-BLOCK:       for.exit2:
1483; EPILOG-BLOCK-NEXT:    ret i32 42
1484; EPILOG-BLOCK:       for.exiting_block.1:
1485; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1486; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1487; EPILOG-BLOCK:       latch.1:
1488; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1489; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1490; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
1491; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1492; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
1493; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0
1494; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !4
1495;
1496; PROLOG-LABEL: @hdr_latch_same_exit(
1497; PROLOG-NEXT:  entry:
1498; PROLOG-NEXT:    %0 = add i64 %n, -1
1499; PROLOG-NEXT:    %xtraiter = and i64 %n, 7
1500; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1501; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
1502; PROLOG:       header.prol.preheader:
1503; PROLOG-NEXT:    br label %header.prol
1504; PROLOG:       header.prol:
1505; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
1506; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
1507; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ]
1508; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit1, label %for.exiting_block.prol
1509; PROLOG:       for.exiting_block.prol:
1510; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
1511; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit3, label %latch.prol
1512; PROLOG:       latch.prol:
1513; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
1514; PROLOG-NEXT:    %1 = load i32, i32* %arrayidx.prol, align 4
1515; PROLOG-NEXT:    %add.prol = add nsw i32 %1, %sum.02.prol
1516; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
1517; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
1518; PROLOG-NEXT:    %prol.iter.sub = sub i64 %prol.iter, 1
1519; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
1520; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !4
1521; PROLOG:       header.prol.loopexit.unr-lcssa:
1522; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
1523; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
1524; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
1525; PROLOG-NEXT:    br label %header.prol.loopexit
1526; PROLOG:       header.prol.loopexit:
1527; PROLOG-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
1528; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
1529; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
1530; PROLOG-NEXT:    %2 = icmp ult i64 %0, 7
1531; PROLOG-NEXT:    br i1 %2, label %latchExit, label %entry.new
1532; PROLOG:       entry.new:
1533; PROLOG-NEXT:    br label %header
1534; PROLOG:       header:
1535; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
1536; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
1537; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block
1538; PROLOG:       for.exiting_block:
1539; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
1540; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1541; PROLOG:       latch:
1542; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1543; PROLOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
1544; PROLOG-NEXT:    %add = add nsw i32 %3, %sum.02
1545; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
1546; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.1
1547; PROLOG:       latchExit.unr-lcssa.loopexit:
1548; 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 ]
1549; PROLOG-NEXT:    br label %latchExit.unr-lcssa
1550; PROLOG:       latchExit.unr-lcssa.loopexit1:
1551; PROLOG-NEXT:    %result.ph.ph2 = phi i32 [ 0, %header.prol ]
1552; PROLOG-NEXT:    br label %latchExit.unr-lcssa
1553; PROLOG:       latchExit.unr-lcssa:
1554; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph2, %latchExit.unr-lcssa.loopexit1 ]
1555; PROLOG-NEXT:    br label %latchExit
1556; PROLOG:       latchExit:
1557; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
1558; PROLOG-NEXT:    ret i32 %result
1559; PROLOG:       for.exit2.loopexit:
1560; PROLOG-NEXT:    br label %for.exit2
1561; PROLOG:       for.exit2.loopexit3:
1562; PROLOG-NEXT:    br label %for.exit2
1563; PROLOG:       for.exit2:
1564; PROLOG-NEXT:    ret i32 42
1565; PROLOG:       for.exiting_block.1:
1566; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1567; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1568; PROLOG:       latch.1:
1569; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1570; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1571; PROLOG-NEXT:    %add.1 = add nsw i32 %4, %add
1572; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1573; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.2
1574; PROLOG:       for.exiting_block.2:
1575; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1576; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
1577; PROLOG:       latch.2:
1578; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1579; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
1580; PROLOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
1581; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
1582; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.3
1583; PROLOG:       for.exiting_block.3:
1584; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1585; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
1586; PROLOG:       latch.3:
1587; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1588; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
1589; PROLOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
1590; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
1591; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.4
1592; PROLOG:       for.exiting_block.4:
1593; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1594; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
1595; PROLOG:       latch.4:
1596; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
1597; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
1598; PROLOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
1599; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
1600; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.5
1601; PROLOG:       for.exiting_block.5:
1602; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1603; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
1604; PROLOG:       latch.5:
1605; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
1606; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
1607; PROLOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
1608; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
1609; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.6
1610; PROLOG:       for.exiting_block.6:
1611; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
1612; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
1613; PROLOG:       latch.6:
1614; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
1615; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
1616; PROLOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
1617; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
1618; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.7
1619; PROLOG:       for.exiting_block.7:
1620; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
1621; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
1622; PROLOG:       latch.7:
1623; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
1624; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
1625; PROLOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
1626; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
1627; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
1628; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
1629;
1630; PROLOG-BLOCK-LABEL: @hdr_latch_same_exit(
1631; PROLOG-BLOCK-NEXT:  entry:
1632; PROLOG-BLOCK-NEXT:    %0 = add i64 %n, -1
1633; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
1634; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1635; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
1636; PROLOG-BLOCK:       header.prol.preheader:
1637; PROLOG-BLOCK-NEXT:    br label %header.prol
1638; PROLOG-BLOCK:       header.prol:
1639; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.unr-lcssa, label %for.exiting_block.prol
1640; PROLOG-BLOCK:       for.exiting_block.prol:
1641; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
1642; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %latch.prol
1643; PROLOG-BLOCK:       latch.prol:
1644; PROLOG-BLOCK-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 0
1645; PROLOG-BLOCK-NEXT:    %1 = load i32, i32* %arrayidx.prol, align 4
1646; PROLOG-BLOCK-NEXT:    %add.prol = add nsw i32 %1, 0
1647; PROLOG-BLOCK-NEXT:    %indvars.iv.next.prol = add i64 0, 1
1648; PROLOG-BLOCK-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
1649; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
1650; PROLOG-BLOCK:       header.prol.loopexit:
1651; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %add.prol, %latch.prol ]
1652; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.next.prol, %latch.prol ]
1653; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %add.prol, %latch.prol ]
1654; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %0, 1
1655; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchExit, label %entry.new
1656; PROLOG-BLOCK:       entry.new:
1657; PROLOG-BLOCK-NEXT:    br label %header
1658; PROLOG-BLOCK:       header:
1659; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
1660; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
1661; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block
1662; PROLOG-BLOCK:       for.exiting_block:
1663; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
1664; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1665; PROLOG-BLOCK:       latch:
1666; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1667; PROLOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
1668; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
1669; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
1670; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.1
1671; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
1672; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ %add.1, %latch.1 ]
1673; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
1674; PROLOG-BLOCK:       latchExit.unr-lcssa:
1675; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %header.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1676; PROLOG-BLOCK-NEXT:    br label %latchExit
1677; PROLOG-BLOCK:       latchExit:
1678; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
1679; PROLOG-BLOCK-NEXT:    ret i32 %result
1680; PROLOG-BLOCK:       for.exit2.loopexit:
1681; PROLOG-BLOCK-NEXT:    br label %for.exit2
1682; PROLOG-BLOCK:       for.exit2:
1683; PROLOG-BLOCK-NEXT:    ret i32 42
1684; PROLOG-BLOCK:       for.exiting_block.1:
1685; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1686; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1687; PROLOG-BLOCK:       latch.1:
1688; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1689; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1690; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
1691; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1692; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
1693; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !4
1694;
1695
1696entry:
1697  br label %header
1698
1699header:
1700  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
1701  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
1702  br i1 %cond, label %latchExit, label %for.exiting_block
1703
1704for.exiting_block:
1705  %cmp = icmp eq i64 %n, 42
1706  br i1 %cmp, label %for.exit2, label %latch
1707
1708latch:                                         ; preds = %latch, %entry
1709  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1710  %0 = load i32, i32* %arrayidx, align 4
1711  %add = add nsw i32 %0, %sum.02
1712  %indvars.iv.next = add i64 %indvars.iv, 1
1713  %exitcond = icmp eq i64 %indvars.iv.next, %n
1714  br i1 %exitcond, label %latchExit, label %header
1715
1716latchExit:                                          ; preds = %latch, %entry
1717  %result = phi i32 [ 0, %header ], [ %add, %latch ]
1718  ret i32 %result
1719
1720for.exit2:
1721  ret i32 42
1722}
1723
1724; Two exiting blocks to latch where the exiting blocks are Latch and a
1725; non-header
1726; FIXME: We should unroll this loop.
1727define i32 @otherblock_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) {
1728; EPILOG-LABEL: @otherblock_latch_same_exit(
1729; EPILOG-NEXT:  entry:
1730; EPILOG-NEXT:    %0 = add i64 %n, -1
1731; EPILOG-NEXT:    %xtraiter = and i64 %n, 7
1732; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
1733; EPILOG-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
1734; EPILOG:       entry.new:
1735; EPILOG-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
1736; EPILOG-NEXT:    br label %header
1737; EPILOG:       header:
1738; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
1739; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
1740; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %latch.7 ]
1741; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
1742; EPILOG:       for.exiting_block:
1743; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
1744; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
1745; EPILOG:       latch:
1746; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1747; EPILOG-NEXT:    %2 = load i32, i32* %arrayidx, align 4
1748; EPILOG-NEXT:    %add = add nsw i32 %2, %sum.02
1749; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1750; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
1751; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
1752; EPILOG:       latchExit.unr-lcssa.loopexit:
1753; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
1754; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
1755; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
1756; EPILOG-NEXT:    br label %latchExit.unr-lcssa
1757; EPILOG:       latchExit.unr-lcssa:
1758; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1759; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1760; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1761; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1762; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1763; EPILOG:       header.epil.preheader:
1764; EPILOG-NEXT:    br label %header.epil
1765; EPILOG:       header.epil:
1766; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
1767; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
1768; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
1769; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
1770; EPILOG:       for.exiting_block.epil:
1771; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1772; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
1773; EPILOG:       latch.epil:
1774; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
1775; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
1776; EPILOG-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
1777; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
1778; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
1779; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
1780; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
1781; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !5
1782; EPILOG:       latchExit.epilog-lcssa.loopexit:
1783; 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 ]
1784; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1785; EPILOG:       latchExit.epilog-lcssa.loopexit3:
1786; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ 2, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
1787; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1788; EPILOG:       latchExit.epilog-lcssa:
1789; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
1790; EPILOG-NEXT:    br label %latchExit
1791; EPILOG:       latchExit:
1792; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1793; EPILOG-NEXT:    ret i32 %result
1794; EPILOG:       for.exit2.loopexit:
1795; EPILOG-NEXT:    br label %for.exit2
1796; EPILOG:       for.exit2.loopexit2:
1797; EPILOG-NEXT:    br label %for.exit2
1798; EPILOG:       for.exit2:
1799; EPILOG-NEXT:    ret i32 42
1800; EPILOG:       for.exiting_block.1:
1801; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1802; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
1803; EPILOG:       latch.1:
1804; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1805; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1806; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
1807; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
1808; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
1809; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
1810; EPILOG:       for.exiting_block.2:
1811; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1812; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
1813; EPILOG:       latch.2:
1814; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1815; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
1816; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
1817; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
1818; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
1819; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
1820; EPILOG:       for.exiting_block.3:
1821; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1822; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
1823; EPILOG:       latch.3:
1824; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1825; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
1826; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
1827; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
1828; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
1829; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
1830; EPILOG:       for.exiting_block.4:
1831; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1832; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
1833; EPILOG:       latch.4:
1834; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
1835; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
1836; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
1837; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
1838; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
1839; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
1840; EPILOG:       for.exiting_block.5:
1841; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1842; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
1843; EPILOG:       latch.5:
1844; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
1845; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
1846; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
1847; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
1848; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
1849; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
1850; EPILOG:       for.exiting_block.6:
1851; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
1852; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
1853; EPILOG:       latch.6:
1854; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
1855; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
1856; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
1857; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
1858; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
1859; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
1860; EPILOG:       for.exiting_block.7:
1861; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
1862; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
1863; EPILOG:       latch.7:
1864; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
1865; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
1866; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
1867; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
1868; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
1869; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
1870; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
1871;
1872; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit(
1873; EPILOG-BLOCK-NEXT:  entry:
1874; EPILOG-BLOCK-NEXT:    %0 = add i64 %n, -1
1875; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
1876; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
1877; EPILOG-BLOCK-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
1878; EPILOG-BLOCK:       entry.new:
1879; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
1880; EPILOG-BLOCK-NEXT:    br label %header
1881; EPILOG-BLOCK:       header:
1882; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
1883; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
1884; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %latch.1 ]
1885; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
1886; EPILOG-BLOCK:       for.exiting_block:
1887; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
1888; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
1889; EPILOG-BLOCK:       latch:
1890; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1891; EPILOG-BLOCK-NEXT:    %2 = load i32, i32* %arrayidx, align 4
1892; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %2, %sum.02
1893; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1894; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
1895; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
1896; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
1897; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
1898; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
1899; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
1900; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
1901; EPILOG-BLOCK:       latchExit.unr-lcssa:
1902; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1903; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1904; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1905; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1906; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1907; EPILOG-BLOCK:       header.epil.preheader:
1908; EPILOG-BLOCK-NEXT:    br label %header.epil
1909; EPILOG-BLOCK:       header.epil:
1910; EPILOG-BLOCK-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.unr, %header.epil.preheader ]
1911; EPILOG-BLOCK-NEXT:    %sum.02.epil = phi i32 [ %sum.02.unr, %header.epil.preheader ]
1912; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
1913; EPILOG-BLOCK:       for.exiting_block.epil:
1914; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1915; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
1916; EPILOG-BLOCK:       latch.epil:
1917; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
1918; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
1919; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
1920; EPILOG-BLOCK-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
1921; EPILOG-BLOCK-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
1922; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1923; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
1924; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ]
1925; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1926; EPILOG-BLOCK:       latchExit.epilog-lcssa:
1927; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 2, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
1928; EPILOG-BLOCK-NEXT:    br label %latchExit
1929; EPILOG-BLOCK:       latchExit:
1930; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1931; EPILOG-BLOCK-NEXT:    ret i32 %result
1932; EPILOG-BLOCK:       for.exit2.loopexit:
1933; EPILOG-BLOCK-NEXT:    br label %for.exit2
1934; EPILOG-BLOCK:       for.exit2:
1935; EPILOG-BLOCK-NEXT:    ret i32 42
1936; EPILOG-BLOCK:       for.exiting_block.1:
1937; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1938; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
1939; EPILOG-BLOCK:       latch.1:
1940; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1941; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1942; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
1943; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1944; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
1945; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0
1946; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5
1947;
1948; PROLOG-LABEL: @otherblock_latch_same_exit(
1949; PROLOG-NEXT:  entry:
1950; PROLOG-NEXT:    %0 = add i64 %n, -1
1951; PROLOG-NEXT:    %xtraiter = and i64 %n, 7
1952; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1953; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
1954; PROLOG:       header.prol.preheader:
1955; PROLOG-NEXT:    br label %header.prol
1956; PROLOG:       header.prol:
1957; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
1958; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
1959; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ]
1960; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol
1961; PROLOG:       for.exiting_block.prol:
1962; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
1963; PROLOG-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol
1964; PROLOG:       latch.prol:
1965; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
1966; PROLOG-NEXT:    %1 = load i32, i32* %arrayidx.prol, align 4
1967; PROLOG-NEXT:    %add.prol = add nsw i32 %1, %sum.02.prol
1968; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
1969; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
1970; PROLOG-NEXT:    %prol.iter.sub = sub i64 %prol.iter, 1
1971; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
1972; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !5
1973; PROLOG:       header.prol.loopexit.unr-lcssa:
1974; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
1975; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
1976; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
1977; PROLOG-NEXT:    br label %header.prol.loopexit
1978; PROLOG:       header.prol.loopexit:
1979; PROLOG-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
1980; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
1981; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
1982; PROLOG-NEXT:    %2 = icmp ult i64 %0, 7
1983; PROLOG-NEXT:    br i1 %2, label %latchExit, label %entry.new
1984; PROLOG:       entry.new:
1985; PROLOG-NEXT:    br label %header
1986; PROLOG:       header:
1987; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
1988; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
1989; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
1990; PROLOG:       for.exiting_block:
1991; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
1992; PROLOG-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
1993; PROLOG:       latch:
1994; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1995; PROLOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
1996; PROLOG-NEXT:    %add = add nsw i32 %3, %sum.02
1997; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
1998; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
1999; PROLOG:       latchExit.unr-lcssa.loopexit:
2000; 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 ]
2001; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2002; PROLOG:       latchExit.unr-lcssa.loopexit2:
2003; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ 2, %for.exiting_block.prol ]
2004; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2005; PROLOG:       latchExit.unr-lcssa:
2006; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]
2007; PROLOG-NEXT:    br label %latchExit
2008; PROLOG:       latchExit:
2009; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2010; PROLOG-NEXT:    ret i32 %result
2011; PROLOG:       for.exit2.loopexit:
2012; PROLOG-NEXT:    br label %for.exit2
2013; PROLOG:       for.exit2.loopexit1:
2014; PROLOG-NEXT:    br label %for.exit2
2015; PROLOG:       for.exit2:
2016; PROLOG-NEXT:    ret i32 42
2017; PROLOG:       for.exiting_block.1:
2018; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2019; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2020; PROLOG:       latch.1:
2021; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2022; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2023; PROLOG-NEXT:    %add.1 = add nsw i32 %4, %add
2024; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2025; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2026; PROLOG:       for.exiting_block.2:
2027; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2028; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2
2029; PROLOG:       latch.2:
2030; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2031; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
2032; PROLOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
2033; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
2034; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2035; PROLOG:       for.exiting_block.3:
2036; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2037; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3
2038; PROLOG:       latch.3:
2039; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2040; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
2041; PROLOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
2042; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
2043; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2044; PROLOG:       for.exiting_block.4:
2045; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2046; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4
2047; PROLOG:       latch.4:
2048; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2049; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
2050; PROLOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2051; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
2052; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2053; PROLOG:       for.exiting_block.5:
2054; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2055; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5
2056; PROLOG:       latch.5:
2057; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2058; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
2059; PROLOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2060; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
2061; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2062; PROLOG:       for.exiting_block.6:
2063; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2064; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6
2065; PROLOG:       latch.6:
2066; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2067; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
2068; PROLOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2069; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
2070; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2071; PROLOG:       for.exiting_block.7:
2072; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2073; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7
2074; PROLOG:       latch.7:
2075; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2076; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
2077; PROLOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2078; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2079; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
2080; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
2081;
2082; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit(
2083; PROLOG-BLOCK-NEXT:  entry:
2084; PROLOG-BLOCK-NEXT:    %0 = add i64 %n, -1
2085; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
2086; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2087; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
2088; PROLOG-BLOCK:       header.prol.preheader:
2089; PROLOG-BLOCK-NEXT:    br label %header.prol
2090; PROLOG-BLOCK:       header.prol:
2091; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.prol
2092; PROLOG-BLOCK:       for.exiting_block.prol:
2093; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
2094; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol
2095; PROLOG-BLOCK:       latch.prol:
2096; PROLOG-BLOCK-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 0
2097; PROLOG-BLOCK-NEXT:    %1 = load i32, i32* %arrayidx.prol, align 4
2098; PROLOG-BLOCK-NEXT:    %add.prol = add nsw i32 %1, 0
2099; PROLOG-BLOCK-NEXT:    %indvars.iv.next.prol = add i64 0, 1
2100; PROLOG-BLOCK-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
2101; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
2102; PROLOG-BLOCK:       header.prol.loopexit:
2103; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %add.prol, %latch.prol ]
2104; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.next.prol, %latch.prol ]
2105; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %add.prol, %latch.prol ]
2106; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %0, 1
2107; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchExit, label %entry.new
2108; PROLOG-BLOCK:       entry.new:
2109; PROLOG-BLOCK-NEXT:    br label %header
2110; PROLOG-BLOCK:       header:
2111; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2112; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
2113; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2114; PROLOG-BLOCK:       for.exiting_block:
2115; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2116; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2117; PROLOG-BLOCK:       latch:
2118; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2119; PROLOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
2120; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
2121; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2122; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2123; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2124; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
2125; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2126; PROLOG-BLOCK:       latchExit.unr-lcssa:
2127; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 2, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2128; PROLOG-BLOCK-NEXT:    br label %latchExit
2129; PROLOG-BLOCK:       latchExit:
2130; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2131; PROLOG-BLOCK-NEXT:    ret i32 %result
2132; PROLOG-BLOCK:       for.exit2.loopexit:
2133; PROLOG-BLOCK-NEXT:    br label %for.exit2
2134; PROLOG-BLOCK:       for.exit2:
2135; PROLOG-BLOCK-NEXT:    ret i32 42
2136; PROLOG-BLOCK:       for.exiting_block.1:
2137; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2138; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2139; PROLOG-BLOCK:       latch.1:
2140; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2141; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2142; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2143; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2144; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
2145; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5
2146;
2147
2148entry:
2149  br label %header
2150
2151header:
2152  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
2153  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
2154  br i1 %cond, label %for.exit2, label %for.exiting_block
2155
2156for.exiting_block:
2157  %cmp = icmp eq i64 %n, 42
2158  br i1 %cmp, label %latchExit, label %latch
2159
2160latch:                                         ; preds = %latch, %entry
2161  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2162  %0 = load i32, i32* %arrayidx, align 4
2163  %add = add nsw i32 %0, %sum.02
2164  %indvars.iv.next = add i64 %indvars.iv, 1
2165  %exitcond = icmp eq i64 %indvars.iv.next, %n
2166  br i1 %exitcond, label %latchExit, label %header
2167
2168latchExit:                                          ; preds = %latch, %entry
2169  %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ]
2170  ret i32 %result
2171
2172for.exit2:
2173  ret i32 42
2174}
2175
2176; Two exiting blocks to latch where the exiting blocks are Latch and a
2177; non-header
2178; Same as above test except the incoming value for latch Phi is from the header
2179; FIXME: We should be able to runtime unroll.
2180define i32 @otherblock_latch_same_exit2(i32* nocapture %a, i64 %n, i1 %cond) {
2181; EPILOG-LABEL: @otherblock_latch_same_exit2(
2182; EPILOG-NEXT:  entry:
2183; EPILOG-NEXT:    %0 = add i64 %n, -1
2184; EPILOG-NEXT:    %xtraiter = and i64 %n, 7
2185; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
2186; EPILOG-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
2187; EPILOG:       entry.new:
2188; EPILOG-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
2189; EPILOG-NEXT:    br label %header
2190; EPILOG:       header:
2191; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
2192; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
2193; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %latch.7 ]
2194; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2195; EPILOG:       for.exiting_block:
2196; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
2197; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2198; EPILOG:       latch:
2199; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2200; EPILOG-NEXT:    %2 = load i32, i32* %arrayidx, align 4
2201; EPILOG-NEXT:    %add = add nsw i32 %2, %sum.02
2202; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2203; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
2204; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2205; EPILOG:       latchExit.unr-lcssa.loopexit:
2206; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
2207; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
2208; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
2209; EPILOG-NEXT:    br label %latchExit.unr-lcssa
2210; EPILOG:       latchExit.unr-lcssa:
2211; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2212; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2213; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2214; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2215; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2216; EPILOG:       header.epil.preheader:
2217; EPILOG-NEXT:    br label %header.epil
2218; EPILOG:       header.epil:
2219; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
2220; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
2221; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
2222; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
2223; EPILOG:       for.exiting_block.epil:
2224; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2225; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
2226; EPILOG:       latch.epil:
2227; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
2228; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
2229; EPILOG-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
2230; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
2231; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
2232; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
2233; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
2234; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !6
2235; EPILOG:       latchExit.epilog-lcssa.loopexit:
2236; 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 ]
2237; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2238; EPILOG:       latchExit.epilog-lcssa.loopexit3:
2239; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
2240; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2241; EPILOG:       latchExit.epilog-lcssa:
2242; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
2243; EPILOG-NEXT:    br label %latchExit
2244; EPILOG:       latchExit:
2245; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2246; EPILOG-NEXT:    ret i32 %result
2247; EPILOG:       for.exit2.loopexit:
2248; EPILOG-NEXT:    br label %for.exit2
2249; EPILOG:       for.exit2.loopexit2:
2250; EPILOG-NEXT:    br label %for.exit2
2251; EPILOG:       for.exit2:
2252; EPILOG-NEXT:    ret i32 42
2253; EPILOG:       for.exiting_block.1:
2254; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2255; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2256; EPILOG:       latch.1:
2257; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2258; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2259; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
2260; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
2261; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
2262; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2263; EPILOG:       for.exiting_block.2:
2264; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2265; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
2266; EPILOG:       latch.2:
2267; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2268; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
2269; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
2270; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
2271; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
2272; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2273; EPILOG:       for.exiting_block.3:
2274; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2275; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
2276; EPILOG:       latch.3:
2277; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2278; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
2279; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
2280; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
2281; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
2282; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2283; EPILOG:       for.exiting_block.4:
2284; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2285; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
2286; EPILOG:       latch.4:
2287; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2288; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
2289; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2290; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
2291; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
2292; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2293; EPILOG:       for.exiting_block.5:
2294; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2295; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
2296; EPILOG:       latch.5:
2297; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2298; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
2299; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2300; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
2301; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
2302; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2303; EPILOG:       for.exiting_block.6:
2304; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2305; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
2306; EPILOG:       latch.6:
2307; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2308; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
2309; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2310; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
2311; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
2312; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2313; EPILOG:       for.exiting_block.7:
2314; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2315; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
2316; EPILOG:       latch.7:
2317; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2318; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
2319; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2320; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2321; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
2322; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
2323; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
2324;
2325; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit2(
2326; EPILOG-BLOCK-NEXT:  entry:
2327; EPILOG-BLOCK-NEXT:    %0 = add i64 %n, -1
2328; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
2329; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
2330; EPILOG-BLOCK-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
2331; EPILOG-BLOCK:       entry.new:
2332; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
2333; EPILOG-BLOCK-NEXT:    br label %header
2334; EPILOG-BLOCK:       header:
2335; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2336; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
2337; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %latch.1 ]
2338; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2339; EPILOG-BLOCK:       for.exiting_block:
2340; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2341; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2342; EPILOG-BLOCK:       latch:
2343; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2344; EPILOG-BLOCK-NEXT:    %2 = load i32, i32* %arrayidx, align 4
2345; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %2, %sum.02
2346; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2347; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
2348; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2349; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2350; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
2351; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
2352; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
2353; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2354; EPILOG-BLOCK:       latchExit.unr-lcssa:
2355; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2356; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2357; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2358; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2359; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2360; EPILOG-BLOCK:       header.epil.preheader:
2361; EPILOG-BLOCK-NEXT:    br label %header.epil
2362; EPILOG-BLOCK:       header.epil:
2363; EPILOG-BLOCK-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.unr, %header.epil.preheader ]
2364; EPILOG-BLOCK-NEXT:    %sum.02.epil = phi i32 [ %sum.02.unr, %header.epil.preheader ]
2365; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
2366; EPILOG-BLOCK:       for.exiting_block.epil:
2367; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2368; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
2369; EPILOG-BLOCK:       latch.epil:
2370; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
2371; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
2372; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
2373; EPILOG-BLOCK-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
2374; EPILOG-BLOCK-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
2375; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2376; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
2377; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ]
2378; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2379; EPILOG-BLOCK:       latchExit.epilog-lcssa:
2380; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.epil, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
2381; EPILOG-BLOCK-NEXT:    br label %latchExit
2382; EPILOG-BLOCK:       latchExit:
2383; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2384; EPILOG-BLOCK-NEXT:    ret i32 %result
2385; EPILOG-BLOCK:       for.exit2.loopexit:
2386; EPILOG-BLOCK-NEXT:    br label %for.exit2
2387; EPILOG-BLOCK:       for.exit2:
2388; EPILOG-BLOCK-NEXT:    ret i32 42
2389; EPILOG-BLOCK:       for.exiting_block.1:
2390; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2391; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2392; EPILOG-BLOCK:       latch.1:
2393; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2394; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2395; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2396; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2397; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
2398; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0
2399; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6
2400;
2401; PROLOG-LABEL: @otherblock_latch_same_exit2(
2402; PROLOG-NEXT:  entry:
2403; PROLOG-NEXT:    %0 = add i64 %n, -1
2404; PROLOG-NEXT:    %xtraiter = and i64 %n, 7
2405; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2406; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
2407; PROLOG:       header.prol.preheader:
2408; PROLOG-NEXT:    br label %header.prol
2409; PROLOG:       header.prol:
2410; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
2411; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
2412; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ]
2413; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol
2414; PROLOG:       for.exiting_block.prol:
2415; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
2416; PROLOG-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol
2417; PROLOG:       latch.prol:
2418; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
2419; PROLOG-NEXT:    %1 = load i32, i32* %arrayidx.prol, align 4
2420; PROLOG-NEXT:    %add.prol = add nsw i32 %1, %sum.02.prol
2421; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
2422; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
2423; PROLOG-NEXT:    %prol.iter.sub = sub i64 %prol.iter, 1
2424; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
2425; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !6
2426; PROLOG:       header.prol.loopexit.unr-lcssa:
2427; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
2428; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
2429; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
2430; PROLOG-NEXT:    br label %header.prol.loopexit
2431; PROLOG:       header.prol.loopexit:
2432; PROLOG-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
2433; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
2434; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
2435; PROLOG-NEXT:    %2 = icmp ult i64 %0, 7
2436; PROLOG-NEXT:    br i1 %2, label %latchExit, label %entry.new
2437; PROLOG:       entry.new:
2438; PROLOG-NEXT:    br label %header
2439; PROLOG:       header:
2440; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
2441; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
2442; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2443; PROLOG:       for.exiting_block:
2444; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
2445; PROLOG-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2446; PROLOG:       latch:
2447; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2448; PROLOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
2449; PROLOG-NEXT:    %add = add nsw i32 %3, %sum.02
2450; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2451; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2452; PROLOG:       latchExit.unr-lcssa.loopexit:
2453; 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 ]
2454; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2455; PROLOG:       latchExit.unr-lcssa.loopexit2:
2456; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ]
2457; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2458; PROLOG:       latchExit.unr-lcssa:
2459; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]
2460; PROLOG-NEXT:    br label %latchExit
2461; PROLOG:       latchExit:
2462; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2463; PROLOG-NEXT:    ret i32 %result
2464; PROLOG:       for.exit2.loopexit:
2465; PROLOG-NEXT:    br label %for.exit2
2466; PROLOG:       for.exit2.loopexit1:
2467; PROLOG-NEXT:    br label %for.exit2
2468; PROLOG:       for.exit2:
2469; PROLOG-NEXT:    ret i32 42
2470; PROLOG:       for.exiting_block.1:
2471; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2472; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2473; PROLOG:       latch.1:
2474; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2475; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2476; PROLOG-NEXT:    %add.1 = add nsw i32 %4, %add
2477; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2478; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2479; PROLOG:       for.exiting_block.2:
2480; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2481; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2
2482; PROLOG:       latch.2:
2483; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2484; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
2485; PROLOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
2486; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
2487; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2488; PROLOG:       for.exiting_block.3:
2489; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2490; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3
2491; PROLOG:       latch.3:
2492; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2493; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
2494; PROLOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
2495; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
2496; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2497; PROLOG:       for.exiting_block.4:
2498; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2499; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4
2500; PROLOG:       latch.4:
2501; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2502; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
2503; PROLOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2504; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
2505; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2506; PROLOG:       for.exiting_block.5:
2507; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2508; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5
2509; PROLOG:       latch.5:
2510; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2511; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
2512; PROLOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2513; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
2514; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2515; PROLOG:       for.exiting_block.6:
2516; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2517; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6
2518; PROLOG:       latch.6:
2519; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2520; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
2521; PROLOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2522; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
2523; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2524; PROLOG:       for.exiting_block.7:
2525; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2526; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7
2527; PROLOG:       latch.7:
2528; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2529; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
2530; PROLOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2531; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2532; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
2533; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
2534;
2535; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit2(
2536; PROLOG-BLOCK-NEXT:  entry:
2537; PROLOG-BLOCK-NEXT:    %0 = add i64 %n, -1
2538; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
2539; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2540; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
2541; PROLOG-BLOCK:       header.prol.preheader:
2542; PROLOG-BLOCK-NEXT:    br label %header.prol
2543; PROLOG-BLOCK:       header.prol:
2544; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.prol
2545; PROLOG-BLOCK:       for.exiting_block.prol:
2546; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
2547; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol
2548; PROLOG-BLOCK:       latch.prol:
2549; PROLOG-BLOCK-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 0
2550; PROLOG-BLOCK-NEXT:    %1 = load i32, i32* %arrayidx.prol, align 4
2551; PROLOG-BLOCK-NEXT:    %add.prol = add nsw i32 %1, 0
2552; PROLOG-BLOCK-NEXT:    %indvars.iv.next.prol = add i64 0, 1
2553; PROLOG-BLOCK-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
2554; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
2555; PROLOG-BLOCK:       header.prol.loopexit:
2556; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %add.prol, %latch.prol ]
2557; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.next.prol, %latch.prol ]
2558; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %add.prol, %latch.prol ]
2559; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %0, 1
2560; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchExit, label %entry.new
2561; PROLOG-BLOCK:       entry.new:
2562; PROLOG-BLOCK-NEXT:    br label %header
2563; PROLOG-BLOCK:       header:
2564; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2565; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
2566; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2567; PROLOG-BLOCK:       for.exiting_block:
2568; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2569; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2570; PROLOG-BLOCK:       latch:
2571; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2572; PROLOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
2573; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
2574; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2575; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2576; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2577; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
2578; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2579; PROLOG-BLOCK:       latchExit.unr-lcssa:
2580; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2581; PROLOG-BLOCK-NEXT:    br label %latchExit
2582; PROLOG-BLOCK:       latchExit:
2583; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2584; PROLOG-BLOCK-NEXT:    ret i32 %result
2585; PROLOG-BLOCK:       for.exit2.loopexit:
2586; PROLOG-BLOCK-NEXT:    br label %for.exit2
2587; PROLOG-BLOCK:       for.exit2:
2588; PROLOG-BLOCK-NEXT:    ret i32 42
2589; PROLOG-BLOCK:       for.exiting_block.1:
2590; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2591; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2592; PROLOG-BLOCK:       latch.1:
2593; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2594; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2595; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2596; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2597; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
2598; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6
2599;
2600
2601entry:
2602  br label %header
2603
2604header:
2605  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
2606  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
2607  br i1 %cond, label %for.exit2, label %for.exiting_block
2608
2609for.exiting_block:
2610  %cmp = icmp eq i64 %n, 42
2611  br i1 %cmp, label %latchExit, label %latch
2612
2613latch:                                         ; preds = %latch, %entry
2614  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2615  %0 = load i32, i32* %arrayidx, align 4
2616  %add = add nsw i32 %0, %sum.02
2617  %indvars.iv.next = add i64 %indvars.iv, 1
2618  %exitcond = icmp eq i64 %indvars.iv.next, %n
2619  br i1 %exitcond, label %latchExit, label %header
2620
2621latchExit:                                          ; preds = %latch, %entry
2622  %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
2623  ret i32 %result
2624
2625for.exit2:
2626  ret i32 42
2627}
2628
2629; Two exiting blocks to latch where the exiting blocks are Latch and a
2630; non-header
2631; Same as above test except the incoming value for cloned latch Phi is from the
2632; for.exiting_block.
2633; FIXME: We should be able to runtime unroll.
2634define i32 @otherblock_latch_same_exit3(i32* nocapture %a, i64 %n, i1 %cond) {
2635; EPILOG-LABEL: @otherblock_latch_same_exit3(
2636; EPILOG-NEXT:  entry:
2637; EPILOG-NEXT:    %0 = add i64 %n, -1
2638; EPILOG-NEXT:    %xtraiter = and i64 %n, 7
2639; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
2640; EPILOG-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
2641; EPILOG:       entry.new:
2642; EPILOG-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
2643; EPILOG-NEXT:    br label %header
2644; EPILOG:       header:
2645; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
2646; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
2647; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %latch.7 ]
2648; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2649; EPILOG:       for.exiting_block:
2650; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2651; EPILOG-NEXT:    %2 = load i32, i32* %arrayidx, align 4
2652; EPILOG-NEXT:    %add = add nsw i32 %2, %sum.02
2653; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
2654; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2655; EPILOG:       latch:
2656; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2657; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
2658; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2659; EPILOG:       latchExit.unr-lcssa.loopexit:
2660; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
2661; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
2662; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
2663; EPILOG-NEXT:    br label %latchExit.unr-lcssa
2664; EPILOG:       latchExit.unr-lcssa:
2665; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2666; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2667; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2668; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2669; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2670; EPILOG:       header.epil.preheader:
2671; EPILOG-NEXT:    br label %header.epil
2672; EPILOG:       header.epil:
2673; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
2674; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
2675; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
2676; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
2677; EPILOG:       for.exiting_block.epil:
2678; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
2679; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
2680; EPILOG-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
2681; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2682; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
2683; EPILOG:       latch.epil:
2684; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
2685; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
2686; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
2687; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
2688; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !7
2689; EPILOG:       latchExit.epilog-lcssa.loopexit:
2690; 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 ]
2691; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2692; EPILOG:       latchExit.epilog-lcssa.loopexit3:
2693; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
2694; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2695; EPILOG:       latchExit.epilog-lcssa:
2696; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
2697; EPILOG-NEXT:    br label %latchExit
2698; EPILOG:       latchExit:
2699; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2700; EPILOG-NEXT:    ret i32 %result
2701; EPILOG:       for.exit2.loopexit:
2702; EPILOG-NEXT:    br label %for.exit2
2703; EPILOG:       for.exit2.loopexit2:
2704; EPILOG-NEXT:    br label %for.exit2
2705; EPILOG:       for.exit2:
2706; EPILOG-NEXT:    ret i32 42
2707; EPILOG:       for.exiting_block.1:
2708; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2709; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2710; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
2711; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2712; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2713; EPILOG:       latch.1:
2714; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
2715; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
2716; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2717; EPILOG:       for.exiting_block.2:
2718; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2719; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
2720; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
2721; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2722; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
2723; EPILOG:       latch.2:
2724; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
2725; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
2726; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2727; EPILOG:       for.exiting_block.3:
2728; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2729; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
2730; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
2731; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2732; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
2733; EPILOG:       latch.3:
2734; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
2735; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
2736; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2737; EPILOG:       for.exiting_block.4:
2738; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2739; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
2740; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2741; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2742; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
2743; EPILOG:       latch.4:
2744; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
2745; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
2746; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2747; EPILOG:       for.exiting_block.5:
2748; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2749; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
2750; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2751; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2752; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
2753; EPILOG:       latch.5:
2754; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
2755; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
2756; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2757; EPILOG:       for.exiting_block.6:
2758; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2759; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
2760; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2761; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2762; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
2763; EPILOG:       latch.6:
2764; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
2765; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
2766; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2767; EPILOG:       for.exiting_block.7:
2768; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2769; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
2770; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2771; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2772; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
2773; EPILOG:       latch.7:
2774; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2775; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
2776; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
2777; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
2778;
2779; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit3(
2780; EPILOG-BLOCK-NEXT:  entry:
2781; EPILOG-BLOCK-NEXT:    %0 = add i64 %n, -1
2782; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
2783; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
2784; EPILOG-BLOCK-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
2785; EPILOG-BLOCK:       entry.new:
2786; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
2787; EPILOG-BLOCK-NEXT:    br label %header
2788; EPILOG-BLOCK:       header:
2789; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2790; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
2791; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %latch.1 ]
2792; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2793; EPILOG-BLOCK:       for.exiting_block:
2794; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2795; EPILOG-BLOCK-NEXT:    %2 = load i32, i32* %arrayidx, align 4
2796; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %2, %sum.02
2797; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2798; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2799; EPILOG-BLOCK:       latch:
2800; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2801; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
2802; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2803; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2804; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
2805; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
2806; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
2807; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2808; EPILOG-BLOCK:       latchExit.unr-lcssa:
2809; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2810; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2811; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2812; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2813; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2814; EPILOG-BLOCK:       header.epil.preheader:
2815; EPILOG-BLOCK-NEXT:    br label %header.epil
2816; EPILOG-BLOCK:       header.epil:
2817; EPILOG-BLOCK-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.unr, %header.epil.preheader ]
2818; EPILOG-BLOCK-NEXT:    %sum.02.epil = phi i32 [ %sum.02.unr, %header.epil.preheader ]
2819; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
2820; EPILOG-BLOCK:       for.exiting_block.epil:
2821; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
2822; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
2823; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
2824; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2825; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
2826; EPILOG-BLOCK:       latch.epil:
2827; EPILOG-BLOCK-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
2828; EPILOG-BLOCK-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
2829; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2830; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
2831; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ]
2832; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2833; EPILOG-BLOCK:       latchExit.epilog-lcssa:
2834; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.epil, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
2835; EPILOG-BLOCK-NEXT:    br label %latchExit
2836; EPILOG-BLOCK:       latchExit:
2837; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2838; EPILOG-BLOCK-NEXT:    ret i32 %result
2839; EPILOG-BLOCK:       for.exit2.loopexit:
2840; EPILOG-BLOCK-NEXT:    br label %for.exit2
2841; EPILOG-BLOCK:       for.exit2:
2842; EPILOG-BLOCK-NEXT:    ret i32 42
2843; EPILOG-BLOCK:       for.exiting_block.1:
2844; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2845; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2846; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2847; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2848; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2849; EPILOG-BLOCK:       latch.1:
2850; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2851; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
2852; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0
2853; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7
2854;
2855; PROLOG-LABEL: @otherblock_latch_same_exit3(
2856; PROLOG-NEXT:  entry:
2857; PROLOG-NEXT:    %0 = add i64 %n, -1
2858; PROLOG-NEXT:    %xtraiter = and i64 %n, 7
2859; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2860; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
2861; PROLOG:       header.prol.preheader:
2862; PROLOG-NEXT:    br label %header.prol
2863; PROLOG:       header.prol:
2864; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
2865; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
2866; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ]
2867; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol
2868; PROLOG:       for.exiting_block.prol:
2869; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
2870; PROLOG-NEXT:    %1 = load i32, i32* %arrayidx.prol, align 4
2871; PROLOG-NEXT:    %add.prol = add nsw i32 %1, %sum.02.prol
2872; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
2873; PROLOG-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol
2874; PROLOG:       latch.prol:
2875; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
2876; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
2877; PROLOG-NEXT:    %prol.iter.sub = sub i64 %prol.iter, 1
2878; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
2879; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !7
2880; PROLOG:       header.prol.loopexit.unr-lcssa:
2881; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
2882; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
2883; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
2884; PROLOG-NEXT:    br label %header.prol.loopexit
2885; PROLOG:       header.prol.loopexit:
2886; PROLOG-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
2887; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
2888; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
2889; PROLOG-NEXT:    %2 = icmp ult i64 %0, 7
2890; PROLOG-NEXT:    br i1 %2, label %latchExit, label %entry.new
2891; PROLOG:       entry.new:
2892; PROLOG-NEXT:    br label %header
2893; PROLOG:       header:
2894; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
2895; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
2896; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2897; PROLOG:       for.exiting_block:
2898; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2899; PROLOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
2900; PROLOG-NEXT:    %add = add nsw i32 %3, %sum.02
2901; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
2902; PROLOG-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2903; PROLOG:       latch:
2904; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2905; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2906; PROLOG:       latchExit.unr-lcssa.loopexit:
2907; 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 ]
2908; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2909; PROLOG:       latchExit.unr-lcssa.loopexit2:
2910; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ]
2911; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2912; PROLOG:       latchExit.unr-lcssa:
2913; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]
2914; PROLOG-NEXT:    br label %latchExit
2915; PROLOG:       latchExit:
2916; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2917; PROLOG-NEXT:    ret i32 %result
2918; PROLOG:       for.exit2.loopexit:
2919; PROLOG-NEXT:    br label %for.exit2
2920; PROLOG:       for.exit2.loopexit1:
2921; PROLOG-NEXT:    br label %for.exit2
2922; PROLOG:       for.exit2:
2923; PROLOG-NEXT:    ret i32 42
2924; PROLOG:       for.exiting_block.1:
2925; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2926; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2927; PROLOG-NEXT:    %add.1 = add nsw i32 %4, %add
2928; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2929; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2930; PROLOG:       latch.1:
2931; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2932; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2933; PROLOG:       for.exiting_block.2:
2934; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2935; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
2936; PROLOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
2937; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2938; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2
2939; PROLOG:       latch.2:
2940; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
2941; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2942; PROLOG:       for.exiting_block.3:
2943; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2944; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
2945; PROLOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
2946; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2947; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3
2948; PROLOG:       latch.3:
2949; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
2950; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2951; PROLOG:       for.exiting_block.4:
2952; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2953; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
2954; PROLOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2955; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2956; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4
2957; PROLOG:       latch.4:
2958; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
2959; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2960; PROLOG:       for.exiting_block.5:
2961; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2962; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
2963; PROLOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2964; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2965; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5
2966; PROLOG:       latch.5:
2967; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
2968; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2969; PROLOG:       for.exiting_block.6:
2970; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2971; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
2972; PROLOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2973; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2974; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6
2975; PROLOG:       latch.6:
2976; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
2977; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2978; PROLOG:       for.exiting_block.7:
2979; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2980; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
2981; PROLOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2982; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2983; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7
2984; PROLOG:       latch.7:
2985; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2986; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
2987; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
2988;
2989; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit3(
2990; PROLOG-BLOCK-NEXT:  entry:
2991; PROLOG-BLOCK-NEXT:    %0 = add i64 %n, -1
2992; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
2993; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2994; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
2995; PROLOG-BLOCK:       header.prol.preheader:
2996; PROLOG-BLOCK-NEXT:    br label %header.prol
2997; PROLOG-BLOCK:       header.prol:
2998; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.prol
2999; PROLOG-BLOCK:       for.exiting_block.prol:
3000; PROLOG-BLOCK-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 0
3001; PROLOG-BLOCK-NEXT:    %1 = load i32, i32* %arrayidx.prol, align 4
3002; PROLOG-BLOCK-NEXT:    %add.prol = add nsw i32 %1, 0
3003; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
3004; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol
3005; PROLOG-BLOCK:       latch.prol:
3006; PROLOG-BLOCK-NEXT:    %indvars.iv.next.prol = add i64 0, 1
3007; PROLOG-BLOCK-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
3008; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
3009; PROLOG-BLOCK:       header.prol.loopexit:
3010; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %add.prol, %latch.prol ]
3011; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.next.prol, %latch.prol ]
3012; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %add.prol, %latch.prol ]
3013; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %0, 1
3014; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchExit, label %entry.new
3015; PROLOG-BLOCK:       entry.new:
3016; PROLOG-BLOCK-NEXT:    br label %header
3017; PROLOG-BLOCK:       header:
3018; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
3019; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
3020; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
3021; PROLOG-BLOCK:       for.exiting_block:
3022; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3023; PROLOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
3024; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
3025; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
3026; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
3027; PROLOG-BLOCK:       latch:
3028; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
3029; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
3030; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
3031; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
3032; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
3033; PROLOG-BLOCK:       latchExit.unr-lcssa:
3034; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
3035; PROLOG-BLOCK-NEXT:    br label %latchExit
3036; PROLOG-BLOCK:       latchExit:
3037; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
3038; PROLOG-BLOCK-NEXT:    ret i32 %result
3039; PROLOG-BLOCK:       for.exit2.loopexit:
3040; PROLOG-BLOCK-NEXT:    br label %for.exit2
3041; PROLOG-BLOCK:       for.exit2:
3042; PROLOG-BLOCK-NEXT:    ret i32 42
3043; PROLOG-BLOCK:       for.exiting_block.1:
3044; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3045; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
3046; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
3047; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3048; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
3049; PROLOG-BLOCK:       latch.1:
3050; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
3051; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
3052; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7
3053;
3054
3055entry:
3056  br label %header
3057
3058header:
3059  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
3060  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
3061  br i1 %cond, label %for.exit2, label %for.exiting_block
3062
3063for.exiting_block:
3064  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3065  %0 = load i32, i32* %arrayidx, align 4
3066  %add = add nsw i32 %0, %sum.02
3067  %cmp = icmp eq i64 %n, 42
3068  br i1 %cmp, label %latchExit, label %latch
3069
3070latch:                                         ; preds = %latch, %entry
3071  %indvars.iv.next = add i64 %indvars.iv, 1
3072  %exitcond = icmp eq i64 %indvars.iv.next, %n
3073  br i1 %exitcond, label %latchExit, label %header
3074
3075latchExit:                                          ; preds = %latch, %entry
3076  %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
3077  ret i32 %result
3078
3079for.exit2:
3080  ret i32 42
3081}
3082
3083; FIXME: Support multiple exiting blocks to the unique exit block (LatchExit).
3084; Only 2 blocks in loop: header and latch where both exit to same LatchExit.
3085define void @unique_exit(i32 %arg) {
3086; CHECK-LABEL: @unique_exit(
3087; CHECK-NEXT:  entry:
3088; CHECK-NEXT:    %i = icmp sgt i32 undef, %arg
3089; CHECK-NEXT:    br i1 %i, label %preheader, label %returnblock
3090; CHECK:       preheader:
3091; CHECK-NEXT:    br label %header
3092; CHECK:       header:
3093; CHECK-NEXT:    br i1 true, label %latchExit, label %latch
3094; CHECK:       latch:
3095; CHECK-NEXT:    br label %latchExit
3096; CHECK:       latchExit:
3097; CHECK-NEXT:    %i2.ph = phi i32 [ %arg, %header ], [ -1, %latch ]
3098; CHECK-NEXT:    br label %returnblock
3099; CHECK:       returnblock:
3100; CHECK-NEXT:    %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ]
3101; CHECK-NEXT:    ret void
3102;
3103
3104entry:
3105  %i = icmp sgt i32 undef, %arg
3106  br i1 %i, label %preheader, label %returnblock
3107
3108preheader:                                 ; preds = %entry
3109  br label %header
3110
3111header:                                           ; preds = %preheader, %latch
3112  %i4 = phi i32 [ %inc, %latch ], [ %arg, %preheader ]
3113  %inc = add nsw i32 %i4, 1
3114  br i1 true, label %latchExit, label %latch
3115
3116latch:                                            ; preds = %header
3117  %cmp = icmp slt i32 %inc, undef
3118  br i1 %cmp, label %header, label %latchExit
3119
3120latchExit:                                ; preds = %header, %latch
3121  %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ]
3122  br label %returnblock
3123
3124returnblock:                                         ; preds = %latchExit, %entry
3125  %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ]
3126  ret void
3127}
3128
3129; two exiting and two exit blocks.
3130; the non-latch exiting block has duplicate edges to the non-latch exit block.
3131define i64 @test5(i64 %trip, i64 %add, i1 %cond) {
3132; EPILOG-LABEL: @test5(
3133; EPILOG-NEXT:  entry:
3134; EPILOG-NEXT:    %0 = add i64 %trip, -1
3135; EPILOG-NEXT:    %xtraiter = and i64 %trip, 7
3136; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
3137; EPILOG-NEXT:    br i1 %1, label %latchexit.unr-lcssa, label %entry.new
3138; EPILOG:       entry.new:
3139; EPILOG-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
3140; EPILOG-NEXT:    br label %loop_header
3141; EPILOG:       loop_header:
3142; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
3143; EPILOG-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
3144; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ]
3145; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3146; EPILOG:       loop_exiting:
3147; EPILOG-NEXT:    %ivy = add i64 %iv, %add
3148; EPILOG-NEXT:    switch i64 %sum, label %loop_latch [
3149; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3150; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3151; EPILOG-NEXT:    ]
3152; EPILOG:       loop_latch:
3153; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3154; EPILOG-NEXT:    %sum.next = add i64 %sum, %add
3155; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
3156; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3157; EPILOG:       exit1.loopexit:
3158; 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 ]
3159; EPILOG-NEXT:    br label %exit1
3160; EPILOG:       exit1.loopexit2:
3161; EPILOG-NEXT:    %result.ph3 = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ]
3162; EPILOG-NEXT:    br label %exit1
3163; EPILOG:       exit1:
3164; EPILOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph3, %exit1.loopexit2 ]
3165; EPILOG-NEXT:    ret i64 %result
3166; EPILOG:       latchexit.unr-lcssa.loopexit:
3167; EPILOG-NEXT:    %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3168; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
3169; EPILOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3170; EPILOG-NEXT:    br label %latchexit.unr-lcssa
3171; EPILOG:       latchexit.unr-lcssa:
3172; EPILOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ]
3173; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ]
3174; EPILOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ]
3175; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3176; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit
3177; EPILOG:       loop_header.epil.preheader:
3178; EPILOG-NEXT:    br label %loop_header.epil
3179; EPILOG:       loop_header.epil:
3180; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
3181; EPILOG-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]
3182; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ]
3183; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil
3184; EPILOG:       loop_exiting.epil:
3185; EPILOG-NEXT:    %ivy.epil = add i64 %iv.epil, %add
3186; EPILOG-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
3187; EPILOG-NEXT:    i64 24, label %exit1.loopexit2
3188; EPILOG-NEXT:    i64 42, label %exit1.loopexit2
3189; EPILOG-NEXT:    ]
3190; EPILOG:       loop_latch.epil:
3191; EPILOG-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
3192; EPILOG-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
3193; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
3194; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
3195; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
3196; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %latchexit.epilog-lcssa, !llvm.loop !8
3197; EPILOG:       latchexit.epilog-lcssa:
3198; EPILOG-NEXT:    %sum.next.lcssa.ph1 = phi i64 [ %sum.next.epil, %loop_latch.epil ]
3199; EPILOG-NEXT:    br label %latchexit
3200; EPILOG:       latchexit:
3201; EPILOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.lcssa.ph1, %latchexit.epilog-lcssa ]
3202; EPILOG-NEXT:    ret i64 %sum.next.lcssa
3203; EPILOG:       loop_exiting.1:
3204; EPILOG-NEXT:    %ivy.1 = add i64 %iv_next, %add
3205; EPILOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3206; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3207; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3208; EPILOG-NEXT:    ]
3209; EPILOG:       loop_latch.1:
3210; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3211; EPILOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3212; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
3213; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.2
3214; EPILOG:       loop_exiting.2:
3215; EPILOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add
3216; EPILOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
3217; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3218; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3219; EPILOG-NEXT:    ]
3220; EPILOG:       loop_latch.2:
3221; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
3222; EPILOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
3223; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
3224; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.3
3225; EPILOG:       loop_exiting.3:
3226; EPILOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add
3227; EPILOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
3228; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3229; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3230; EPILOG-NEXT:    ]
3231; EPILOG:       loop_latch.3:
3232; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
3233; EPILOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
3234; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
3235; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.4
3236; EPILOG:       loop_exiting.4:
3237; EPILOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add
3238; EPILOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
3239; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3240; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3241; EPILOG-NEXT:    ]
3242; EPILOG:       loop_latch.4:
3243; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
3244; EPILOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
3245; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
3246; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.5
3247; EPILOG:       loop_exiting.5:
3248; EPILOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add
3249; EPILOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
3250; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3251; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3252; EPILOG-NEXT:    ]
3253; EPILOG:       loop_latch.5:
3254; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
3255; EPILOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
3256; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
3257; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.6
3258; EPILOG:       loop_exiting.6:
3259; EPILOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add
3260; EPILOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
3261; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3262; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3263; EPILOG-NEXT:    ]
3264; EPILOG:       loop_latch.6:
3265; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
3266; EPILOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
3267; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
3268; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.7
3269; EPILOG:       loop_exiting.7:
3270; EPILOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add
3271; EPILOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
3272; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3273; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3274; EPILOG-NEXT:    ]
3275; EPILOG:       loop_latch.7:
3276; EPILOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
3277; EPILOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
3278; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
3279; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0
3280; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %latchexit.unr-lcssa.loopexit
3281;
3282; EPILOG-BLOCK-LABEL: @test5(
3283; EPILOG-BLOCK-NEXT:  entry:
3284; EPILOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
3285; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
3286; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
3287; EPILOG-BLOCK-NEXT:    br i1 %1, label %latchexit.unr-lcssa, label %entry.new
3288; EPILOG-BLOCK:       entry.new:
3289; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
3290; EPILOG-BLOCK-NEXT:    br label %loop_header
3291; EPILOG-BLOCK:       loop_header:
3292; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
3293; EPILOG-BLOCK-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
3294; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %loop_latch.1 ]
3295; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3296; EPILOG-BLOCK:       loop_exiting:
3297; EPILOG-BLOCK-NEXT:    %ivy = add i64 %iv, %add
3298; EPILOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
3299; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3300; EPILOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3301; EPILOG-BLOCK-NEXT:    ]
3302; EPILOG-BLOCK:       loop_latch:
3303; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3304; EPILOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
3305; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
3306; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3307; EPILOG-BLOCK:       exit1.loopexit:
3308; EPILOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]
3309; EPILOG-BLOCK-NEXT:    br label %exit1
3310; EPILOG-BLOCK:       exit1:
3311; EPILOG-BLOCK-NEXT:    %result = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ], [ %result.ph, %exit1.loopexit ]
3312; EPILOG-BLOCK-NEXT:    ret i64 %result
3313; EPILOG-BLOCK:       latchexit.unr-lcssa.loopexit:
3314; EPILOG-BLOCK-NEXT:    %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3315; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
3316; EPILOG-BLOCK-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3317; EPILOG-BLOCK-NEXT:    br label %latchexit.unr-lcssa
3318; EPILOG-BLOCK:       latchexit.unr-lcssa:
3319; EPILOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ]
3320; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ]
3321; EPILOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ]
3322; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3323; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit
3324; EPILOG-BLOCK:       loop_header.epil.preheader:
3325; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
3326; EPILOG-BLOCK:       loop_header.epil:
3327; EPILOG-BLOCK-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ]
3328; EPILOG-BLOCK-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ]
3329; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil
3330; EPILOG-BLOCK:       loop_exiting.epil:
3331; EPILOG-BLOCK-NEXT:    %ivy.epil = add i64 %iv.epil, %add
3332; EPILOG-BLOCK-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
3333; EPILOG-BLOCK-NEXT:    i64 24, label %exit1
3334; EPILOG-BLOCK-NEXT:    i64 42, label %exit1
3335; EPILOG-BLOCK-NEXT:    ]
3336; EPILOG-BLOCK:       loop_latch.epil:
3337; EPILOG-BLOCK-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
3338; EPILOG-BLOCK-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
3339; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
3340; EPILOG-BLOCK-NEXT:    br label %latchexit.epilog-lcssa
3341; EPILOG-BLOCK:       latchexit.epilog-lcssa:
3342; EPILOG-BLOCK-NEXT:    br label %latchexit
3343; EPILOG-BLOCK:       latchexit:
3344; EPILOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.epil, %latchexit.epilog-lcssa ]
3345; EPILOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa
3346; EPILOG-BLOCK:       loop_exiting.1:
3347; EPILOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add
3348; EPILOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3349; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3350; EPILOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3351; EPILOG-BLOCK-NEXT:    ]
3352; EPILOG-BLOCK:       loop_latch.1:
3353; EPILOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3354; EPILOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3355; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
3356; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0
3357; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !8
3358;
3359; PROLOG-LABEL: @test5(
3360; PROLOG-NEXT:  entry:
3361; PROLOG-NEXT:    %0 = add i64 %trip, -1
3362; PROLOG-NEXT:    %xtraiter = and i64 %trip, 7
3363; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3364; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
3365; PROLOG:       loop_header.prol.preheader:
3366; PROLOG-NEXT:    br label %loop_header.prol
3367; PROLOG:       loop_header.prol:
3368; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
3369; PROLOG-NEXT:    %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ]
3370; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ]
3371; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol
3372; PROLOG:       loop_exiting.prol:
3373; PROLOG-NEXT:    %ivy.prol = add i64 %iv.prol, %add
3374; PROLOG-NEXT:    switch i64 %sum.prol, label %loop_latch.prol [
3375; PROLOG-NEXT:    i64 24, label %exit1.loopexit1
3376; PROLOG-NEXT:    i64 42, label %exit1.loopexit1
3377; PROLOG-NEXT:    ]
3378; PROLOG:       loop_latch.prol:
3379; PROLOG-NEXT:    %iv_next.prol = add nuw nsw i64 %iv.prol, 1
3380; PROLOG-NEXT:    %sum.next.prol = add i64 %sum.prol, %add
3381; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
3382; PROLOG-NEXT:    %prol.iter.sub = sub i64 %prol.iter, 1
3383; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
3384; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !8
3385; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
3386; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
3387; PROLOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
3388; PROLOG-NEXT:    %sum.next.lcssa.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
3389; PROLOG-NEXT:    br label %loop_header.prol.loopexit
3390; PROLOG:       loop_header.prol.loopexit:
3391; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
3392; PROLOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
3393; PROLOG-NEXT:    %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %sum.next.lcssa.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
3394; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
3395; PROLOG-NEXT:    br i1 %1, label %latchexit, label %entry.new
3396; PROLOG:       entry.new:
3397; PROLOG-NEXT:    br label %loop_header
3398; PROLOG:       loop_header:
3399; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
3400; PROLOG-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
3401; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3402; PROLOG:       loop_exiting:
3403; PROLOG-NEXT:    %ivy = add i64 %iv, %add
3404; PROLOG-NEXT:    switch i64 %sum, label %loop_latch [
3405; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3406; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3407; PROLOG-NEXT:    ]
3408; PROLOG:       loop_latch:
3409; PROLOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3410; PROLOG-NEXT:    %sum.next = add i64 %sum, %add
3411; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3412; PROLOG:       exit1.loopexit:
3413; 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 ]
3414; PROLOG-NEXT:    br label %exit1
3415; PROLOG:       exit1.loopexit1:
3416; PROLOG-NEXT:    %result.ph2 = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ]
3417; PROLOG-NEXT:    br label %exit1
3418; PROLOG:       exit1:
3419; PROLOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph2, %exit1.loopexit1 ]
3420; PROLOG-NEXT:    ret i64 %result
3421; PROLOG:       latchexit.unr-lcssa:
3422; PROLOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3423; PROLOG-NEXT:    br label %latchexit
3424; PROLOG:       latchexit:
3425; PROLOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]
3426; PROLOG-NEXT:    ret i64 %sum.next.lcssa
3427; PROLOG:       loop_exiting.1:
3428; PROLOG-NEXT:    %ivy.1 = add i64 %iv_next, %add
3429; PROLOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3430; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3431; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3432; PROLOG-NEXT:    ]
3433; PROLOG:       loop_latch.1:
3434; PROLOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3435; PROLOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3436; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.2
3437; PROLOG:       loop_exiting.2:
3438; PROLOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add
3439; PROLOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
3440; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3441; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3442; PROLOG-NEXT:    ]
3443; PROLOG:       loop_latch.2:
3444; PROLOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
3445; PROLOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
3446; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.3
3447; PROLOG:       loop_exiting.3:
3448; PROLOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add
3449; PROLOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
3450; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3451; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3452; PROLOG-NEXT:    ]
3453; PROLOG:       loop_latch.3:
3454; PROLOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
3455; PROLOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
3456; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.4
3457; PROLOG:       loop_exiting.4:
3458; PROLOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add
3459; PROLOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
3460; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3461; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3462; PROLOG-NEXT:    ]
3463; PROLOG:       loop_latch.4:
3464; PROLOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
3465; PROLOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
3466; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.5
3467; PROLOG:       loop_exiting.5:
3468; PROLOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add
3469; PROLOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
3470; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3471; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3472; PROLOG-NEXT:    ]
3473; PROLOG:       loop_latch.5:
3474; PROLOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
3475; PROLOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
3476; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.6
3477; PROLOG:       loop_exiting.6:
3478; PROLOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add
3479; PROLOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
3480; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3481; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3482; PROLOG-NEXT:    ]
3483; PROLOG:       loop_latch.6:
3484; PROLOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
3485; PROLOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
3486; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.7
3487; PROLOG:       loop_exiting.7:
3488; PROLOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add
3489; PROLOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
3490; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3491; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3492; PROLOG-NEXT:    ]
3493; PROLOG:       loop_latch.7:
3494; PROLOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
3495; PROLOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
3496; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
3497; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %latchexit.unr-lcssa
3498;
3499; PROLOG-BLOCK-LABEL: @test5(
3500; PROLOG-BLOCK-NEXT:  entry:
3501; PROLOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
3502; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
3503; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3504; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
3505; PROLOG-BLOCK:       loop_header.prol.preheader:
3506; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
3507; PROLOG-BLOCK:       loop_header.prol:
3508; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol
3509; PROLOG-BLOCK:       loop_exiting.prol:
3510; PROLOG-BLOCK-NEXT:    %ivy.prol = add i64 0, %add
3511; PROLOG-BLOCK-NEXT:    switch i64 0, label %loop_latch.prol [
3512; PROLOG-BLOCK-NEXT:    i64 24, label %exit1
3513; PROLOG-BLOCK-NEXT:    i64 42, label %exit1
3514; PROLOG-BLOCK-NEXT:    ]
3515; PROLOG-BLOCK:       loop_latch.prol:
3516; PROLOG-BLOCK-NEXT:    %iv_next.prol = add nuw nsw i64 0, 1
3517; PROLOG-BLOCK-NEXT:    %sum.next.prol = add i64 0, %add
3518; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
3519; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
3520; PROLOG-BLOCK:       loop_header.prol.loopexit:
3521; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv_next.prol, %loop_latch.prol ]
3522; PROLOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.next.prol, %loop_latch.prol ]
3523; PROLOG-BLOCK-NEXT:    %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %sum.next.prol, %loop_latch.prol ]
3524; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
3525; PROLOG-BLOCK-NEXT:    br i1 %1, label %latchexit, label %entry.new
3526; PROLOG-BLOCK:       entry.new:
3527; PROLOG-BLOCK-NEXT:    br label %loop_header
3528; PROLOG-BLOCK:       loop_header:
3529; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
3530; PROLOG-BLOCK-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
3531; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3532; PROLOG-BLOCK:       loop_exiting:
3533; PROLOG-BLOCK-NEXT:    %ivy = add i64 %iv, %add
3534; PROLOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
3535; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3536; PROLOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3537; PROLOG-BLOCK-NEXT:    ]
3538; PROLOG-BLOCK:       loop_latch:
3539; PROLOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3540; PROLOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
3541; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3542; PROLOG-BLOCK:       exit1.loopexit:
3543; PROLOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]
3544; PROLOG-BLOCK-NEXT:    br label %exit1
3545; PROLOG-BLOCK:       exit1:
3546; PROLOG-BLOCK-NEXT:    %result = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ], [ %result.ph, %exit1.loopexit ]
3547; PROLOG-BLOCK-NEXT:    ret i64 %result
3548; PROLOG-BLOCK:       latchexit.unr-lcssa:
3549; PROLOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3550; PROLOG-BLOCK-NEXT:    br label %latchexit
3551; PROLOG-BLOCK:       latchexit:
3552; PROLOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]
3553; PROLOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa
3554; PROLOG-BLOCK:       loop_exiting.1:
3555; PROLOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add
3556; PROLOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3557; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3558; PROLOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3559; PROLOG-BLOCK-NEXT:    ]
3560; PROLOG-BLOCK:       loop_latch.1:
3561; PROLOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3562; PROLOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3563; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
3564; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %latchexit.unr-lcssa, !llvm.loop !8
3565;
3566
3567entry:
3568  br label %loop_header
3569
3570loop_header:
3571  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
3572  %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ]
3573  br i1 %cond, label %loop_latch, label %loop_exiting
3574
3575loop_exiting:
3576  %ivy = add i64 %iv, %add
3577  switch i64 %sum, label %loop_latch [
3578  i64 24, label %exit1
3579  i64 42, label %exit1
3580  ]
3581
3582loop_latch:
3583  %iv_next = add nuw nsw i64 %iv, 1
3584  %sum.next = add i64 %sum, %add
3585  %cmp = icmp ne i64 %iv_next, %trip
3586  br i1 %cmp, label %loop_header, label %latchexit
3587
3588exit1:
3589  %result = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ]
3590  ret i64 %result
3591
3592latchexit:
3593  ret i64 %sum.next
3594}
3595
3596; test when exit blocks have successors.
3597define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) {
3598; EPILOG-LABEL: @test6(
3599; EPILOG-NEXT:  entry:
3600; EPILOG-NEXT:    %0 = add i64 %n, -1
3601; EPILOG-NEXT:    %xtraiter = and i64 %n, 7
3602; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
3603; EPILOG-NEXT:    br i1 %1, label %latch_exit.unr-lcssa, label %entry.new
3604; EPILOG:       entry.new:
3605; EPILOG-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
3606; EPILOG-NEXT:    br label %header
3607; EPILOG:       header:
3608; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
3609; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
3610; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %latch.7 ]
3611; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
3612; EPILOG:       for.exiting_block:
3613; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
3614; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
3615; EPILOG:       latch:
3616; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3617; EPILOG-NEXT:    %load = load i32, i32* %arrayidx, align 4
3618; EPILOG-NEXT:    %add = add nsw i32 %load, %sum.02
3619; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
3620; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
3621; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
3622; EPILOG:       latch_exit.unr-lcssa.loopexit:
3623; EPILOG-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %latch.7 ]
3624; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
3625; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
3626; EPILOG-NEXT:    br label %latch_exit.unr-lcssa
3627; EPILOG:       latch_exit.unr-lcssa:
3628; EPILOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ]
3629; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3630; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3631; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3632; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit
3633; EPILOG:       header.epil.preheader:
3634; EPILOG-NEXT:    br label %header.epil
3635; EPILOG:       header.epil:
3636; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
3637; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
3638; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
3639; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil
3640; EPILOG:       for.exiting_block.epil:
3641; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
3642; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit2, label %latch.epil
3643; EPILOG:       latch.epil:
3644; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
3645; EPILOG-NEXT:    %load.epil = load i32, i32* %arrayidx.epil, align 4
3646; EPILOG-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.epil
3647; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
3648; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
3649; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
3650; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
3651; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latch_exit.epilog-lcssa, !llvm.loop !9
3652; EPILOG:       latch_exit.epilog-lcssa:
3653; EPILOG-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %latch.epil ]
3654; EPILOG-NEXT:    br label %latch_exit
3655; EPILOG:       latch_exit:
3656; EPILOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %sum.0.lcssa.ph1, %latch_exit.epilog-lcssa ]
3657; EPILOG-NEXT:    ret i32 %sum.0.lcssa
3658; EPILOG:       for.exit2.loopexit:
3659; 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 ]
3660; EPILOG-NEXT:    br label %for.exit2
3661; EPILOG:       for.exit2.loopexit2:
3662; EPILOG-NEXT:    %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
3663; EPILOG-NEXT:    br label %for.exit2
3664; EPILOG:       for.exit2:
3665; EPILOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
3666; EPILOG-NEXT:    %addx = add i32 %retval, %x
3667; EPILOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3668; EPILOG:       exit_true:
3669; EPILOG-NEXT:    ret i32 %retval
3670; EPILOG:       exit_false:
3671; EPILOG-NEXT:    ret i32 %addx
3672; EPILOG:       for.exiting_block.1:
3673; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3674; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3675; EPILOG:       latch.1:
3676; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3677; EPILOG-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
3678; EPILOG-NEXT:    %add.1 = add nsw i32 %load.1, %add
3679; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
3680; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
3681; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
3682; EPILOG:       for.exiting_block.2:
3683; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
3684; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
3685; EPILOG:       latch.2:
3686; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
3687; EPILOG-NEXT:    %load.2 = load i32, i32* %arrayidx.2, align 4
3688; EPILOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.1
3689; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
3690; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
3691; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
3692; EPILOG:       for.exiting_block.3:
3693; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
3694; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
3695; EPILOG:       latch.3:
3696; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
3697; EPILOG-NEXT:    %load.3 = load i32, i32* %arrayidx.3, align 4
3698; EPILOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.2
3699; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
3700; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
3701; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
3702; EPILOG:       for.exiting_block.4:
3703; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
3704; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
3705; EPILOG:       latch.4:
3706; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
3707; EPILOG-NEXT:    %load.4 = load i32, i32* %arrayidx.4, align 4
3708; EPILOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.3
3709; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
3710; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
3711; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
3712; EPILOG:       for.exiting_block.5:
3713; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
3714; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
3715; EPILOG:       latch.5:
3716; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
3717; EPILOG-NEXT:    %load.5 = load i32, i32* %arrayidx.5, align 4
3718; EPILOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.4
3719; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
3720; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
3721; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
3722; EPILOG:       for.exiting_block.6:
3723; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
3724; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
3725; EPILOG:       latch.6:
3726; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
3727; EPILOG-NEXT:    %load.6 = load i32, i32* %arrayidx.6, align 4
3728; EPILOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.5
3729; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
3730; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
3731; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
3732; EPILOG:       for.exiting_block.7:
3733; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
3734; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
3735; EPILOG:       latch.7:
3736; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
3737; EPILOG-NEXT:    %load.7 = load i32, i32* %arrayidx.7, align 4
3738; EPILOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.6
3739; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
3740; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
3741; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
3742; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latch_exit.unr-lcssa.loopexit, label %header
3743;
3744; EPILOG-BLOCK-LABEL: @test6(
3745; EPILOG-BLOCK-NEXT:  entry:
3746; EPILOG-BLOCK-NEXT:    %0 = add i64 %n, -1
3747; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
3748; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
3749; EPILOG-BLOCK-NEXT:    br i1 %1, label %latch_exit.unr-lcssa, label %entry.new
3750; EPILOG-BLOCK:       entry.new:
3751; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
3752; EPILOG-BLOCK-NEXT:    br label %header
3753; EPILOG-BLOCK:       header:
3754; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
3755; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
3756; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %latch.1 ]
3757; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
3758; EPILOG-BLOCK:       for.exiting_block:
3759; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
3760; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
3761; EPILOG-BLOCK:       latch:
3762; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3763; EPILOG-BLOCK-NEXT:    %load = load i32, i32* %arrayidx, align 4
3764; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %load, %sum.02
3765; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
3766; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
3767; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
3768; EPILOG-BLOCK:       latch_exit.unr-lcssa.loopexit:
3769; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %latch.1 ]
3770; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
3771; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
3772; EPILOG-BLOCK-NEXT:    br label %latch_exit.unr-lcssa
3773; EPILOG-BLOCK:       latch_exit.unr-lcssa:
3774; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ]
3775; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3776; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3777; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3778; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit
3779; EPILOG-BLOCK:       header.epil.preheader:
3780; EPILOG-BLOCK-NEXT:    br label %header.epil
3781; EPILOG-BLOCK:       header.epil:
3782; EPILOG-BLOCK-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.unr, %header.epil.preheader ]
3783; EPILOG-BLOCK-NEXT:    %sum.02.epil = phi i32 [ %sum.02.unr, %header.epil.preheader ]
3784; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.epil
3785; EPILOG-BLOCK:       for.exiting_block.epil:
3786; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
3787; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %latch.epil
3788; EPILOG-BLOCK:       latch.epil:
3789; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
3790; EPILOG-BLOCK-NEXT:    %load.epil = load i32, i32* %arrayidx.epil, align 4
3791; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.epil
3792; EPILOG-BLOCK-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
3793; EPILOG-BLOCK-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
3794; EPILOG-BLOCK-NEXT:    br label %latch_exit.epilog-lcssa
3795; EPILOG-BLOCK:       latch_exit.epilog-lcssa:
3796; EPILOG-BLOCK-NEXT:    br label %latch_exit
3797; EPILOG-BLOCK:       latch_exit:
3798; EPILOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %add.epil, %latch_exit.epilog-lcssa ]
3799; EPILOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
3800; EPILOG-BLOCK:       for.exit2.loopexit:
3801; EPILOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]
3802; EPILOG-BLOCK-NEXT:    br label %for.exit2
3803; EPILOG-BLOCK:       for.exit2:
3804; EPILOG-BLOCK-NEXT:    %retval = phi i32 [ %sum.02.epil, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ]
3805; EPILOG-BLOCK-NEXT:    %addx = add i32 %retval, %x
3806; EPILOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3807; EPILOG-BLOCK:       exit_true:
3808; EPILOG-BLOCK-NEXT:    ret i32 %retval
3809; EPILOG-BLOCK:       exit_false:
3810; EPILOG-BLOCK-NEXT:    ret i32 %addx
3811; EPILOG-BLOCK:       for.exiting_block.1:
3812; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3813; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3814; EPILOG-BLOCK:       latch.1:
3815; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3816; EPILOG-BLOCK-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
3817; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add
3818; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
3819; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
3820; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0
3821; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latch_exit.unr-lcssa.loopexit, label %header, !llvm.loop !9
3822;
3823; PROLOG-LABEL: @test6(
3824; PROLOG-NEXT:  entry:
3825; PROLOG-NEXT:    %0 = add i64 %n, -1
3826; PROLOG-NEXT:    %xtraiter = and i64 %n, 7
3827; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3828; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
3829; PROLOG:       header.prol.preheader:
3830; PROLOG-NEXT:    br label %header.prol
3831; PROLOG:       header.prol:
3832; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
3833; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
3834; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ]
3835; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol
3836; PROLOG:       for.exiting_block.prol:
3837; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
3838; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit1, label %latch.prol
3839; PROLOG:       latch.prol:
3840; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
3841; PROLOG-NEXT:    %load.prol = load i32, i32* %arrayidx.prol, align 4
3842; PROLOG-NEXT:    %add.prol = add nsw i32 %load.prol, %sum.02.prol
3843; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
3844; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
3845; PROLOG-NEXT:    %prol.iter.sub = sub i64 %prol.iter, 1
3846; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
3847; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !9
3848; PROLOG:       header.prol.loopexit.unr-lcssa:
3849; PROLOG-NEXT:    %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %latch.prol ]
3850; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
3851; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
3852; PROLOG-NEXT:    br label %header.prol.loopexit
3853; PROLOG:       header.prol.loopexit:
3854; PROLOG-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ]
3855; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
3856; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
3857; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
3858; PROLOG-NEXT:    br i1 %1, label %latch_exit, label %entry.new
3859; PROLOG:       entry.new:
3860; PROLOG-NEXT:    br label %header
3861; PROLOG:       header:
3862; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
3863; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
3864; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
3865; PROLOG:       for.exiting_block:
3866; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
3867; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
3868; PROLOG:       latch:
3869; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3870; PROLOG-NEXT:    %load = load i32, i32* %arrayidx, align 4
3871; PROLOG-NEXT:    %add = add nsw i32 %load, %sum.02
3872; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
3873; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
3874; PROLOG:       latch_exit.unr-lcssa:
3875; PROLOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %latch.7 ]
3876; PROLOG-NEXT:    br label %latch_exit
3877; PROLOG:       latch_exit:
3878; PROLOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]
3879; PROLOG-NEXT:    ret i32 %sum.0.lcssa
3880; PROLOG:       for.exit2.loopexit:
3881; 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 ]
3882; PROLOG-NEXT:    br label %for.exit2
3883; PROLOG:       for.exit2.loopexit1:
3884; PROLOG-NEXT:    %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
3885; PROLOG-NEXT:    br label %for.exit2
3886; PROLOG:       for.exit2:
3887; PROLOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
3888; PROLOG-NEXT:    %addx = add i32 %retval, %x
3889; PROLOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3890; PROLOG:       exit_true:
3891; PROLOG-NEXT:    ret i32 %retval
3892; PROLOG:       exit_false:
3893; PROLOG-NEXT:    ret i32 %addx
3894; PROLOG:       for.exiting_block.1:
3895; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3896; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3897; PROLOG:       latch.1:
3898; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3899; PROLOG-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
3900; PROLOG-NEXT:    %add.1 = add nsw i32 %load.1, %add
3901; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
3902; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
3903; PROLOG:       for.exiting_block.2:
3904; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
3905; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
3906; PROLOG:       latch.2:
3907; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
3908; PROLOG-NEXT:    %load.2 = load i32, i32* %arrayidx.2, align 4
3909; PROLOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.1
3910; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
3911; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
3912; PROLOG:       for.exiting_block.3:
3913; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
3914; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
3915; PROLOG:       latch.3:
3916; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
3917; PROLOG-NEXT:    %load.3 = load i32, i32* %arrayidx.3, align 4
3918; PROLOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.2
3919; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
3920; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
3921; PROLOG:       for.exiting_block.4:
3922; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
3923; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
3924; PROLOG:       latch.4:
3925; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
3926; PROLOG-NEXT:    %load.4 = load i32, i32* %arrayidx.4, align 4
3927; PROLOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.3
3928; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
3929; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
3930; PROLOG:       for.exiting_block.5:
3931; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
3932; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
3933; PROLOG:       latch.5:
3934; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
3935; PROLOG-NEXT:    %load.5 = load i32, i32* %arrayidx.5, align 4
3936; PROLOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.4
3937; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
3938; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
3939; PROLOG:       for.exiting_block.6:
3940; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
3941; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
3942; PROLOG:       latch.6:
3943; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
3944; PROLOG-NEXT:    %load.6 = load i32, i32* %arrayidx.6, align 4
3945; PROLOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.5
3946; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
3947; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
3948; PROLOG:       for.exiting_block.7:
3949; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
3950; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
3951; PROLOG:       latch.7:
3952; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
3953; PROLOG-NEXT:    %load.7 = load i32, i32* %arrayidx.7, align 4
3954; PROLOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.6
3955; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
3956; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
3957; PROLOG-NEXT:    br i1 %exitcond.7, label %latch_exit.unr-lcssa, label %header
3958;
3959; PROLOG-BLOCK-LABEL: @test6(
3960; PROLOG-BLOCK-NEXT:  entry:
3961; PROLOG-BLOCK-NEXT:    %0 = add i64 %n, -1
3962; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
3963; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3964; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
3965; PROLOG-BLOCK:       header.prol.preheader:
3966; PROLOG-BLOCK-NEXT:    br label %header.prol
3967; PROLOG-BLOCK:       header.prol:
3968; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.prol
3969; PROLOG-BLOCK:       for.exiting_block.prol:
3970; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
3971; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %latch.prol
3972; PROLOG-BLOCK:       latch.prol:
3973; PROLOG-BLOCK-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 0
3974; PROLOG-BLOCK-NEXT:    %load.prol = load i32, i32* %arrayidx.prol, align 4
3975; PROLOG-BLOCK-NEXT:    %add.prol = add nsw i32 %load.prol, 0
3976; PROLOG-BLOCK-NEXT:    %indvars.iv.next.prol = add i64 0, 1
3977; PROLOG-BLOCK-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
3978; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
3979; PROLOG-BLOCK:       header.prol.loopexit:
3980; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %add.prol, %latch.prol ]
3981; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.next.prol, %latch.prol ]
3982; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %add.prol, %latch.prol ]
3983; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
3984; PROLOG-BLOCK-NEXT:    br i1 %1, label %latch_exit, label %entry.new
3985; PROLOG-BLOCK:       entry.new:
3986; PROLOG-BLOCK-NEXT:    br label %header
3987; PROLOG-BLOCK:       header:
3988; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
3989; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
3990; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
3991; PROLOG-BLOCK:       for.exiting_block:
3992; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
3993; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
3994; PROLOG-BLOCK:       latch:
3995; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3996; PROLOG-BLOCK-NEXT:    %load = load i32, i32* %arrayidx, align 4
3997; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %load, %sum.02
3998; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
3999; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
4000; PROLOG-BLOCK:       latch_exit.unr-lcssa:
4001; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %latch.1 ]
4002; PROLOG-BLOCK-NEXT:    br label %latch_exit
4003; PROLOG-BLOCK:       latch_exit:
4004; PROLOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]
4005; PROLOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
4006; PROLOG-BLOCK:       for.exit2.loopexit:
4007; PROLOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]
4008; PROLOG-BLOCK-NEXT:    br label %for.exit2
4009; PROLOG-BLOCK:       for.exit2:
4010; PROLOG-BLOCK-NEXT:    %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ]
4011; PROLOG-BLOCK-NEXT:    %addx = add i32 %retval, %x
4012; PROLOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false
4013; PROLOG-BLOCK:       exit_true:
4014; PROLOG-BLOCK-NEXT:    ret i32 %retval
4015; PROLOG-BLOCK:       exit_false:
4016; PROLOG-BLOCK-NEXT:    ret i32 %addx
4017; PROLOG-BLOCK:       for.exiting_block.1:
4018; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
4019; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
4020; PROLOG-BLOCK:       latch.1:
4021; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
4022; PROLOG-BLOCK-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
4023; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add
4024; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
4025; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
4026; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latch_exit.unr-lcssa, label %header, !llvm.loop !9
4027;
4028
4029entry:
4030  br label %header
4031
4032header:
4033  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
4034  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
4035  br i1 false, label %for.exit2, label %for.exiting_block
4036
4037for.exiting_block:
4038  %cmp = icmp eq i64 %n, 42
4039  br i1 %cmp, label %for.exit2, label %latch
4040
4041latch:
4042  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
4043  %load = load i32, i32* %arrayidx, align 4
4044  %add = add nsw i32 %load, %sum.02
4045  %indvars.iv.next = add i64 %indvars.iv, 1
4046  %exitcond = icmp eq i64 %indvars.iv.next, %n
4047  br i1 %exitcond, label %latch_exit, label %header
4048
4049latch_exit:
4050  %sum.0.lcssa = phi i32 [ %add, %latch ]
4051  ret i32 %sum.0.lcssa
4052
4053for.exit2:
4054  %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ]
4055  %addx = add i32 %retval, %x
4056  br i1 %cond, label %exit_true, label %exit_false
4057
4058exit_true:
4059  ret i32 %retval
4060
4061exit_false:
4062  ret i32 %addx
4063}
4064
4065; test when value in exit block does not have VMap.
4066define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) {
4067; EPILOG-LABEL: @test7(
4068; EPILOG-NEXT:  bb:
4069; EPILOG-NEXT:    %i = icmp slt i32 undef, 2
4070; EPILOG-NEXT:    %sext = sext i32 undef to i64
4071; EPILOG-NEXT:    %shft = ashr exact i32 %arg, 16
4072; EPILOG-NEXT:    br i1 %i, label %loopexit2, label %preheader
4073; EPILOG:       preheader:
4074; EPILOG-NEXT:    %0 = add nsw i64 %sext, -1
4075; EPILOG-NEXT:    %1 = add nsw i64 %sext, -2
4076; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
4077; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
4078; EPILOG-NEXT:    br i1 %2, label %latchexit.unr-lcssa, label %preheader.new
4079; EPILOG:       preheader.new:
4080; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
4081; EPILOG-NEXT:    br label %header
4082; EPILOG:       header:
4083; EPILOG-NEXT:    %i6 = phi i64 [ 1, %preheader.new ], [ %add.7, %latch.7 ]
4084; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %preheader.new ], [ %niter.nsub.7, %latch.7 ]
4085; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4086; EPILOG:       latch:
4087; EPILOG-NEXT:    %add = add nuw nsw i64 %i6, 1
4088; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
4089; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4090; EPILOG:       latchexit.unr-lcssa.loopexit:
4091; EPILOG-NEXT:    %i6.unr.ph = phi i64 [ %add.7, %latch.7 ]
4092; EPILOG-NEXT:    br label %latchexit.unr-lcssa
4093; EPILOG:       latchexit.unr-lcssa:
4094; EPILOG-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ]
4095; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4096; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit
4097; EPILOG:       header.epil.preheader:
4098; EPILOG-NEXT:    br label %header.epil
4099; EPILOG:       header.epil:
4100; EPILOG-NEXT:    %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ], [ %add.epil, %latch.epil ]
4101; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
4102; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit1, label %latch.epil
4103; EPILOG:       latch.epil:
4104; EPILOG-NEXT:    %add.epil = add nuw nsw i64 %i6.epil, 1
4105; EPILOG-NEXT:    %i9.epil = icmp slt i64 %add.epil, %sext
4106; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
4107; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
4108; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchexit.epilog-lcssa, !llvm.loop !10
4109; EPILOG:       latchexit.epilog-lcssa:
4110; EPILOG-NEXT:    br label %latchexit
4111; EPILOG:       latchexit:
4112; EPILOG-NEXT:    unreachable
4113; EPILOG:       loopexit2:
4114; EPILOG-NEXT:    ret i32 %shft
4115; EPILOG:       loopexit1.loopexit:
4116; 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 ]
4117; EPILOG-NEXT:    br label %loopexit1
4118; EPILOG:       loopexit1.loopexit1:
4119; EPILOG-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.epil ]
4120; EPILOG-NEXT:    br label %loopexit1
4121; EPILOG:       loopexit1:
4122; EPILOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
4123; EPILOG-NEXT:    ret i32 %sext3
4124; EPILOG:       latch.1:
4125; EPILOG-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4126; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
4127; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.2
4128; EPILOG:       latch.2:
4129; EPILOG-NEXT:    %add.2 = add nuw nsw i64 %add.1, 1
4130; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
4131; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.3
4132; EPILOG:       latch.3:
4133; EPILOG-NEXT:    %add.3 = add nuw nsw i64 %add.2, 1
4134; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
4135; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.4
4136; EPILOG:       latch.4:
4137; EPILOG-NEXT:    %add.4 = add nuw nsw i64 %add.3, 1
4138; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
4139; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.5
4140; EPILOG:       latch.5:
4141; EPILOG-NEXT:    %add.5 = add nuw nsw i64 %add.4, 1
4142; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
4143; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.6
4144; EPILOG:       latch.6:
4145; EPILOG-NEXT:    %add.6 = add nuw nsw i64 %add.5, 1
4146; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
4147; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.7
4148; EPILOG:       latch.7:
4149; EPILOG-NEXT:    %add.7 = add nuw nsw i64 %add.6, 1
4150; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
4151; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0
4152; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %latchexit.unr-lcssa.loopexit
4153;
4154; EPILOG-BLOCK-LABEL: @test7(
4155; EPILOG-BLOCK-NEXT:  bb:
4156; EPILOG-BLOCK-NEXT:    %i = icmp slt i32 undef, 2
4157; EPILOG-BLOCK-NEXT:    %sext = sext i32 undef to i64
4158; EPILOG-BLOCK-NEXT:    %shft = ashr exact i32 %arg, 16
4159; EPILOG-BLOCK-NEXT:    br i1 %i, label %loopexit2, label %preheader
4160; EPILOG-BLOCK:       preheader:
4161; EPILOG-BLOCK-NEXT:    %0 = add nsw i64 %sext, -1
4162; EPILOG-BLOCK-NEXT:    %1 = add nsw i64 %sext, -2
4163; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4164; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4165; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchexit.unr-lcssa, label %preheader.new
4166; EPILOG-BLOCK:       preheader.new:
4167; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
4168; EPILOG-BLOCK-NEXT:    br label %header
4169; EPILOG-BLOCK:       header:
4170; EPILOG-BLOCK-NEXT:    %i6 = phi i64 [ 1, %preheader.new ], [ %add.1, %latch.1 ]
4171; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %preheader.new ], [ %niter.nsub.1, %latch.1 ]
4172; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4173; EPILOG-BLOCK:       latch:
4174; EPILOG-BLOCK-NEXT:    %add = add nuw nsw i64 %i6, 1
4175; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
4176; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4177; EPILOG-BLOCK:       latchexit.unr-lcssa.loopexit:
4178; EPILOG-BLOCK-NEXT:    %i6.unr.ph = phi i64 [ %add.1, %latch.1 ]
4179; EPILOG-BLOCK-NEXT:    br label %latchexit.unr-lcssa
4180; EPILOG-BLOCK:       latchexit.unr-lcssa:
4181; EPILOG-BLOCK-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ]
4182; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4183; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit
4184; EPILOG-BLOCK:       header.epil.preheader:
4185; EPILOG-BLOCK-NEXT:    br label %header.epil
4186; EPILOG-BLOCK:       header.epil:
4187; EPILOG-BLOCK-NEXT:    %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ]
4188; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1, label %latch.epil
4189; EPILOG-BLOCK:       latch.epil:
4190; EPILOG-BLOCK-NEXT:    %add.epil = add nuw nsw i64 %i6.epil, 1
4191; EPILOG-BLOCK-NEXT:    %i9.epil = icmp slt i64 %add.epil, %sext
4192; EPILOG-BLOCK-NEXT:    br label %latchexit.epilog-lcssa
4193; EPILOG-BLOCK:       latchexit.epilog-lcssa:
4194; EPILOG-BLOCK-NEXT:    br label %latchexit
4195; EPILOG-BLOCK:       latchexit:
4196; EPILOG-BLOCK-NEXT:    unreachable
4197; EPILOG-BLOCK:       loopexit2:
4198; EPILOG-BLOCK-NEXT:    ret i32 %shft
4199; EPILOG-BLOCK:       loopexit1.loopexit:
4200; EPILOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]
4201; EPILOG-BLOCK-NEXT:    br label %loopexit1
4202; EPILOG-BLOCK:       loopexit1:
4203; EPILOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.epil ], [ %sext3.ph, %loopexit1.loopexit ]
4204; EPILOG-BLOCK-NEXT:    ret i32 %sext3
4205; EPILOG-BLOCK:       latch.1:
4206; EPILOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4207; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
4208; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0
4209; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !10
4210;
4211; PROLOG-LABEL: @test7(
4212; PROLOG-NEXT:  bb:
4213; PROLOG-NEXT:    %i = icmp slt i32 undef, 2
4214; PROLOG-NEXT:    %sext = sext i32 undef to i64
4215; PROLOG-NEXT:    %shft = ashr exact i32 %arg, 16
4216; PROLOG-NEXT:    br i1 %i, label %loopexit2, label %preheader
4217; PROLOG:       preheader:
4218; PROLOG-NEXT:    %0 = add nsw i64 %sext, -1
4219; PROLOG-NEXT:    %1 = add nsw i64 %sext, -2
4220; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
4221; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4222; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4223; PROLOG:       header.prol.preheader:
4224; PROLOG-NEXT:    br label %header.prol
4225; PROLOG:       header.prol:
4226; PROLOG-NEXT:    %i6.prol = phi i64 [ 1, %header.prol.preheader ], [ %add.prol, %latch.prol ]
4227; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ]
4228; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit1, label %latch.prol
4229; PROLOG:       latch.prol:
4230; PROLOG-NEXT:    %add.prol = add nuw nsw i64 %i6.prol, 1
4231; PROLOG-NEXT:    %i9.prol = icmp slt i64 %add.prol, %sext
4232; PROLOG-NEXT:    %prol.iter.sub = sub i64 %prol.iter, 1
4233; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
4234; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !10
4235; PROLOG:       header.prol.loopexit.unr-lcssa:
4236; PROLOG-NEXT:    %i6.unr.ph = phi i64 [ %add.prol, %latch.prol ]
4237; PROLOG-NEXT:    br label %header.prol.loopexit
4238; PROLOG:       header.prol.loopexit:
4239; PROLOG-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %header.prol.loopexit.unr-lcssa ]
4240; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
4241; PROLOG-NEXT:    br i1 %2, label %latchexit, label %preheader.new
4242; PROLOG:       preheader.new:
4243; PROLOG-NEXT:    br label %header
4244; PROLOG:       header:
4245; PROLOG-NEXT:    %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.7, %latch.7 ]
4246; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4247; PROLOG:       latch:
4248; PROLOG-NEXT:    %add = add nuw nsw i64 %i6, 1
4249; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4250; PROLOG:       latchexit.unr-lcssa:
4251; PROLOG-NEXT:    br label %latchexit
4252; PROLOG:       latchexit:
4253; PROLOG-NEXT:    unreachable
4254; PROLOG:       loopexit2:
4255; PROLOG-NEXT:    ret i32 %shft
4256; PROLOG:       loopexit1.loopexit:
4257; 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 ]
4258; PROLOG-NEXT:    br label %loopexit1
4259; PROLOG:       loopexit1.loopexit1:
4260; PROLOG-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.prol ]
4261; PROLOG-NEXT:    br label %loopexit1
4262; PROLOG:       loopexit1:
4263; PROLOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
4264; PROLOG-NEXT:    ret i32 %sext3
4265; PROLOG:       latch.1:
4266; PROLOG-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4267; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.2
4268; PROLOG:       latch.2:
4269; PROLOG-NEXT:    %add.2 = add nuw nsw i64 %add.1, 1
4270; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.3
4271; PROLOG:       latch.3:
4272; PROLOG-NEXT:    %add.3 = add nuw nsw i64 %add.2, 1
4273; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.4
4274; PROLOG:       latch.4:
4275; PROLOG-NEXT:    %add.4 = add nuw nsw i64 %add.3, 1
4276; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.5
4277; PROLOG:       latch.5:
4278; PROLOG-NEXT:    %add.5 = add nuw nsw i64 %add.4, 1
4279; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.6
4280; PROLOG:       latch.6:
4281; PROLOG-NEXT:    %add.6 = add nuw nsw i64 %add.5, 1
4282; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.7
4283; PROLOG:       latch.7:
4284; PROLOG-NEXT:    %add.7 = add nuw nsw i64 %add.6, 1
4285; PROLOG-NEXT:    %i9.7 = icmp slt i64 %add.7, %sext
4286; PROLOG-NEXT:    br i1 %i9.7, label %header, label %latchexit.unr-lcssa
4287;
4288; PROLOG-BLOCK-LABEL: @test7(
4289; PROLOG-BLOCK-NEXT:  bb:
4290; PROLOG-BLOCK-NEXT:    %i = icmp slt i32 undef, 2
4291; PROLOG-BLOCK-NEXT:    %sext = sext i32 undef to i64
4292; PROLOG-BLOCK-NEXT:    %shft = ashr exact i32 %arg, 16
4293; PROLOG-BLOCK-NEXT:    br i1 %i, label %loopexit2, label %preheader
4294; PROLOG-BLOCK:       preheader:
4295; PROLOG-BLOCK-NEXT:    %0 = add nsw i64 %sext, -1
4296; PROLOG-BLOCK-NEXT:    %1 = add nsw i64 %sext, -2
4297; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4298; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4299; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4300; PROLOG-BLOCK:       header.prol.preheader:
4301; PROLOG-BLOCK-NEXT:    br label %header.prol
4302; PROLOG-BLOCK:       header.prol:
4303; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1, label %latch.prol
4304; PROLOG-BLOCK:       latch.prol:
4305; PROLOG-BLOCK-NEXT:    %add.prol = add nuw nsw i64 1, 1
4306; PROLOG-BLOCK-NEXT:    %i9.prol = icmp slt i64 %add.prol, %sext
4307; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
4308; PROLOG-BLOCK:       header.prol.loopexit:
4309; PROLOG-BLOCK-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %add.prol, %latch.prol ]
4310; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4311; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchexit, label %preheader.new
4312; PROLOG-BLOCK:       preheader.new:
4313; PROLOG-BLOCK-NEXT:    br label %header
4314; PROLOG-BLOCK:       header:
4315; PROLOG-BLOCK-NEXT:    %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.1, %latch.1 ]
4316; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4317; PROLOG-BLOCK:       latch:
4318; PROLOG-BLOCK-NEXT:    %add = add nuw nsw i64 %i6, 1
4319; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4320; PROLOG-BLOCK:       latchexit.unr-lcssa:
4321; PROLOG-BLOCK-NEXT:    br label %latchexit
4322; PROLOG-BLOCK:       latchexit:
4323; PROLOG-BLOCK-NEXT:    unreachable
4324; PROLOG-BLOCK:       loopexit2:
4325; PROLOG-BLOCK-NEXT:    ret i32 %shft
4326; PROLOG-BLOCK:       loopexit1.loopexit:
4327; PROLOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]
4328; PROLOG-BLOCK-NEXT:    br label %loopexit1
4329; PROLOG-BLOCK:       loopexit1:
4330; PROLOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.prol ], [ %sext3.ph, %loopexit1.loopexit ]
4331; PROLOG-BLOCK-NEXT:    ret i32 %sext3
4332; PROLOG-BLOCK:       latch.1:
4333; PROLOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4334; PROLOG-BLOCK-NEXT:    %i9.1 = icmp slt i64 %add.1, %sext
4335; PROLOG-BLOCK-NEXT:    br i1 %i9.1, label %header, label %latchexit.unr-lcssa, !llvm.loop !10
4336;
4337bb:
4338  %i = icmp slt i32 undef, 2
4339  %sext = sext i32 undef to i64
4340  %shft = ashr exact i32 %arg, 16
4341  br i1 %i, label %loopexit2, label %preheader
4342
4343preheader:                                              ; preds = %bb2
4344  br label %header
4345
4346header:                                              ; preds = %latch, %preheader
4347  %i6 = phi i64 [ 1, %preheader ], [ %add, %latch ]
4348  br i1 false, label %loopexit1, label %latch
4349
4350latch:                                              ; preds = %header
4351  %add = add nuw nsw i64 %i6, 1
4352  %i9 = icmp slt i64 %add, %sext
4353  br i1 %i9, label %header, label %latchexit
4354
4355latchexit:                                             ; preds = %latch
4356  unreachable
4357
4358loopexit2:                                             ; preds = %bb2
4359  ret i32 %shft
4360
4361loopexit1:                                             ; preds = %header
4362  %sext3 = phi i32 [ %shft, %header ]
4363  ret i32 %sext3
4364}
4365
4366; Nested loop and inner loop is unrolled
4367; FIXME: we cannot unroll with epilog remainder currently, because
4368; the outer loop does not contain the epilog preheader and epilog exit (while
4369; infact it should). This causes us to choke up on LCSSA form being incorrect in
4370; outer loop. However, the exit block where LCSSA fails, is infact still within
4371; the outer loop. For now, we just bail out in presence of outer loop and epilog
4372; loop is generated.
4373; The outer loop header is the preheader for the inner loop and the inner header
4374; branches back to the outer loop.
4375define void @test8() {
4376; EPILOG-LABEL: @test8(
4377; EPILOG-NEXT:  bb:
4378; EPILOG-NEXT:    br label %outerloop
4379; EPILOG:       outerloop.loopexit:
4380; EPILOG-NEXT:    br label %outerloop
4381; EPILOG:       outerloop:
4382; EPILOG-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]
4383; EPILOG-NEXT:    br label %innerH
4384; EPILOG:       innerH:
4385; EPILOG-NEXT:    %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ]
4386; EPILOG-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4387; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit, label %latch
4388; EPILOG:       latch:
4389; EPILOG-NEXT:    %i6 = icmp ult i64 %i4, 100
4390; EPILOG-NEXT:    br i1 %i6, label %innerH, label %exit
4391; EPILOG:       exit:
4392; EPILOG-NEXT:    ret void
4393;
4394; EPILOG-BLOCK-LABEL: @test8(
4395; EPILOG-BLOCK-NEXT:  bb:
4396; EPILOG-BLOCK-NEXT:    br label %outerloop
4397; EPILOG-BLOCK:       outerloop.loopexit:
4398; EPILOG-BLOCK-NEXT:    br label %innerH.12
4399; EPILOG-BLOCK:       outerloop:
4400; EPILOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]
4401; EPILOG-BLOCK-NEXT:    br label %innerH
4402; EPILOG-BLOCK:       innerH:
4403; EPILOG-BLOCK-NEXT:    %i3 = phi i64 [ %i, %outerloop ], [ %i4.1, %latch.1 ]
4404; EPILOG-BLOCK-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4405; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch
4406; EPILOG-BLOCK:       latch:
4407; EPILOG-BLOCK-NEXT:    %i6 = icmp ult i64 %i4, 100
4408; EPILOG-BLOCK-NEXT:    br i1 %i6, label %innerH.1, label %exit.loopexit
4409; EPILOG-BLOCK:       exit.loopexit:
4410; EPILOG-BLOCK-NEXT:    br label %exit
4411; EPILOG-BLOCK:       exit.loopexit5:
4412; EPILOG-BLOCK-NEXT:    br label %exit
4413; EPILOG-BLOCK:       exit:
4414; EPILOG-BLOCK-NEXT:    ret void
4415; EPILOG-BLOCK:       innerH.1:
4416; EPILOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
4417; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.1
4418; EPILOG-BLOCK:       latch.1:
4419; EPILOG-BLOCK-NEXT:    %i6.1 = icmp ult i64 %i4.1, 100
4420; EPILOG-BLOCK-NEXT:    br i1 %i6.1, label %innerH, label %exit.loopexit, !llvm.loop !11
4421; EPILOG-BLOCK:       innerH.12:
4422; EPILOG-BLOCK-NEXT:    %i3.1 = phi i64 [ 0, %outerloop.loopexit ], [ %i4.1.1, %latch.1.1 ]
4423; EPILOG-BLOCK-NEXT:    %i4.11 = add nuw nsw i64 %i3.1, 1
4424; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.14
4425; EPILOG-BLOCK:       latch.14:
4426; EPILOG-BLOCK-NEXT:    %i6.13 = icmp ult i64 %i4.11, 100
4427; EPILOG-BLOCK-NEXT:    br i1 %i6.13, label %innerH.1.1, label %exit.loopexit5
4428; EPILOG-BLOCK:       innerH.1.1:
4429; EPILOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i4.11, 1
4430; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.1.1
4431; EPILOG-BLOCK:       latch.1.1:
4432; EPILOG-BLOCK-NEXT:    %i6.1.1 = icmp ult i64 %i4.1.1, 100
4433; EPILOG-BLOCK-NEXT:    br i1 %i6.1.1, label %innerH.12, label %exit.loopexit5, !llvm.loop !11
4434; EPILOG-BLOCK:       outerloop.loopexit.1:
4435; EPILOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !12
4436;
4437; PROLOG-LABEL: @test8(
4438; PROLOG-NEXT:  bb:
4439; PROLOG-NEXT:    br label %outerloop
4440; PROLOG:       outerloop.loopexit.loopexit:
4441; PROLOG-NEXT:    br label %outerloop.loopexit
4442; PROLOG:       outerloop.loopexit.loopexit1:
4443; PROLOG-NEXT:    br label %outerloop.loopexit
4444; PROLOG:       outerloop.loopexit:
4445; PROLOG-NEXT:    br label %outerloop
4446; PROLOG:       outerloop:
4447; PROLOG-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]
4448; PROLOG-NEXT:    %0 = sub i64 100, %i
4449; PROLOG-NEXT:    %1 = sub i64 99, %i
4450; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
4451; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4452; PROLOG-NEXT:    br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit
4453; PROLOG:       innerH.prol.preheader:
4454; PROLOG-NEXT:    br label %innerH.prol
4455; PROLOG:       innerH.prol:
4456; PROLOG-NEXT:    %i3.prol = phi i64 [ %i4.prol, %latch.prol ], [ %i, %innerH.prol.preheader ]
4457; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %innerH.prol.preheader ], [ %prol.iter.sub, %latch.prol ]
4458; PROLOG-NEXT:    %i4.prol = add nuw nsw i64 %i3.prol, 1
4459; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit1, label %latch.prol
4460; PROLOG:       latch.prol:
4461; PROLOG-NEXT:    %i6.prol = icmp ult i64 %i4.prol, 100
4462; PROLOG-NEXT:    %prol.iter.sub = sub i64 %prol.iter, 1
4463; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
4464; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %innerH.prol, label %innerH.prol.loopexit.unr-lcssa, !llvm.loop !11
4465; PROLOG:       innerH.prol.loopexit.unr-lcssa:
4466; PROLOG-NEXT:    %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ]
4467; PROLOG-NEXT:    br label %innerH.prol.loopexit
4468; PROLOG:       innerH.prol.loopexit:
4469; PROLOG-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %innerH.prol.loopexit.unr-lcssa ]
4470; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
4471; PROLOG-NEXT:    br i1 %2, label %exit.loopexit, label %outerloop.new
4472; PROLOG:       outerloop.new:
4473; PROLOG-NEXT:    br label %innerH
4474; PROLOG:       innerH:
4475; PROLOG-NEXT:    %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.7, %latch.7 ]
4476; PROLOG-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4477; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4478; PROLOG:       latch:
4479; PROLOG-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
4480; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4481; PROLOG:       exit.unr-lcssa:
4482; PROLOG-NEXT:    br label %exit
4483; PROLOG:       exit.loopexit:
4484; PROLOG-NEXT:    br label %exit
4485; PROLOG:       exit:
4486; PROLOG-NEXT:    ret void
4487; PROLOG:       latch.1:
4488; PROLOG-NEXT:    %i4.2 = add nuw nsw i64 %i4.1, 1
4489; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.2
4490; PROLOG:       latch.2:
4491; PROLOG-NEXT:    %i4.3 = add nuw nsw i64 %i4.2, 1
4492; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.3
4493; PROLOG:       latch.3:
4494; PROLOG-NEXT:    %i4.4 = add nuw nsw i64 %i4.3, 1
4495; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.4
4496; PROLOG:       latch.4:
4497; PROLOG-NEXT:    %i4.5 = add nuw nsw i64 %i4.4, 1
4498; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.5
4499; PROLOG:       latch.5:
4500; PROLOG-NEXT:    %i4.6 = add nuw nsw i64 %i4.5, 1
4501; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.6
4502; PROLOG:       latch.6:
4503; PROLOG-NEXT:    %i4.7 = add nuw nsw i64 %i4.6, 1
4504; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.7
4505; PROLOG:       latch.7:
4506; PROLOG-NEXT:    %i6.7 = icmp ult i64 %i4.7, 100
4507; PROLOG-NEXT:    br i1 %i6.7, label %innerH, label %exit.unr-lcssa
4508;
4509; PROLOG-BLOCK-LABEL: @test8(
4510; PROLOG-BLOCK-NEXT:  bb:
4511; PROLOG-BLOCK-NEXT:    br label %outerloop
4512; PROLOG-BLOCK:       outerloop.loopexit.loopexit:
4513; PROLOG-BLOCK-NEXT:    br label %outerloop.loopexit
4514; PROLOG-BLOCK:       outerloop.loopexit:
4515; PROLOG-BLOCK-NEXT:    br i1 false, label %innerH.prol.preheader.1, label %innerH.prol.loopexit.unr-lcssa.1
4516; PROLOG-BLOCK:       outerloop:
4517; PROLOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]
4518; PROLOG-BLOCK-NEXT:    %0 = sub i64 100, %i
4519; PROLOG-BLOCK-NEXT:    %1 = sub i64 99, %i
4520; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4521; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4522; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit.unr-lcssa
4523; PROLOG-BLOCK:       innerH.prol.preheader:
4524; PROLOG-BLOCK-NEXT:    br label %innerH.prol
4525; PROLOG-BLOCK:       innerH.prol:
4526; PROLOG-BLOCK-NEXT:    %i4.prol = add nuw nsw i64 %i, 1
4527; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.prol
4528; PROLOG-BLOCK:       latch.prol:
4529; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit.unr-lcssa
4530; PROLOG-BLOCK:       innerH.prol.loopexit.unr-lcssa:
4531; PROLOG-BLOCK-NEXT:    %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ], [ %i, %outerloop ]
4532; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit
4533; PROLOG-BLOCK:       innerH.prol.loopexit:
4534; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4535; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit.loopexit, label %outerloop.new
4536; PROLOG-BLOCK:       outerloop.new:
4537; PROLOG-BLOCK-NEXT:    br label %innerH
4538; PROLOG-BLOCK:       innerH:
4539; PROLOG-BLOCK-NEXT:    %i3 = phi i64 [ %i3.unr.ph, %outerloop.new ], [ %i4.1, %latch.1 ]
4540; PROLOG-BLOCK-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4541; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4542; PROLOG-BLOCK:       latch:
4543; PROLOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
4544; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4545; PROLOG-BLOCK:       exit.unr-lcssa.loopexit:
4546; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4547; PROLOG-BLOCK:       exit.unr-lcssa.loopexit3:
4548; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4549; PROLOG-BLOCK:       exit.unr-lcssa:
4550; PROLOG-BLOCK-NEXT:    br label %exit
4551; PROLOG-BLOCK:       exit.loopexit:
4552; PROLOG-BLOCK-NEXT:    br label %exit
4553; PROLOG-BLOCK:       exit:
4554; PROLOG-BLOCK-NEXT:    ret void
4555; PROLOG-BLOCK:       latch.1:
4556; PROLOG-BLOCK-NEXT:    %i6.1 = icmp ult i64 %i4.1, 100
4557; PROLOG-BLOCK-NEXT:    br i1 %i6.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !11
4558; PROLOG-BLOCK:       innerH.prol.preheader.1:
4559; PROLOG-BLOCK-NEXT:    br label %innerH.prol.1
4560; PROLOG-BLOCK:       innerH.prol.1:
4561; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.prol.1
4562; PROLOG-BLOCK:       latch.prol.1:
4563; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit.unr-lcssa.1
4564; PROLOG-BLOCK:       innerH.prol.loopexit.unr-lcssa.1:
4565; PROLOG-BLOCK-NEXT:    %i3.unr.ph.1 = phi i64 [ 1, %latch.prol.1 ], [ 0, %outerloop.loopexit ]
4566; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit.1
4567; PROLOG-BLOCK:       innerH.prol.loopexit.1:
4568; PROLOG-BLOCK-NEXT:    br i1 false, label %exit.loopexit, label %outerloop.new.1
4569; PROLOG-BLOCK:       outerloop.new.1:
4570; PROLOG-BLOCK-NEXT:    br label %innerH.1
4571; PROLOG-BLOCK:       innerH.1:
4572; PROLOG-BLOCK-NEXT:    %i3.1 = phi i64 [ %i3.unr.ph.1, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ]
4573; PROLOG-BLOCK-NEXT:    %i4.11 = add nuw nsw i64 %i3.1, 1
4574; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.12
4575; PROLOG-BLOCK:       latch.12:
4576; PROLOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i4.11, 1
4577; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1
4578; PROLOG-BLOCK:       latch.1.1:
4579; PROLOG-BLOCK-NEXT:    %i6.1.1 = icmp ult i64 %i4.1.1, 100
4580; PROLOG-BLOCK-NEXT:    br i1 %i6.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit3, !llvm.loop !11
4581; PROLOG-BLOCK:       outerloop.loopexit.loopexit.1:
4582; PROLOG-BLOCK-NEXT:    br label %outerloop.loopexit.1
4583; PROLOG-BLOCK:       outerloop.loopexit.1:
4584; PROLOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !12
4585;
4586
4587bb:
4588  br label %outerloop
4589
4590outerloop:                                              ; preds = %innerH, %bb
4591  %i = phi i64 [ 3, %bb ], [ 0, %innerH ]
4592  br label %innerH
4593
4594innerH:                                              ; preds = %latch, %outerloop
4595  %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ]
4596  %i4 = add nuw nsw i64 %i3, 1
4597  br i1 false, label %outerloop, label %latch
4598
4599latch:                                              ; preds = %innerH
4600  %i6 = icmp ult i64 %i4, 100
4601  br i1 %i6, label %innerH, label %exit
4602
4603exit:                                              ; preds = %latch
4604  ret void
4605}
4606
4607declare i8 addrspace(1)* @foo(i32)
4608; inner loop prolog unrolled
4609; a value from outer loop is used in exit block of inner loop.
4610; Don't create VMap entries for such values (%trip).
4611define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) {
4612; EPILOG-LABEL: @test9(
4613; EPILOG-NEXT:  bb:
4614; EPILOG-NEXT:    br label %outerloopHdr
4615; EPILOG:       outerloopHdr:
4616; EPILOG-NEXT:    %trip = add i32 %n, -1
4617; EPILOG-NEXT:    %outercnd = icmp slt i32 0, %trip
4618; EPILOG-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
4619; EPILOG:       preheader:
4620; EPILOG-NEXT:    %i4 = zext i32 0 to i64
4621; EPILOG-NEXT:    br label %header
4622; EPILOG:       header:
4623; EPILOG-NEXT:    %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ]
4624; EPILOG-NEXT:    %i7 = trunc i64 %phi to i32
4625; EPILOG-NEXT:    br i1 true, label %latch, label %innerexit
4626; EPILOG:       innerexit:
4627; EPILOG-NEXT:    %trip.lcssa = phi i32 [ %trip, %header ]
4628; EPILOG-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
4629; EPILOG-NEXT:    ret i8 addrspace(1)* %i9
4630; EPILOG:       latch:
4631; EPILOG-NEXT:    %i11 = add nsw i32 %i7, 1
4632; EPILOG-NEXT:    %innercnd = icmp slt i32 %i11, %trip
4633; EPILOG-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
4634; EPILOG-NEXT:    br i1 %innercnd, label %header, label %outerLatch.loopexit
4635; EPILOG:       outerLatch.loopexit:
4636; EPILOG-NEXT:    br label %outerLatch
4637; EPILOG:       outerLatch:
4638; EPILOG-NEXT:    br label %outerloopHdr
4639;
4640; EPILOG-BLOCK-LABEL: @test9(
4641; EPILOG-BLOCK-NEXT:  bb:
4642; EPILOG-BLOCK-NEXT:    br label %outerloopHdr
4643; EPILOG-BLOCK:       outerloopHdr:
4644; EPILOG-BLOCK-NEXT:    %trip = add i32 %n, -1
4645; EPILOG-BLOCK-NEXT:    %outercnd = icmp slt i32 0, %trip
4646; EPILOG-BLOCK-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
4647; EPILOG-BLOCK:       preheader:
4648; EPILOG-BLOCK-NEXT:    br label %header
4649; EPILOG-BLOCK:       header:
4650; EPILOG-BLOCK-NEXT:    %phi = phi i64 [ 0, %preheader ], [ %iv.next.1, %latch.1 ]
4651; EPILOG-BLOCK-NEXT:    %i7 = trunc i64 %phi to i32
4652; EPILOG-BLOCK-NEXT:    br i1 true, label %latch, label %innerexit.loopexit
4653; EPILOG-BLOCK:       innerexit.loopexit:
4654; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph = phi i32 [ %trip, %header.1 ], [ %trip, %header ]
4655; EPILOG-BLOCK-NEXT:    br label %innerexit
4656; EPILOG-BLOCK:       innerexit.loopexit7:
4657; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph8 = phi i32 [ %trip.1, %header.1.1 ], [ %trip.1, %header.12 ]
4658; EPILOG-BLOCK-NEXT:    br label %innerexit
4659; EPILOG-BLOCK:       innerexit:
4660; EPILOG-BLOCK-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph8, %innerexit.loopexit7 ]
4661; EPILOG-BLOCK-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
4662; EPILOG-BLOCK-NEXT:    ret i8 addrspace(1)* %i9
4663; EPILOG-BLOCK:       latch:
4664; EPILOG-BLOCK-NEXT:    %i11 = add nuw nsw i32 %i7, 1
4665; EPILOG-BLOCK-NEXT:    %innercnd = icmp slt i32 %i11, %trip
4666; EPILOG-BLOCK-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
4667; EPILOG-BLOCK-NEXT:    br i1 %innercnd, label %header.1, label %outerLatch.loopexit
4668; EPILOG-BLOCK:       outerLatch.loopexit:
4669; EPILOG-BLOCK-NEXT:    br label %outerLatch
4670; EPILOG-BLOCK:       outerLatch:
4671; EPILOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -1
4672; EPILOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.1
4673; EPILOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.1
4674; EPILOG-BLOCK:       header.1:
4675; EPILOG-BLOCK-NEXT:    %i7.1 = trunc i64 %iv.next to i32
4676; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit
4677; EPILOG-BLOCK:       latch.1:
4678; EPILOG-BLOCK-NEXT:    %i11.1 = add nsw i32 %i7.1, 1
4679; EPILOG-BLOCK-NEXT:    %innercnd.1 = icmp slt i32 %i11.1, %trip
4680; EPILOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
4681; EPILOG-BLOCK-NEXT:    br i1 %innercnd.1, label %header, label %outerLatch.loopexit, !llvm.loop !13
4682; EPILOG-BLOCK:       preheader.1:
4683; EPILOG-BLOCK-NEXT:    br label %header.12
4684; EPILOG-BLOCK:       header.12:
4685; EPILOG-BLOCK-NEXT:    %phi.1 = phi i64 [ 0, %preheader.1 ], [ %iv.next.1.1, %latch.1.1 ]
4686; EPILOG-BLOCK-NEXT:    %i7.11 = trunc i64 %phi.1 to i32
4687; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.16, label %innerexit.loopexit7
4688; EPILOG-BLOCK:       latch.16:
4689; EPILOG-BLOCK-NEXT:    %i11.13 = add nuw nsw i32 %i7.11, 1
4690; EPILOG-BLOCK-NEXT:    %innercnd.14 = icmp slt i32 %i11.13, %trip.1
4691; EPILOG-BLOCK-NEXT:    %iv.next.15 = add nuw nsw i64 %phi.1, 1
4692; EPILOG-BLOCK-NEXT:    br i1 %innercnd.14, label %header.1.1, label %outerLatch.loopexit.1
4693; EPILOG-BLOCK:       header.1.1:
4694; EPILOG-BLOCK-NEXT:    %i7.1.1 = trunc i64 %iv.next.15 to i32
4695; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.1.1, label %innerexit.loopexit7
4696; EPILOG-BLOCK:       latch.1.1:
4697; EPILOG-BLOCK-NEXT:    %i11.1.1 = add nsw i32 %i7.1.1, 1
4698; EPILOG-BLOCK-NEXT:    %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.1
4699; EPILOG-BLOCK-NEXT:    %iv.next.1.1 = add nuw nsw i64 %iv.next.15, 1
4700; EPILOG-BLOCK-NEXT:    br i1 %innercnd.1.1, label %header.12, label %outerLatch.loopexit.1, !llvm.loop !13
4701; EPILOG-BLOCK:       outerLatch.loopexit.1:
4702; EPILOG-BLOCK-NEXT:    br label %outerLatch.1
4703; EPILOG-BLOCK:       outerLatch.1:
4704; EPILOG-BLOCK-NEXT:    br label %outerloopHdr, !llvm.loop !14
4705;
4706; PROLOG-LABEL: @test9(
4707; PROLOG-NEXT:  bb:
4708; PROLOG-NEXT:    %0 = add i32 %n, -1
4709; PROLOG-NEXT:    %1 = add i32 %n, -2
4710; PROLOG-NEXT:    br label %outerloopHdr
4711; PROLOG:       outerloopHdr:
4712; PROLOG-NEXT:    %trip = add i32 %n, -1
4713; PROLOG-NEXT:    %outercnd = icmp slt i32 0, %trip
4714; PROLOG-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
4715; PROLOG:       preheader:
4716; PROLOG-NEXT:    %i4 = zext i32 0 to i64
4717; PROLOG-NEXT:    %xtraiter = and i32 %0, 7
4718; PROLOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
4719; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4720; PROLOG:       header.prol.preheader:
4721; PROLOG-NEXT:    br label %header.prol
4722; PROLOG:       header.prol:
4723; PROLOG-NEXT:    %phi.prol = phi i64 [ %i4, %header.prol.preheader ], [ %iv.next.prol, %latch.prol ]
4724; PROLOG-NEXT:    %prol.iter = phi i32 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ]
4725; PROLOG-NEXT:    %i7.prol = trunc i64 %phi.prol to i32
4726; PROLOG-NEXT:    br i1 true, label %latch.prol, label %innerexit.loopexit1
4727; PROLOG:       latch.prol:
4728; PROLOG-NEXT:    %i11.prol = add nsw i32 %i7.prol, 1
4729; PROLOG-NEXT:    %innercnd.prol = icmp slt i32 %i11.prol, %trip
4730; PROLOG-NEXT:    %iv.next.prol = add nuw nsw i64 %phi.prol, 1
4731; PROLOG-NEXT:    %prol.iter.sub = sub i32 %prol.iter, 1
4732; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i32 %prol.iter.sub, 0
4733; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !12
4734; PROLOG:       header.prol.loopexit.unr-lcssa:
4735; PROLOG-NEXT:    %phi.unr.ph = phi i64 [ %iv.next.prol, %latch.prol ]
4736; PROLOG-NEXT:    br label %header.prol.loopexit
4737; PROLOG:       header.prol.loopexit:
4738; PROLOG-NEXT:    %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %header.prol.loopexit.unr-lcssa ]
4739; PROLOG-NEXT:    %2 = icmp ult i32 %1, 7
4740; PROLOG-NEXT:    br i1 %2, label %outerLatch.loopexit, label %preheader.new
4741; PROLOG:       preheader.new:
4742; PROLOG-NEXT:    br label %header
4743; PROLOG:       header:
4744; PROLOG-NEXT:    %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.7, %latch.7 ]
4745; PROLOG-NEXT:    br i1 true, label %latch, label %innerexit.loopexit
4746; PROLOG:       innerexit.loopexit:
4747; 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 ]
4748; PROLOG-NEXT:    br label %innerexit
4749; PROLOG:       innerexit.loopexit1:
4750; PROLOG-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ]
4751; PROLOG-NEXT:    br label %innerexit
4752; PROLOG:       innerexit:
4753; PROLOG-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
4754; PROLOG-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
4755; PROLOG-NEXT:    ret i8 addrspace(1)* %i9
4756; PROLOG:       latch:
4757; PROLOG-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
4758; PROLOG-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit
4759; PROLOG:       outerLatch.loopexit.unr-lcssa:
4760; PROLOG-NEXT:    br label %outerLatch.loopexit
4761; PROLOG:       outerLatch.loopexit:
4762; PROLOG-NEXT:    br label %outerLatch
4763; PROLOG:       outerLatch:
4764; PROLOG-NEXT:    br label %outerloopHdr
4765; PROLOG:       latch.1:
4766; PROLOG-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
4767; PROLOG-NEXT:    br i1 true, label %latch.2, label %innerexit.loopexit
4768; PROLOG:       latch.2:
4769; PROLOG-NEXT:    %iv.next.2 = add nuw nsw i64 %iv.next.1, 1
4770; PROLOG-NEXT:    br i1 true, label %latch.3, label %innerexit.loopexit
4771; PROLOG:       latch.3:
4772; PROLOG-NEXT:    %iv.next.3 = add nuw nsw i64 %iv.next.2, 1
4773; PROLOG-NEXT:    br i1 true, label %latch.4, label %innerexit.loopexit
4774; PROLOG:       latch.4:
4775; PROLOG-NEXT:    %iv.next.4 = add nuw nsw i64 %iv.next.3, 1
4776; PROLOG-NEXT:    br i1 true, label %latch.5, label %innerexit.loopexit
4777; PROLOG:       latch.5:
4778; PROLOG-NEXT:    %iv.next.5 = add nuw nsw i64 %iv.next.4, 1
4779; PROLOG-NEXT:    br i1 true, label %latch.6, label %innerexit.loopexit
4780; PROLOG:       latch.6:
4781; PROLOG-NEXT:    %iv.next.6 = add nuw nsw i64 %iv.next.5, 1
4782; PROLOG-NEXT:    %i7.7 = trunc i64 %iv.next.6 to i32
4783; PROLOG-NEXT:    br i1 true, label %latch.7, label %innerexit.loopexit
4784; PROLOG:       latch.7:
4785; PROLOG-NEXT:    %i11.7 = add nsw i32 %i7.7, 1
4786; PROLOG-NEXT:    %innercnd.7 = icmp slt i32 %i11.7, %trip
4787; PROLOG-NEXT:    %iv.next.7 = add nuw nsw i64 %iv.next.6, 1
4788; PROLOG-NEXT:    br i1 %innercnd.7, label %header, label %outerLatch.loopexit.unr-lcssa
4789;
4790; PROLOG-BLOCK-LABEL: @test9(
4791; PROLOG-BLOCK-NEXT:  bb:
4792; PROLOG-BLOCK-NEXT:    %0 = add i32 %n, -1
4793; PROLOG-BLOCK-NEXT:    %1 = add i32 %n, -2
4794; PROLOG-BLOCK-NEXT:    br label %outerloopHdr
4795; PROLOG-BLOCK:       outerloopHdr:
4796; PROLOG-BLOCK-NEXT:    %trip = add i32 %n, -1
4797; PROLOG-BLOCK-NEXT:    %outercnd = icmp slt i32 0, %trip
4798; PROLOG-BLOCK-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
4799; PROLOG-BLOCK:       preheader:
4800; PROLOG-BLOCK-NEXT:    %xtraiter = and i32 %0, 1
4801; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
4802; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit.unr-lcssa
4803; PROLOG-BLOCK:       header.prol.preheader:
4804; PROLOG-BLOCK-NEXT:    br label %header.prol
4805; PROLOG-BLOCK:       header.prol:
4806; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.prol, label %innerexit.loopexit1
4807; PROLOG-BLOCK:       latch.prol:
4808; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit.unr-lcssa
4809; PROLOG-BLOCK:       header.prol.loopexit.unr-lcssa:
4810; PROLOG-BLOCK-NEXT:    %phi.unr.ph = phi i64 [ 1, %latch.prol ], [ 0, %preheader ]
4811; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
4812; PROLOG-BLOCK:       header.prol.loopexit:
4813; PROLOG-BLOCK-NEXT:    %2 = icmp ult i32 %1, 1
4814; PROLOG-BLOCK-NEXT:    br i1 %2, label %outerLatch.loopexit, label %preheader.new
4815; PROLOG-BLOCK:       preheader.new:
4816; PROLOG-BLOCK-NEXT:    br label %header
4817; PROLOG-BLOCK:       header:
4818; PROLOG-BLOCK-NEXT:    %phi = phi i64 [ %phi.unr.ph, %preheader.new ], [ %iv.next.1, %latch.1 ]
4819; PROLOG-BLOCK-NEXT:    br i1 true, label %latch, label %innerexit.loopexit.loopexit
4820; PROLOG-BLOCK:       innerexit.loopexit.loopexit:
4821; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ]
4822; PROLOG-BLOCK-NEXT:    br label %innerexit.loopexit
4823; PROLOG-BLOCK:       innerexit.loopexit.loopexit5:
4824; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph.ph6 = phi i32 [ %trip.1, %latch.14 ], [ %trip.1, %header.1 ]
4825; PROLOG-BLOCK-NEXT:    br label %innerexit.loopexit
4826; PROLOG-BLOCK:       innerexit.loopexit:
4827; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph6, %innerexit.loopexit.loopexit5 ]
4828; PROLOG-BLOCK-NEXT:    br label %innerexit
4829; PROLOG-BLOCK:       innerexit.loopexit1:
4830; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ], [ %trip.1, %header.prol.1 ]
4831; PROLOG-BLOCK-NEXT:    br label %innerexit
4832; PROLOG-BLOCK:       innerexit:
4833; PROLOG-BLOCK-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
4834; PROLOG-BLOCK-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
4835; PROLOG-BLOCK-NEXT:    ret i8 addrspace(1)* %i9
4836; PROLOG-BLOCK:       latch:
4837; PROLOG-BLOCK-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
4838; PROLOG-BLOCK-NEXT:    %i7.1 = trunc i64 %iv.next to i32
4839; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit.loopexit
4840; PROLOG-BLOCK:       outerLatch.loopexit.unr-lcssa:
4841; PROLOG-BLOCK-NEXT:    br label %outerLatch.loopexit
4842; PROLOG-BLOCK:       outerLatch.loopexit:
4843; PROLOG-BLOCK-NEXT:    br label %outerLatch
4844; PROLOG-BLOCK:       outerLatch:
4845; PROLOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -1
4846; PROLOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.1
4847; PROLOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.1
4848; PROLOG-BLOCK:       latch.1:
4849; PROLOG-BLOCK-NEXT:    %i11.1 = add nsw i32 %i7.1, 1
4850; PROLOG-BLOCK-NEXT:    %innercnd.1 = icmp slt i32 %i11.1, %trip
4851; PROLOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
4852; PROLOG-BLOCK-NEXT:    br i1 %innercnd.1, label %header, label %outerLatch.loopexit.unr-lcssa, !llvm.loop !13
4853; PROLOG-BLOCK:       preheader.1:
4854; PROLOG-BLOCK-NEXT:    %xtraiter.1 = and i32 %0, 1
4855; PROLOG-BLOCK-NEXT:    %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0
4856; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod.1, label %header.prol.preheader.1, label %header.prol.loopexit.unr-lcssa.1
4857; PROLOG-BLOCK:       header.prol.preheader.1:
4858; PROLOG-BLOCK-NEXT:    br label %header.prol.1
4859; PROLOG-BLOCK:       header.prol.1:
4860; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.prol.1, label %innerexit.loopexit1
4861; PROLOG-BLOCK:       latch.prol.1:
4862; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit.unr-lcssa.1
4863; PROLOG-BLOCK:       header.prol.loopexit.unr-lcssa.1:
4864; PROLOG-BLOCK-NEXT:    %phi.unr.ph.1 = phi i64 [ 1, %latch.prol.1 ], [ 0, %preheader.1 ]
4865; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit.1
4866; PROLOG-BLOCK:       header.prol.loopexit.1:
4867; PROLOG-BLOCK-NEXT:    %3 = icmp ult i32 %1, 1
4868; PROLOG-BLOCK-NEXT:    br i1 %3, label %outerLatch.loopexit.1, label %preheader.new.1
4869; PROLOG-BLOCK:       preheader.new.1:
4870; PROLOG-BLOCK-NEXT:    br label %header.1
4871; PROLOG-BLOCK:       header.1:
4872; PROLOG-BLOCK-NEXT:    %phi.1 = phi i64 [ %phi.unr.ph.1, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ]
4873; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.14, label %innerexit.loopexit.loopexit5
4874; PROLOG-BLOCK:       latch.14:
4875; PROLOG-BLOCK-NEXT:    %iv.next.13 = add nuw nsw i64 %phi.1, 1
4876; PROLOG-BLOCK-NEXT:    %i7.1.1 = trunc i64 %iv.next.13 to i32
4877; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit5
4878; PROLOG-BLOCK:       latch.1.1:
4879; PROLOG-BLOCK-NEXT:    %i11.1.1 = add nsw i32 %i7.1.1, 1
4880; PROLOG-BLOCK-NEXT:    %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.1
4881; PROLOG-BLOCK-NEXT:    %iv.next.1.1 = add nuw nsw i64 %iv.next.13, 1
4882; PROLOG-BLOCK-NEXT:    br i1 %innercnd.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.1, !llvm.loop !13
4883; PROLOG-BLOCK:       outerLatch.loopexit.unr-lcssa.1:
4884; PROLOG-BLOCK-NEXT:    br label %outerLatch.loopexit.1
4885; PROLOG-BLOCK:       outerLatch.loopexit.1:
4886; PROLOG-BLOCK-NEXT:    br label %outerLatch.1
4887; PROLOG-BLOCK:       outerLatch.1:
4888; PROLOG-BLOCK-NEXT:    br label %outerloopHdr, !llvm.loop !14
4889;
4890bb:
4891  br label %outerloopHdr
4892
4893outerloopHdr:                                              ; preds = %outerLatch, %bb
4894  %trip = add i32 %n, -1
4895  %outercnd = icmp slt i32 0, %trip
4896  br i1 %outercnd, label %preheader, label %outerLatch
4897
4898preheader:                                              ; preds = %outerloopHdr
4899  %i4 = zext i32 0 to i64
4900  br label %header
4901
4902header:                                              ; preds = %latch, %preheader
4903  %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ]
4904  %i7 = trunc i64 %phi to i32
4905  br i1 true, label %latch, label %innerexit
4906
4907innerexit:                                              ; preds = %header
4908  %i9 = call i8 addrspace(1)* @foo(i32 %trip)
4909  ret i8 addrspace(1)* %i9
4910
4911latch:                                             ; preds = %header
4912  %i11 = add nsw i32 %i7, 1
4913  %innercnd = icmp slt i32 %i11, %trip
4914  %iv.next = add nuw nsw i64 %phi, 1
4915  br i1 %innercnd, label %header, label %outerLatch
4916
4917outerLatch:                                             ; preds = %latch, %outerloopHdr
4918  br label %outerloopHdr
4919}
4920