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:    br label %header
1499; PROLOG:       header:
1500; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
1501; PROLOG-NEXT:    %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
1502; PROLOG-NEXT:    br i1 %cond, label %latchExit, label %for.exiting_block
1503; PROLOG:       for.exiting_block:
1504; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
1505; PROLOG-NEXT:    br i1 %cmp, label %for.exit2, label %latch
1506; PROLOG:       latch:
1507; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1508; PROLOG-NEXT:    %0 = load i32, i32* %arrayidx, align 4
1509; PROLOG-NEXT:    %add = add nsw i32 %0, %sum.02
1510; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
1511; PROLOG-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
1512; PROLOG-NEXT:    br i1 %exitcond, label %latchExit, label %header
1513; PROLOG:       latchExit:
1514; PROLOG-NEXT:    %result = phi i32 [ 0, %header ], [ %add, %latch ]
1515; PROLOG-NEXT:    ret i32 %result
1516; PROLOG:       for.exit2:
1517; PROLOG-NEXT:    ret i32 42
1518;
1519; PROLOG-BLOCK-LABEL: @hdr_latch_same_exit(
1520; PROLOG-BLOCK-NEXT:  entry:
1521; PROLOG-BLOCK-NEXT:    br label %header
1522; PROLOG-BLOCK:       header:
1523; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ]
1524; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ]
1525; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit, label %for.exiting_block
1526; PROLOG-BLOCK:       for.exiting_block:
1527; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
1528; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2, label %latch
1529; PROLOG-BLOCK:       latch:
1530; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1531; PROLOG-BLOCK-NEXT:    %0 = load i32, i32* %arrayidx, align 4
1532; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %0, %sum.02
1533; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1534; PROLOG-BLOCK-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
1535; PROLOG-BLOCK-NEXT:    br i1 %exitcond, label %latchExit, label %header.1
1536; PROLOG-BLOCK:       latchExit:
1537; PROLOG-BLOCK-NEXT:    %result = phi i32 [ 0, %header ], [ %add, %latch ], [ 0, %header.1 ], [ %add.1, %latch.1 ]
1538; PROLOG-BLOCK-NEXT:    ret i32 %result
1539; PROLOG-BLOCK:       for.exit2:
1540; PROLOG-BLOCK-NEXT:    ret i32 42
1541; PROLOG-BLOCK:       header.1:
1542; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit, label %for.exiting_block.1
1543; PROLOG-BLOCK:       for.exiting_block.1:
1544; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1545; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2, label %latch.1
1546; PROLOG-BLOCK:       latch.1:
1547; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1548; PROLOG-BLOCK-NEXT:    %1 = load i32, i32* %arrayidx.1, align 4
1549; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %1, %add
1550; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1551; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
1552; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !4
1553;
1554
1555entry:
1556  br label %header
1557
1558header:
1559  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
1560  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
1561  br i1 %cond, label %latchExit, label %for.exiting_block
1562
1563for.exiting_block:
1564  %cmp = icmp eq i64 %n, 42
1565  br i1 %cmp, label %for.exit2, label %latch
1566
1567latch:                                         ; preds = %latch, %entry
1568  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1569  %0 = load i32, i32* %arrayidx, align 4
1570  %add = add nsw i32 %0, %sum.02
1571  %indvars.iv.next = add i64 %indvars.iv, 1
1572  %exitcond = icmp eq i64 %indvars.iv.next, %n
1573  br i1 %exitcond, label %latchExit, label %header
1574
1575latchExit:                                          ; preds = %latch, %entry
1576  %result = phi i32 [ 0, %header ], [ %add, %latch ]
1577  ret i32 %result
1578
1579for.exit2:
1580  ret i32 42
1581}
1582
1583; Two exiting blocks to latch where the exiting blocks are Latch and a
1584; non-header
1585; FIXME: We should unroll this loop.
1586define i32 @otherblock_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) {
1587; EPILOG-LABEL: @otherblock_latch_same_exit(
1588; EPILOG-NEXT:  entry:
1589; EPILOG-NEXT:    %0 = add i64 %n, -1
1590; EPILOG-NEXT:    %xtraiter = and i64 %n, 7
1591; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
1592; EPILOG-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
1593; EPILOG:       entry.new:
1594; EPILOG-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
1595; EPILOG-NEXT:    br label %header
1596; EPILOG:       header:
1597; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
1598; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
1599; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %latch.7 ]
1600; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
1601; EPILOG:       for.exiting_block:
1602; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
1603; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
1604; EPILOG:       latch:
1605; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1606; EPILOG-NEXT:    %2 = load i32, i32* %arrayidx, align 4
1607; EPILOG-NEXT:    %add = add nsw i32 %2, %sum.02
1608; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1609; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
1610; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
1611; EPILOG:       latchExit.unr-lcssa.loopexit:
1612; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
1613; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
1614; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
1615; EPILOG-NEXT:    br label %latchExit.unr-lcssa
1616; EPILOG:       latchExit.unr-lcssa:
1617; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1618; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1619; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1620; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1621; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1622; EPILOG:       header.epil.preheader:
1623; EPILOG-NEXT:    br label %header.epil
1624; EPILOG:       header.epil:
1625; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
1626; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
1627; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
1628; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
1629; EPILOG:       for.exiting_block.epil:
1630; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1631; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
1632; EPILOG:       latch.epil:
1633; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
1634; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
1635; EPILOG-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
1636; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
1637; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
1638; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
1639; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
1640; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !5
1641; EPILOG:       latchExit.epilog-lcssa.loopexit:
1642; 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 ]
1643; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1644; EPILOG:       latchExit.epilog-lcssa.loopexit3:
1645; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ 2, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
1646; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1647; EPILOG:       latchExit.epilog-lcssa:
1648; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
1649; EPILOG-NEXT:    br label %latchExit
1650; EPILOG:       latchExit:
1651; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1652; EPILOG-NEXT:    ret i32 %result
1653; EPILOG:       for.exit2.loopexit:
1654; EPILOG-NEXT:    br label %for.exit2
1655; EPILOG:       for.exit2.loopexit2:
1656; EPILOG-NEXT:    br label %for.exit2
1657; EPILOG:       for.exit2:
1658; EPILOG-NEXT:    ret i32 42
1659; EPILOG:       for.exiting_block.1:
1660; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1661; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
1662; EPILOG:       latch.1:
1663; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1664; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1665; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
1666; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
1667; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
1668; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
1669; EPILOG:       for.exiting_block.2:
1670; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1671; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
1672; EPILOG:       latch.2:
1673; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1674; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
1675; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
1676; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
1677; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
1678; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
1679; EPILOG:       for.exiting_block.3:
1680; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1681; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
1682; EPILOG:       latch.3:
1683; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1684; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
1685; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
1686; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
1687; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
1688; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
1689; EPILOG:       for.exiting_block.4:
1690; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1691; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
1692; EPILOG:       latch.4:
1693; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
1694; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
1695; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
1696; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
1697; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
1698; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
1699; EPILOG:       for.exiting_block.5:
1700; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1701; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
1702; EPILOG:       latch.5:
1703; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
1704; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
1705; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
1706; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
1707; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
1708; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
1709; EPILOG:       for.exiting_block.6:
1710; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
1711; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
1712; EPILOG:       latch.6:
1713; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
1714; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
1715; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
1716; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
1717; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
1718; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
1719; EPILOG:       for.exiting_block.7:
1720; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
1721; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
1722; EPILOG:       latch.7:
1723; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
1724; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
1725; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
1726; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
1727; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
1728; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
1729; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
1730;
1731; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit(
1732; EPILOG-BLOCK-NEXT:  entry:
1733; EPILOG-BLOCK-NEXT:    %0 = add i64 %n, -1
1734; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
1735; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
1736; EPILOG-BLOCK-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
1737; EPILOG-BLOCK:       entry.new:
1738; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
1739; EPILOG-BLOCK-NEXT:    br label %header
1740; EPILOG-BLOCK:       header:
1741; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
1742; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
1743; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %latch.1 ]
1744; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
1745; EPILOG-BLOCK:       for.exiting_block:
1746; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
1747; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
1748; EPILOG-BLOCK:       latch:
1749; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1750; EPILOG-BLOCK-NEXT:    %2 = load i32, i32* %arrayidx, align 4
1751; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %2, %sum.02
1752; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1753; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
1754; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
1755; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
1756; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
1757; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
1758; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
1759; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
1760; EPILOG-BLOCK:       latchExit.unr-lcssa:
1761; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1762; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1763; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1764; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1765; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1766; EPILOG-BLOCK:       header.epil.preheader:
1767; EPILOG-BLOCK-NEXT:    br label %header.epil
1768; EPILOG-BLOCK:       header.epil:
1769; EPILOG-BLOCK-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.unr, %header.epil.preheader ]
1770; EPILOG-BLOCK-NEXT:    %sum.02.epil = phi i32 [ %sum.02.unr, %header.epil.preheader ]
1771; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
1772; EPILOG-BLOCK:       for.exiting_block.epil:
1773; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1774; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
1775; EPILOG-BLOCK:       latch.epil:
1776; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
1777; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
1778; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
1779; EPILOG-BLOCK-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
1780; EPILOG-BLOCK-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
1781; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1782; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
1783; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ]
1784; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
1785; EPILOG-BLOCK:       latchExit.epilog-lcssa:
1786; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 2, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
1787; EPILOG-BLOCK-NEXT:    br label %latchExit
1788; EPILOG-BLOCK:       latchExit:
1789; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1790; EPILOG-BLOCK-NEXT:    ret i32 %result
1791; EPILOG-BLOCK:       for.exit2.loopexit:
1792; EPILOG-BLOCK-NEXT:    br label %for.exit2
1793; EPILOG-BLOCK:       for.exit2:
1794; EPILOG-BLOCK-NEXT:    ret i32 42
1795; EPILOG-BLOCK:       for.exiting_block.1:
1796; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1797; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
1798; EPILOG-BLOCK:       latch.1:
1799; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1800; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1801; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
1802; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1803; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
1804; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0
1805; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5
1806;
1807; PROLOG-LABEL: @otherblock_latch_same_exit(
1808; PROLOG-NEXT:  entry:
1809; PROLOG-NEXT:    br label %header
1810; PROLOG:       header:
1811; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
1812; PROLOG-NEXT:    %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
1813; PROLOG-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
1814; PROLOG:       for.exiting_block:
1815; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
1816; PROLOG-NEXT:    br i1 %cmp, label %latchExit, label %latch
1817; PROLOG:       latch:
1818; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1819; PROLOG-NEXT:    %0 = load i32, i32* %arrayidx, align 4
1820; PROLOG-NEXT:    %add = add nsw i32 %0, %sum.02
1821; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
1822; PROLOG-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
1823; PROLOG-NEXT:    br i1 %exitcond, label %latchExit, label %header
1824; PROLOG:       latchExit:
1825; PROLOG-NEXT:    %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ]
1826; PROLOG-NEXT:    ret i32 %result
1827; PROLOG:       for.exit2:
1828; PROLOG-NEXT:    ret i32 42
1829;
1830; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit(
1831; PROLOG-BLOCK-NEXT:  entry:
1832; PROLOG-BLOCK-NEXT:    br label %header
1833; PROLOG-BLOCK:       header:
1834; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ]
1835; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ]
1836; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
1837; PROLOG-BLOCK:       for.exiting_block:
1838; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
1839; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit, label %latch
1840; PROLOG-BLOCK:       latch:
1841; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1842; PROLOG-BLOCK-NEXT:    %0 = load i32, i32* %arrayidx, align 4
1843; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %0, %sum.02
1844; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1845; PROLOG-BLOCK-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
1846; PROLOG-BLOCK-NEXT:    br i1 %exitcond, label %latchExit, label %header.1
1847; PROLOG-BLOCK:       latchExit:
1848; PROLOG-BLOCK-NEXT:    %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ], [ 2, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
1849; PROLOG-BLOCK-NEXT:    ret i32 %result
1850; PROLOG-BLOCK:       for.exit2:
1851; PROLOG-BLOCK-NEXT:    ret i32 42
1852; PROLOG-BLOCK:       header.1:
1853; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.1
1854; PROLOG-BLOCK:       for.exiting_block.1:
1855; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1856; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit, label %latch.1
1857; PROLOG-BLOCK:       latch.1:
1858; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1859; PROLOG-BLOCK-NEXT:    %1 = load i32, i32* %arrayidx.1, align 4
1860; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %1, %add
1861; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1862; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
1863; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !5
1864;
1865
1866entry:
1867  br label %header
1868
1869header:
1870  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
1871  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
1872  br i1 %cond, label %for.exit2, label %for.exiting_block
1873
1874for.exiting_block:
1875  %cmp = icmp eq i64 %n, 42
1876  br i1 %cmp, label %latchExit, label %latch
1877
1878latch:                                         ; preds = %latch, %entry
1879  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1880  %0 = load i32, i32* %arrayidx, align 4
1881  %add = add nsw i32 %0, %sum.02
1882  %indvars.iv.next = add i64 %indvars.iv, 1
1883  %exitcond = icmp eq i64 %indvars.iv.next, %n
1884  br i1 %exitcond, label %latchExit, label %header
1885
1886latchExit:                                          ; preds = %latch, %entry
1887  %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ]
1888  ret i32 %result
1889
1890for.exit2:
1891  ret i32 42
1892}
1893
1894; Two exiting blocks to latch where the exiting blocks are Latch and a
1895; non-header
1896; Same as above test except the incoming value for latch Phi is from the header
1897; FIXME: We should be able to runtime unroll.
1898define i32 @otherblock_latch_same_exit2(i32* nocapture %a, i64 %n, i1 %cond) {
1899; EPILOG-LABEL: @otherblock_latch_same_exit2(
1900; EPILOG-NEXT:  entry:
1901; EPILOG-NEXT:    %0 = add i64 %n, -1
1902; EPILOG-NEXT:    %xtraiter = and i64 %n, 7
1903; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
1904; EPILOG-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
1905; EPILOG:       entry.new:
1906; EPILOG-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
1907; EPILOG-NEXT:    br label %header
1908; EPILOG:       header:
1909; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
1910; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
1911; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %latch.7 ]
1912; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
1913; EPILOG:       for.exiting_block:
1914; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
1915; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
1916; EPILOG:       latch:
1917; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1918; EPILOG-NEXT:    %2 = load i32, i32* %arrayidx, align 4
1919; EPILOG-NEXT:    %add = add nsw i32 %2, %sum.02
1920; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1921; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
1922; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
1923; EPILOG:       latchExit.unr-lcssa.loopexit:
1924; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
1925; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
1926; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
1927; EPILOG-NEXT:    br label %latchExit.unr-lcssa
1928; EPILOG:       latchExit.unr-lcssa:
1929; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
1930; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
1931; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
1932; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1933; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
1934; EPILOG:       header.epil.preheader:
1935; EPILOG-NEXT:    br label %header.epil
1936; EPILOG:       header.epil:
1937; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
1938; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
1939; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
1940; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
1941; EPILOG:       for.exiting_block.epil:
1942; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
1943; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
1944; EPILOG:       latch.epil:
1945; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
1946; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
1947; EPILOG-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
1948; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
1949; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
1950; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
1951; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
1952; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !6
1953; EPILOG:       latchExit.epilog-lcssa.loopexit:
1954; 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 ]
1955; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1956; EPILOG:       latchExit.epilog-lcssa.loopexit3:
1957; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
1958; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
1959; EPILOG:       latchExit.epilog-lcssa:
1960; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
1961; EPILOG-NEXT:    br label %latchExit
1962; EPILOG:       latchExit:
1963; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1964; EPILOG-NEXT:    ret i32 %result
1965; EPILOG:       for.exit2.loopexit:
1966; EPILOG-NEXT:    br label %for.exit2
1967; EPILOG:       for.exit2.loopexit2:
1968; EPILOG-NEXT:    br label %for.exit2
1969; EPILOG:       for.exit2:
1970; EPILOG-NEXT:    ret i32 42
1971; EPILOG:       for.exiting_block.1:
1972; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1973; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
1974; EPILOG:       latch.1:
1975; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1976; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1977; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
1978; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
1979; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
1980; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
1981; EPILOG:       for.exiting_block.2:
1982; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1983; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
1984; EPILOG:       latch.2:
1985; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1986; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
1987; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
1988; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
1989; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
1990; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
1991; EPILOG:       for.exiting_block.3:
1992; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1993; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
1994; EPILOG:       latch.3:
1995; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1996; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
1997; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
1998; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
1999; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
2000; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2001; EPILOG:       for.exiting_block.4:
2002; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2003; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
2004; EPILOG:       latch.4:
2005; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2006; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
2007; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2008; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
2009; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
2010; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2011; EPILOG:       for.exiting_block.5:
2012; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2013; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
2014; EPILOG:       latch.5:
2015; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2016; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
2017; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2018; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
2019; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
2020; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2021; EPILOG:       for.exiting_block.6:
2022; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2023; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
2024; EPILOG:       latch.6:
2025; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2026; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
2027; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2028; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
2029; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
2030; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2031; EPILOG:       for.exiting_block.7:
2032; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2033; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
2034; EPILOG:       latch.7:
2035; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2036; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
2037; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2038; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2039; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
2040; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
2041; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
2042;
2043; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit2(
2044; EPILOG-BLOCK-NEXT:  entry:
2045; EPILOG-BLOCK-NEXT:    %0 = add i64 %n, -1
2046; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
2047; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
2048; EPILOG-BLOCK-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
2049; EPILOG-BLOCK:       entry.new:
2050; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
2051; EPILOG-BLOCK-NEXT:    br label %header
2052; EPILOG-BLOCK:       header:
2053; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2054; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
2055; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %latch.1 ]
2056; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2057; EPILOG-BLOCK:       for.exiting_block:
2058; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2059; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2060; EPILOG-BLOCK:       latch:
2061; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2062; EPILOG-BLOCK-NEXT:    %2 = load i32, i32* %arrayidx, align 4
2063; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %2, %sum.02
2064; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2065; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
2066; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2067; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2068; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
2069; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
2070; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
2071; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2072; EPILOG-BLOCK:       latchExit.unr-lcssa:
2073; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2074; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2075; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2076; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2077; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2078; EPILOG-BLOCK:       header.epil.preheader:
2079; EPILOG-BLOCK-NEXT:    br label %header.epil
2080; EPILOG-BLOCK:       header.epil:
2081; EPILOG-BLOCK-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.unr, %header.epil.preheader ]
2082; EPILOG-BLOCK-NEXT:    %sum.02.epil = phi i32 [ %sum.02.unr, %header.epil.preheader ]
2083; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
2084; EPILOG-BLOCK:       for.exiting_block.epil:
2085; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2086; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
2087; EPILOG-BLOCK:       latch.epil:
2088; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
2089; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
2090; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
2091; EPILOG-BLOCK-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
2092; EPILOG-BLOCK-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
2093; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2094; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
2095; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ]
2096; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2097; EPILOG-BLOCK:       latchExit.epilog-lcssa:
2098; 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 ]
2099; EPILOG-BLOCK-NEXT:    br label %latchExit
2100; EPILOG-BLOCK:       latchExit:
2101; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2102; EPILOG-BLOCK-NEXT:    ret i32 %result
2103; EPILOG-BLOCK:       for.exit2.loopexit:
2104; EPILOG-BLOCK-NEXT:    br label %for.exit2
2105; EPILOG-BLOCK:       for.exit2:
2106; EPILOG-BLOCK-NEXT:    ret i32 42
2107; EPILOG-BLOCK:       for.exiting_block.1:
2108; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2109; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2110; EPILOG-BLOCK:       latch.1:
2111; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2112; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2113; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2114; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2115; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
2116; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0
2117; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6
2118;
2119; PROLOG-LABEL: @otherblock_latch_same_exit2(
2120; PROLOG-NEXT:  entry:
2121; PROLOG-NEXT:    br label %header
2122; PROLOG:       header:
2123; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
2124; PROLOG-NEXT:    %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
2125; PROLOG-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
2126; PROLOG:       for.exiting_block:
2127; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
2128; PROLOG-NEXT:    br i1 %cmp, label %latchExit, label %latch
2129; PROLOG:       latch:
2130; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2131; PROLOG-NEXT:    %0 = load i32, i32* %arrayidx, align 4
2132; PROLOG-NEXT:    %add = add nsw i32 %0, %sum.02
2133; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2134; PROLOG-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
2135; PROLOG-NEXT:    br i1 %exitcond, label %latchExit, label %header
2136; PROLOG:       latchExit:
2137; PROLOG-NEXT:    %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
2138; PROLOG-NEXT:    ret i32 %result
2139; PROLOG:       for.exit2:
2140; PROLOG-NEXT:    ret i32 42
2141;
2142; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit2(
2143; PROLOG-BLOCK-NEXT:  entry:
2144; PROLOG-BLOCK-NEXT:    br label %header
2145; PROLOG-BLOCK:       header:
2146; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ]
2147; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ]
2148; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
2149; PROLOG-BLOCK:       for.exiting_block:
2150; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2151; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit, label %latch
2152; PROLOG-BLOCK:       latch:
2153; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2154; PROLOG-BLOCK-NEXT:    %0 = load i32, i32* %arrayidx, align 4
2155; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %0, %sum.02
2156; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2157; PROLOG-BLOCK-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
2158; PROLOG-BLOCK-NEXT:    br i1 %exitcond, label %latchExit, label %header.1
2159; PROLOG-BLOCK:       latchExit:
2160; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
2161; PROLOG-BLOCK-NEXT:    ret i32 %result
2162; PROLOG-BLOCK:       for.exit2:
2163; PROLOG-BLOCK-NEXT:    ret i32 42
2164; PROLOG-BLOCK:       header.1:
2165; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.1
2166; PROLOG-BLOCK:       for.exiting_block.1:
2167; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2168; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit, label %latch.1
2169; PROLOG-BLOCK:       latch.1:
2170; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2171; PROLOG-BLOCK-NEXT:    %1 = load i32, i32* %arrayidx.1, align 4
2172; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %1, %add
2173; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2174; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
2175; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !6
2176;
2177
2178entry:
2179  br label %header
2180
2181header:
2182  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
2183  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
2184  br i1 %cond, label %for.exit2, label %for.exiting_block
2185
2186for.exiting_block:
2187  %cmp = icmp eq i64 %n, 42
2188  br i1 %cmp, label %latchExit, label %latch
2189
2190latch:                                         ; preds = %latch, %entry
2191  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2192  %0 = load i32, i32* %arrayidx, align 4
2193  %add = add nsw i32 %0, %sum.02
2194  %indvars.iv.next = add i64 %indvars.iv, 1
2195  %exitcond = icmp eq i64 %indvars.iv.next, %n
2196  br i1 %exitcond, label %latchExit, label %header
2197
2198latchExit:                                          ; preds = %latch, %entry
2199  %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
2200  ret i32 %result
2201
2202for.exit2:
2203  ret i32 42
2204}
2205
2206; Two exiting blocks to latch where the exiting blocks are Latch and a
2207; non-header
2208; Same as above test except the incoming value for cloned latch Phi is from the
2209; for.exiting_block.
2210; FIXME: We should be able to runtime unroll.
2211define i32 @otherblock_latch_same_exit3(i32* nocapture %a, i64 %n, i1 %cond) {
2212; EPILOG-LABEL: @otherblock_latch_same_exit3(
2213; EPILOG-NEXT:  entry:
2214; EPILOG-NEXT:    %0 = add i64 %n, -1
2215; EPILOG-NEXT:    %xtraiter = and i64 %n, 7
2216; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
2217; EPILOG-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
2218; EPILOG:       entry.new:
2219; EPILOG-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
2220; EPILOG-NEXT:    br label %header
2221; EPILOG:       header:
2222; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
2223; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
2224; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %latch.7 ]
2225; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2226; EPILOG:       for.exiting_block:
2227; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2228; EPILOG-NEXT:    %2 = load i32, i32* %arrayidx, align 4
2229; EPILOG-NEXT:    %add = add nsw i32 %2, %sum.02
2230; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
2231; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2232; EPILOG:       latch:
2233; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2234; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
2235; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2236; EPILOG:       latchExit.unr-lcssa.loopexit:
2237; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
2238; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
2239; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
2240; EPILOG-NEXT:    br label %latchExit.unr-lcssa
2241; EPILOG:       latchExit.unr-lcssa:
2242; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2243; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2244; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2245; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2246; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2247; EPILOG:       header.epil.preheader:
2248; EPILOG-NEXT:    br label %header.epil
2249; EPILOG:       header.epil:
2250; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
2251; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
2252; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
2253; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
2254; EPILOG:       for.exiting_block.epil:
2255; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
2256; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
2257; EPILOG-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
2258; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2259; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
2260; EPILOG:       latch.epil:
2261; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
2262; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
2263; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
2264; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
2265; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !7
2266; EPILOG:       latchExit.epilog-lcssa.loopexit:
2267; 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 ]
2268; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2269; EPILOG:       latchExit.epilog-lcssa.loopexit3:
2270; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
2271; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
2272; EPILOG:       latchExit.epilog-lcssa:
2273; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
2274; EPILOG-NEXT:    br label %latchExit
2275; EPILOG:       latchExit:
2276; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2277; EPILOG-NEXT:    ret i32 %result
2278; EPILOG:       for.exit2.loopexit:
2279; EPILOG-NEXT:    br label %for.exit2
2280; EPILOG:       for.exit2.loopexit2:
2281; EPILOG-NEXT:    br label %for.exit2
2282; EPILOG:       for.exit2:
2283; EPILOG-NEXT:    ret i32 42
2284; EPILOG:       for.exiting_block.1:
2285; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2286; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2287; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
2288; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2289; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2290; EPILOG:       latch.1:
2291; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
2292; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
2293; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2294; EPILOG:       for.exiting_block.2:
2295; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2296; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
2297; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
2298; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2299; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
2300; EPILOG:       latch.2:
2301; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
2302; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
2303; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2304; EPILOG:       for.exiting_block.3:
2305; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2306; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
2307; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
2308; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2309; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
2310; EPILOG:       latch.3:
2311; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
2312; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
2313; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2314; EPILOG:       for.exiting_block.4:
2315; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2316; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
2317; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2318; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2319; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
2320; EPILOG:       latch.4:
2321; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
2322; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
2323; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2324; EPILOG:       for.exiting_block.5:
2325; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2326; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
2327; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2328; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2329; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
2330; EPILOG:       latch.5:
2331; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
2332; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
2333; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2334; EPILOG:       for.exiting_block.6:
2335; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2336; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
2337; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2338; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2339; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
2340; EPILOG:       latch.6:
2341; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
2342; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
2343; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2344; EPILOG:       for.exiting_block.7:
2345; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2346; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
2347; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2348; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2349; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
2350; EPILOG:       latch.7:
2351; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
2352; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
2353; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
2354; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
2355;
2356; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit3(
2357; EPILOG-BLOCK-NEXT:  entry:
2358; EPILOG-BLOCK-NEXT:    %0 = add i64 %n, -1
2359; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
2360; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
2361; EPILOG-BLOCK-NEXT:    br i1 %1, label %latchExit.unr-lcssa, label %entry.new
2362; EPILOG-BLOCK:       entry.new:
2363; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
2364; EPILOG-BLOCK-NEXT:    br label %header
2365; EPILOG-BLOCK:       header:
2366; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
2367; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
2368; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %latch.1 ]
2369; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2370; EPILOG-BLOCK:       for.exiting_block:
2371; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2372; EPILOG-BLOCK-NEXT:    %2 = load i32, i32* %arrayidx, align 4
2373; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %2, %sum.02
2374; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2375; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2376; EPILOG-BLOCK:       latch:
2377; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2378; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
2379; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2380; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
2381; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
2382; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
2383; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
2384; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
2385; EPILOG-BLOCK:       latchExit.unr-lcssa:
2386; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
2387; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
2388; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
2389; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2390; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
2391; EPILOG-BLOCK:       header.epil.preheader:
2392; EPILOG-BLOCK-NEXT:    br label %header.epil
2393; EPILOG-BLOCK:       header.epil:
2394; EPILOG-BLOCK-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.unr, %header.epil.preheader ]
2395; EPILOG-BLOCK-NEXT:    %sum.02.epil = phi i32 [ %sum.02.unr, %header.epil.preheader ]
2396; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
2397; EPILOG-BLOCK:       for.exiting_block.epil:
2398; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
2399; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
2400; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
2401; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
2402; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
2403; EPILOG-BLOCK:       latch.epil:
2404; EPILOG-BLOCK-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
2405; EPILOG-BLOCK-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
2406; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2407; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
2408; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ]
2409; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
2410; EPILOG-BLOCK:       latchExit.epilog-lcssa:
2411; 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 ]
2412; EPILOG-BLOCK-NEXT:    br label %latchExit
2413; EPILOG-BLOCK:       latchExit:
2414; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2415; EPILOG-BLOCK-NEXT:    ret i32 %result
2416; EPILOG-BLOCK:       for.exit2.loopexit:
2417; EPILOG-BLOCK-NEXT:    br label %for.exit2
2418; EPILOG-BLOCK:       for.exit2:
2419; EPILOG-BLOCK-NEXT:    ret i32 42
2420; EPILOG-BLOCK:       for.exiting_block.1:
2421; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2422; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2423; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2424; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2425; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2426; EPILOG-BLOCK:       latch.1:
2427; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2428; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
2429; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0
2430; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7
2431;
2432; PROLOG-LABEL: @otherblock_latch_same_exit3(
2433; PROLOG-NEXT:  entry:
2434; PROLOG-NEXT:    br label %header
2435; PROLOG:       header:
2436; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
2437; PROLOG-NEXT:    %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
2438; PROLOG-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
2439; PROLOG:       for.exiting_block:
2440; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2441; PROLOG-NEXT:    %0 = load i32, i32* %arrayidx, align 4
2442; PROLOG-NEXT:    %add = add nsw i32 %0, %sum.02
2443; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
2444; PROLOG-NEXT:    br i1 %cmp, label %latchExit, label %latch
2445; PROLOG:       latch:
2446; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
2447; PROLOG-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
2448; PROLOG-NEXT:    br i1 %exitcond, label %latchExit, label %header
2449; PROLOG:       latchExit:
2450; PROLOG-NEXT:    %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
2451; PROLOG-NEXT:    ret i32 %result
2452; PROLOG:       for.exit2:
2453; PROLOG-NEXT:    ret i32 42
2454;
2455; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit3(
2456; PROLOG-BLOCK-NEXT:  entry:
2457; PROLOG-BLOCK-NEXT:    br label %header
2458; PROLOG-BLOCK:       header:
2459; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ]
2460; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ]
2461; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
2462; PROLOG-BLOCK:       for.exiting_block:
2463; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2464; PROLOG-BLOCK-NEXT:    %0 = load i32, i32* %arrayidx, align 4
2465; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %0, %sum.02
2466; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
2467; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit, label %latch
2468; PROLOG-BLOCK:       latch:
2469; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
2470; PROLOG-BLOCK-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
2471; PROLOG-BLOCK-NEXT:    br i1 %exitcond, label %latchExit, label %header.1
2472; PROLOG-BLOCK:       latchExit:
2473; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
2474; PROLOG-BLOCK-NEXT:    ret i32 %result
2475; PROLOG-BLOCK:       for.exit2:
2476; PROLOG-BLOCK-NEXT:    ret i32 42
2477; PROLOG-BLOCK:       header.1:
2478; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.1
2479; PROLOG-BLOCK:       for.exiting_block.1:
2480; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2481; PROLOG-BLOCK-NEXT:    %1 = load i32, i32* %arrayidx.1, align 4
2482; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %1, %add
2483; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2484; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit, label %latch.1
2485; PROLOG-BLOCK:       latch.1:
2486; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2487; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
2488; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !7
2489;
2490
2491entry:
2492  br label %header
2493
2494header:
2495  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
2496  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
2497  br i1 %cond, label %for.exit2, label %for.exiting_block
2498
2499for.exiting_block:
2500  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2501  %0 = load i32, i32* %arrayidx, align 4
2502  %add = add nsw i32 %0, %sum.02
2503  %cmp = icmp eq i64 %n, 42
2504  br i1 %cmp, label %latchExit, label %latch
2505
2506latch:                                         ; preds = %latch, %entry
2507  %indvars.iv.next = add i64 %indvars.iv, 1
2508  %exitcond = icmp eq i64 %indvars.iv.next, %n
2509  br i1 %exitcond, label %latchExit, label %header
2510
2511latchExit:                                          ; preds = %latch, %entry
2512  %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
2513  ret i32 %result
2514
2515for.exit2:
2516  ret i32 42
2517}
2518
2519; FIXME: Support multiple exiting blocks to the unique exit block (LatchExit).
2520; Only 2 blocks in loop: header and latch where both exit to same LatchExit.
2521define void @unique_exit(i32 %arg) {
2522; CHECK-LABEL: @unique_exit(
2523; CHECK-NEXT:  entry:
2524; CHECK-NEXT:    %i = icmp sgt i32 undef, %arg
2525; CHECK-NEXT:    br i1 %i, label %preheader, label %returnblock
2526; CHECK:       preheader:
2527; CHECK-NEXT:    br label %header
2528; CHECK:       header:
2529; CHECK-NEXT:    br i1 true, label %latchExit, label %latch
2530; CHECK:       latch:
2531; CHECK-NEXT:    br label %latchExit
2532; CHECK:       latchExit:
2533; CHECK-NEXT:    %i2.ph = phi i32 [ %arg, %header ], [ -1, %latch ]
2534; CHECK-NEXT:    br label %returnblock
2535; CHECK:       returnblock:
2536; CHECK-NEXT:    %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ]
2537; CHECK-NEXT:    ret void
2538;
2539
2540entry:
2541  %i = icmp sgt i32 undef, %arg
2542  br i1 %i, label %preheader, label %returnblock
2543
2544preheader:                                 ; preds = %entry
2545  br label %header
2546
2547header:                                           ; preds = %preheader, %latch
2548  %i4 = phi i32 [ %inc, %latch ], [ %arg, %preheader ]
2549  %inc = add nsw i32 %i4, 1
2550  br i1 true, label %latchExit, label %latch
2551
2552latch:                                            ; preds = %header
2553  %cmp = icmp slt i32 %inc, undef
2554  br i1 %cmp, label %header, label %latchExit
2555
2556latchExit:                                ; preds = %header, %latch
2557  %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ]
2558  br label %returnblock
2559
2560returnblock:                                         ; preds = %latchExit, %entry
2561  %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ]
2562  ret void
2563}
2564
2565; two exiting and two exit blocks.
2566; the non-latch exiting block has duplicate edges to the non-latch exit block.
2567define i64 @test5(i64 %trip, i64 %add, i1 %cond) {
2568; EPILOG-LABEL: @test5(
2569; EPILOG-NEXT:  entry:
2570; EPILOG-NEXT:    %0 = add i64 %trip, -1
2571; EPILOG-NEXT:    %xtraiter = and i64 %trip, 7
2572; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
2573; EPILOG-NEXT:    br i1 %1, label %latchexit.unr-lcssa, label %entry.new
2574; EPILOG:       entry.new:
2575; EPILOG-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
2576; EPILOG-NEXT:    br label %loop_header
2577; EPILOG:       loop_header:
2578; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
2579; EPILOG-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
2580; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ]
2581; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
2582; EPILOG:       loop_exiting:
2583; EPILOG-NEXT:    %ivy = add i64 %iv, %add
2584; EPILOG-NEXT:    switch i64 %sum, label %loop_latch [
2585; EPILOG-NEXT:    i64 24, label %exit1.loopexit
2586; EPILOG-NEXT:    i64 42, label %exit1.loopexit
2587; EPILOG-NEXT:    ]
2588; EPILOG:       loop_latch:
2589; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
2590; EPILOG-NEXT:    %sum.next = add i64 %sum, %add
2591; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
2592; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
2593; EPILOG:       exit1.loopexit:
2594; 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 ]
2595; EPILOG-NEXT:    br label %exit1
2596; EPILOG:       exit1.loopexit2:
2597; EPILOG-NEXT:    %result.ph3 = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ]
2598; EPILOG-NEXT:    br label %exit1
2599; EPILOG:       exit1:
2600; EPILOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph3, %exit1.loopexit2 ]
2601; EPILOG-NEXT:    ret i64 %result
2602; EPILOG:       latchexit.unr-lcssa.loopexit:
2603; EPILOG-NEXT:    %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
2604; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
2605; EPILOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
2606; EPILOG-NEXT:    br label %latchexit.unr-lcssa
2607; EPILOG:       latchexit.unr-lcssa:
2608; EPILOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ]
2609; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ]
2610; EPILOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ]
2611; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2612; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit
2613; EPILOG:       loop_header.epil.preheader:
2614; EPILOG-NEXT:    br label %loop_header.epil
2615; EPILOG:       loop_header.epil:
2616; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
2617; EPILOG-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]
2618; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ]
2619; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil
2620; EPILOG:       loop_exiting.epil:
2621; EPILOG-NEXT:    %ivy.epil = add i64 %iv.epil, %add
2622; EPILOG-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
2623; EPILOG-NEXT:    i64 24, label %exit1.loopexit2
2624; EPILOG-NEXT:    i64 42, label %exit1.loopexit2
2625; EPILOG-NEXT:    ]
2626; EPILOG:       loop_latch.epil:
2627; EPILOG-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
2628; EPILOG-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
2629; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
2630; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
2631; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
2632; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %latchexit.epilog-lcssa, !llvm.loop !8
2633; EPILOG:       latchexit.epilog-lcssa:
2634; EPILOG-NEXT:    %sum.next.lcssa.ph1 = phi i64 [ %sum.next.epil, %loop_latch.epil ]
2635; EPILOG-NEXT:    br label %latchexit
2636; EPILOG:       latchexit:
2637; EPILOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.lcssa.ph1, %latchexit.epilog-lcssa ]
2638; EPILOG-NEXT:    ret i64 %sum.next.lcssa
2639; EPILOG:       loop_exiting.1:
2640; EPILOG-NEXT:    %ivy.1 = add i64 %iv_next, %add
2641; EPILOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
2642; EPILOG-NEXT:    i64 24, label %exit1.loopexit
2643; EPILOG-NEXT:    i64 42, label %exit1.loopexit
2644; EPILOG-NEXT:    ]
2645; EPILOG:       loop_latch.1:
2646; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
2647; EPILOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
2648; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
2649; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.2
2650; EPILOG:       loop_exiting.2:
2651; EPILOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add
2652; EPILOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
2653; EPILOG-NEXT:    i64 24, label %exit1.loopexit
2654; EPILOG-NEXT:    i64 42, label %exit1.loopexit
2655; EPILOG-NEXT:    ]
2656; EPILOG:       loop_latch.2:
2657; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
2658; EPILOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
2659; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
2660; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.3
2661; EPILOG:       loop_exiting.3:
2662; EPILOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add
2663; EPILOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
2664; EPILOG-NEXT:    i64 24, label %exit1.loopexit
2665; EPILOG-NEXT:    i64 42, label %exit1.loopexit
2666; EPILOG-NEXT:    ]
2667; EPILOG:       loop_latch.3:
2668; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
2669; EPILOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
2670; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
2671; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.4
2672; EPILOG:       loop_exiting.4:
2673; EPILOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add
2674; EPILOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
2675; EPILOG-NEXT:    i64 24, label %exit1.loopexit
2676; EPILOG-NEXT:    i64 42, label %exit1.loopexit
2677; EPILOG-NEXT:    ]
2678; EPILOG:       loop_latch.4:
2679; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
2680; EPILOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
2681; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
2682; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.5
2683; EPILOG:       loop_exiting.5:
2684; EPILOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add
2685; EPILOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
2686; EPILOG-NEXT:    i64 24, label %exit1.loopexit
2687; EPILOG-NEXT:    i64 42, label %exit1.loopexit
2688; EPILOG-NEXT:    ]
2689; EPILOG:       loop_latch.5:
2690; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
2691; EPILOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
2692; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
2693; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.6
2694; EPILOG:       loop_exiting.6:
2695; EPILOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add
2696; EPILOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
2697; EPILOG-NEXT:    i64 24, label %exit1.loopexit
2698; EPILOG-NEXT:    i64 42, label %exit1.loopexit
2699; EPILOG-NEXT:    ]
2700; EPILOG:       loop_latch.6:
2701; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
2702; EPILOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
2703; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
2704; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.7
2705; EPILOG:       loop_exiting.7:
2706; EPILOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add
2707; EPILOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
2708; EPILOG-NEXT:    i64 24, label %exit1.loopexit
2709; EPILOG-NEXT:    i64 42, label %exit1.loopexit
2710; EPILOG-NEXT:    ]
2711; EPILOG:       loop_latch.7:
2712; EPILOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
2713; EPILOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
2714; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
2715; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0
2716; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %latchexit.unr-lcssa.loopexit
2717;
2718; EPILOG-BLOCK-LABEL: @test5(
2719; EPILOG-BLOCK-NEXT:  entry:
2720; EPILOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
2721; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
2722; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
2723; EPILOG-BLOCK-NEXT:    br i1 %1, label %latchexit.unr-lcssa, label %entry.new
2724; EPILOG-BLOCK:       entry.new:
2725; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
2726; EPILOG-BLOCK-NEXT:    br label %loop_header
2727; EPILOG-BLOCK:       loop_header:
2728; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
2729; EPILOG-BLOCK-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
2730; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %loop_latch.1 ]
2731; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
2732; EPILOG-BLOCK:       loop_exiting:
2733; EPILOG-BLOCK-NEXT:    %ivy = add i64 %iv, %add
2734; EPILOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
2735; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
2736; EPILOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
2737; EPILOG-BLOCK-NEXT:    ]
2738; EPILOG-BLOCK:       loop_latch:
2739; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
2740; EPILOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
2741; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
2742; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
2743; EPILOG-BLOCK:       exit1.loopexit:
2744; EPILOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]
2745; EPILOG-BLOCK-NEXT:    br label %exit1
2746; EPILOG-BLOCK:       exit1:
2747; EPILOG-BLOCK-NEXT:    %result = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ], [ %result.ph, %exit1.loopexit ]
2748; EPILOG-BLOCK-NEXT:    ret i64 %result
2749; EPILOG-BLOCK:       latchexit.unr-lcssa.loopexit:
2750; EPILOG-BLOCK-NEXT:    %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
2751; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
2752; EPILOG-BLOCK-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
2753; EPILOG-BLOCK-NEXT:    br label %latchexit.unr-lcssa
2754; EPILOG-BLOCK:       latchexit.unr-lcssa:
2755; EPILOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ]
2756; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ]
2757; EPILOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ]
2758; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2759; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit
2760; EPILOG-BLOCK:       loop_header.epil.preheader:
2761; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
2762; EPILOG-BLOCK:       loop_header.epil:
2763; EPILOG-BLOCK-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ]
2764; EPILOG-BLOCK-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ]
2765; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil
2766; EPILOG-BLOCK:       loop_exiting.epil:
2767; EPILOG-BLOCK-NEXT:    %ivy.epil = add i64 %iv.epil, %add
2768; EPILOG-BLOCK-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
2769; EPILOG-BLOCK-NEXT:    i64 24, label %exit1
2770; EPILOG-BLOCK-NEXT:    i64 42, label %exit1
2771; EPILOG-BLOCK-NEXT:    ]
2772; EPILOG-BLOCK:       loop_latch.epil:
2773; EPILOG-BLOCK-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
2774; EPILOG-BLOCK-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
2775; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
2776; EPILOG-BLOCK-NEXT:    br label %latchexit.epilog-lcssa
2777; EPILOG-BLOCK:       latchexit.epilog-lcssa:
2778; EPILOG-BLOCK-NEXT:    br label %latchexit
2779; EPILOG-BLOCK:       latchexit:
2780; EPILOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.epil, %latchexit.epilog-lcssa ]
2781; EPILOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa
2782; EPILOG-BLOCK:       loop_exiting.1:
2783; EPILOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add
2784; EPILOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
2785; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
2786; EPILOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
2787; EPILOG-BLOCK-NEXT:    ]
2788; EPILOG-BLOCK:       loop_latch.1:
2789; EPILOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
2790; EPILOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
2791; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
2792; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0
2793; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !8
2794;
2795; PROLOG-LABEL: @test5(
2796; PROLOG-NEXT:  entry:
2797; PROLOG-NEXT:    %0 = add i64 %trip, -1
2798; PROLOG-NEXT:    %xtraiter = and i64 %trip, 7
2799; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2800; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
2801; PROLOG:       loop_header.prol.preheader:
2802; PROLOG-NEXT:    br label %loop_header.prol
2803; PROLOG:       loop_header.prol:
2804; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
2805; PROLOG-NEXT:    %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ]
2806; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ]
2807; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol
2808; PROLOG:       loop_exiting.prol:
2809; PROLOG-NEXT:    %ivy.prol = add i64 %iv.prol, %add
2810; PROLOG-NEXT:    switch i64 %sum.prol, label %loop_latch.prol [
2811; PROLOG-NEXT:    i64 24, label %exit1.loopexit1
2812; PROLOG-NEXT:    i64 42, label %exit1.loopexit1
2813; PROLOG-NEXT:    ]
2814; PROLOG:       loop_latch.prol:
2815; PROLOG-NEXT:    %iv_next.prol = add nuw nsw i64 %iv.prol, 1
2816; PROLOG-NEXT:    %sum.next.prol = add i64 %sum.prol, %add
2817; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
2818; PROLOG-NEXT:    %prol.iter.sub = sub i64 %prol.iter, 1
2819; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
2820; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !4
2821; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
2822; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
2823; PROLOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
2824; PROLOG-NEXT:    %sum.next.lcssa.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
2825; PROLOG-NEXT:    br label %loop_header.prol.loopexit
2826; PROLOG:       loop_header.prol.loopexit:
2827; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
2828; PROLOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
2829; PROLOG-NEXT:    %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %sum.next.lcssa.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
2830; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
2831; PROLOG-NEXT:    br i1 %1, label %latchexit, label %entry.new
2832; PROLOG:       entry.new:
2833; PROLOG-NEXT:    br label %loop_header
2834; PROLOG:       loop_header:
2835; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
2836; PROLOG-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
2837; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
2838; PROLOG:       loop_exiting:
2839; PROLOG-NEXT:    %ivy = add i64 %iv, %add
2840; PROLOG-NEXT:    switch i64 %sum, label %loop_latch [
2841; PROLOG-NEXT:    i64 24, label %exit1.loopexit
2842; PROLOG-NEXT:    i64 42, label %exit1.loopexit
2843; PROLOG-NEXT:    ]
2844; PROLOG:       loop_latch:
2845; PROLOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
2846; PROLOG-NEXT:    %sum.next = add i64 %sum, %add
2847; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
2848; PROLOG:       exit1.loopexit:
2849; 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 ]
2850; PROLOG-NEXT:    br label %exit1
2851; PROLOG:       exit1.loopexit1:
2852; PROLOG-NEXT:    %result.ph2 = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ]
2853; PROLOG-NEXT:    br label %exit1
2854; PROLOG:       exit1:
2855; PROLOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph2, %exit1.loopexit1 ]
2856; PROLOG-NEXT:    ret i64 %result
2857; PROLOG:       latchexit.unr-lcssa:
2858; PROLOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
2859; PROLOG-NEXT:    br label %latchexit
2860; PROLOG:       latchexit:
2861; PROLOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]
2862; PROLOG-NEXT:    ret i64 %sum.next.lcssa
2863; PROLOG:       loop_exiting.1:
2864; PROLOG-NEXT:    %ivy.1 = add i64 %iv_next, %add
2865; PROLOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
2866; PROLOG-NEXT:    i64 24, label %exit1.loopexit
2867; PROLOG-NEXT:    i64 42, label %exit1.loopexit
2868; PROLOG-NEXT:    ]
2869; PROLOG:       loop_latch.1:
2870; PROLOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
2871; PROLOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
2872; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.2
2873; PROLOG:       loop_exiting.2:
2874; PROLOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add
2875; PROLOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
2876; PROLOG-NEXT:    i64 24, label %exit1.loopexit
2877; PROLOG-NEXT:    i64 42, label %exit1.loopexit
2878; PROLOG-NEXT:    ]
2879; PROLOG:       loop_latch.2:
2880; PROLOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
2881; PROLOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
2882; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.3
2883; PROLOG:       loop_exiting.3:
2884; PROLOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add
2885; PROLOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
2886; PROLOG-NEXT:    i64 24, label %exit1.loopexit
2887; PROLOG-NEXT:    i64 42, label %exit1.loopexit
2888; PROLOG-NEXT:    ]
2889; PROLOG:       loop_latch.3:
2890; PROLOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
2891; PROLOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
2892; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.4
2893; PROLOG:       loop_exiting.4:
2894; PROLOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add
2895; PROLOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
2896; PROLOG-NEXT:    i64 24, label %exit1.loopexit
2897; PROLOG-NEXT:    i64 42, label %exit1.loopexit
2898; PROLOG-NEXT:    ]
2899; PROLOG:       loop_latch.4:
2900; PROLOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
2901; PROLOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
2902; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.5
2903; PROLOG:       loop_exiting.5:
2904; PROLOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add
2905; PROLOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
2906; PROLOG-NEXT:    i64 24, label %exit1.loopexit
2907; PROLOG-NEXT:    i64 42, label %exit1.loopexit
2908; PROLOG-NEXT:    ]
2909; PROLOG:       loop_latch.5:
2910; PROLOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
2911; PROLOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
2912; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.6
2913; PROLOG:       loop_exiting.6:
2914; PROLOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add
2915; PROLOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
2916; PROLOG-NEXT:    i64 24, label %exit1.loopexit
2917; PROLOG-NEXT:    i64 42, label %exit1.loopexit
2918; PROLOG-NEXT:    ]
2919; PROLOG:       loop_latch.6:
2920; PROLOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
2921; PROLOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
2922; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.7
2923; PROLOG:       loop_exiting.7:
2924; PROLOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add
2925; PROLOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
2926; PROLOG-NEXT:    i64 24, label %exit1.loopexit
2927; PROLOG-NEXT:    i64 42, label %exit1.loopexit
2928; PROLOG-NEXT:    ]
2929; PROLOG:       loop_latch.7:
2930; PROLOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
2931; PROLOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
2932; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
2933; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %latchexit.unr-lcssa
2934;
2935; PROLOG-BLOCK-LABEL: @test5(
2936; PROLOG-BLOCK-NEXT:  entry:
2937; PROLOG-BLOCK-NEXT:    %0 = add i64 %trip, -1
2938; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %trip, 1
2939; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2940; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
2941; PROLOG-BLOCK:       loop_header.prol.preheader:
2942; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
2943; PROLOG-BLOCK:       loop_header.prol:
2944; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol
2945; PROLOG-BLOCK:       loop_exiting.prol:
2946; PROLOG-BLOCK-NEXT:    %ivy.prol = add i64 0, %add
2947; PROLOG-BLOCK-NEXT:    switch i64 0, label %loop_latch.prol [
2948; PROLOG-BLOCK-NEXT:    i64 24, label %exit1
2949; PROLOG-BLOCK-NEXT:    i64 42, label %exit1
2950; PROLOG-BLOCK-NEXT:    ]
2951; PROLOG-BLOCK:       loop_latch.prol:
2952; PROLOG-BLOCK-NEXT:    %iv_next.prol = add nuw nsw i64 0, 1
2953; PROLOG-BLOCK-NEXT:    %sum.next.prol = add i64 0, %add
2954; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
2955; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
2956; PROLOG-BLOCK:       loop_header.prol.loopexit:
2957; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv_next.prol, %loop_latch.prol ]
2958; PROLOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.next.prol, %loop_latch.prol ]
2959; PROLOG-BLOCK-NEXT:    %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %sum.next.prol, %loop_latch.prol ]
2960; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
2961; PROLOG-BLOCK-NEXT:    br i1 %1, label %latchexit, label %entry.new
2962; PROLOG-BLOCK:       entry.new:
2963; PROLOG-BLOCK-NEXT:    br label %loop_header
2964; PROLOG-BLOCK:       loop_header:
2965; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
2966; PROLOG-BLOCK-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
2967; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
2968; PROLOG-BLOCK:       loop_exiting:
2969; PROLOG-BLOCK-NEXT:    %ivy = add i64 %iv, %add
2970; PROLOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
2971; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
2972; PROLOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
2973; PROLOG-BLOCK-NEXT:    ]
2974; PROLOG-BLOCK:       loop_latch:
2975; PROLOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
2976; PROLOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
2977; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
2978; PROLOG-BLOCK:       exit1.loopexit:
2979; PROLOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]
2980; PROLOG-BLOCK-NEXT:    br label %exit1
2981; PROLOG-BLOCK:       exit1:
2982; PROLOG-BLOCK-NEXT:    %result = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ], [ %result.ph, %exit1.loopexit ]
2983; PROLOG-BLOCK-NEXT:    ret i64 %result
2984; PROLOG-BLOCK:       latchexit.unr-lcssa:
2985; PROLOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
2986; PROLOG-BLOCK-NEXT:    br label %latchexit
2987; PROLOG-BLOCK:       latchexit:
2988; PROLOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]
2989; PROLOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa
2990; PROLOG-BLOCK:       loop_exiting.1:
2991; PROLOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add
2992; PROLOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
2993; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
2994; PROLOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
2995; PROLOG-BLOCK-NEXT:    ]
2996; PROLOG-BLOCK:       loop_latch.1:
2997; PROLOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
2998; PROLOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
2999; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
3000; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %latchexit.unr-lcssa, !llvm.loop !8
3001;
3002
3003entry:
3004  br label %loop_header
3005
3006loop_header:
3007  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
3008  %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ]
3009  br i1 %cond, label %loop_latch, label %loop_exiting
3010
3011loop_exiting:
3012  %ivy = add i64 %iv, %add
3013  switch i64 %sum, label %loop_latch [
3014  i64 24, label %exit1
3015  i64 42, label %exit1
3016  ]
3017
3018loop_latch:
3019  %iv_next = add nuw nsw i64 %iv, 1
3020  %sum.next = add i64 %sum, %add
3021  %cmp = icmp ne i64 %iv_next, %trip
3022  br i1 %cmp, label %loop_header, label %latchexit
3023
3024exit1:
3025  %result = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ]
3026  ret i64 %result
3027
3028latchexit:
3029  ret i64 %sum.next
3030}
3031
3032; test when exit blocks have successors.
3033define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) {
3034; EPILOG-LABEL: @test6(
3035; EPILOG-NEXT:  entry:
3036; EPILOG-NEXT:    %0 = add i64 %n, -1
3037; EPILOG-NEXT:    %xtraiter = and i64 %n, 7
3038; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
3039; EPILOG-NEXT:    br i1 %1, label %latch_exit.unr-lcssa, label %entry.new
3040; EPILOG:       entry.new:
3041; EPILOG-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
3042; EPILOG-NEXT:    br label %header
3043; EPILOG:       header:
3044; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
3045; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
3046; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %latch.7 ]
3047; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
3048; EPILOG:       for.exiting_block:
3049; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
3050; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
3051; EPILOG:       latch:
3052; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3053; EPILOG-NEXT:    %load = load i32, i32* %arrayidx, align 4
3054; EPILOG-NEXT:    %add = add nsw i32 %load, %sum.02
3055; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
3056; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
3057; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
3058; EPILOG:       latch_exit.unr-lcssa.loopexit:
3059; EPILOG-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %latch.7 ]
3060; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
3061; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
3062; EPILOG-NEXT:    br label %latch_exit.unr-lcssa
3063; EPILOG:       latch_exit.unr-lcssa:
3064; EPILOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ]
3065; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3066; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3067; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3068; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit
3069; EPILOG:       header.epil.preheader:
3070; EPILOG-NEXT:    br label %header.epil
3071; EPILOG:       header.epil:
3072; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
3073; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
3074; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
3075; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil
3076; EPILOG:       for.exiting_block.epil:
3077; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
3078; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit2, label %latch.epil
3079; EPILOG:       latch.epil:
3080; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
3081; EPILOG-NEXT:    %load.epil = load i32, i32* %arrayidx.epil, align 4
3082; EPILOG-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.epil
3083; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
3084; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
3085; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
3086; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
3087; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latch_exit.epilog-lcssa, !llvm.loop !9
3088; EPILOG:       latch_exit.epilog-lcssa:
3089; EPILOG-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %latch.epil ]
3090; EPILOG-NEXT:    br label %latch_exit
3091; EPILOG:       latch_exit:
3092; EPILOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %sum.0.lcssa.ph1, %latch_exit.epilog-lcssa ]
3093; EPILOG-NEXT:    ret i32 %sum.0.lcssa
3094; EPILOG:       for.exit2.loopexit:
3095; 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 ]
3096; EPILOG-NEXT:    br label %for.exit2
3097; EPILOG:       for.exit2.loopexit2:
3098; EPILOG-NEXT:    %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
3099; EPILOG-NEXT:    br label %for.exit2
3100; EPILOG:       for.exit2:
3101; EPILOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
3102; EPILOG-NEXT:    %addx = add i32 %retval, %x
3103; EPILOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3104; EPILOG:       exit_true:
3105; EPILOG-NEXT:    ret i32 %retval
3106; EPILOG:       exit_false:
3107; EPILOG-NEXT:    ret i32 %addx
3108; EPILOG:       for.exiting_block.1:
3109; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3110; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3111; EPILOG:       latch.1:
3112; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3113; EPILOG-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
3114; EPILOG-NEXT:    %add.1 = add nsw i32 %load.1, %add
3115; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
3116; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
3117; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
3118; EPILOG:       for.exiting_block.2:
3119; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
3120; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
3121; EPILOG:       latch.2:
3122; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
3123; EPILOG-NEXT:    %load.2 = load i32, i32* %arrayidx.2, align 4
3124; EPILOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.1
3125; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
3126; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
3127; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
3128; EPILOG:       for.exiting_block.3:
3129; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
3130; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
3131; EPILOG:       latch.3:
3132; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
3133; EPILOG-NEXT:    %load.3 = load i32, i32* %arrayidx.3, align 4
3134; EPILOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.2
3135; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
3136; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
3137; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
3138; EPILOG:       for.exiting_block.4:
3139; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
3140; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
3141; EPILOG:       latch.4:
3142; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
3143; EPILOG-NEXT:    %load.4 = load i32, i32* %arrayidx.4, align 4
3144; EPILOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.3
3145; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
3146; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
3147; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
3148; EPILOG:       for.exiting_block.5:
3149; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
3150; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
3151; EPILOG:       latch.5:
3152; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
3153; EPILOG-NEXT:    %load.5 = load i32, i32* %arrayidx.5, align 4
3154; EPILOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.4
3155; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
3156; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
3157; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
3158; EPILOG:       for.exiting_block.6:
3159; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
3160; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
3161; EPILOG:       latch.6:
3162; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
3163; EPILOG-NEXT:    %load.6 = load i32, i32* %arrayidx.6, align 4
3164; EPILOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.5
3165; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
3166; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
3167; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
3168; EPILOG:       for.exiting_block.7:
3169; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
3170; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
3171; EPILOG:       latch.7:
3172; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
3173; EPILOG-NEXT:    %load.7 = load i32, i32* %arrayidx.7, align 4
3174; EPILOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.6
3175; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
3176; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
3177; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
3178; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latch_exit.unr-lcssa.loopexit, label %header
3179;
3180; EPILOG-BLOCK-LABEL: @test6(
3181; EPILOG-BLOCK-NEXT:  entry:
3182; EPILOG-BLOCK-NEXT:    %0 = add i64 %n, -1
3183; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
3184; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
3185; EPILOG-BLOCK-NEXT:    br i1 %1, label %latch_exit.unr-lcssa, label %entry.new
3186; EPILOG-BLOCK:       entry.new:
3187; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
3188; EPILOG-BLOCK-NEXT:    br label %header
3189; EPILOG-BLOCK:       header:
3190; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
3191; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
3192; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %latch.1 ]
3193; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
3194; EPILOG-BLOCK:       for.exiting_block:
3195; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
3196; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
3197; EPILOG-BLOCK:       latch:
3198; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3199; EPILOG-BLOCK-NEXT:    %load = load i32, i32* %arrayidx, align 4
3200; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %load, %sum.02
3201; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
3202; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
3203; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
3204; EPILOG-BLOCK:       latch_exit.unr-lcssa.loopexit:
3205; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %latch.1 ]
3206; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
3207; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
3208; EPILOG-BLOCK-NEXT:    br label %latch_exit.unr-lcssa
3209; EPILOG-BLOCK:       latch_exit.unr-lcssa:
3210; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ]
3211; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3212; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3213; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3214; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit
3215; EPILOG-BLOCK:       header.epil.preheader:
3216; EPILOG-BLOCK-NEXT:    br label %header.epil
3217; EPILOG-BLOCK:       header.epil:
3218; EPILOG-BLOCK-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.unr, %header.epil.preheader ]
3219; EPILOG-BLOCK-NEXT:    %sum.02.epil = phi i32 [ %sum.02.unr, %header.epil.preheader ]
3220; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.epil
3221; EPILOG-BLOCK:       for.exiting_block.epil:
3222; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
3223; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %latch.epil
3224; EPILOG-BLOCK:       latch.epil:
3225; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
3226; EPILOG-BLOCK-NEXT:    %load.epil = load i32, i32* %arrayidx.epil, align 4
3227; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.epil
3228; EPILOG-BLOCK-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
3229; EPILOG-BLOCK-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
3230; EPILOG-BLOCK-NEXT:    br label %latch_exit.epilog-lcssa
3231; EPILOG-BLOCK:       latch_exit.epilog-lcssa:
3232; EPILOG-BLOCK-NEXT:    br label %latch_exit
3233; EPILOG-BLOCK:       latch_exit:
3234; EPILOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %add.epil, %latch_exit.epilog-lcssa ]
3235; EPILOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
3236; EPILOG-BLOCK:       for.exit2.loopexit:
3237; EPILOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]
3238; EPILOG-BLOCK-NEXT:    br label %for.exit2
3239; EPILOG-BLOCK:       for.exit2:
3240; EPILOG-BLOCK-NEXT:    %retval = phi i32 [ %sum.02.epil, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ]
3241; EPILOG-BLOCK-NEXT:    %addx = add i32 %retval, %x
3242; EPILOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3243; EPILOG-BLOCK:       exit_true:
3244; EPILOG-BLOCK-NEXT:    ret i32 %retval
3245; EPILOG-BLOCK:       exit_false:
3246; EPILOG-BLOCK-NEXT:    ret i32 %addx
3247; EPILOG-BLOCK:       for.exiting_block.1:
3248; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3249; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3250; EPILOG-BLOCK:       latch.1:
3251; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3252; EPILOG-BLOCK-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
3253; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add
3254; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
3255; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
3256; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0
3257; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latch_exit.unr-lcssa.loopexit, label %header, !llvm.loop !9
3258;
3259; PROLOG-LABEL: @test6(
3260; PROLOG-NEXT:  entry:
3261; PROLOG-NEXT:    %0 = add i64 %n, -1
3262; PROLOG-NEXT:    %xtraiter = and i64 %n, 7
3263; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3264; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
3265; PROLOG:       header.prol.preheader:
3266; PROLOG-NEXT:    br label %header.prol
3267; PROLOG:       header.prol:
3268; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
3269; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
3270; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ]
3271; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol
3272; PROLOG:       for.exiting_block.prol:
3273; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
3274; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit1, label %latch.prol
3275; PROLOG:       latch.prol:
3276; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
3277; PROLOG-NEXT:    %load.prol = load i32, i32* %arrayidx.prol, align 4
3278; PROLOG-NEXT:    %add.prol = add nsw i32 %load.prol, %sum.02.prol
3279; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
3280; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
3281; PROLOG-NEXT:    %prol.iter.sub = sub i64 %prol.iter, 1
3282; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
3283; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !5
3284; PROLOG:       header.prol.loopexit.unr-lcssa:
3285; PROLOG-NEXT:    %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %latch.prol ]
3286; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
3287; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
3288; PROLOG-NEXT:    br label %header.prol.loopexit
3289; PROLOG:       header.prol.loopexit:
3290; PROLOG-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ]
3291; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
3292; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
3293; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
3294; PROLOG-NEXT:    br i1 %1, label %latch_exit, label %entry.new
3295; PROLOG:       entry.new:
3296; PROLOG-NEXT:    br label %header
3297; PROLOG:       header:
3298; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
3299; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
3300; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
3301; PROLOG:       for.exiting_block:
3302; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
3303; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
3304; PROLOG:       latch:
3305; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3306; PROLOG-NEXT:    %load = load i32, i32* %arrayidx, align 4
3307; PROLOG-NEXT:    %add = add nsw i32 %load, %sum.02
3308; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
3309; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
3310; PROLOG:       latch_exit.unr-lcssa:
3311; PROLOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %latch.7 ]
3312; PROLOG-NEXT:    br label %latch_exit
3313; PROLOG:       latch_exit:
3314; PROLOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]
3315; PROLOG-NEXT:    ret i32 %sum.0.lcssa
3316; PROLOG:       for.exit2.loopexit:
3317; 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 ]
3318; PROLOG-NEXT:    br label %for.exit2
3319; PROLOG:       for.exit2.loopexit1:
3320; PROLOG-NEXT:    %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
3321; PROLOG-NEXT:    br label %for.exit2
3322; PROLOG:       for.exit2:
3323; PROLOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
3324; PROLOG-NEXT:    %addx = add i32 %retval, %x
3325; PROLOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3326; PROLOG:       exit_true:
3327; PROLOG-NEXT:    ret i32 %retval
3328; PROLOG:       exit_false:
3329; PROLOG-NEXT:    ret i32 %addx
3330; PROLOG:       for.exiting_block.1:
3331; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3332; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3333; PROLOG:       latch.1:
3334; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3335; PROLOG-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
3336; PROLOG-NEXT:    %add.1 = add nsw i32 %load.1, %add
3337; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
3338; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
3339; PROLOG:       for.exiting_block.2:
3340; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
3341; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
3342; PROLOG:       latch.2:
3343; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
3344; PROLOG-NEXT:    %load.2 = load i32, i32* %arrayidx.2, align 4
3345; PROLOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.1
3346; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
3347; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
3348; PROLOG:       for.exiting_block.3:
3349; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
3350; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
3351; PROLOG:       latch.3:
3352; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
3353; PROLOG-NEXT:    %load.3 = load i32, i32* %arrayidx.3, align 4
3354; PROLOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.2
3355; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
3356; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
3357; PROLOG:       for.exiting_block.4:
3358; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
3359; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
3360; PROLOG:       latch.4:
3361; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
3362; PROLOG-NEXT:    %load.4 = load i32, i32* %arrayidx.4, align 4
3363; PROLOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.3
3364; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
3365; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
3366; PROLOG:       for.exiting_block.5:
3367; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
3368; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
3369; PROLOG:       latch.5:
3370; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
3371; PROLOG-NEXT:    %load.5 = load i32, i32* %arrayidx.5, align 4
3372; PROLOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.4
3373; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
3374; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
3375; PROLOG:       for.exiting_block.6:
3376; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
3377; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
3378; PROLOG:       latch.6:
3379; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
3380; PROLOG-NEXT:    %load.6 = load i32, i32* %arrayidx.6, align 4
3381; PROLOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.5
3382; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
3383; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
3384; PROLOG:       for.exiting_block.7:
3385; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
3386; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
3387; PROLOG:       latch.7:
3388; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
3389; PROLOG-NEXT:    %load.7 = load i32, i32* %arrayidx.7, align 4
3390; PROLOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.6
3391; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
3392; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
3393; PROLOG-NEXT:    br i1 %exitcond.7, label %latch_exit.unr-lcssa, label %header
3394;
3395; PROLOG-BLOCK-LABEL: @test6(
3396; PROLOG-BLOCK-NEXT:  entry:
3397; PROLOG-BLOCK-NEXT:    %0 = add i64 %n, -1
3398; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
3399; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3400; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
3401; PROLOG-BLOCK:       header.prol.preheader:
3402; PROLOG-BLOCK-NEXT:    br label %header.prol
3403; PROLOG-BLOCK:       header.prol:
3404; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.prol
3405; PROLOG-BLOCK:       for.exiting_block.prol:
3406; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
3407; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %latch.prol
3408; PROLOG-BLOCK:       latch.prol:
3409; PROLOG-BLOCK-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 0
3410; PROLOG-BLOCK-NEXT:    %load.prol = load i32, i32* %arrayidx.prol, align 4
3411; PROLOG-BLOCK-NEXT:    %add.prol = add nsw i32 %load.prol, 0
3412; PROLOG-BLOCK-NEXT:    %indvars.iv.next.prol = add i64 0, 1
3413; PROLOG-BLOCK-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
3414; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
3415; PROLOG-BLOCK:       header.prol.loopexit:
3416; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %add.prol, %latch.prol ]
3417; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.next.prol, %latch.prol ]
3418; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %add.prol, %latch.prol ]
3419; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
3420; PROLOG-BLOCK-NEXT:    br i1 %1, label %latch_exit, label %entry.new
3421; PROLOG-BLOCK:       entry.new:
3422; PROLOG-BLOCK-NEXT:    br label %header
3423; PROLOG-BLOCK:       header:
3424; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
3425; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
3426; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
3427; PROLOG-BLOCK:       for.exiting_block:
3428; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
3429; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
3430; PROLOG-BLOCK:       latch:
3431; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3432; PROLOG-BLOCK-NEXT:    %load = load i32, i32* %arrayidx, align 4
3433; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %load, %sum.02
3434; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
3435; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
3436; PROLOG-BLOCK:       latch_exit.unr-lcssa:
3437; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %latch.1 ]
3438; PROLOG-BLOCK-NEXT:    br label %latch_exit
3439; PROLOG-BLOCK:       latch_exit:
3440; PROLOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]
3441; PROLOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
3442; PROLOG-BLOCK:       for.exit2.loopexit:
3443; PROLOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]
3444; PROLOG-BLOCK-NEXT:    br label %for.exit2
3445; PROLOG-BLOCK:       for.exit2:
3446; PROLOG-BLOCK-NEXT:    %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ]
3447; PROLOG-BLOCK-NEXT:    %addx = add i32 %retval, %x
3448; PROLOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3449; PROLOG-BLOCK:       exit_true:
3450; PROLOG-BLOCK-NEXT:    ret i32 %retval
3451; PROLOG-BLOCK:       exit_false:
3452; PROLOG-BLOCK-NEXT:    ret i32 %addx
3453; PROLOG-BLOCK:       for.exiting_block.1:
3454; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3455; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3456; PROLOG-BLOCK:       latch.1:
3457; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3458; PROLOG-BLOCK-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
3459; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add
3460; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
3461; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
3462; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latch_exit.unr-lcssa, label %header, !llvm.loop !9
3463;
3464
3465entry:
3466  br label %header
3467
3468header:
3469  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
3470  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
3471  br i1 false, label %for.exit2, label %for.exiting_block
3472
3473for.exiting_block:
3474  %cmp = icmp eq i64 %n, 42
3475  br i1 %cmp, label %for.exit2, label %latch
3476
3477latch:
3478  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3479  %load = load i32, i32* %arrayidx, align 4
3480  %add = add nsw i32 %load, %sum.02
3481  %indvars.iv.next = add i64 %indvars.iv, 1
3482  %exitcond = icmp eq i64 %indvars.iv.next, %n
3483  br i1 %exitcond, label %latch_exit, label %header
3484
3485latch_exit:
3486  %sum.0.lcssa = phi i32 [ %add, %latch ]
3487  ret i32 %sum.0.lcssa
3488
3489for.exit2:
3490  %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ]
3491  %addx = add i32 %retval, %x
3492  br i1 %cond, label %exit_true, label %exit_false
3493
3494exit_true:
3495  ret i32 %retval
3496
3497exit_false:
3498  ret i32 %addx
3499}
3500
3501; test when value in exit block does not have VMap.
3502define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) {
3503; EPILOG-LABEL: @test7(
3504; EPILOG-NEXT:  bb:
3505; EPILOG-NEXT:    %i = icmp slt i32 undef, 2
3506; EPILOG-NEXT:    %sext = sext i32 undef to i64
3507; EPILOG-NEXT:    %shft = ashr exact i32 %arg, 16
3508; EPILOG-NEXT:    br i1 %i, label %loopexit2, label %preheader
3509; EPILOG:       preheader:
3510; EPILOG-NEXT:    %0 = add nsw i64 %sext, -1
3511; EPILOG-NEXT:    %1 = add nsw i64 %sext, -2
3512; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
3513; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
3514; EPILOG-NEXT:    br i1 %2, label %latchexit.unr-lcssa, label %preheader.new
3515; EPILOG:       preheader.new:
3516; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
3517; EPILOG-NEXT:    br label %header
3518; EPILOG:       header:
3519; EPILOG-NEXT:    %i6 = phi i64 [ 1, %preheader.new ], [ %add.7, %latch.7 ]
3520; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %preheader.new ], [ %niter.nsub.7, %latch.7 ]
3521; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
3522; EPILOG:       latch:
3523; EPILOG-NEXT:    %add = add nuw nsw i64 %i6, 1
3524; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
3525; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
3526; EPILOG:       latchexit.unr-lcssa.loopexit:
3527; EPILOG-NEXT:    %i6.unr.ph = phi i64 [ %add.7, %latch.7 ]
3528; EPILOG-NEXT:    br label %latchexit.unr-lcssa
3529; EPILOG:       latchexit.unr-lcssa:
3530; EPILOG-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ]
3531; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3532; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit
3533; EPILOG:       header.epil.preheader:
3534; EPILOG-NEXT:    br label %header.epil
3535; EPILOG:       header.epil:
3536; EPILOG-NEXT:    %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ], [ %add.epil, %latch.epil ]
3537; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
3538; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit1, label %latch.epil
3539; EPILOG:       latch.epil:
3540; EPILOG-NEXT:    %add.epil = add nuw nsw i64 %i6.epil, 1
3541; EPILOG-NEXT:    %i9.epil = icmp slt i64 %add.epil, %sext
3542; EPILOG-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
3543; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
3544; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchexit.epilog-lcssa, !llvm.loop !10
3545; EPILOG:       latchexit.epilog-lcssa:
3546; EPILOG-NEXT:    br label %latchexit
3547; EPILOG:       latchexit:
3548; EPILOG-NEXT:    unreachable
3549; EPILOG:       loopexit2:
3550; EPILOG-NEXT:    ret i32 %shft
3551; EPILOG:       loopexit1.loopexit:
3552; 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 ]
3553; EPILOG-NEXT:    br label %loopexit1
3554; EPILOG:       loopexit1.loopexit1:
3555; EPILOG-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.epil ]
3556; EPILOG-NEXT:    br label %loopexit1
3557; EPILOG:       loopexit1:
3558; EPILOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
3559; EPILOG-NEXT:    ret i32 %sext3
3560; EPILOG:       latch.1:
3561; EPILOG-NEXT:    %add.1 = add nuw nsw i64 %add, 1
3562; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
3563; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.2
3564; EPILOG:       latch.2:
3565; EPILOG-NEXT:    %add.2 = add nuw nsw i64 %add.1, 1
3566; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
3567; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.3
3568; EPILOG:       latch.3:
3569; EPILOG-NEXT:    %add.3 = add nuw nsw i64 %add.2, 1
3570; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
3571; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.4
3572; EPILOG:       latch.4:
3573; EPILOG-NEXT:    %add.4 = add nuw nsw i64 %add.3, 1
3574; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
3575; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.5
3576; EPILOG:       latch.5:
3577; EPILOG-NEXT:    %add.5 = add nuw nsw i64 %add.4, 1
3578; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
3579; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.6
3580; EPILOG:       latch.6:
3581; EPILOG-NEXT:    %add.6 = add nuw nsw i64 %add.5, 1
3582; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
3583; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.7
3584; EPILOG:       latch.7:
3585; EPILOG-NEXT:    %add.7 = add nuw nsw i64 %add.6, 1
3586; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
3587; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0
3588; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %latchexit.unr-lcssa.loopexit
3589;
3590; EPILOG-BLOCK-LABEL: @test7(
3591; EPILOG-BLOCK-NEXT:  bb:
3592; EPILOG-BLOCK-NEXT:    %i = icmp slt i32 undef, 2
3593; EPILOG-BLOCK-NEXT:    %sext = sext i32 undef to i64
3594; EPILOG-BLOCK-NEXT:    %shft = ashr exact i32 %arg, 16
3595; EPILOG-BLOCK-NEXT:    br i1 %i, label %loopexit2, label %preheader
3596; EPILOG-BLOCK:       preheader:
3597; EPILOG-BLOCK-NEXT:    %0 = add nsw i64 %sext, -1
3598; EPILOG-BLOCK-NEXT:    %1 = add nsw i64 %sext, -2
3599; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
3600; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
3601; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchexit.unr-lcssa, label %preheader.new
3602; EPILOG-BLOCK:       preheader.new:
3603; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
3604; EPILOG-BLOCK-NEXT:    br label %header
3605; EPILOG-BLOCK:       header:
3606; EPILOG-BLOCK-NEXT:    %i6 = phi i64 [ 1, %preheader.new ], [ %add.1, %latch.1 ]
3607; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %preheader.new ], [ %niter.nsub.1, %latch.1 ]
3608; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
3609; EPILOG-BLOCK:       latch:
3610; EPILOG-BLOCK-NEXT:    %add = add nuw nsw i64 %i6, 1
3611; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
3612; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
3613; EPILOG-BLOCK:       latchexit.unr-lcssa.loopexit:
3614; EPILOG-BLOCK-NEXT:    %i6.unr.ph = phi i64 [ %add.1, %latch.1 ]
3615; EPILOG-BLOCK-NEXT:    br label %latchexit.unr-lcssa
3616; EPILOG-BLOCK:       latchexit.unr-lcssa:
3617; EPILOG-BLOCK-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ]
3618; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3619; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit
3620; EPILOG-BLOCK:       header.epil.preheader:
3621; EPILOG-BLOCK-NEXT:    br label %header.epil
3622; EPILOG-BLOCK:       header.epil:
3623; EPILOG-BLOCK-NEXT:    %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ]
3624; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1, label %latch.epil
3625; EPILOG-BLOCK:       latch.epil:
3626; EPILOG-BLOCK-NEXT:    %add.epil = add nuw nsw i64 %i6.epil, 1
3627; EPILOG-BLOCK-NEXT:    %i9.epil = icmp slt i64 %add.epil, %sext
3628; EPILOG-BLOCK-NEXT:    br label %latchexit.epilog-lcssa
3629; EPILOG-BLOCK:       latchexit.epilog-lcssa:
3630; EPILOG-BLOCK-NEXT:    br label %latchexit
3631; EPILOG-BLOCK:       latchexit:
3632; EPILOG-BLOCK-NEXT:    unreachable
3633; EPILOG-BLOCK:       loopexit2:
3634; EPILOG-BLOCK-NEXT:    ret i32 %shft
3635; EPILOG-BLOCK:       loopexit1.loopexit:
3636; EPILOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]
3637; EPILOG-BLOCK-NEXT:    br label %loopexit1
3638; EPILOG-BLOCK:       loopexit1:
3639; EPILOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.epil ], [ %sext3.ph, %loopexit1.loopexit ]
3640; EPILOG-BLOCK-NEXT:    ret i32 %sext3
3641; EPILOG-BLOCK:       latch.1:
3642; EPILOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %add, 1
3643; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
3644; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0
3645; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !10
3646;
3647; PROLOG-LABEL: @test7(
3648; PROLOG-NEXT:  bb:
3649; PROLOG-NEXT:    %i = icmp slt i32 undef, 2
3650; PROLOG-NEXT:    %sext = sext i32 undef to i64
3651; PROLOG-NEXT:    %shft = ashr exact i32 %arg, 16
3652; PROLOG-NEXT:    br i1 %i, label %loopexit2, label %preheader
3653; PROLOG:       preheader:
3654; PROLOG-NEXT:    %0 = add nsw i64 %sext, -1
3655; PROLOG-NEXT:    %1 = add nsw i64 %sext, -2
3656; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
3657; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3658; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
3659; PROLOG:       header.prol.preheader:
3660; PROLOG-NEXT:    br label %header.prol
3661; PROLOG:       header.prol:
3662; PROLOG-NEXT:    %i6.prol = phi i64 [ 1, %header.prol.preheader ], [ %add.prol, %latch.prol ]
3663; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ]
3664; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit1, label %latch.prol
3665; PROLOG:       latch.prol:
3666; PROLOG-NEXT:    %add.prol = add nuw nsw i64 %i6.prol, 1
3667; PROLOG-NEXT:    %i9.prol = icmp slt i64 %add.prol, %sext
3668; PROLOG-NEXT:    %prol.iter.sub = sub i64 %prol.iter, 1
3669; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
3670; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !6
3671; PROLOG:       header.prol.loopexit.unr-lcssa:
3672; PROLOG-NEXT:    %i6.unr.ph = phi i64 [ %add.prol, %latch.prol ]
3673; PROLOG-NEXT:    br label %header.prol.loopexit
3674; PROLOG:       header.prol.loopexit:
3675; PROLOG-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %header.prol.loopexit.unr-lcssa ]
3676; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
3677; PROLOG-NEXT:    br i1 %2, label %latchexit, label %preheader.new
3678; PROLOG:       preheader.new:
3679; PROLOG-NEXT:    br label %header
3680; PROLOG:       header:
3681; PROLOG-NEXT:    %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.7, %latch.7 ]
3682; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
3683; PROLOG:       latch:
3684; PROLOG-NEXT:    %add = add nuw nsw i64 %i6, 1
3685; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
3686; PROLOG:       latchexit.unr-lcssa:
3687; PROLOG-NEXT:    br label %latchexit
3688; PROLOG:       latchexit:
3689; PROLOG-NEXT:    unreachable
3690; PROLOG:       loopexit2:
3691; PROLOG-NEXT:    ret i32 %shft
3692; PROLOG:       loopexit1.loopexit:
3693; 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 ]
3694; PROLOG-NEXT:    br label %loopexit1
3695; PROLOG:       loopexit1.loopexit1:
3696; PROLOG-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.prol ]
3697; PROLOG-NEXT:    br label %loopexit1
3698; PROLOG:       loopexit1:
3699; PROLOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
3700; PROLOG-NEXT:    ret i32 %sext3
3701; PROLOG:       latch.1:
3702; PROLOG-NEXT:    %add.1 = add nuw nsw i64 %add, 1
3703; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.2
3704; PROLOG:       latch.2:
3705; PROLOG-NEXT:    %add.2 = add nuw nsw i64 %add.1, 1
3706; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.3
3707; PROLOG:       latch.3:
3708; PROLOG-NEXT:    %add.3 = add nuw nsw i64 %add.2, 1
3709; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.4
3710; PROLOG:       latch.4:
3711; PROLOG-NEXT:    %add.4 = add nuw nsw i64 %add.3, 1
3712; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.5
3713; PROLOG:       latch.5:
3714; PROLOG-NEXT:    %add.5 = add nuw nsw i64 %add.4, 1
3715; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.6
3716; PROLOG:       latch.6:
3717; PROLOG-NEXT:    %add.6 = add nuw nsw i64 %add.5, 1
3718; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.7
3719; PROLOG:       latch.7:
3720; PROLOG-NEXT:    %add.7 = add nuw nsw i64 %add.6, 1
3721; PROLOG-NEXT:    %i9.7 = icmp slt i64 %add.7, %sext
3722; PROLOG-NEXT:    br i1 %i9.7, label %header, label %latchexit.unr-lcssa
3723;
3724; PROLOG-BLOCK-LABEL: @test7(
3725; PROLOG-BLOCK-NEXT:  bb:
3726; PROLOG-BLOCK-NEXT:    %i = icmp slt i32 undef, 2
3727; PROLOG-BLOCK-NEXT:    %sext = sext i32 undef to i64
3728; PROLOG-BLOCK-NEXT:    %shft = ashr exact i32 %arg, 16
3729; PROLOG-BLOCK-NEXT:    br i1 %i, label %loopexit2, label %preheader
3730; PROLOG-BLOCK:       preheader:
3731; PROLOG-BLOCK-NEXT:    %0 = add nsw i64 %sext, -1
3732; PROLOG-BLOCK-NEXT:    %1 = add nsw i64 %sext, -2
3733; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
3734; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3735; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
3736; PROLOG-BLOCK:       header.prol.preheader:
3737; PROLOG-BLOCK-NEXT:    br label %header.prol
3738; PROLOG-BLOCK:       header.prol:
3739; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1, label %latch.prol
3740; PROLOG-BLOCK:       latch.prol:
3741; PROLOG-BLOCK-NEXT:    %add.prol = add nuw nsw i64 1, 1
3742; PROLOG-BLOCK-NEXT:    %i9.prol = icmp slt i64 %add.prol, %sext
3743; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
3744; PROLOG-BLOCK:       header.prol.loopexit:
3745; PROLOG-BLOCK-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %add.prol, %latch.prol ]
3746; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
3747; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchexit, label %preheader.new
3748; PROLOG-BLOCK:       preheader.new:
3749; PROLOG-BLOCK-NEXT:    br label %header
3750; PROLOG-BLOCK:       header:
3751; PROLOG-BLOCK-NEXT:    %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.1, %latch.1 ]
3752; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
3753; PROLOG-BLOCK:       latch:
3754; PROLOG-BLOCK-NEXT:    %add = add nuw nsw i64 %i6, 1
3755; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
3756; PROLOG-BLOCK:       latchexit.unr-lcssa:
3757; PROLOG-BLOCK-NEXT:    br label %latchexit
3758; PROLOG-BLOCK:       latchexit:
3759; PROLOG-BLOCK-NEXT:    unreachable
3760; PROLOG-BLOCK:       loopexit2:
3761; PROLOG-BLOCK-NEXT:    ret i32 %shft
3762; PROLOG-BLOCK:       loopexit1.loopexit:
3763; PROLOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]
3764; PROLOG-BLOCK-NEXT:    br label %loopexit1
3765; PROLOG-BLOCK:       loopexit1:
3766; PROLOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.prol ], [ %sext3.ph, %loopexit1.loopexit ]
3767; PROLOG-BLOCK-NEXT:    ret i32 %sext3
3768; PROLOG-BLOCK:       latch.1:
3769; PROLOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %add, 1
3770; PROLOG-BLOCK-NEXT:    %i9.1 = icmp slt i64 %add.1, %sext
3771; PROLOG-BLOCK-NEXT:    br i1 %i9.1, label %header, label %latchexit.unr-lcssa, !llvm.loop !10
3772;
3773bb:
3774  %i = icmp slt i32 undef, 2
3775  %sext = sext i32 undef to i64
3776  %shft = ashr exact i32 %arg, 16
3777  br i1 %i, label %loopexit2, label %preheader
3778
3779preheader:                                              ; preds = %bb2
3780  br label %header
3781
3782header:                                              ; preds = %latch, %preheader
3783  %i6 = phi i64 [ 1, %preheader ], [ %add, %latch ]
3784  br i1 false, label %loopexit1, label %latch
3785
3786latch:                                              ; preds = %header
3787  %add = add nuw nsw i64 %i6, 1
3788  %i9 = icmp slt i64 %add, %sext
3789  br i1 %i9, label %header, label %latchexit
3790
3791latchexit:                                             ; preds = %latch
3792  unreachable
3793
3794loopexit2:                                             ; preds = %bb2
3795  ret i32 %shft
3796
3797loopexit1:                                             ; preds = %header
3798  %sext3 = phi i32 [ %shft, %header ]
3799  ret i32 %sext3
3800}
3801
3802; Nested loop and inner loop is unrolled
3803; FIXME: we cannot unroll with epilog remainder currently, because
3804; the outer loop does not contain the epilog preheader and epilog exit (while
3805; infact it should). This causes us to choke up on LCSSA form being incorrect in
3806; outer loop. However, the exit block where LCSSA fails, is infact still within
3807; the outer loop. For now, we just bail out in presence of outer loop and epilog
3808; loop is generated.
3809; The outer loop header is the preheader for the inner loop and the inner header
3810; branches back to the outer loop.
3811define void @test8() {
3812; EPILOG-LABEL: @test8(
3813; EPILOG-NEXT:  bb:
3814; EPILOG-NEXT:    br label %outerloop
3815; EPILOG:       outerloop.loopexit:
3816; EPILOG-NEXT:    br label %outerloop
3817; EPILOG:       outerloop:
3818; EPILOG-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]
3819; EPILOG-NEXT:    br label %innerH
3820; EPILOG:       innerH:
3821; EPILOG-NEXT:    %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ]
3822; EPILOG-NEXT:    %i4 = add nuw nsw i64 %i3, 1
3823; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit, label %latch
3824; EPILOG:       latch:
3825; EPILOG-NEXT:    %i6 = icmp ult i64 %i4, 100
3826; EPILOG-NEXT:    br i1 %i6, label %innerH, label %exit
3827; EPILOG:       exit:
3828; EPILOG-NEXT:    ret void
3829;
3830; EPILOG-BLOCK-LABEL: @test8(
3831; EPILOG-BLOCK-NEXT:  bb:
3832; EPILOG-BLOCK-NEXT:    br label %outerloop
3833; EPILOG-BLOCK:       outerloop.loopexit:
3834; EPILOG-BLOCK-NEXT:    br label %innerH.12
3835; EPILOG-BLOCK:       outerloop:
3836; EPILOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]
3837; EPILOG-BLOCK-NEXT:    br label %innerH
3838; EPILOG-BLOCK:       innerH:
3839; EPILOG-BLOCK-NEXT:    %i3 = phi i64 [ %i, %outerloop ], [ %i4.1, %latch.1 ]
3840; EPILOG-BLOCK-NEXT:    %i4 = add nuw nsw i64 %i3, 1
3841; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch
3842; EPILOG-BLOCK:       latch:
3843; EPILOG-BLOCK-NEXT:    %i6 = icmp ult i64 %i4, 100
3844; EPILOG-BLOCK-NEXT:    br i1 %i6, label %innerH.1, label %exit.loopexit
3845; EPILOG-BLOCK:       exit.loopexit:
3846; EPILOG-BLOCK-NEXT:    br label %exit
3847; EPILOG-BLOCK:       exit.loopexit5:
3848; EPILOG-BLOCK-NEXT:    br label %exit
3849; EPILOG-BLOCK:       exit:
3850; EPILOG-BLOCK-NEXT:    ret void
3851; EPILOG-BLOCK:       innerH.1:
3852; EPILOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
3853; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.1
3854; EPILOG-BLOCK:       latch.1:
3855; EPILOG-BLOCK-NEXT:    %i6.1 = icmp ult i64 %i4.1, 100
3856; EPILOG-BLOCK-NEXT:    br i1 %i6.1, label %innerH, label %exit.loopexit, !llvm.loop !11
3857; EPILOG-BLOCK:       innerH.12:
3858; EPILOG-BLOCK-NEXT:    %i3.1 = phi i64 [ 0, %outerloop.loopexit ], [ %i4.1.1, %latch.1.1 ]
3859; EPILOG-BLOCK-NEXT:    %i4.11 = add nuw nsw i64 %i3.1, 1
3860; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.14
3861; EPILOG-BLOCK:       latch.14:
3862; EPILOG-BLOCK-NEXT:    %i6.13 = icmp ult i64 %i4.11, 100
3863; EPILOG-BLOCK-NEXT:    br i1 %i6.13, label %innerH.1.1, label %exit.loopexit5
3864; EPILOG-BLOCK:       innerH.1.1:
3865; EPILOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i4.11, 1
3866; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.1.1
3867; EPILOG-BLOCK:       latch.1.1:
3868; EPILOG-BLOCK-NEXT:    %i6.1.1 = icmp ult i64 %i4.1.1, 100
3869; EPILOG-BLOCK-NEXT:    br i1 %i6.1.1, label %innerH.12, label %exit.loopexit5, !llvm.loop !11
3870; EPILOG-BLOCK:       outerloop.loopexit.1:
3871; EPILOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !12
3872;
3873; PROLOG-LABEL: @test8(
3874; PROLOG-NEXT:  bb:
3875; PROLOG-NEXT:    br label %outerloop
3876; PROLOG:       outerloop.loopexit.loopexit:
3877; PROLOG-NEXT:    br label %outerloop.loopexit
3878; PROLOG:       outerloop.loopexit.loopexit1:
3879; PROLOG-NEXT:    br label %outerloop.loopexit
3880; PROLOG:       outerloop.loopexit:
3881; PROLOG-NEXT:    br label %outerloop
3882; PROLOG:       outerloop:
3883; PROLOG-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]
3884; PROLOG-NEXT:    %0 = sub i64 100, %i
3885; PROLOG-NEXT:    %1 = sub i64 99, %i
3886; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
3887; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3888; PROLOG-NEXT:    br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit
3889; PROLOG:       innerH.prol.preheader:
3890; PROLOG-NEXT:    br label %innerH.prol
3891; PROLOG:       innerH.prol:
3892; PROLOG-NEXT:    %i3.prol = phi i64 [ %i4.prol, %latch.prol ], [ %i, %innerH.prol.preheader ]
3893; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %innerH.prol.preheader ], [ %prol.iter.sub, %latch.prol ]
3894; PROLOG-NEXT:    %i4.prol = add nuw nsw i64 %i3.prol, 1
3895; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit1, label %latch.prol
3896; PROLOG:       latch.prol:
3897; PROLOG-NEXT:    %i6.prol = icmp ult i64 %i4.prol, 100
3898; PROLOG-NEXT:    %prol.iter.sub = sub i64 %prol.iter, 1
3899; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
3900; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %innerH.prol, label %innerH.prol.loopexit.unr-lcssa, !llvm.loop !7
3901; PROLOG:       innerH.prol.loopexit.unr-lcssa:
3902; PROLOG-NEXT:    %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ]
3903; PROLOG-NEXT:    br label %innerH.prol.loopexit
3904; PROLOG:       innerH.prol.loopexit:
3905; PROLOG-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %innerH.prol.loopexit.unr-lcssa ]
3906; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
3907; PROLOG-NEXT:    br i1 %2, label %exit.loopexit, label %outerloop.new
3908; PROLOG:       outerloop.new:
3909; PROLOG-NEXT:    br label %innerH
3910; PROLOG:       innerH:
3911; PROLOG-NEXT:    %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.7, %latch.7 ]
3912; PROLOG-NEXT:    %i4 = add nuw nsw i64 %i3, 1
3913; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
3914; PROLOG:       latch:
3915; PROLOG-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
3916; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
3917; PROLOG:       exit.unr-lcssa:
3918; PROLOG-NEXT:    br label %exit
3919; PROLOG:       exit.loopexit:
3920; PROLOG-NEXT:    br label %exit
3921; PROLOG:       exit:
3922; PROLOG-NEXT:    ret void
3923; PROLOG:       latch.1:
3924; PROLOG-NEXT:    %i4.2 = add nuw nsw i64 %i4.1, 1
3925; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.2
3926; PROLOG:       latch.2:
3927; PROLOG-NEXT:    %i4.3 = add nuw nsw i64 %i4.2, 1
3928; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.3
3929; PROLOG:       latch.3:
3930; PROLOG-NEXT:    %i4.4 = add nuw nsw i64 %i4.3, 1
3931; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.4
3932; PROLOG:       latch.4:
3933; PROLOG-NEXT:    %i4.5 = add nuw nsw i64 %i4.4, 1
3934; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.5
3935; PROLOG:       latch.5:
3936; PROLOG-NEXT:    %i4.6 = add nuw nsw i64 %i4.5, 1
3937; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.6
3938; PROLOG:       latch.6:
3939; PROLOG-NEXT:    %i4.7 = add nuw nsw i64 %i4.6, 1
3940; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.7
3941; PROLOG:       latch.7:
3942; PROLOG-NEXT:    %i6.7 = icmp ult i64 %i4.7, 100
3943; PROLOG-NEXT:    br i1 %i6.7, label %innerH, label %exit.unr-lcssa
3944;
3945; PROLOG-BLOCK-LABEL: @test8(
3946; PROLOG-BLOCK-NEXT:  bb:
3947; PROLOG-BLOCK-NEXT:    br label %outerloop
3948; PROLOG-BLOCK:       outerloop.loopexit.loopexit:
3949; PROLOG-BLOCK-NEXT:    br label %outerloop.loopexit
3950; PROLOG-BLOCK:       outerloop.loopexit:
3951; PROLOG-BLOCK-NEXT:    br i1 false, label %innerH.prol.preheader.1, label %innerH.prol.loopexit.unr-lcssa.1
3952; PROLOG-BLOCK:       outerloop:
3953; PROLOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]
3954; PROLOG-BLOCK-NEXT:    %0 = sub i64 100, %i
3955; PROLOG-BLOCK-NEXT:    %1 = sub i64 99, %i
3956; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
3957; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3958; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit.unr-lcssa
3959; PROLOG-BLOCK:       innerH.prol.preheader:
3960; PROLOG-BLOCK-NEXT:    br label %innerH.prol
3961; PROLOG-BLOCK:       innerH.prol:
3962; PROLOG-BLOCK-NEXT:    %i4.prol = add nuw nsw i64 %i, 1
3963; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.prol
3964; PROLOG-BLOCK:       latch.prol:
3965; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit.unr-lcssa
3966; PROLOG-BLOCK:       innerH.prol.loopexit.unr-lcssa:
3967; PROLOG-BLOCK-NEXT:    %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ], [ %i, %outerloop ]
3968; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit
3969; PROLOG-BLOCK:       innerH.prol.loopexit:
3970; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
3971; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit.loopexit, label %outerloop.new
3972; PROLOG-BLOCK:       outerloop.new:
3973; PROLOG-BLOCK-NEXT:    br label %innerH
3974; PROLOG-BLOCK:       innerH:
3975; PROLOG-BLOCK-NEXT:    %i3 = phi i64 [ %i3.unr.ph, %outerloop.new ], [ %i4.1, %latch.1 ]
3976; PROLOG-BLOCK-NEXT:    %i4 = add nuw nsw i64 %i3, 1
3977; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
3978; PROLOG-BLOCK:       latch:
3979; PROLOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
3980; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
3981; PROLOG-BLOCK:       exit.unr-lcssa.loopexit:
3982; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa
3983; PROLOG-BLOCK:       exit.unr-lcssa.loopexit3:
3984; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa
3985; PROLOG-BLOCK:       exit.unr-lcssa:
3986; PROLOG-BLOCK-NEXT:    br label %exit
3987; PROLOG-BLOCK:       exit.loopexit:
3988; PROLOG-BLOCK-NEXT:    br label %exit
3989; PROLOG-BLOCK:       exit:
3990; PROLOG-BLOCK-NEXT:    ret void
3991; PROLOG-BLOCK:       latch.1:
3992; PROLOG-BLOCK-NEXT:    %i6.1 = icmp ult i64 %i4.1, 100
3993; PROLOG-BLOCK-NEXT:    br i1 %i6.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !11
3994; PROLOG-BLOCK:       innerH.prol.preheader.1:
3995; PROLOG-BLOCK-NEXT:    br label %innerH.prol.1
3996; PROLOG-BLOCK:       innerH.prol.1:
3997; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.prol.1
3998; PROLOG-BLOCK:       latch.prol.1:
3999; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit.unr-lcssa.1
4000; PROLOG-BLOCK:       innerH.prol.loopexit.unr-lcssa.1:
4001; PROLOG-BLOCK-NEXT:    %i3.unr.ph.1 = phi i64 [ 1, %latch.prol.1 ], [ 0, %outerloop.loopexit ]
4002; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit.1
4003; PROLOG-BLOCK:       innerH.prol.loopexit.1:
4004; PROLOG-BLOCK-NEXT:    br i1 false, label %exit.loopexit, label %outerloop.new.1
4005; PROLOG-BLOCK:       outerloop.new.1:
4006; PROLOG-BLOCK-NEXT:    br label %innerH.1
4007; PROLOG-BLOCK:       innerH.1:
4008; PROLOG-BLOCK-NEXT:    %i3.1 = phi i64 [ %i3.unr.ph.1, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ]
4009; PROLOG-BLOCK-NEXT:    %i4.11 = add nuw nsw i64 %i3.1, 1
4010; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.12
4011; PROLOG-BLOCK:       latch.12:
4012; PROLOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i4.11, 1
4013; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1
4014; PROLOG-BLOCK:       latch.1.1:
4015; PROLOG-BLOCK-NEXT:    %i6.1.1 = icmp ult i64 %i4.1.1, 100
4016; PROLOG-BLOCK-NEXT:    br i1 %i6.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit3, !llvm.loop !11
4017; PROLOG-BLOCK:       outerloop.loopexit.loopexit.1:
4018; PROLOG-BLOCK-NEXT:    br label %outerloop.loopexit.1
4019; PROLOG-BLOCK:       outerloop.loopexit.1:
4020; PROLOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !12
4021;
4022
4023bb:
4024  br label %outerloop
4025
4026outerloop:                                              ; preds = %innerH, %bb
4027  %i = phi i64 [ 3, %bb ], [ 0, %innerH ]
4028  br label %innerH
4029
4030innerH:                                              ; preds = %latch, %outerloop
4031  %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ]
4032  %i4 = add nuw nsw i64 %i3, 1
4033  br i1 false, label %outerloop, label %latch
4034
4035latch:                                              ; preds = %innerH
4036  %i6 = icmp ult i64 %i4, 100
4037  br i1 %i6, label %innerH, label %exit
4038
4039exit:                                              ; preds = %latch
4040  ret void
4041}
4042
4043declare i8 addrspace(1)* @foo(i32)
4044; inner loop prolog unrolled
4045; a value from outer loop is used in exit block of inner loop.
4046; Don't create VMap entries for such values (%trip).
4047define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) {
4048; EPILOG-LABEL: @test9(
4049; EPILOG-NEXT:  bb:
4050; EPILOG-NEXT:    br label %outerloopHdr
4051; EPILOG:       outerloopHdr:
4052; EPILOG-NEXT:    %trip = add i32 %n, -1
4053; EPILOG-NEXT:    %outercnd = icmp slt i32 0, %trip
4054; EPILOG-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
4055; EPILOG:       preheader:
4056; EPILOG-NEXT:    %i4 = zext i32 0 to i64
4057; EPILOG-NEXT:    br label %header
4058; EPILOG:       header:
4059; EPILOG-NEXT:    %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ]
4060; EPILOG-NEXT:    %i7 = trunc i64 %phi to i32
4061; EPILOG-NEXT:    br i1 true, label %latch, label %innerexit
4062; EPILOG:       innerexit:
4063; EPILOG-NEXT:    %trip.lcssa = phi i32 [ %trip, %header ]
4064; EPILOG-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
4065; EPILOG-NEXT:    ret i8 addrspace(1)* %i9
4066; EPILOG:       latch:
4067; EPILOG-NEXT:    %i11 = add nsw i32 %i7, 1
4068; EPILOG-NEXT:    %innercnd = icmp slt i32 %i11, %trip
4069; EPILOG-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
4070; EPILOG-NEXT:    br i1 %innercnd, label %header, label %outerLatch.loopexit
4071; EPILOG:       outerLatch.loopexit:
4072; EPILOG-NEXT:    br label %outerLatch
4073; EPILOG:       outerLatch:
4074; EPILOG-NEXT:    br label %outerloopHdr
4075;
4076; EPILOG-BLOCK-LABEL: @test9(
4077; EPILOG-BLOCK-NEXT:  bb:
4078; EPILOG-BLOCK-NEXT:    br label %outerloopHdr
4079; EPILOG-BLOCK:       outerloopHdr:
4080; EPILOG-BLOCK-NEXT:    %trip = add i32 %n, -1
4081; EPILOG-BLOCK-NEXT:    %outercnd = icmp slt i32 0, %trip
4082; EPILOG-BLOCK-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
4083; EPILOG-BLOCK:       preheader:
4084; EPILOG-BLOCK-NEXT:    br label %header
4085; EPILOG-BLOCK:       header:
4086; EPILOG-BLOCK-NEXT:    %phi = phi i64 [ 0, %preheader ], [ %iv.next.1, %latch.1 ]
4087; EPILOG-BLOCK-NEXT:    %i7 = trunc i64 %phi to i32
4088; EPILOG-BLOCK-NEXT:    br i1 true, label %latch, label %innerexit.loopexit
4089; EPILOG-BLOCK:       innerexit.loopexit:
4090; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph = phi i32 [ %trip, %header.1 ], [ %trip, %header ]
4091; EPILOG-BLOCK-NEXT:    br label %innerexit
4092; EPILOG-BLOCK:       innerexit.loopexit7:
4093; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph8 = phi i32 [ %trip.1, %header.1.1 ], [ %trip.1, %header.12 ]
4094; EPILOG-BLOCK-NEXT:    br label %innerexit
4095; EPILOG-BLOCK:       innerexit:
4096; EPILOG-BLOCK-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph8, %innerexit.loopexit7 ]
4097; EPILOG-BLOCK-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
4098; EPILOG-BLOCK-NEXT:    ret i8 addrspace(1)* %i9
4099; EPILOG-BLOCK:       latch:
4100; EPILOG-BLOCK-NEXT:    %i11 = add nuw nsw i32 %i7, 1
4101; EPILOG-BLOCK-NEXT:    %innercnd = icmp slt i32 %i11, %trip
4102; EPILOG-BLOCK-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
4103; EPILOG-BLOCK-NEXT:    br i1 %innercnd, label %header.1, label %outerLatch.loopexit
4104; EPILOG-BLOCK:       outerLatch.loopexit:
4105; EPILOG-BLOCK-NEXT:    br label %outerLatch
4106; EPILOG-BLOCK:       outerLatch:
4107; EPILOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -1
4108; EPILOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.1
4109; EPILOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.1
4110; EPILOG-BLOCK:       header.1:
4111; EPILOG-BLOCK-NEXT:    %i7.1 = trunc i64 %iv.next to i32
4112; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit
4113; EPILOG-BLOCK:       latch.1:
4114; EPILOG-BLOCK-NEXT:    %i11.1 = add nsw i32 %i7.1, 1
4115; EPILOG-BLOCK-NEXT:    %innercnd.1 = icmp slt i32 %i11.1, %trip
4116; EPILOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
4117; EPILOG-BLOCK-NEXT:    br i1 %innercnd.1, label %header, label %outerLatch.loopexit, !llvm.loop !13
4118; EPILOG-BLOCK:       preheader.1:
4119; EPILOG-BLOCK-NEXT:    br label %header.12
4120; EPILOG-BLOCK:       header.12:
4121; EPILOG-BLOCK-NEXT:    %phi.1 = phi i64 [ 0, %preheader.1 ], [ %iv.next.1.1, %latch.1.1 ]
4122; EPILOG-BLOCK-NEXT:    %i7.11 = trunc i64 %phi.1 to i32
4123; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.16, label %innerexit.loopexit7
4124; EPILOG-BLOCK:       latch.16:
4125; EPILOG-BLOCK-NEXT:    %i11.13 = add nuw nsw i32 %i7.11, 1
4126; EPILOG-BLOCK-NEXT:    %innercnd.14 = icmp slt i32 %i11.13, %trip.1
4127; EPILOG-BLOCK-NEXT:    %iv.next.15 = add nuw nsw i64 %phi.1, 1
4128; EPILOG-BLOCK-NEXT:    br i1 %innercnd.14, label %header.1.1, label %outerLatch.loopexit.1
4129; EPILOG-BLOCK:       header.1.1:
4130; EPILOG-BLOCK-NEXT:    %i7.1.1 = trunc i64 %iv.next.15 to i32
4131; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.1.1, label %innerexit.loopexit7
4132; EPILOG-BLOCK:       latch.1.1:
4133; EPILOG-BLOCK-NEXT:    %i11.1.1 = add nsw i32 %i7.1.1, 1
4134; EPILOG-BLOCK-NEXT:    %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.1
4135; EPILOG-BLOCK-NEXT:    %iv.next.1.1 = add nuw nsw i64 %iv.next.15, 1
4136; EPILOG-BLOCK-NEXT:    br i1 %innercnd.1.1, label %header.12, label %outerLatch.loopexit.1, !llvm.loop !13
4137; EPILOG-BLOCK:       outerLatch.loopexit.1:
4138; EPILOG-BLOCK-NEXT:    br label %outerLatch.1
4139; EPILOG-BLOCK:       outerLatch.1:
4140; EPILOG-BLOCK-NEXT:    br label %outerloopHdr, !llvm.loop !14
4141;
4142; PROLOG-LABEL: @test9(
4143; PROLOG-NEXT:  bb:
4144; PROLOG-NEXT:    %0 = add i32 %n, -1
4145; PROLOG-NEXT:    %1 = add i32 %n, -2
4146; PROLOG-NEXT:    br label %outerloopHdr
4147; PROLOG:       outerloopHdr:
4148; PROLOG-NEXT:    %trip = add i32 %n, -1
4149; PROLOG-NEXT:    %outercnd = icmp slt i32 0, %trip
4150; PROLOG-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
4151; PROLOG:       preheader:
4152; PROLOG-NEXT:    %i4 = zext i32 0 to i64
4153; PROLOG-NEXT:    %xtraiter = and i32 %0, 7
4154; PROLOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
4155; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4156; PROLOG:       header.prol.preheader:
4157; PROLOG-NEXT:    br label %header.prol
4158; PROLOG:       header.prol:
4159; PROLOG-NEXT:    %phi.prol = phi i64 [ %i4, %header.prol.preheader ], [ %iv.next.prol, %latch.prol ]
4160; PROLOG-NEXT:    %prol.iter = phi i32 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ]
4161; PROLOG-NEXT:    %i7.prol = trunc i64 %phi.prol to i32
4162; PROLOG-NEXT:    br i1 true, label %latch.prol, label %innerexit.loopexit1
4163; PROLOG:       latch.prol:
4164; PROLOG-NEXT:    %i11.prol = add nsw i32 %i7.prol, 1
4165; PROLOG-NEXT:    %innercnd.prol = icmp slt i32 %i11.prol, %trip
4166; PROLOG-NEXT:    %iv.next.prol = add nuw nsw i64 %phi.prol, 1
4167; PROLOG-NEXT:    %prol.iter.sub = sub i32 %prol.iter, 1
4168; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i32 %prol.iter.sub, 0
4169; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !8
4170; PROLOG:       header.prol.loopexit.unr-lcssa:
4171; PROLOG-NEXT:    %phi.unr.ph = phi i64 [ %iv.next.prol, %latch.prol ]
4172; PROLOG-NEXT:    br label %header.prol.loopexit
4173; PROLOG:       header.prol.loopexit:
4174; PROLOG-NEXT:    %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %header.prol.loopexit.unr-lcssa ]
4175; PROLOG-NEXT:    %2 = icmp ult i32 %1, 7
4176; PROLOG-NEXT:    br i1 %2, label %outerLatch.loopexit, label %preheader.new
4177; PROLOG:       preheader.new:
4178; PROLOG-NEXT:    br label %header
4179; PROLOG:       header:
4180; PROLOG-NEXT:    %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.7, %latch.7 ]
4181; PROLOG-NEXT:    br i1 true, label %latch, label %innerexit.loopexit
4182; PROLOG:       innerexit.loopexit:
4183; 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 ]
4184; PROLOG-NEXT:    br label %innerexit
4185; PROLOG:       innerexit.loopexit1:
4186; PROLOG-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ]
4187; PROLOG-NEXT:    br label %innerexit
4188; PROLOG:       innerexit:
4189; PROLOG-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
4190; PROLOG-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
4191; PROLOG-NEXT:    ret i8 addrspace(1)* %i9
4192; PROLOG:       latch:
4193; PROLOG-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
4194; PROLOG-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit
4195; PROLOG:       outerLatch.loopexit.unr-lcssa:
4196; PROLOG-NEXT:    br label %outerLatch.loopexit
4197; PROLOG:       outerLatch.loopexit:
4198; PROLOG-NEXT:    br label %outerLatch
4199; PROLOG:       outerLatch:
4200; PROLOG-NEXT:    br label %outerloopHdr
4201; PROLOG:       latch.1:
4202; PROLOG-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
4203; PROLOG-NEXT:    br i1 true, label %latch.2, label %innerexit.loopexit
4204; PROLOG:       latch.2:
4205; PROLOG-NEXT:    %iv.next.2 = add nuw nsw i64 %iv.next.1, 1
4206; PROLOG-NEXT:    br i1 true, label %latch.3, label %innerexit.loopexit
4207; PROLOG:       latch.3:
4208; PROLOG-NEXT:    %iv.next.3 = add nuw nsw i64 %iv.next.2, 1
4209; PROLOG-NEXT:    br i1 true, label %latch.4, label %innerexit.loopexit
4210; PROLOG:       latch.4:
4211; PROLOG-NEXT:    %iv.next.4 = add nuw nsw i64 %iv.next.3, 1
4212; PROLOG-NEXT:    br i1 true, label %latch.5, label %innerexit.loopexit
4213; PROLOG:       latch.5:
4214; PROLOG-NEXT:    %iv.next.5 = add nuw nsw i64 %iv.next.4, 1
4215; PROLOG-NEXT:    br i1 true, label %latch.6, label %innerexit.loopexit
4216; PROLOG:       latch.6:
4217; PROLOG-NEXT:    %iv.next.6 = add nuw nsw i64 %iv.next.5, 1
4218; PROLOG-NEXT:    %i7.7 = trunc i64 %iv.next.6 to i32
4219; PROLOG-NEXT:    br i1 true, label %latch.7, label %innerexit.loopexit
4220; PROLOG:       latch.7:
4221; PROLOG-NEXT:    %i11.7 = add nsw i32 %i7.7, 1
4222; PROLOG-NEXT:    %innercnd.7 = icmp slt i32 %i11.7, %trip
4223; PROLOG-NEXT:    %iv.next.7 = add nuw nsw i64 %iv.next.6, 1
4224; PROLOG-NEXT:    br i1 %innercnd.7, label %header, label %outerLatch.loopexit.unr-lcssa
4225;
4226; PROLOG-BLOCK-LABEL: @test9(
4227; PROLOG-BLOCK-NEXT:  bb:
4228; PROLOG-BLOCK-NEXT:    %0 = add i32 %n, -1
4229; PROLOG-BLOCK-NEXT:    %1 = add i32 %n, -2
4230; PROLOG-BLOCK-NEXT:    br label %outerloopHdr
4231; PROLOG-BLOCK:       outerloopHdr:
4232; PROLOG-BLOCK-NEXT:    %trip = add i32 %n, -1
4233; PROLOG-BLOCK-NEXT:    %outercnd = icmp slt i32 0, %trip
4234; PROLOG-BLOCK-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
4235; PROLOG-BLOCK:       preheader:
4236; PROLOG-BLOCK-NEXT:    %xtraiter = and i32 %0, 1
4237; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
4238; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit.unr-lcssa
4239; PROLOG-BLOCK:       header.prol.preheader:
4240; PROLOG-BLOCK-NEXT:    br label %header.prol
4241; PROLOG-BLOCK:       header.prol:
4242; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.prol, label %innerexit.loopexit1
4243; PROLOG-BLOCK:       latch.prol:
4244; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit.unr-lcssa
4245; PROLOG-BLOCK:       header.prol.loopexit.unr-lcssa:
4246; PROLOG-BLOCK-NEXT:    %phi.unr.ph = phi i64 [ 1, %latch.prol ], [ 0, %preheader ]
4247; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
4248; PROLOG-BLOCK:       header.prol.loopexit:
4249; PROLOG-BLOCK-NEXT:    %2 = icmp ult i32 %1, 1
4250; PROLOG-BLOCK-NEXT:    br i1 %2, label %outerLatch.loopexit, label %preheader.new
4251; PROLOG-BLOCK:       preheader.new:
4252; PROLOG-BLOCK-NEXT:    br label %header
4253; PROLOG-BLOCK:       header:
4254; PROLOG-BLOCK-NEXT:    %phi = phi i64 [ %phi.unr.ph, %preheader.new ], [ %iv.next.1, %latch.1 ]
4255; PROLOG-BLOCK-NEXT:    br i1 true, label %latch, label %innerexit.loopexit.loopexit
4256; PROLOG-BLOCK:       innerexit.loopexit.loopexit:
4257; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ]
4258; PROLOG-BLOCK-NEXT:    br label %innerexit.loopexit
4259; PROLOG-BLOCK:       innerexit.loopexit.loopexit5:
4260; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph.ph6 = phi i32 [ %trip.1, %latch.14 ], [ %trip.1, %header.1 ]
4261; PROLOG-BLOCK-NEXT:    br label %innerexit.loopexit
4262; PROLOG-BLOCK:       innerexit.loopexit:
4263; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph6, %innerexit.loopexit.loopexit5 ]
4264; PROLOG-BLOCK-NEXT:    br label %innerexit
4265; PROLOG-BLOCK:       innerexit.loopexit1:
4266; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ], [ %trip.1, %header.prol.1 ]
4267; PROLOG-BLOCK-NEXT:    br label %innerexit
4268; PROLOG-BLOCK:       innerexit:
4269; PROLOG-BLOCK-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
4270; PROLOG-BLOCK-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
4271; PROLOG-BLOCK-NEXT:    ret i8 addrspace(1)* %i9
4272; PROLOG-BLOCK:       latch:
4273; PROLOG-BLOCK-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
4274; PROLOG-BLOCK-NEXT:    %i7.1 = trunc i64 %iv.next to i32
4275; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit.loopexit
4276; PROLOG-BLOCK:       outerLatch.loopexit.unr-lcssa:
4277; PROLOG-BLOCK-NEXT:    br label %outerLatch.loopexit
4278; PROLOG-BLOCK:       outerLatch.loopexit:
4279; PROLOG-BLOCK-NEXT:    br label %outerLatch
4280; PROLOG-BLOCK:       outerLatch:
4281; PROLOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -1
4282; PROLOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.1
4283; PROLOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.1
4284; PROLOG-BLOCK:       latch.1:
4285; PROLOG-BLOCK-NEXT:    %i11.1 = add nsw i32 %i7.1, 1
4286; PROLOG-BLOCK-NEXT:    %innercnd.1 = icmp slt i32 %i11.1, %trip
4287; PROLOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
4288; PROLOG-BLOCK-NEXT:    br i1 %innercnd.1, label %header, label %outerLatch.loopexit.unr-lcssa, !llvm.loop !13
4289; PROLOG-BLOCK:       preheader.1:
4290; PROLOG-BLOCK-NEXT:    %xtraiter.1 = and i32 %0, 1
4291; PROLOG-BLOCK-NEXT:    %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0
4292; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod.1, label %header.prol.preheader.1, label %header.prol.loopexit.unr-lcssa.1
4293; PROLOG-BLOCK:       header.prol.preheader.1:
4294; PROLOG-BLOCK-NEXT:    br label %header.prol.1
4295; PROLOG-BLOCK:       header.prol.1:
4296; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.prol.1, label %innerexit.loopexit1
4297; PROLOG-BLOCK:       latch.prol.1:
4298; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit.unr-lcssa.1
4299; PROLOG-BLOCK:       header.prol.loopexit.unr-lcssa.1:
4300; PROLOG-BLOCK-NEXT:    %phi.unr.ph.1 = phi i64 [ 1, %latch.prol.1 ], [ 0, %preheader.1 ]
4301; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit.1
4302; PROLOG-BLOCK:       header.prol.loopexit.1:
4303; PROLOG-BLOCK-NEXT:    %3 = icmp ult i32 %1, 1
4304; PROLOG-BLOCK-NEXT:    br i1 %3, label %outerLatch.loopexit.1, label %preheader.new.1
4305; PROLOG-BLOCK:       preheader.new.1:
4306; PROLOG-BLOCK-NEXT:    br label %header.1
4307; PROLOG-BLOCK:       header.1:
4308; PROLOG-BLOCK-NEXT:    %phi.1 = phi i64 [ %phi.unr.ph.1, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ]
4309; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.14, label %innerexit.loopexit.loopexit5
4310; PROLOG-BLOCK:       latch.14:
4311; PROLOG-BLOCK-NEXT:    %iv.next.13 = add nuw nsw i64 %phi.1, 1
4312; PROLOG-BLOCK-NEXT:    %i7.1.1 = trunc i64 %iv.next.13 to i32
4313; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit5
4314; PROLOG-BLOCK:       latch.1.1:
4315; PROLOG-BLOCK-NEXT:    %i11.1.1 = add nsw i32 %i7.1.1, 1
4316; PROLOG-BLOCK-NEXT:    %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.1
4317; PROLOG-BLOCK-NEXT:    %iv.next.1.1 = add nuw nsw i64 %iv.next.13, 1
4318; PROLOG-BLOCK-NEXT:    br i1 %innercnd.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.1, !llvm.loop !13
4319; PROLOG-BLOCK:       outerLatch.loopexit.unr-lcssa.1:
4320; PROLOG-BLOCK-NEXT:    br label %outerLatch.loopexit.1
4321; PROLOG-BLOCK:       outerLatch.loopexit.1:
4322; PROLOG-BLOCK-NEXT:    br label %outerLatch.1
4323; PROLOG-BLOCK:       outerLatch.1:
4324; PROLOG-BLOCK-NEXT:    br label %outerloopHdr, !llvm.loop !14
4325;
4326bb:
4327  br label %outerloopHdr
4328
4329outerloopHdr:                                              ; preds = %outerLatch, %bb
4330  %trip = add i32 %n, -1
4331  %outercnd = icmp slt i32 0, %trip
4332  br i1 %outercnd, label %preheader, label %outerLatch
4333
4334preheader:                                              ; preds = %outerloopHdr
4335  %i4 = zext i32 0 to i64
4336  br label %header
4337
4338header:                                              ; preds = %latch, %preheader
4339  %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ]
4340  %i7 = trunc i64 %phi to i32
4341  br i1 true, label %latch, label %innerexit
4342
4343innerexit:                                              ; preds = %header
4344  %i9 = call i8 addrspace(1)* @foo(i32 %trip)
4345  ret i8 addrspace(1)* %i9
4346
4347latch:                                             ; preds = %header
4348  %i11 = add nsw i32 %i7, 1
4349  %innercnd = icmp slt i32 %i11, %trip
4350  %iv.next = add nuw nsw i64 %phi, 1
4351  br i1 %innercnd, label %header, label %outerLatch
4352
4353outerLatch:                                             ; preds = %latch, %outerloopHdr
4354  br label %outerloopHdr
4355}
4356