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