1911991d2SPhilip Reames; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: -p
2911991d2SPhilip Reames; 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
3911991d2SPhilip Reames; 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
4911991d2SPhilip Reames; 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
5911991d2SPhilip Reames; 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
6cee313d2SEric Christopher
7cee313d2SEric Christopher; REQUIRES: asserts
8cee313d2SEric Christopher
9cee313d2SEric Christopher; test with three exiting and three exit blocks.
10cee313d2SEric Christopher; none of the exit blocks have successors
11cee313d2SEric Christopherdefine void @test1(i64 %trip, i1 %cond) {
12911991d2SPhilip Reames; EPILOG-LABEL: @test1(
13cee313d2SEric Christopher; EPILOG-NEXT:  entry:
14*81c648a3SNikita Popov; EPILOG-NEXT:    %0 = freeze i64 %trip
15*81c648a3SNikita Popov; EPILOG-NEXT:    %1 = add i64 %0, -1
16*81c648a3SNikita Popov; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
17*81c648a3SNikita Popov; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
18323514deSNikita Popov; EPILOG-NEXT:    br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new
19cee313d2SEric Christopher; EPILOG:       entry.new:
20*81c648a3SNikita Popov; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
21911991d2SPhilip Reames; EPILOG-NEXT:    br label %loop_header
22911991d2SPhilip Reames; EPILOG:       loop_header:
23911991d2SPhilip Reames; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
2437ead201SPhilip Reames; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
25911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
26911991d2SPhilip Reames; EPILOG:       loop_exiting_bb1:
27911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
28911991d2SPhilip Reames; EPILOG:       loop_exiting_bb2:
29911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
30911991d2SPhilip Reames; EPILOG:       exit3.loopexit:
31911991d2SPhilip Reames; EPILOG-NEXT:    br label %exit3
32911991d2SPhilip Reames; EPILOG:       exit3.loopexit2:
33911991d2SPhilip Reames; EPILOG-NEXT:    br label %exit3
34911991d2SPhilip Reames; EPILOG:       exit3:
35911991d2SPhilip Reames; EPILOG-NEXT:    ret void
36911991d2SPhilip Reames; EPILOG:       loop_latch:
37911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3837ead201SPhilip Reames; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
39911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
40911991d2SPhilip Reames; EPILOG:       loop_exiting_bb1.1:
41911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
42911991d2SPhilip Reames; EPILOG:       loop_exiting_bb2.1:
43911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
44911991d2SPhilip Reames; EPILOG:       loop_latch.1:
45911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
4637ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
47911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2
48911991d2SPhilip Reames; EPILOG:       loop_exiting_bb1.2:
49911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit
50911991d2SPhilip Reames; EPILOG:       loop_exiting_bb2.2:
51911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loop_latch.2, label %exit3.loopexit
52911991d2SPhilip Reames; EPILOG:       loop_latch.2:
53911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
5437ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
55911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3
56911991d2SPhilip Reames; EPILOG:       loop_exiting_bb1.3:
57911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit
58911991d2SPhilip Reames; EPILOG:       loop_exiting_bb2.3:
59911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loop_latch.3, label %exit3.loopexit
60911991d2SPhilip Reames; EPILOG:       loop_latch.3:
61911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
6237ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
63911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4
64911991d2SPhilip Reames; EPILOG:       loop_exiting_bb1.4:
65911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit
66911991d2SPhilip Reames; EPILOG:       loop_exiting_bb2.4:
67911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loop_latch.4, label %exit3.loopexit
68911991d2SPhilip Reames; EPILOG:       loop_latch.4:
69911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
7037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
71911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5
72911991d2SPhilip Reames; EPILOG:       loop_exiting_bb1.5:
73911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit
74911991d2SPhilip Reames; EPILOG:       loop_exiting_bb2.5:
75911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loop_latch.5, label %exit3.loopexit
76911991d2SPhilip Reames; EPILOG:       loop_latch.5:
77911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
7837ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
79911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6
80911991d2SPhilip Reames; EPILOG:       loop_exiting_bb1.6:
81911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit
82911991d2SPhilip Reames; EPILOG:       loop_exiting_bb2.6:
83911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loop_latch.6, label %exit3.loopexit
84911991d2SPhilip Reames; EPILOG:       loop_latch.6:
85911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
8637ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
87911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7
88911991d2SPhilip Reames; EPILOG:       loop_exiting_bb1.7:
89911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit
90911991d2SPhilip Reames; EPILOG:       loop_exiting_bb2.7:
91911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loop_latch.7, label %exit3.loopexit
92cee313d2SEric Christopher; EPILOG:       loop_latch.7:
93911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
9437ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
9537ead201SPhilip Reames; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
96911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit
97de2fed61SPhilip Reames; EPILOG:       exit1.loopexit:
98de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1
99de2fed61SPhilip Reames; EPILOG:       exit1.loopexit1:
100de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1
101de2fed61SPhilip Reames; EPILOG:       exit1:
102de2fed61SPhilip Reames; EPILOG-NEXT:    ret void
103de2fed61SPhilip Reames; EPILOG:       exit2.loopexit.unr-lcssa.loopexit:
104de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
105de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit2.loopexit.unr-lcssa
106de2fed61SPhilip Reames; EPILOG:       exit2.loopexit.unr-lcssa:
107de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
108de2fed61SPhilip Reames; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
109de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
110de2fed61SPhilip Reames; EPILOG:       loop_header.epil.preheader:
111de2fed61SPhilip Reames; EPILOG-NEXT:    br label %loop_header.epil
112de2fed61SPhilip Reames; EPILOG:       loop_header.epil:
113de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
11437ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
115de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil
116de2fed61SPhilip Reames; EPILOG:       loop_exiting_bb1.epil:
117de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.epil, label %exit1.loopexit1
118de2fed61SPhilip Reames; EPILOG:       loop_exiting_bb2.epil:
119de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loop_latch.epil, label %exit3.loopexit2
120de2fed61SPhilip Reames; EPILOG:       loop_latch.epil:
121de2fed61SPhilip Reames; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
122de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
12337ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
12437ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
125de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !0
126de2fed61SPhilip Reames; EPILOG:       exit2.loopexit.epilog-lcssa:
127de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit2.loopexit
128de2fed61SPhilip Reames; EPILOG:       exit2.loopexit:
129de2fed61SPhilip Reames; EPILOG-NEXT:    ret void
130911991d2SPhilip Reames;
131911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @test1(
132911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:  entry:
133*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
134*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
135*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
136*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
137323514deSNikita Popov; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new
138911991d2SPhilip Reames; EPILOG-BLOCK:       entry.new:
139*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
140911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %loop_header
141911991d2SPhilip Reames; EPILOG-BLOCK:       loop_header:
142911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
14337ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
144911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
145911991d2SPhilip Reames; EPILOG-BLOCK:       loop_exiting_bb1:
146911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
147911991d2SPhilip Reames; EPILOG-BLOCK:       loop_exiting_bb2:
148911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
149911991d2SPhilip Reames; EPILOG-BLOCK:       exit3.loopexit:
150911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit3
151911991d2SPhilip Reames; EPILOG-BLOCK:       exit3:
152911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret void
153911991d2SPhilip Reames; EPILOG-BLOCK:       loop_latch:
154911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
15537ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
156911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
157de2fed61SPhilip Reames; EPILOG-BLOCK:       loop_exiting_bb1.1:
158de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
159de2fed61SPhilip Reames; EPILOG-BLOCK:       loop_exiting_bb2.1:
160de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
161de2fed61SPhilip Reames; EPILOG-BLOCK:       loop_latch.1:
162de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
16337ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
16437ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
165de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !0
166911991d2SPhilip Reames; EPILOG-BLOCK:       exit1.loopexit:
167911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit1
168911991d2SPhilip Reames; EPILOG-BLOCK:       exit1:
169911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret void
170911991d2SPhilip Reames; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa.loopexit:
171911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit.unr-lcssa
172911991d2SPhilip Reames; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa:
173911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
174911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
175911991d2SPhilip Reames; EPILOG-BLOCK:       loop_header.epil.preheader:
176911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
177911991d2SPhilip Reames; EPILOG-BLOCK:       loop_header.epil:
178911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil
179911991d2SPhilip Reames; EPILOG-BLOCK:       loop_exiting_bb1.epil:
180911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.epil, label %exit1
181911991d2SPhilip Reames; EPILOG-BLOCK:       loop_exiting_bb2.epil:
182911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch.epil, label %exit3
183911991d2SPhilip Reames; EPILOG-BLOCK:       loop_latch.epil:
184911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit
185911991d2SPhilip Reames; EPILOG-BLOCK:       exit2.loopexit:
186911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret void
187911991d2SPhilip Reames;
188911991d2SPhilip Reames; PROLOG-LABEL: @test1(
189cee313d2SEric Christopher; PROLOG-NEXT:  entry:
190*81c648a3SNikita Popov; PROLOG-NEXT:    %0 = freeze i64 %trip
191*81c648a3SNikita Popov; PROLOG-NEXT:    %1 = add i64 %0, -1
192*81c648a3SNikita Popov; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
193911991d2SPhilip Reames; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
194*81c648a3SNikita Popov; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
195911991d2SPhilip Reames; PROLOG:       loop_header.prol.preheader:
196911991d2SPhilip Reames; PROLOG-NEXT:    br label %loop_header.prol
197cee313d2SEric Christopher; PROLOG:       loop_header.prol:
198cee313d2SEric Christopher; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
19937ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
200cee313d2SEric Christopher; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol
201911991d2SPhilip Reames; PROLOG:       loop_exiting_bb1.prol:
202911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.prol, label %exit1.loopexit1
203911991d2SPhilip Reames; PROLOG:       loop_exiting_bb2.prol:
204911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loop_latch.prol, label %exit3.loopexit2
205cee313d2SEric Christopher; PROLOG:       loop_latch.prol:
206cee313d2SEric Christopher; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
207911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
20837ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
20937ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
210911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !0
211911991d2SPhilip Reames; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
212911991d2SPhilip Reames; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
213911991d2SPhilip Reames; PROLOG-NEXT:    br label %loop_header.prol.loopexit
214911991d2SPhilip Reames; PROLOG:       loop_header.prol.loopexit:
215911991d2SPhilip Reames; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
216*81c648a3SNikita Popov; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
217323514deSNikita Popov; PROLOG-NEXT:    br i1 %2, label %exit2.loopexit, label %entry.new
218911991d2SPhilip Reames; PROLOG:       entry.new:
219911991d2SPhilip Reames; PROLOG-NEXT:    br label %loop_header
220911991d2SPhilip Reames; PROLOG:       loop_header:
221911991d2SPhilip Reames; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
222911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
223911991d2SPhilip Reames; PROLOG:       loop_exiting_bb1:
224911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
225911991d2SPhilip Reames; PROLOG:       loop_exiting_bb2:
226911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
227911991d2SPhilip Reames; PROLOG:       exit3.loopexit:
228911991d2SPhilip Reames; PROLOG-NEXT:    br label %exit3
229911991d2SPhilip Reames; PROLOG:       exit3.loopexit2:
230911991d2SPhilip Reames; PROLOG-NEXT:    br label %exit3
231911991d2SPhilip Reames; PROLOG:       exit3:
232911991d2SPhilip Reames; PROLOG-NEXT:    ret void
233911991d2SPhilip Reames; PROLOG:       loop_latch:
234911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
235911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
236911991d2SPhilip Reames; PROLOG:       loop_exiting_bb1.1:
237911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
238911991d2SPhilip Reames; PROLOG:       loop_exiting_bb2.1:
239911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
240911991d2SPhilip Reames; PROLOG:       loop_latch.1:
241911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
242911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2
243911991d2SPhilip Reames; PROLOG:       loop_exiting_bb1.2:
244911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit
245911991d2SPhilip Reames; PROLOG:       loop_exiting_bb2.2:
246911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loop_latch.2, label %exit3.loopexit
247911991d2SPhilip Reames; PROLOG:       loop_latch.2:
248911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
249911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3
250911991d2SPhilip Reames; PROLOG:       loop_exiting_bb1.3:
251911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit
252911991d2SPhilip Reames; PROLOG:       loop_exiting_bb2.3:
253911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loop_latch.3, label %exit3.loopexit
254911991d2SPhilip Reames; PROLOG:       loop_latch.3:
255911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
256911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4
257911991d2SPhilip Reames; PROLOG:       loop_exiting_bb1.4:
258911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit
259911991d2SPhilip Reames; PROLOG:       loop_exiting_bb2.4:
260911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loop_latch.4, label %exit3.loopexit
261911991d2SPhilip Reames; PROLOG:       loop_latch.4:
262911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
263911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5
264911991d2SPhilip Reames; PROLOG:       loop_exiting_bb1.5:
265911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit
266911991d2SPhilip Reames; PROLOG:       loop_exiting_bb2.5:
267911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loop_latch.5, label %exit3.loopexit
268911991d2SPhilip Reames; PROLOG:       loop_latch.5:
269911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
270911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6
271911991d2SPhilip Reames; PROLOG:       loop_exiting_bb1.6:
272911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit
273911991d2SPhilip Reames; PROLOG:       loop_exiting_bb2.6:
274911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loop_latch.6, label %exit3.loopexit
275911991d2SPhilip Reames; PROLOG:       loop_latch.6:
276911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
277911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7
278911991d2SPhilip Reames; PROLOG:       loop_exiting_bb1.7:
279911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit
280911991d2SPhilip Reames; PROLOG:       loop_exiting_bb2.7:
281911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loop_latch.7, label %exit3.loopexit
282cee313d2SEric Christopher; PROLOG:       loop_latch.7:
283911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
284911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
285911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa
286de2fed61SPhilip Reames; PROLOG:       exit1.loopexit:
287de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit1
288de2fed61SPhilip Reames; PROLOG:       exit1.loopexit1:
289de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit1
290de2fed61SPhilip Reames; PROLOG:       exit1:
291de2fed61SPhilip Reames; PROLOG-NEXT:    ret void
292de2fed61SPhilip Reames; PROLOG:       exit2.loopexit.unr-lcssa:
293de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit2.loopexit
294de2fed61SPhilip Reames; PROLOG:       exit2.loopexit:
295de2fed61SPhilip Reames; PROLOG-NEXT:    ret void
296911991d2SPhilip Reames;
297911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @test1(
298911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:  entry:
299*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
300*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
301*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
302911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
303*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
304911991d2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol.preheader:
305911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
306911991d2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol:
307911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol
308911991d2SPhilip Reames; PROLOG-BLOCK:       loop_exiting_bb1.prol:
309911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.prol, label %exit1
310911991d2SPhilip Reames; PROLOG-BLOCK:       loop_exiting_bb2.prol:
311911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch.prol, label %exit3
312911991d2SPhilip Reames; PROLOG-BLOCK:       loop_latch.prol:
313911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
314911991d2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol.loopexit:
315b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
316*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
317323514deSNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit2.loopexit, label %entry.new
318911991d2SPhilip Reames; PROLOG-BLOCK:       entry.new:
319911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header
320911991d2SPhilip Reames; PROLOG-BLOCK:       loop_header:
321911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
322911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
323911991d2SPhilip Reames; PROLOG-BLOCK:       loop_exiting_bb1:
324911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
325911991d2SPhilip Reames; PROLOG-BLOCK:       loop_exiting_bb2:
326911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
327911991d2SPhilip Reames; PROLOG-BLOCK:       exit3.loopexit:
328911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit3
329911991d2SPhilip Reames; PROLOG-BLOCK:       exit3:
330911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret void
331911991d2SPhilip Reames; PROLOG-BLOCK:       loop_latch:
332911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
333911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
334911991d2SPhilip Reames; PROLOG-BLOCK:       loop_exiting_bb1.1:
335911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
336911991d2SPhilip Reames; PROLOG-BLOCK:       loop_exiting_bb2.1:
337911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
338911991d2SPhilip Reames; PROLOG-BLOCK:       loop_latch.1:
339911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
340911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
341911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !0
342de2fed61SPhilip Reames; PROLOG-BLOCK:       exit1.loopexit:
343de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit1
344de2fed61SPhilip Reames; PROLOG-BLOCK:       exit1:
345de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    ret void
346de2fed61SPhilip Reames; PROLOG-BLOCK:       exit2.loopexit.unr-lcssa:
347de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit2.loopexit
348de2fed61SPhilip Reames; PROLOG-BLOCK:       exit2.loopexit:
349de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    ret void
350911991d2SPhilip Reames;
351911991d2SPhilip Reames
352cee313d2SEric Christopherentry:
353cee313d2SEric Christopher  br label %loop_header
354cee313d2SEric Christopher
355cee313d2SEric Christopherloop_header:
356cee313d2SEric Christopher  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
357cee313d2SEric Christopher  br i1 %cond, label %loop_latch, label %loop_exiting_bb1
358cee313d2SEric Christopher
359cee313d2SEric Christopherloop_exiting_bb1:
360cee313d2SEric Christopher  br i1 false, label %loop_exiting_bb2, label %exit1
361cee313d2SEric Christopher
362cee313d2SEric Christopherloop_exiting_bb2:
363cee313d2SEric Christopher  br i1 false, label %loop_latch, label %exit3
364cee313d2SEric Christopher
365cee313d2SEric Christopherexit3:
366cee313d2SEric Christopher  ret void
367cee313d2SEric Christopher
368cee313d2SEric Christopherloop_latch:
369cee313d2SEric Christopher  %iv_next = add i64 %iv, 1
370cee313d2SEric Christopher  %cmp = icmp ne i64 %iv_next, %trip
371cee313d2SEric Christopher  br i1 %cmp, label %loop_header, label %exit2.loopexit
372cee313d2SEric Christopher
373cee313d2SEric Christopherexit1:
374cee313d2SEric Christopher  ret void
375cee313d2SEric Christopher
376cee313d2SEric Christopherexit2.loopexit:
377cee313d2SEric Christopher  ret void
378cee313d2SEric Christopher}
379cee313d2SEric Christopher
380cee313d2SEric Christopher
381cee313d2SEric Christopher; test with three exiting and two exit blocks.
382cee313d2SEric Christopher; The non-latch exit block has 2 unique predecessors.
383cee313d2SEric Christopher; There are 2 values passed to the exit blocks that are calculated at every iteration.
384cee313d2SEric Christopher; %sum.02 and %add. Both of these are incoming values for phi from every exiting
385cee313d2SEric Christopher; unrolled block.
386cee313d2SEric Christopherdefine i32 @test2(i32* nocapture %a, i64 %n) {
387911991d2SPhilip Reames; EPILOG-LABEL: @test2(
388911991d2SPhilip Reames; EPILOG-NEXT:  entry:
389*81c648a3SNikita Popov; EPILOG-NEXT:    %0 = freeze i64 %n
390*81c648a3SNikita Popov; EPILOG-NEXT:    %1 = add i64 %0, -1
391*81c648a3SNikita Popov; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
392*81c648a3SNikita Popov; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
393323514deSNikita Popov; EPILOG-NEXT:    br i1 %2, label %for.end.unr-lcssa, label %entry.new
394911991d2SPhilip Reames; EPILOG:       entry.new:
395*81c648a3SNikita Popov; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
396911991d2SPhilip Reames; EPILOG-NEXT:    br label %header
397911991d2SPhilip Reames; EPILOG:       header:
398911991d2SPhilip Reames; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ]
399911991d2SPhilip Reames; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %for.body.7 ]
40037ead201SPhilip Reames; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %for.body.7 ]
401911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
402911991d2SPhilip Reames; EPILOG:       for.exiting_block:
403911991d2SPhilip Reames; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
404911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
405911991d2SPhilip Reames; EPILOG:       for.body:
406911991d2SPhilip Reames; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
407323514deSNikita Popov; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
408323514deSNikita Popov; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.02
409911991d2SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
41037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
41172031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
412de2fed61SPhilip Reames; EPILOG:       for.exiting_block.1:
413de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
414de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
415de2fed61SPhilip Reames; EPILOG:       for.body.1:
416de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
417323514deSNikita Popov; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
418323514deSNikita Popov; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
419de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
42037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
42172031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
422de2fed61SPhilip Reames; EPILOG:       for.exiting_block.2:
423de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
424de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2
425de2fed61SPhilip Reames; EPILOG:       for.body.2:
426de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
427323514deSNikita Popov; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
428323514deSNikita Popov; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
429de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
43037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
43172031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
432de2fed61SPhilip Reames; EPILOG:       for.exiting_block.3:
433de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
434de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3
435de2fed61SPhilip Reames; EPILOG:       for.body.3:
436de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
437323514deSNikita Popov; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
438323514deSNikita Popov; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
439de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
44037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
44172031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
442de2fed61SPhilip Reames; EPILOG:       for.exiting_block.4:
443de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
444de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4
445de2fed61SPhilip Reames; EPILOG:       for.body.4:
446de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
447323514deSNikita Popov; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
448323514deSNikita Popov; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
449de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
45037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
45172031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
452de2fed61SPhilip Reames; EPILOG:       for.exiting_block.5:
453de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
454de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5
455de2fed61SPhilip Reames; EPILOG:       for.body.5:
456de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
457323514deSNikita Popov; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
458323514deSNikita Popov; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
459de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
46037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
46172031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
462de2fed61SPhilip Reames; EPILOG:       for.exiting_block.6:
463de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
464de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6
465de2fed61SPhilip Reames; EPILOG:       for.body.6:
466de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
467323514deSNikita Popov; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
468323514deSNikita Popov; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
469de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
47037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
47172031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
472de2fed61SPhilip Reames; EPILOG:       for.exiting_block.7:
473de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
474de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7
475de2fed61SPhilip Reames; EPILOG:       for.body.7:
476de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
477323514deSNikita Popov; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
478323514deSNikita Popov; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
479de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
48037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
48137ead201SPhilip Reames; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
482de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %for.end.unr-lcssa.loopexit, label %header
483911991d2SPhilip Reames; EPILOG:       for.end.unr-lcssa.loopexit:
484911991d2SPhilip Reames; EPILOG-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %for.body.7 ]
485911991d2SPhilip Reames; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %for.body.7 ]
486911991d2SPhilip Reames; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %for.body.7 ]
487911991d2SPhilip Reames; EPILOG-NEXT:    br label %for.end.unr-lcssa
488911991d2SPhilip Reames; EPILOG:       for.end.unr-lcssa:
489911991d2SPhilip Reames; EPILOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ]
490911991d2SPhilip Reames; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ]
491911991d2SPhilip Reames; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ]
492911991d2SPhilip Reames; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
493911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %for.end
494911991d2SPhilip Reames; EPILOG:       header.epil.preheader:
495911991d2SPhilip Reames; EPILOG-NEXT:    br label %header.epil
496911991d2SPhilip Reames; EPILOG:       header.epil:
497911991d2SPhilip Reames; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %for.body.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
498911991d2SPhilip Reames; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %for.body.epil ], [ %sum.02.unr, %header.epil.preheader ]
49937ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %for.body.epil ]
500911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil
501911991d2SPhilip Reames; EPILOG:       for.exiting_block.epil:
502911991d2SPhilip Reames; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
503911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit2, label %for.body.epil
504911991d2SPhilip Reames; EPILOG:       for.body.epil:
505911991d2SPhilip Reames; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
506323514deSNikita Popov; EPILOG-NEXT:    %11 = load i32, i32* %arrayidx.epil, align 4
507323514deSNikita Popov; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil
508911991d2SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
509911991d2SPhilip Reames; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
51037ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
51137ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
512911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %for.end.epilog-lcssa, !llvm.loop !2
513911991d2SPhilip Reames; EPILOG:       for.end.epilog-lcssa:
514911991d2SPhilip Reames; EPILOG-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %for.body.epil ]
515911991d2SPhilip Reames; EPILOG-NEXT:    br label %for.end
516911991d2SPhilip Reames; EPILOG:       for.end:
517911991d2SPhilip Reames; EPILOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %sum.0.lcssa.ph1, %for.end.epilog-lcssa ]
518911991d2SPhilip Reames; EPILOG-NEXT:    ret i32 %sum.0.lcssa
519cee313d2SEric Christopher; EPILOG:       for.exit2.loopexit:
52072031407SPhilip Reames; 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 ]
521cee313d2SEric Christopher; EPILOG-NEXT:    br label %for.exit2
522cee313d2SEric Christopher; EPILOG:       for.exit2.loopexit2:
523cee313d2SEric Christopher; EPILOG-NEXT:    %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
524cee313d2SEric Christopher; EPILOG-NEXT:    br label %for.exit2
525cee313d2SEric Christopher; EPILOG:       for.exit2:
526cee313d2SEric Christopher; EPILOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
527cee313d2SEric Christopher; EPILOG-NEXT:    ret i32 %retval
528911991d2SPhilip Reames;
529911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @test2(
530911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:  entry:
531*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n
532*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
533*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
534*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
535323514deSNikita Popov; EPILOG-BLOCK-NEXT:    br i1 %2, label %for.end.unr-lcssa, label %entry.new
536911991d2SPhilip Reames; EPILOG-BLOCK:       entry.new:
537*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
538911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header
539911991d2SPhilip Reames; EPILOG-BLOCK:       header:
540911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ]
541911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %for.body.1 ]
54237ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %for.body.1 ]
543911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
544911991d2SPhilip Reames; EPILOG-BLOCK:       for.exiting_block:
545911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
546911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
547911991d2SPhilip Reames; EPILOG-BLOCK:       for.body:
548911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
549323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
550323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
551911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
55237ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
55372031407SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
554de2fed61SPhilip Reames; EPILOG-BLOCK:       for.exiting_block.1:
555de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
556de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
557de2fed61SPhilip Reames; EPILOG-BLOCK:       for.body.1:
558de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
559323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
560323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
561de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
56237ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
56337ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
564de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %for.end.unr-lcssa.loopexit, label %header, !llvm.loop !2
565911991d2SPhilip Reames; EPILOG-BLOCK:       for.end.unr-lcssa.loopexit:
566911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %for.body.1 ]
567911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %for.body.1 ]
568911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %for.body.1 ]
569911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %for.end.unr-lcssa
570911991d2SPhilip Reames; EPILOG-BLOCK:       for.end.unr-lcssa:
571911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ]
572911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ]
573911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ]
574911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
575911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %for.end
576911991d2SPhilip Reames; EPILOG-BLOCK:       header.epil.preheader:
577911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header.epil
578911991d2SPhilip Reames; EPILOG-BLOCK:       header.epil:
579911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.epil
580911991d2SPhilip Reames; EPILOG-BLOCK:       for.exiting_block.epil:
581911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
582911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %for.body.epil
583911991d2SPhilip Reames; EPILOG-BLOCK:       for.body.epil:
584b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
585323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.epil, align 4
586323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.unr
587911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %for.end
588911991d2SPhilip Reames; EPILOG-BLOCK:       for.end:
589b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %add.epil, %for.body.epil ]
590911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
591911991d2SPhilip Reames; EPILOG-BLOCK:       for.exit2.loopexit:
59272031407SPhilip Reames; EPILOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ]
593911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %for.exit2
594911991d2SPhilip Reames; EPILOG-BLOCK:       for.exit2:
595b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT:    %retval = phi i32 [ %sum.02.unr, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ]
596911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret i32 %retval
597911991d2SPhilip Reames;
598911991d2SPhilip Reames; PROLOG-LABEL: @test2(
599911991d2SPhilip Reames; PROLOG-NEXT:  entry:
600*81c648a3SNikita Popov; PROLOG-NEXT:    %0 = freeze i64 %n
601*81c648a3SNikita Popov; PROLOG-NEXT:    %1 = add i64 %0, -1
602*81c648a3SNikita Popov; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
603911991d2SPhilip Reames; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
604*81c648a3SNikita Popov; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
605911991d2SPhilip Reames; PROLOG:       header.prol.preheader:
606911991d2SPhilip Reames; PROLOG-NEXT:    br label %header.prol
607911991d2SPhilip Reames; PROLOG:       header.prol:
608911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %for.body.prol ], [ 0, %header.prol.preheader ]
609911991d2SPhilip Reames; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %for.body.prol ], [ 0, %header.prol.preheader ]
61037ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %for.body.prol ]
611911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol
612911991d2SPhilip Reames; PROLOG:       for.exiting_block.prol:
613911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
614911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit1, label %for.body.prol
615911991d2SPhilip Reames; PROLOG:       for.body.prol:
616911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
617323514deSNikita Popov; PROLOG-NEXT:    %2 = load i32, i32* %arrayidx.prol, align 4
618323514deSNikita Popov; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol
619911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
620911991d2SPhilip Reames; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
62137ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
62237ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
623911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !2
624911991d2SPhilip Reames; PROLOG:       header.prol.loopexit.unr-lcssa:
625911991d2SPhilip Reames; PROLOG-NEXT:    %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %for.body.prol ]
626911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %for.body.prol ]
627911991d2SPhilip Reames; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %for.body.prol ]
628911991d2SPhilip Reames; PROLOG-NEXT:    br label %header.prol.loopexit
629911991d2SPhilip Reames; PROLOG:       header.prol.loopexit:
630911991d2SPhilip Reames; PROLOG-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ]
631911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
632911991d2SPhilip Reames; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
633*81c648a3SNikita Popov; PROLOG-NEXT:    %3 = icmp ult i64 %1, 7
634323514deSNikita Popov; PROLOG-NEXT:    br i1 %3, label %for.end, label %entry.new
635911991d2SPhilip Reames; PROLOG:       entry.new:
636911991d2SPhilip Reames; PROLOG-NEXT:    br label %header
637911991d2SPhilip Reames; PROLOG:       header:
638911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ]
639911991d2SPhilip Reames; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %for.body.7 ]
640911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
641911991d2SPhilip Reames; PROLOG:       for.exiting_block:
642911991d2SPhilip Reames; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
643911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
644911991d2SPhilip Reames; PROLOG:       for.body:
645911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
646323514deSNikita Popov; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx, align 4
647323514deSNikita Popov; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.02
648911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
64972031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
650911991d2SPhilip Reames; PROLOG:       for.exiting_block.1:
651911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
652911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
653911991d2SPhilip Reames; PROLOG:       for.body.1:
654911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
655323514deSNikita Popov; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
656323514deSNikita Popov; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add
657911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
65872031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
659911991d2SPhilip Reames; PROLOG:       for.exiting_block.2:
660911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
661911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2
662911991d2SPhilip Reames; PROLOG:       for.body.2:
663911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
664323514deSNikita Popov; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.2, align 4
665323514deSNikita Popov; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.1
666911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
66772031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
668911991d2SPhilip Reames; PROLOG:       for.exiting_block.3:
669911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
670911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3
671911991d2SPhilip Reames; PROLOG:       for.body.3:
672911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
673323514deSNikita Popov; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.3, align 4
674323514deSNikita Popov; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.2
675911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
67672031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
677911991d2SPhilip Reames; PROLOG:       for.exiting_block.4:
678911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
679911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4
680911991d2SPhilip Reames; PROLOG:       for.body.4:
681911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
682323514deSNikita Popov; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.4, align 4
683323514deSNikita Popov; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.3
684911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
68572031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
686911991d2SPhilip Reames; PROLOG:       for.exiting_block.5:
687911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
688911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5
689911991d2SPhilip Reames; PROLOG:       for.body.5:
690911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
691323514deSNikita Popov; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.5, align 4
692323514deSNikita Popov; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.4
693911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
69472031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
695911991d2SPhilip Reames; PROLOG:       for.exiting_block.6:
696911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
697911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6
698911991d2SPhilip Reames; PROLOG:       for.body.6:
699911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
700323514deSNikita Popov; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.6, align 4
701323514deSNikita Popov; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.5
702911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
70372031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
704911991d2SPhilip Reames; PROLOG:       for.exiting_block.7:
705911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
706911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7
707911991d2SPhilip Reames; PROLOG:       for.body.7:
708911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
709323514deSNikita Popov; PROLOG-NEXT:    %11 = load i32, i32* %arrayidx.7, align 4
710323514deSNikita Popov; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.6
711911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
712911991d2SPhilip Reames; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
713911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %exitcond.7, label %for.end.unr-lcssa, label %header
714de2fed61SPhilip Reames; PROLOG:       for.end.unr-lcssa:
715de2fed61SPhilip Reames; PROLOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %for.body.7 ]
716de2fed61SPhilip Reames; PROLOG-NEXT:    br label %for.end
717de2fed61SPhilip Reames; PROLOG:       for.end:
718de2fed61SPhilip Reames; PROLOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ]
719de2fed61SPhilip Reames; PROLOG-NEXT:    ret i32 %sum.0.lcssa
720de2fed61SPhilip Reames; PROLOG:       for.exit2.loopexit:
72172031407SPhilip Reames; 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 ]
722de2fed61SPhilip Reames; PROLOG-NEXT:    br label %for.exit2
723de2fed61SPhilip Reames; PROLOG:       for.exit2.loopexit1:
724de2fed61SPhilip Reames; PROLOG-NEXT:    %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
725de2fed61SPhilip Reames; PROLOG-NEXT:    br label %for.exit2
726de2fed61SPhilip Reames; PROLOG:       for.exit2:
727de2fed61SPhilip Reames; PROLOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
728de2fed61SPhilip Reames; PROLOG-NEXT:    ret i32 %retval
729911991d2SPhilip Reames;
730911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @test2(
731911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:  entry:
732*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n
733*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
734*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
735911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
736*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
737911991d2SPhilip Reames; PROLOG-BLOCK:       header.prol.preheader:
738911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol
739911991d2SPhilip Reames; PROLOG-BLOCK:       header.prol:
740911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.prol
741911991d2SPhilip Reames; PROLOG-BLOCK:       for.exiting_block.prol:
742911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
743911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %for.body.prol
744911991d2SPhilip Reames; PROLOG-BLOCK:       for.body.prol:
745323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %2 = load i32, i32* %a, align 4
746911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
747911991d2SPhilip Reames; PROLOG-BLOCK:       header.prol.loopexit:
748323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %2, %for.body.prol ]
749b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %for.body.prol ]
750323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %for.body.prol ]
751*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 1
752323514deSNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %3, label %for.end, label %entry.new
753911991d2SPhilip Reames; PROLOG-BLOCK:       entry.new:
754911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header
755911991d2SPhilip Reames; PROLOG-BLOCK:       header:
756911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ]
757911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %for.body.1 ]
758911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
759911991d2SPhilip Reames; PROLOG-BLOCK:       for.exiting_block:
760911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
761911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
762911991d2SPhilip Reames; PROLOG-BLOCK:       for.body:
763911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
764323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx, align 4
765323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.02
766911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
76772031407SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
768de2fed61SPhilip Reames; PROLOG-BLOCK:       for.exiting_block.1:
769de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
770de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
771de2fed61SPhilip Reames; PROLOG-BLOCK:       for.body.1:
772de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
773323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
774323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add
775de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
776de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
777de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %for.end.unr-lcssa, label %header, !llvm.loop !2
778911991d2SPhilip Reames; PROLOG-BLOCK:       for.end.unr-lcssa:
779911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %for.body.1 ]
780911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %for.end
781911991d2SPhilip Reames; PROLOG-BLOCK:       for.end:
782911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ]
783911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
784911991d2SPhilip Reames; PROLOG-BLOCK:       for.exit2.loopexit:
78572031407SPhilip Reames; PROLOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ]
786911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %for.exit2
787911991d2SPhilip Reames; PROLOG-BLOCK:       for.exit2:
788911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ]
789911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret i32 %retval
790911991d2SPhilip Reames;
791911991d2SPhilip Reames
792cee313d2SEric Christopher
793cee313d2SEric Christopherentry:
794cee313d2SEric Christopher  br label %header
795cee313d2SEric Christopher
796cee313d2SEric Christopherheader:
797cee313d2SEric Christopher  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
798cee313d2SEric Christopher  %sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ]
799cee313d2SEric Christopher  br i1 false, label %for.exit2, label %for.exiting_block
800cee313d2SEric Christopher
801cee313d2SEric Christopherfor.exiting_block:
802cee313d2SEric Christopher  %cmp = icmp eq i64 %n, 42
803cee313d2SEric Christopher  br i1 %cmp, label %for.exit2, label %for.body
804cee313d2SEric Christopher
805cee313d2SEric Christopherfor.body:
806cee313d2SEric Christopher  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
807cee313d2SEric Christopher  %0 = load i32, i32* %arrayidx, align 4
808cee313d2SEric Christopher  %add = add nsw i32 %0, %sum.02
809cee313d2SEric Christopher  %indvars.iv.next = add i64 %indvars.iv, 1
810cee313d2SEric Christopher  %exitcond = icmp eq i64 %indvars.iv.next, %n
811cee313d2SEric Christopher  br i1 %exitcond, label %for.end, label %header
812cee313d2SEric Christopher
813cee313d2SEric Christopherfor.end:                                          ; preds = %for.body
814cee313d2SEric Christopher  %sum.0.lcssa = phi i32 [ %add, %for.body ]
815cee313d2SEric Christopher  ret i32 %sum.0.lcssa
816cee313d2SEric Christopher
817cee313d2SEric Christopherfor.exit2:
818cee313d2SEric Christopher  %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ]
819cee313d2SEric Christopher  ret i32 %retval
820cee313d2SEric Christopher}
821cee313d2SEric Christopher
822cee313d2SEric Christopher; test with two exiting and three exit blocks.
823cee313d2SEric Christopher; the non-latch exiting block has a switch.
824cee313d2SEric Christopherdefine void @test3(i64 %trip, i64 %add) {
825911991d2SPhilip Reames; EPILOG-LABEL: @test3(
826cee313d2SEric Christopher; EPILOG-NEXT:  entry:
827*81c648a3SNikita Popov; EPILOG-NEXT:    %0 = freeze i64 %trip
828*81c648a3SNikita Popov; EPILOG-NEXT:    %1 = add i64 %0, -1
829*81c648a3SNikita Popov; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
830*81c648a3SNikita Popov; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
831323514deSNikita Popov; EPILOG-NEXT:    br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new
832cee313d2SEric Christopher; EPILOG:       entry.new:
833*81c648a3SNikita Popov; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
834911991d2SPhilip Reames; EPILOG-NEXT:    br label %loop_header
835cee313d2SEric Christopher; EPILOG:       loop_header:
836911991d2SPhilip Reames; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
837cee313d2SEric Christopher; EPILOG-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
83837ead201SPhilip Reames; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
839911991d2SPhilip Reames; EPILOG-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
840911991d2SPhilip Reames; EPILOG:       loop_exiting_bb1:
841911991d2SPhilip Reames; EPILOG-NEXT:    switch i64 %sum, label %loop_latch [
842911991d2SPhilip Reames; EPILOG-NEXT:    i64 24, label %exit1.loopexit
843911991d2SPhilip Reames; EPILOG-NEXT:    i64 42, label %exit3.loopexit
844911991d2SPhilip Reames; EPILOG-NEXT:    ]
845911991d2SPhilip Reames; EPILOG:       exit3.loopexit:
846911991d2SPhilip Reames; EPILOG-NEXT:    br label %exit3
847911991d2SPhilip Reames; EPILOG:       exit3.loopexit2:
848911991d2SPhilip Reames; EPILOG-NEXT:    br label %exit3
849911991d2SPhilip Reames; EPILOG:       exit3:
850911991d2SPhilip Reames; EPILOG-NEXT:    ret void
851911991d2SPhilip Reames; EPILOG:       loop_latch:
852911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
853911991d2SPhilip Reames; EPILOG-NEXT:    %sum.next = add i64 %sum, %add
85437ead201SPhilip Reames; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
855911991d2SPhilip Reames; EPILOG-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
856911991d2SPhilip Reames; EPILOG:       loop_exiting_bb1.1:
857911991d2SPhilip Reames; EPILOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
858911991d2SPhilip Reames; EPILOG-NEXT:    i64 24, label %exit1.loopexit
859911991d2SPhilip Reames; EPILOG-NEXT:    i64 42, label %exit3.loopexit
860911991d2SPhilip Reames; EPILOG-NEXT:    ]
861911991d2SPhilip Reames; EPILOG:       loop_latch.1:
862911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
863911991d2SPhilip Reames; EPILOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
86437ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
865911991d2SPhilip Reames; EPILOG-NEXT:    br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2
866911991d2SPhilip Reames; EPILOG:       loop_exiting_bb1.2:
867911991d2SPhilip Reames; EPILOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
868911991d2SPhilip Reames; EPILOG-NEXT:    i64 24, label %exit1.loopexit
869911991d2SPhilip Reames; EPILOG-NEXT:    i64 42, label %exit3.loopexit
870911991d2SPhilip Reames; EPILOG-NEXT:    ]
871911991d2SPhilip Reames; EPILOG:       loop_latch.2:
872911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
873911991d2SPhilip Reames; EPILOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
87437ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
875911991d2SPhilip Reames; EPILOG-NEXT:    br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3
876911991d2SPhilip Reames; EPILOG:       loop_exiting_bb1.3:
877911991d2SPhilip Reames; EPILOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
878911991d2SPhilip Reames; EPILOG-NEXT:    i64 24, label %exit1.loopexit
879911991d2SPhilip Reames; EPILOG-NEXT:    i64 42, label %exit3.loopexit
880911991d2SPhilip Reames; EPILOG-NEXT:    ]
881911991d2SPhilip Reames; EPILOG:       loop_latch.3:
882911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
883911991d2SPhilip Reames; EPILOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
88437ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
885911991d2SPhilip Reames; EPILOG-NEXT:    br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4
886911991d2SPhilip Reames; EPILOG:       loop_exiting_bb1.4:
887911991d2SPhilip Reames; EPILOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
888911991d2SPhilip Reames; EPILOG-NEXT:    i64 24, label %exit1.loopexit
889911991d2SPhilip Reames; EPILOG-NEXT:    i64 42, label %exit3.loopexit
890911991d2SPhilip Reames; EPILOG-NEXT:    ]
891911991d2SPhilip Reames; EPILOG:       loop_latch.4:
892911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
893911991d2SPhilip Reames; EPILOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
89437ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
895911991d2SPhilip Reames; EPILOG-NEXT:    br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5
896911991d2SPhilip Reames; EPILOG:       loop_exiting_bb1.5:
897911991d2SPhilip Reames; EPILOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
898911991d2SPhilip Reames; EPILOG-NEXT:    i64 24, label %exit1.loopexit
899911991d2SPhilip Reames; EPILOG-NEXT:    i64 42, label %exit3.loopexit
900911991d2SPhilip Reames; EPILOG-NEXT:    ]
901911991d2SPhilip Reames; EPILOG:       loop_latch.5:
902911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
903911991d2SPhilip Reames; EPILOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
90437ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
905911991d2SPhilip Reames; EPILOG-NEXT:    br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6
906911991d2SPhilip Reames; EPILOG:       loop_exiting_bb1.6:
907911991d2SPhilip Reames; EPILOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
908911991d2SPhilip Reames; EPILOG-NEXT:    i64 24, label %exit1.loopexit
909911991d2SPhilip Reames; EPILOG-NEXT:    i64 42, label %exit3.loopexit
910911991d2SPhilip Reames; EPILOG-NEXT:    ]
911911991d2SPhilip Reames; EPILOG:       loop_latch.6:
912911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
913911991d2SPhilip Reames; EPILOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
91437ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
915911991d2SPhilip Reames; EPILOG-NEXT:    br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7
916cee313d2SEric Christopher; EPILOG:       loop_exiting_bb1.7:
917911991d2SPhilip Reames; EPILOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
918911991d2SPhilip Reames; EPILOG-NEXT:    i64 24, label %exit1.loopexit
919911991d2SPhilip Reames; EPILOG-NEXT:    i64 42, label %exit3.loopexit
920911991d2SPhilip Reames; EPILOG-NEXT:    ]
921cee313d2SEric Christopher; EPILOG:       loop_latch.7:
922911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
923cee313d2SEric Christopher; EPILOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
92437ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
92537ead201SPhilip Reames; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
926911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit
927de2fed61SPhilip Reames; EPILOG:       exit1.loopexit:
928de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1
929de2fed61SPhilip Reames; EPILOG:       exit1.loopexit1:
930de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1
931de2fed61SPhilip Reames; EPILOG:       exit1:
932de2fed61SPhilip Reames; EPILOG-NEXT:    ret void
933de2fed61SPhilip Reames; EPILOG:       exit2.loopexit.unr-lcssa.loopexit:
934de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
935de2fed61SPhilip Reames; EPILOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
936de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit2.loopexit.unr-lcssa
937de2fed61SPhilip Reames; EPILOG:       exit2.loopexit.unr-lcssa:
938de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
939de2fed61SPhilip Reames; EPILOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
940de2fed61SPhilip Reames; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
941de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
942de2fed61SPhilip Reames; EPILOG:       loop_header.epil.preheader:
943de2fed61SPhilip Reames; EPILOG-NEXT:    br label %loop_header.epil
944de2fed61SPhilip Reames; EPILOG:       loop_header.epil:
945de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
946de2fed61SPhilip Reames; EPILOG-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]
94737ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
948de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil
949de2fed61SPhilip Reames; EPILOG:       loop_exiting_bb1.epil:
950de2fed61SPhilip Reames; EPILOG-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
951de2fed61SPhilip Reames; EPILOG-NEXT:    i64 24, label %exit1.loopexit1
952de2fed61SPhilip Reames; EPILOG-NEXT:    i64 42, label %exit3.loopexit2
953de2fed61SPhilip Reames; EPILOG-NEXT:    ]
954de2fed61SPhilip Reames; EPILOG:       loop_latch.epil:
955de2fed61SPhilip Reames; EPILOG-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
956de2fed61SPhilip Reames; EPILOG-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
957de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
95837ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
95937ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
960de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !3
961de2fed61SPhilip Reames; EPILOG:       exit2.loopexit.epilog-lcssa:
962de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit2.loopexit
963de2fed61SPhilip Reames; EPILOG:       exit2.loopexit:
964de2fed61SPhilip Reames; EPILOG-NEXT:    ret void
965911991d2SPhilip Reames;
966911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @test3(
967911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:  entry:
968*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
969*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
970*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
971*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
972323514deSNikita Popov; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new
973911991d2SPhilip Reames; EPILOG-BLOCK:       entry.new:
974*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
975911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %loop_header
976911991d2SPhilip Reames; EPILOG-BLOCK:       loop_header:
977911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
978911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
97937ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
980911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
981911991d2SPhilip Reames; EPILOG-BLOCK:       loop_exiting_bb1:
982911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
983911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
984911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
985911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ]
986911991d2SPhilip Reames; EPILOG-BLOCK:       exit3.loopexit:
987911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit3
988911991d2SPhilip Reames; EPILOG-BLOCK:       exit3:
989911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret void
990911991d2SPhilip Reames; EPILOG-BLOCK:       loop_latch:
991911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
992911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
99337ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
994911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
995de2fed61SPhilip Reames; EPILOG-BLOCK:       loop_exiting_bb1.1:
996de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
997de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
998de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
999de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    ]
1000de2fed61SPhilip Reames; EPILOG-BLOCK:       loop_latch.1:
1001de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
1002de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
100337ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
100437ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
1005de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !3
1006911991d2SPhilip Reames; EPILOG-BLOCK:       exit1.loopexit:
1007911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit1
1008911991d2SPhilip Reames; EPILOG-BLOCK:       exit1:
1009911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret void
1010911991d2SPhilip Reames; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa.loopexit:
1011911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
1012911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit.unr-lcssa
1013911991d2SPhilip Reames; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa:
1014911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
1015911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1016911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
1017911991d2SPhilip Reames; EPILOG-BLOCK:       loop_header.epil.preheader:
1018911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
1019911991d2SPhilip Reames; EPILOG-BLOCK:       loop_header.epil:
1020911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil
1021911991d2SPhilip Reames; EPILOG-BLOCK:       loop_exiting_bb1.epil:
1022b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT:    switch i64 %sum.unr, label %loop_latch.epil [
1023911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    i64 24, label %exit1
1024911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    i64 42, label %exit3
1025911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ]
1026911991d2SPhilip Reames; EPILOG-BLOCK:       loop_latch.epil:
1027911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit
1028911991d2SPhilip Reames; EPILOG-BLOCK:       exit2.loopexit:
1029911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret void
1030911991d2SPhilip Reames;
1031911991d2SPhilip Reames; PROLOG-LABEL: @test3(
1032cee313d2SEric Christopher; PROLOG-NEXT:  entry:
1033*81c648a3SNikita Popov; PROLOG-NEXT:    %0 = freeze i64 %trip
1034*81c648a3SNikita Popov; PROLOG-NEXT:    %1 = add i64 %0, -1
1035*81c648a3SNikita Popov; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
1036911991d2SPhilip Reames; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1037*81c648a3SNikita Popov; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
1038911991d2SPhilip Reames; PROLOG:       loop_header.prol.preheader:
1039911991d2SPhilip Reames; PROLOG-NEXT:    br label %loop_header.prol
1040911991d2SPhilip Reames; PROLOG:       loop_header.prol:
1041911991d2SPhilip Reames; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
1042911991d2SPhilip Reames; PROLOG-NEXT:    %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ]
104337ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
1044911991d2SPhilip Reames; PROLOG-NEXT:    br i1 undef, label %loop_latch.prol, label %loop_exiting_bb1.prol
1045911991d2SPhilip Reames; PROLOG:       loop_exiting_bb1.prol:
1046911991d2SPhilip Reames; PROLOG-NEXT:    switch i64 %sum.prol, label %loop_latch.prol [
1047911991d2SPhilip Reames; PROLOG-NEXT:    i64 24, label %exit1.loopexit1
1048911991d2SPhilip Reames; PROLOG-NEXT:    i64 42, label %exit3.loopexit2
1049911991d2SPhilip Reames; PROLOG-NEXT:    ]
1050911991d2SPhilip Reames; PROLOG:       loop_latch.prol:
1051911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.prol = add nuw nsw i64 %iv.prol, 1
1052911991d2SPhilip Reames; PROLOG-NEXT:    %sum.next.prol = add i64 %sum.prol, %add
1053911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
105437ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
105537ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
1056911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !3
1057911991d2SPhilip Reames; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
1058911991d2SPhilip Reames; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
1059911991d2SPhilip Reames; PROLOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
1060911991d2SPhilip Reames; PROLOG-NEXT:    br label %loop_header.prol.loopexit
1061911991d2SPhilip Reames; PROLOG:       loop_header.prol.loopexit:
1062911991d2SPhilip Reames; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
1063911991d2SPhilip Reames; PROLOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
1064*81c648a3SNikita Popov; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
1065323514deSNikita Popov; PROLOG-NEXT:    br i1 %2, label %exit2.loopexit, label %entry.new
1066911991d2SPhilip Reames; PROLOG:       entry.new:
1067911991d2SPhilip Reames; PROLOG-NEXT:    br label %loop_header
1068cee313d2SEric Christopher; PROLOG:       loop_header:
1069cee313d2SEric Christopher; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
1070cee313d2SEric Christopher; PROLOG-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
1071911991d2SPhilip Reames; PROLOG-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
1072911991d2SPhilip Reames; PROLOG:       loop_exiting_bb1:
1073911991d2SPhilip Reames; PROLOG-NEXT:    switch i64 %sum, label %loop_latch [
1074911991d2SPhilip Reames; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1075911991d2SPhilip Reames; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1076911991d2SPhilip Reames; PROLOG-NEXT:    ]
1077911991d2SPhilip Reames; PROLOG:       exit3.loopexit:
1078911991d2SPhilip Reames; PROLOG-NEXT:    br label %exit3
1079911991d2SPhilip Reames; PROLOG:       exit3.loopexit2:
1080911991d2SPhilip Reames; PROLOG-NEXT:    br label %exit3
1081911991d2SPhilip Reames; PROLOG:       exit3:
1082911991d2SPhilip Reames; PROLOG-NEXT:    ret void
1083911991d2SPhilip Reames; PROLOG:       loop_latch:
1084911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
1085911991d2SPhilip Reames; PROLOG-NEXT:    %sum.next = add i64 %sum, %add
1086911991d2SPhilip Reames; PROLOG-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
1087911991d2SPhilip Reames; PROLOG:       loop_exiting_bb1.1:
1088911991d2SPhilip Reames; PROLOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
1089911991d2SPhilip Reames; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1090911991d2SPhilip Reames; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1091911991d2SPhilip Reames; PROLOG-NEXT:    ]
1092911991d2SPhilip Reames; PROLOG:       loop_latch.1:
1093911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
1094911991d2SPhilip Reames; PROLOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
1095911991d2SPhilip Reames; PROLOG-NEXT:    br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2
1096911991d2SPhilip Reames; PROLOG:       loop_exiting_bb1.2:
1097911991d2SPhilip Reames; PROLOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
1098911991d2SPhilip Reames; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1099911991d2SPhilip Reames; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1100911991d2SPhilip Reames; PROLOG-NEXT:    ]
1101911991d2SPhilip Reames; PROLOG:       loop_latch.2:
1102911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
1103911991d2SPhilip Reames; PROLOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
1104911991d2SPhilip Reames; PROLOG-NEXT:    br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3
1105911991d2SPhilip Reames; PROLOG:       loop_exiting_bb1.3:
1106911991d2SPhilip Reames; PROLOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
1107911991d2SPhilip Reames; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1108911991d2SPhilip Reames; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1109911991d2SPhilip Reames; PROLOG-NEXT:    ]
1110911991d2SPhilip Reames; PROLOG:       loop_latch.3:
1111911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
1112911991d2SPhilip Reames; PROLOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
1113911991d2SPhilip Reames; PROLOG-NEXT:    br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4
1114911991d2SPhilip Reames; PROLOG:       loop_exiting_bb1.4:
1115911991d2SPhilip Reames; PROLOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
1116911991d2SPhilip Reames; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1117911991d2SPhilip Reames; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1118911991d2SPhilip Reames; PROLOG-NEXT:    ]
1119911991d2SPhilip Reames; PROLOG:       loop_latch.4:
1120911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
1121911991d2SPhilip Reames; PROLOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
1122911991d2SPhilip Reames; PROLOG-NEXT:    br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5
1123911991d2SPhilip Reames; PROLOG:       loop_exiting_bb1.5:
1124911991d2SPhilip Reames; PROLOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
1125911991d2SPhilip Reames; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1126911991d2SPhilip Reames; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1127911991d2SPhilip Reames; PROLOG-NEXT:    ]
1128911991d2SPhilip Reames; PROLOG:       loop_latch.5:
1129911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
1130911991d2SPhilip Reames; PROLOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
1131911991d2SPhilip Reames; PROLOG-NEXT:    br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6
1132911991d2SPhilip Reames; PROLOG:       loop_exiting_bb1.6:
1133911991d2SPhilip Reames; PROLOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
1134911991d2SPhilip Reames; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1135911991d2SPhilip Reames; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1136911991d2SPhilip Reames; PROLOG-NEXT:    ]
1137911991d2SPhilip Reames; PROLOG:       loop_latch.6:
1138911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
1139911991d2SPhilip Reames; PROLOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
1140911991d2SPhilip Reames; PROLOG-NEXT:    br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7
1141cee313d2SEric Christopher; PROLOG:       loop_exiting_bb1.7:
1142911991d2SPhilip Reames; PROLOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
1143911991d2SPhilip Reames; PROLOG-NEXT:    i64 24, label %exit1.loopexit
1144911991d2SPhilip Reames; PROLOG-NEXT:    i64 42, label %exit3.loopexit
1145911991d2SPhilip Reames; PROLOG-NEXT:    ]
1146cee313d2SEric Christopher; PROLOG:       loop_latch.7:
1147911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
1148cee313d2SEric Christopher; PROLOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
1149911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
1150911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa
1151de2fed61SPhilip Reames; PROLOG:       exit1.loopexit:
1152de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit1
1153de2fed61SPhilip Reames; PROLOG:       exit1.loopexit1:
1154de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit1
1155de2fed61SPhilip Reames; PROLOG:       exit1:
1156de2fed61SPhilip Reames; PROLOG-NEXT:    ret void
1157de2fed61SPhilip Reames; PROLOG:       exit2.loopexit.unr-lcssa:
1158de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit2.loopexit
1159de2fed61SPhilip Reames; PROLOG:       exit2.loopexit:
1160de2fed61SPhilip Reames; PROLOG-NEXT:    ret void
1161911991d2SPhilip Reames;
1162911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @test3(
1163911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:  entry:
1164*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
1165*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
1166*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
1167911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1168*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
1169911991d2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol.preheader:
1170911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
1171911991d2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol:
1172911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.prol, label %loop_exiting_bb1.prol
1173911991d2SPhilip Reames; PROLOG-BLOCK:       loop_exiting_bb1.prol:
1174911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    switch i64 0, label %loop_latch.prol [
1175911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    i64 24, label %exit1
1176911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    i64 42, label %exit3
1177911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ]
1178911991d2SPhilip Reames; PROLOG-BLOCK:       loop_latch.prol:
1179911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
1180911991d2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol.loopexit:
1181b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
1182b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %add, %loop_latch.prol ]
1183*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
1184323514deSNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit2.loopexit, label %entry.new
1185911991d2SPhilip Reames; PROLOG-BLOCK:       entry.new:
1186911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header
1187911991d2SPhilip Reames; PROLOG-BLOCK:       loop_header:
1188911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
1189911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
1190911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
1191911991d2SPhilip Reames; PROLOG-BLOCK:       loop_exiting_bb1:
1192911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
1193911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
1194911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
1195911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ]
1196911991d2SPhilip Reames; PROLOG-BLOCK:       exit3.loopexit:
1197911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit3
1198911991d2SPhilip Reames; PROLOG-BLOCK:       exit3:
1199911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret void
1200911991d2SPhilip Reames; PROLOG-BLOCK:       loop_latch:
1201911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
1202911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
1203911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
1204911991d2SPhilip Reames; PROLOG-BLOCK:       loop_exiting_bb1.1:
1205911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
1206911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
1207911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
1208911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ]
1209911991d2SPhilip Reames; PROLOG-BLOCK:       loop_latch.1:
1210911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
1211911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
1212911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
1213911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !3
1214de2fed61SPhilip Reames; PROLOG-BLOCK:       exit1.loopexit:
1215de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit1
1216de2fed61SPhilip Reames; PROLOG-BLOCK:       exit1:
1217de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    ret void
1218de2fed61SPhilip Reames; PROLOG-BLOCK:       exit2.loopexit.unr-lcssa:
1219de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit2.loopexit
1220de2fed61SPhilip Reames; PROLOG-BLOCK:       exit2.loopexit:
1221de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    ret void
1222911991d2SPhilip Reames;
1223911991d2SPhilip Reames
1224cee313d2SEric Christopherentry:
1225cee313d2SEric Christopher  br label %loop_header
1226cee313d2SEric Christopher
1227cee313d2SEric Christopherloop_header:
1228cee313d2SEric Christopher  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
1229cee313d2SEric Christopher  %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ]
1230cee313d2SEric Christopher  br i1 undef, label %loop_latch, label %loop_exiting_bb1
1231cee313d2SEric Christopher
1232cee313d2SEric Christopherloop_exiting_bb1:
1233cee313d2SEric Christopher  switch i64 %sum, label %loop_latch [
1234cee313d2SEric Christopher  i64 24, label %exit1
1235cee313d2SEric Christopher  i64 42, label %exit3
1236cee313d2SEric Christopher  ]
1237cee313d2SEric Christopher
1238cee313d2SEric Christopherexit3:
1239cee313d2SEric Christopher  ret void
1240cee313d2SEric Christopher
1241cee313d2SEric Christopherloop_latch:
1242cee313d2SEric Christopher  %iv_next = add nuw nsw i64 %iv, 1
1243cee313d2SEric Christopher  %sum.next = add i64 %sum, %add
1244cee313d2SEric Christopher  %cmp = icmp ne i64 %iv_next, %trip
1245cee313d2SEric Christopher  br i1 %cmp, label %loop_header, label %exit2.loopexit
1246cee313d2SEric Christopher
1247cee313d2SEric Christopherexit1:
1248cee313d2SEric Christopher  ret void
1249cee313d2SEric Christopher
1250cee313d2SEric Christopherexit2.loopexit:
1251cee313d2SEric Christopher  ret void
1252cee313d2SEric Christopher}
1253cee313d2SEric Christopher
1254cee313d2SEric Christopher; FIXME: Support multiple exiting blocks to the same latch exit block.
1255cee313d2SEric Christopher; Three exiting blocks where header and latch exit to same LatchExit.
1256cee313d2SEric Christopherdefine i32 @hdr_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) {
1257911991d2SPhilip Reames; EPILOG-LABEL: @hdr_latch_same_exit(
1258911991d2SPhilip Reames; EPILOG-NEXT:  entry:
1259*81c648a3SNikita Popov; EPILOG-NEXT:    %0 = freeze i64 %n
1260*81c648a3SNikita Popov; EPILOG-NEXT:    %1 = add i64 %0, -1
1261*81c648a3SNikita Popov; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
1262*81c648a3SNikita Popov; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
1263323514deSNikita Popov; EPILOG-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
126494d09142SPhilip Reames; EPILOG:       entry.new:
1265*81c648a3SNikita Popov; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
1266911991d2SPhilip Reames; EPILOG-NEXT:    br label %header
1267911991d2SPhilip Reames; EPILOG:       header:
126894d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
126994d09142SPhilip Reames; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
127037ead201SPhilip Reames; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
127194d09142SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block
1272911991d2SPhilip Reames; EPILOG:       for.exiting_block:
1273911991d2SPhilip Reames; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
127494d09142SPhilip Reames; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1275911991d2SPhilip Reames; EPILOG:       latch:
1276911991d2SPhilip Reames; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1277323514deSNikita Popov; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
1278323514deSNikita Popov; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.02
127994d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
128037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
128172031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.1
1282de2fed61SPhilip Reames; EPILOG:       for.exiting_block.1:
1283de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1284de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1285de2fed61SPhilip Reames; EPILOG:       latch.1:
1286de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1287323514deSNikita Popov; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1288323514deSNikita Popov; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
1289de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
129037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
129172031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.2
1292de2fed61SPhilip Reames; EPILOG:       for.exiting_block.2:
1293de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1294de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
1295de2fed61SPhilip Reames; EPILOG:       latch.2:
1296de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1297323514deSNikita Popov; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
1298323514deSNikita Popov; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
1299de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
130037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
130172031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.3
1302de2fed61SPhilip Reames; EPILOG:       for.exiting_block.3:
1303de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1304de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
1305de2fed61SPhilip Reames; EPILOG:       latch.3:
1306de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1307323514deSNikita Popov; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
1308323514deSNikita Popov; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
1309de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
131037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
131172031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.4
1312de2fed61SPhilip Reames; EPILOG:       for.exiting_block.4:
1313de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1314de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
1315de2fed61SPhilip Reames; EPILOG:       latch.4:
1316de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
1317323514deSNikita Popov; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
1318323514deSNikita Popov; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
1319de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
132037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
132172031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.5
1322de2fed61SPhilip Reames; EPILOG:       for.exiting_block.5:
1323de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1324de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
1325de2fed61SPhilip Reames; EPILOG:       latch.5:
1326de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
1327323514deSNikita Popov; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
1328323514deSNikita Popov; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
1329de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
133037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
133172031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.6
1332de2fed61SPhilip Reames; EPILOG:       for.exiting_block.6:
1333de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
1334de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
1335de2fed61SPhilip Reames; EPILOG:       latch.6:
1336de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
1337323514deSNikita Popov; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
1338323514deSNikita Popov; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
1339de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
134037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
134172031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.7
1342de2fed61SPhilip Reames; EPILOG:       for.exiting_block.7:
1343de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
1344de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
1345de2fed61SPhilip Reames; EPILOG:       latch.7:
1346de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
1347323514deSNikita Popov; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
1348323514deSNikita Popov; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
1349de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
135037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
135137ead201SPhilip Reames; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
1352de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
135394d09142SPhilip Reames; EPILOG:       latchExit.unr-lcssa.loopexit:
135494d09142SPhilip Reames; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
135594d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
135694d09142SPhilip Reames; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
135794d09142SPhilip Reames; EPILOG-NEXT:    br label %latchExit.unr-lcssa
135894d09142SPhilip Reames; EPILOG:       latchExit.unr-lcssa:
135994d09142SPhilip Reames; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
136094d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
136194d09142SPhilip Reames; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
136294d09142SPhilip Reames; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
136394d09142SPhilip Reames; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
136494d09142SPhilip Reames; EPILOG:       header.epil.preheader:
136594d09142SPhilip Reames; EPILOG-NEXT:    br label %header.epil
136694d09142SPhilip Reames; EPILOG:       header.epil:
136794d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
136894d09142SPhilip Reames; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
136937ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
137094d09142SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit2, label %for.exiting_block.epil
137194d09142SPhilip Reames; EPILOG:       for.exiting_block.epil:
137294d09142SPhilip Reames; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
137394d09142SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit4, label %latch.epil
137494d09142SPhilip Reames; EPILOG:       latch.epil:
137594d09142SPhilip Reames; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
1376323514deSNikita Popov; EPILOG-NEXT:    %11 = load i32, i32* %arrayidx.epil, align 4
1377323514deSNikita Popov; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil
137894d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
137994d09142SPhilip Reames; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
138037ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
138137ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
138294d09142SPhilip Reames; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit2, !llvm.loop !4
138394d09142SPhilip Reames; EPILOG:       latchExit.epilog-lcssa.loopexit:
138472031407SPhilip Reames; EPILOG-NEXT:    %result.ph1.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ 0, %latch.1 ], [ 0, %latch.2 ], [ 0, %latch.3 ], [ 0, %latch.4 ], [ 0, %latch.5 ], [ 0, %latch.6 ]
138594d09142SPhilip Reames; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
138694d09142SPhilip Reames; EPILOG:       latchExit.epilog-lcssa.loopexit2:
138794d09142SPhilip Reames; EPILOG-NEXT:    %result.ph1.ph3 = phi i32 [ 0, %header.epil ], [ %add.epil, %latch.epil ]
138894d09142SPhilip Reames; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
138994d09142SPhilip Reames; EPILOG:       latchExit.epilog-lcssa:
139094d09142SPhilip Reames; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph3, %latchExit.epilog-lcssa.loopexit2 ]
139194d09142SPhilip Reames; EPILOG-NEXT:    br label %latchExit
1392911991d2SPhilip Reames; EPILOG:       latchExit:
139394d09142SPhilip Reames; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1394911991d2SPhilip Reames; EPILOG-NEXT:    ret i32 %result
139594d09142SPhilip Reames; EPILOG:       for.exit2.loopexit:
139694d09142SPhilip Reames; EPILOG-NEXT:    br label %for.exit2
139794d09142SPhilip Reames; EPILOG:       for.exit2.loopexit4:
139894d09142SPhilip Reames; EPILOG-NEXT:    br label %for.exit2
1399911991d2SPhilip Reames; EPILOG:       for.exit2:
1400911991d2SPhilip Reames; EPILOG-NEXT:    ret i32 42
1401911991d2SPhilip Reames;
1402911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @hdr_latch_same_exit(
1403911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:  entry:
1404*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n
1405*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
1406*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
1407*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
1408323514deSNikita Popov; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
140994d09142SPhilip Reames; EPILOG-BLOCK:       entry.new:
1410*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
1411911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header
1412911991d2SPhilip Reames; EPILOG-BLOCK:       header:
141394d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
141494d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
141537ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
141694d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block
1417911991d2SPhilip Reames; EPILOG-BLOCK:       for.exiting_block:
1418911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
141994d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1420911991d2SPhilip Reames; EPILOG-BLOCK:       latch:
1421911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1422323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
1423323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
1424911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
142537ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
142672031407SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa.loopexit, label %for.exiting_block.1
1427de2fed61SPhilip Reames; EPILOG-BLOCK:       for.exiting_block.1:
1428de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1429de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1430de2fed61SPhilip Reames; EPILOG-BLOCK:       latch.1:
1431de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1432323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1433323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
1434de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
143537ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
143637ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
1437de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !4
143894d09142SPhilip Reames; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
143994d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
144094d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
144194d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
144294d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
144394d09142SPhilip Reames; EPILOG-BLOCK:       latchExit.unr-lcssa:
144494d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
144594d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
144694d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
144794d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
144894d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
144994d09142SPhilip Reames; EPILOG-BLOCK:       header.epil.preheader:
145094d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header.epil
145194d09142SPhilip Reames; EPILOG-BLOCK:       header.epil:
145294d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.epilog-lcssa, label %for.exiting_block.epil
145394d09142SPhilip Reames; EPILOG-BLOCK:       for.exiting_block.epil:
145494d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
145594d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %latch.epil
145694d09142SPhilip Reames; EPILOG-BLOCK:       latch.epil:
1457b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
1458323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.epil, align 4
1459323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.unr
146094d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
146194d09142SPhilip Reames; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
146272031407SPhilip Reames; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ 0, %header ], [ 0, %latch ]
146394d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
146494d09142SPhilip Reames; EPILOG-BLOCK:       latchExit.epilog-lcssa:
146594d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 0, %header.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
146694d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit
1467911991d2SPhilip Reames; EPILOG-BLOCK:       latchExit:
146894d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1469911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret i32 %result
147094d09142SPhilip Reames; EPILOG-BLOCK:       for.exit2.loopexit:
147194d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %for.exit2
1472911991d2SPhilip Reames; EPILOG-BLOCK:       for.exit2:
1473911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret i32 42
1474911991d2SPhilip Reames;
1475911991d2SPhilip Reames; PROLOG-LABEL: @hdr_latch_same_exit(
1476911991d2SPhilip Reames; PROLOG-NEXT:  entry:
1477*81c648a3SNikita Popov; PROLOG-NEXT:    %0 = freeze i64 %n
1478*81c648a3SNikita Popov; PROLOG-NEXT:    %1 = add i64 %0, -1
1479*81c648a3SNikita Popov; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
148017b9cb18SPhilip Reames; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1481*81c648a3SNikita Popov; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
148217b9cb18SPhilip Reames; PROLOG:       header.prol.preheader:
148317b9cb18SPhilip Reames; PROLOG-NEXT:    br label %header.prol
148417b9cb18SPhilip Reames; PROLOG:       header.prol:
148517b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
148617b9cb18SPhilip Reames; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
148737ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
148817b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit1, label %for.exiting_block.prol
148917b9cb18SPhilip Reames; PROLOG:       for.exiting_block.prol:
149017b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
149117b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit3, label %latch.prol
149217b9cb18SPhilip Reames; PROLOG:       latch.prol:
149317b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
1494323514deSNikita Popov; PROLOG-NEXT:    %2 = load i32, i32* %arrayidx.prol, align 4
1495323514deSNikita Popov; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol
149617b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
149717b9cb18SPhilip Reames; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
149837ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
149937ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
150017b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !4
150117b9cb18SPhilip Reames; PROLOG:       header.prol.loopexit.unr-lcssa:
150217b9cb18SPhilip Reames; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
150317b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
150417b9cb18SPhilip Reames; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
150517b9cb18SPhilip Reames; PROLOG-NEXT:    br label %header.prol.loopexit
150617b9cb18SPhilip Reames; PROLOG:       header.prol.loopexit:
150717b9cb18SPhilip Reames; PROLOG-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
150817b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
150917b9cb18SPhilip Reames; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
1510*81c648a3SNikita Popov; PROLOG-NEXT:    %3 = icmp ult i64 %1, 7
1511323514deSNikita Popov; PROLOG-NEXT:    br i1 %3, label %latchExit, label %entry.new
151217b9cb18SPhilip Reames; PROLOG:       entry.new:
1513911991d2SPhilip Reames; PROLOG-NEXT:    br label %header
1514911991d2SPhilip Reames; PROLOG:       header:
151517b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
151617b9cb18SPhilip Reames; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
151717b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block
1518911991d2SPhilip Reames; PROLOG:       for.exiting_block:
1519911991d2SPhilip Reames; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
152017b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1521911991d2SPhilip Reames; PROLOG:       latch:
1522911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1523323514deSNikita Popov; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx, align 4
1524323514deSNikita Popov; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.02
1525911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
152672031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.1
152717b9cb18SPhilip Reames; PROLOG:       for.exiting_block.1:
152817b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
152917b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
153017b9cb18SPhilip Reames; PROLOG:       latch.1:
153117b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1532323514deSNikita Popov; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
1533323514deSNikita Popov; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add
153417b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
153572031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.2
153617b9cb18SPhilip Reames; PROLOG:       for.exiting_block.2:
153717b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
153817b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
153917b9cb18SPhilip Reames; PROLOG:       latch.2:
154017b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1541323514deSNikita Popov; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.2, align 4
1542323514deSNikita Popov; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.1
154317b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
154472031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.3
154517b9cb18SPhilip Reames; PROLOG:       for.exiting_block.3:
154617b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
154717b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
154817b9cb18SPhilip Reames; PROLOG:       latch.3:
154917b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1550323514deSNikita Popov; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.3, align 4
1551323514deSNikita Popov; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.2
155217b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
155372031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.4
155417b9cb18SPhilip Reames; PROLOG:       for.exiting_block.4:
155517b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
155617b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
155717b9cb18SPhilip Reames; PROLOG:       latch.4:
155817b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
1559323514deSNikita Popov; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.4, align 4
1560323514deSNikita Popov; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.3
156117b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
156272031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.5
156317b9cb18SPhilip Reames; PROLOG:       for.exiting_block.5:
156417b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
156517b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
156617b9cb18SPhilip Reames; PROLOG:       latch.5:
156717b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
1568323514deSNikita Popov; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.5, align 4
1569323514deSNikita Popov; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.4
157017b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
157172031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.6
157217b9cb18SPhilip Reames; PROLOG:       for.exiting_block.6:
157317b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
157417b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
157517b9cb18SPhilip Reames; PROLOG:       latch.6:
157617b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
1577323514deSNikita Popov; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.6, align 4
1578323514deSNikita Popov; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.5
157917b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
158072031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.7
158117b9cb18SPhilip Reames; PROLOG:       for.exiting_block.7:
158217b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
158317b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
158417b9cb18SPhilip Reames; PROLOG:       latch.7:
158517b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
1586323514deSNikita Popov; PROLOG-NEXT:    %11 = load i32, i32* %arrayidx.7, align 4
1587323514deSNikita Popov; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.6
158817b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
158917b9cb18SPhilip Reames; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
159017b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
1591de2fed61SPhilip Reames; PROLOG:       latchExit.unr-lcssa.loopexit:
159272031407SPhilip Reames; PROLOG-NEXT:    %result.ph.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ 0, %latch.1 ], [ 0, %latch.2 ], [ 0, %latch.3 ], [ 0, %latch.4 ], [ 0, %latch.5 ], [ 0, %latch.6 ], [ %add.7, %latch.7 ]
1593de2fed61SPhilip Reames; PROLOG-NEXT:    br label %latchExit.unr-lcssa
1594de2fed61SPhilip Reames; PROLOG:       latchExit.unr-lcssa.loopexit1:
1595de2fed61SPhilip Reames; PROLOG-NEXT:    %result.ph.ph2 = phi i32 [ 0, %header.prol ]
1596de2fed61SPhilip Reames; PROLOG-NEXT:    br label %latchExit.unr-lcssa
1597de2fed61SPhilip Reames; PROLOG:       latchExit.unr-lcssa:
1598de2fed61SPhilip Reames; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph2, %latchExit.unr-lcssa.loopexit1 ]
1599de2fed61SPhilip Reames; PROLOG-NEXT:    br label %latchExit
1600de2fed61SPhilip Reames; PROLOG:       latchExit:
1601de2fed61SPhilip Reames; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
1602de2fed61SPhilip Reames; PROLOG-NEXT:    ret i32 %result
1603de2fed61SPhilip Reames; PROLOG:       for.exit2.loopexit:
1604de2fed61SPhilip Reames; PROLOG-NEXT:    br label %for.exit2
1605de2fed61SPhilip Reames; PROLOG:       for.exit2.loopexit3:
1606de2fed61SPhilip Reames; PROLOG-NEXT:    br label %for.exit2
1607de2fed61SPhilip Reames; PROLOG:       for.exit2:
1608de2fed61SPhilip Reames; PROLOG-NEXT:    ret i32 42
1609911991d2SPhilip Reames;
1610911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @hdr_latch_same_exit(
1611911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:  entry:
1612*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n
1613*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
1614*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
161517b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1616*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
161717b9cb18SPhilip Reames; PROLOG-BLOCK:       header.prol.preheader:
161817b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol
161917b9cb18SPhilip Reames; PROLOG-BLOCK:       header.prol:
162017b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.unr-lcssa, label %for.exiting_block.prol
162117b9cb18SPhilip Reames; PROLOG-BLOCK:       for.exiting_block.prol:
162217b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
162317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %latch.prol
162417b9cb18SPhilip Reames; PROLOG-BLOCK:       latch.prol:
1625323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %2 = load i32, i32* %a, align 4
162617b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
162717b9cb18SPhilip Reames; PROLOG-BLOCK:       header.prol.loopexit:
1628323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %2, %latch.prol ]
1629b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
1630323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ]
1631*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 1
1632323514deSNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchExit, label %entry.new
163317b9cb18SPhilip Reames; PROLOG-BLOCK:       entry.new:
1634911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header
1635911991d2SPhilip Reames; PROLOG-BLOCK:       header:
163617b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
163717b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
163817b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block
1639911991d2SPhilip Reames; PROLOG-BLOCK:       for.exiting_block:
1640911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
164117b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
1642911991d2SPhilip Reames; PROLOG-BLOCK:       latch:
1643911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1644323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx, align 4
1645323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.02
164617b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
164772031407SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit.unr-lcssa.loopexit, label %for.exiting_block.1
1648de2fed61SPhilip Reames; PROLOG-BLOCK:       for.exiting_block.1:
1649de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1650de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
1651de2fed61SPhilip Reames; PROLOG-BLOCK:       latch.1:
1652de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1653323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
1654323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add
1655de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
1656de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
1657de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !4
165817b9cb18SPhilip Reames; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
165972031407SPhilip Reames; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ 0, %header ], [ 0, %latch ], [ %add.1, %latch.1 ]
166017b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
166117b9cb18SPhilip Reames; PROLOG-BLOCK:       latchExit.unr-lcssa:
166217b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %header.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
166317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %latchExit
1664911991d2SPhilip Reames; PROLOG-BLOCK:       latchExit:
166517b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
1666911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret i32 %result
166717b9cb18SPhilip Reames; PROLOG-BLOCK:       for.exit2.loopexit:
166817b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %for.exit2
1669911991d2SPhilip Reames; PROLOG-BLOCK:       for.exit2:
1670911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret i32 42
1671911991d2SPhilip Reames;
1672cee313d2SEric Christopher
1673cee313d2SEric Christopherentry:
1674cee313d2SEric Christopher  br label %header
1675cee313d2SEric Christopher
1676cee313d2SEric Christopherheader:
1677cee313d2SEric Christopher  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
1678cee313d2SEric Christopher  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
1679cee313d2SEric Christopher  br i1 %cond, label %latchExit, label %for.exiting_block
1680cee313d2SEric Christopher
1681cee313d2SEric Christopherfor.exiting_block:
1682cee313d2SEric Christopher  %cmp = icmp eq i64 %n, 42
1683cee313d2SEric Christopher  br i1 %cmp, label %for.exit2, label %latch
1684cee313d2SEric Christopher
1685cee313d2SEric Christopherlatch:                                         ; preds = %latch, %entry
1686cee313d2SEric Christopher  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1687cee313d2SEric Christopher  %0 = load i32, i32* %arrayidx, align 4
1688cee313d2SEric Christopher  %add = add nsw i32 %0, %sum.02
1689cee313d2SEric Christopher  %indvars.iv.next = add i64 %indvars.iv, 1
1690cee313d2SEric Christopher  %exitcond = icmp eq i64 %indvars.iv.next, %n
1691cee313d2SEric Christopher  br i1 %exitcond, label %latchExit, label %header
1692cee313d2SEric Christopher
1693cee313d2SEric ChristopherlatchExit:                                          ; preds = %latch, %entry
1694cee313d2SEric Christopher  %result = phi i32 [ 0, %header ], [ %add, %latch ]
1695cee313d2SEric Christopher  ret i32 %result
1696cee313d2SEric Christopher
1697cee313d2SEric Christopherfor.exit2:
1698cee313d2SEric Christopher  ret i32 42
1699cee313d2SEric Christopher}
1700cee313d2SEric Christopher
1701cee313d2SEric Christopher; Two exiting blocks to latch where the exiting blocks are Latch and a
1702cee313d2SEric Christopher; non-header
1703cee313d2SEric Christopher; FIXME: We should unroll this loop.
1704cee313d2SEric Christopherdefine i32 @otherblock_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) {
1705911991d2SPhilip Reames; EPILOG-LABEL: @otherblock_latch_same_exit(
1706911991d2SPhilip Reames; EPILOG-NEXT:  entry:
1707*81c648a3SNikita Popov; EPILOG-NEXT:    %0 = freeze i64 %n
1708*81c648a3SNikita Popov; EPILOG-NEXT:    %1 = add i64 %0, -1
1709*81c648a3SNikita Popov; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
1710*81c648a3SNikita Popov; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
1711323514deSNikita Popov; EPILOG-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
171294d09142SPhilip Reames; EPILOG:       entry.new:
1713*81c648a3SNikita Popov; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
1714911991d2SPhilip Reames; EPILOG-NEXT:    br label %header
1715911991d2SPhilip Reames; EPILOG:       header:
171694d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
171794d09142SPhilip Reames; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
171837ead201SPhilip Reames; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
171994d09142SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
1720911991d2SPhilip Reames; EPILOG:       for.exiting_block:
1721911991d2SPhilip Reames; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
172294d09142SPhilip Reames; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
1723911991d2SPhilip Reames; EPILOG:       latch:
1724911991d2SPhilip Reames; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1725323514deSNikita Popov; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
1726323514deSNikita Popov; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.02
172794d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
172837ead201SPhilip Reames; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
172972031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
1730de2fed61SPhilip Reames; EPILOG:       for.exiting_block.1:
1731de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1732de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
1733de2fed61SPhilip Reames; EPILOG:       latch.1:
1734de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1735323514deSNikita Popov; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1736323514deSNikita Popov; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
1737de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
173837ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
173972031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
1740de2fed61SPhilip Reames; EPILOG:       for.exiting_block.2:
1741de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
1742de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
1743de2fed61SPhilip Reames; EPILOG:       latch.2:
1744de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1745323514deSNikita Popov; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
1746323514deSNikita Popov; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
1747de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
174837ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
174972031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
1750de2fed61SPhilip Reames; EPILOG:       for.exiting_block.3:
1751de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
1752de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
1753de2fed61SPhilip Reames; EPILOG:       latch.3:
1754de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1755323514deSNikita Popov; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
1756323514deSNikita Popov; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
1757de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
175837ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
175972031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
1760de2fed61SPhilip Reames; EPILOG:       for.exiting_block.4:
1761de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
1762de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
1763de2fed61SPhilip Reames; EPILOG:       latch.4:
1764de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
1765323514deSNikita Popov; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
1766323514deSNikita Popov; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
1767de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
176837ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
176972031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
1770de2fed61SPhilip Reames; EPILOG:       for.exiting_block.5:
1771de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
1772de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
1773de2fed61SPhilip Reames; EPILOG:       latch.5:
1774de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
1775323514deSNikita Popov; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
1776323514deSNikita Popov; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
1777de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
177837ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
177972031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
1780de2fed61SPhilip Reames; EPILOG:       for.exiting_block.6:
1781de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
1782de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
1783de2fed61SPhilip Reames; EPILOG:       latch.6:
1784de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
1785323514deSNikita Popov; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
1786323514deSNikita Popov; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
1787de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
178837ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
178972031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
1790de2fed61SPhilip Reames; EPILOG:       for.exiting_block.7:
1791de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
1792de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
1793de2fed61SPhilip Reames; EPILOG:       latch.7:
1794de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
1795323514deSNikita Popov; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
1796323514deSNikita Popov; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
1797de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
179837ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
179937ead201SPhilip Reames; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
1800de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
180194d09142SPhilip Reames; EPILOG:       latchExit.unr-lcssa.loopexit:
180294d09142SPhilip Reames; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
180394d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
180494d09142SPhilip Reames; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
180594d09142SPhilip Reames; EPILOG-NEXT:    br label %latchExit.unr-lcssa
180694d09142SPhilip Reames; EPILOG:       latchExit.unr-lcssa:
180794d09142SPhilip Reames; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
180894d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
180994d09142SPhilip Reames; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
181094d09142SPhilip Reames; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
181194d09142SPhilip Reames; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
181294d09142SPhilip Reames; EPILOG:       header.epil.preheader:
181394d09142SPhilip Reames; EPILOG-NEXT:    br label %header.epil
181494d09142SPhilip Reames; EPILOG:       header.epil:
181594d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
181694d09142SPhilip Reames; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
181737ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
181894d09142SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
181994d09142SPhilip Reames; EPILOG:       for.exiting_block.epil:
182094d09142SPhilip Reames; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
182194d09142SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
182294d09142SPhilip Reames; EPILOG:       latch.epil:
182394d09142SPhilip Reames; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
1824323514deSNikita Popov; EPILOG-NEXT:    %11 = load i32, i32* %arrayidx.epil, align 4
1825323514deSNikita Popov; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil
182694d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
182794d09142SPhilip Reames; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
182837ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
182937ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
183094d09142SPhilip Reames; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !5
183194d09142SPhilip Reames; EPILOG:       latchExit.epilog-lcssa.loopexit:
183294d09142SPhilip Reames; EPILOG-NEXT:    %result.ph1.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ 2, %for.exiting_block.2 ], [ 2, %for.exiting_block.3 ], [ 2, %for.exiting_block.4 ], [ 2, %for.exiting_block.5 ], [ 2, %for.exiting_block.6 ], [ 2, %for.exiting_block.7 ]
183394d09142SPhilip Reames; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
183494d09142SPhilip Reames; EPILOG:       latchExit.epilog-lcssa.loopexit3:
183594d09142SPhilip Reames; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ 2, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
183694d09142SPhilip Reames; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
183794d09142SPhilip Reames; EPILOG:       latchExit.epilog-lcssa:
183894d09142SPhilip Reames; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
183994d09142SPhilip Reames; EPILOG-NEXT:    br label %latchExit
1840911991d2SPhilip Reames; EPILOG:       latchExit:
184194d09142SPhilip Reames; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1842911991d2SPhilip Reames; EPILOG-NEXT:    ret i32 %result
184394d09142SPhilip Reames; EPILOG:       for.exit2.loopexit:
184494d09142SPhilip Reames; EPILOG-NEXT:    br label %for.exit2
184594d09142SPhilip Reames; EPILOG:       for.exit2.loopexit2:
184694d09142SPhilip Reames; EPILOG-NEXT:    br label %for.exit2
1847911991d2SPhilip Reames; EPILOG:       for.exit2:
1848911991d2SPhilip Reames; EPILOG-NEXT:    ret i32 42
1849911991d2SPhilip Reames;
1850911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit(
1851911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:  entry:
1852*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n
1853*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
1854*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
1855*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
1856323514deSNikita Popov; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
185794d09142SPhilip Reames; EPILOG-BLOCK:       entry.new:
1858*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
1859911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header
1860911991d2SPhilip Reames; EPILOG-BLOCK:       header:
186194d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
186294d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
186337ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
186494d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
1865911991d2SPhilip Reames; EPILOG-BLOCK:       for.exiting_block:
1866911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
186794d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
1868911991d2SPhilip Reames; EPILOG-BLOCK:       latch:
1869911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1870323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
1871323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
1872911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
187337ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
187472031407SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
1875de2fed61SPhilip Reames; EPILOG-BLOCK:       for.exiting_block.1:
1876de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
1877de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
1878de2fed61SPhilip Reames; EPILOG-BLOCK:       latch.1:
1879de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1880323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
1881323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
1882de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
188337ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
188437ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
1885de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5
188694d09142SPhilip Reames; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
188794d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
188894d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
188994d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
189094d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
189194d09142SPhilip Reames; EPILOG-BLOCK:       latchExit.unr-lcssa:
189294d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
189394d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
189494d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
189594d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
189694d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
189794d09142SPhilip Reames; EPILOG-BLOCK:       header.epil.preheader:
189894d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header.epil
189994d09142SPhilip Reames; EPILOG-BLOCK:       header.epil:
190094d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
190194d09142SPhilip Reames; EPILOG-BLOCK:       for.exiting_block.epil:
190294d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
190394d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
190494d09142SPhilip Reames; EPILOG-BLOCK:       latch.epil:
1905b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
1906323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.epil, align 4
1907323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.unr
190894d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
190994d09142SPhilip Reames; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
191094d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ]
191194d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
191294d09142SPhilip Reames; EPILOG-BLOCK:       latchExit.epilog-lcssa:
191394d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ 2, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
191494d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit
1915911991d2SPhilip Reames; EPILOG-BLOCK:       latchExit:
191694d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
1917911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret i32 %result
191894d09142SPhilip Reames; EPILOG-BLOCK:       for.exit2.loopexit:
191994d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %for.exit2
1920911991d2SPhilip Reames; EPILOG-BLOCK:       for.exit2:
1921911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret i32 42
1922911991d2SPhilip Reames;
1923911991d2SPhilip Reames; PROLOG-LABEL: @otherblock_latch_same_exit(
1924911991d2SPhilip Reames; PROLOG-NEXT:  entry:
1925*81c648a3SNikita Popov; PROLOG-NEXT:    %0 = freeze i64 %n
1926*81c648a3SNikita Popov; PROLOG-NEXT:    %1 = add i64 %0, -1
1927*81c648a3SNikita Popov; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
192817b9cb18SPhilip Reames; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
1929*81c648a3SNikita Popov; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
193017b9cb18SPhilip Reames; PROLOG:       header.prol.preheader:
193117b9cb18SPhilip Reames; PROLOG-NEXT:    br label %header.prol
193217b9cb18SPhilip Reames; PROLOG:       header.prol:
193317b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
193417b9cb18SPhilip Reames; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
193537ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
193617b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol
193717b9cb18SPhilip Reames; PROLOG:       for.exiting_block.prol:
193817b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
193917b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol
194017b9cb18SPhilip Reames; PROLOG:       latch.prol:
194117b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
1942323514deSNikita Popov; PROLOG-NEXT:    %2 = load i32, i32* %arrayidx.prol, align 4
1943323514deSNikita Popov; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol
194417b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
194517b9cb18SPhilip Reames; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
194637ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
194737ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
194817b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !5
194917b9cb18SPhilip Reames; PROLOG:       header.prol.loopexit.unr-lcssa:
195017b9cb18SPhilip Reames; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
195117b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
195217b9cb18SPhilip Reames; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
195317b9cb18SPhilip Reames; PROLOG-NEXT:    br label %header.prol.loopexit
195417b9cb18SPhilip Reames; PROLOG:       header.prol.loopexit:
195517b9cb18SPhilip Reames; PROLOG-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
195617b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
195717b9cb18SPhilip Reames; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
1958*81c648a3SNikita Popov; PROLOG-NEXT:    %3 = icmp ult i64 %1, 7
1959323514deSNikita Popov; PROLOG-NEXT:    br i1 %3, label %latchExit, label %entry.new
196017b9cb18SPhilip Reames; PROLOG:       entry.new:
1961911991d2SPhilip Reames; PROLOG-NEXT:    br label %header
1962911991d2SPhilip Reames; PROLOG:       header:
196317b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
196417b9cb18SPhilip Reames; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
196517b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
1966911991d2SPhilip Reames; PROLOG:       for.exiting_block:
1967911991d2SPhilip Reames; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
196817b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
1969911991d2SPhilip Reames; PROLOG:       latch:
1970911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1971323514deSNikita Popov; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx, align 4
1972323514deSNikita Popov; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.02
1973911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
197472031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
197517b9cb18SPhilip Reames; PROLOG:       for.exiting_block.1:
197617b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
197717b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
197817b9cb18SPhilip Reames; PROLOG:       latch.1:
197917b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
1980323514deSNikita Popov; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
1981323514deSNikita Popov; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add
198217b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
198372031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
198417b9cb18SPhilip Reames; PROLOG:       for.exiting_block.2:
198517b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
198617b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2
198717b9cb18SPhilip Reames; PROLOG:       latch.2:
198817b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
1989323514deSNikita Popov; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.2, align 4
1990323514deSNikita Popov; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.1
199117b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
199272031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
199317b9cb18SPhilip Reames; PROLOG:       for.exiting_block.3:
199417b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
199517b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3
199617b9cb18SPhilip Reames; PROLOG:       latch.3:
199717b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
1998323514deSNikita Popov; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.3, align 4
1999323514deSNikita Popov; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.2
200017b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
200172031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
200217b9cb18SPhilip Reames; PROLOG:       for.exiting_block.4:
200317b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
200417b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4
200517b9cb18SPhilip Reames; PROLOG:       latch.4:
200617b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2007323514deSNikita Popov; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.4, align 4
2008323514deSNikita Popov; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.3
200917b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
201072031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
201117b9cb18SPhilip Reames; PROLOG:       for.exiting_block.5:
201217b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
201317b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5
201417b9cb18SPhilip Reames; PROLOG:       latch.5:
201517b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2016323514deSNikita Popov; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.5, align 4
2017323514deSNikita Popov; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.4
201817b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
201972031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
202017b9cb18SPhilip Reames; PROLOG:       for.exiting_block.6:
202117b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
202217b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6
202317b9cb18SPhilip Reames; PROLOG:       latch.6:
202417b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2025323514deSNikita Popov; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.6, align 4
2026323514deSNikita Popov; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.5
202717b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
202872031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
202917b9cb18SPhilip Reames; PROLOG:       for.exiting_block.7:
203017b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
203117b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7
203217b9cb18SPhilip Reames; PROLOG:       latch.7:
203317b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2034323514deSNikita Popov; PROLOG-NEXT:    %11 = load i32, i32* %arrayidx.7, align 4
2035323514deSNikita Popov; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.6
203617b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
203717b9cb18SPhilip Reames; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
203817b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
2039de2fed61SPhilip Reames; PROLOG:       latchExit.unr-lcssa.loopexit:
2040de2fed61SPhilip Reames; PROLOG-NEXT:    %result.ph.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ 2, %for.exiting_block.2 ], [ 2, %for.exiting_block.3 ], [ 2, %for.exiting_block.4 ], [ 2, %for.exiting_block.5 ], [ 2, %for.exiting_block.6 ], [ 2, %for.exiting_block.7 ], [ %add.7, %latch.7 ]
2041de2fed61SPhilip Reames; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2042de2fed61SPhilip Reames; PROLOG:       latchExit.unr-lcssa.loopexit2:
2043de2fed61SPhilip Reames; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ 2, %for.exiting_block.prol ]
2044de2fed61SPhilip Reames; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2045de2fed61SPhilip Reames; PROLOG:       latchExit.unr-lcssa:
2046de2fed61SPhilip Reames; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]
2047de2fed61SPhilip Reames; PROLOG-NEXT:    br label %latchExit
2048de2fed61SPhilip Reames; PROLOG:       latchExit:
2049de2fed61SPhilip Reames; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2050de2fed61SPhilip Reames; PROLOG-NEXT:    ret i32 %result
2051de2fed61SPhilip Reames; PROLOG:       for.exit2.loopexit:
2052de2fed61SPhilip Reames; PROLOG-NEXT:    br label %for.exit2
2053de2fed61SPhilip Reames; PROLOG:       for.exit2.loopexit1:
2054de2fed61SPhilip Reames; PROLOG-NEXT:    br label %for.exit2
2055de2fed61SPhilip Reames; PROLOG:       for.exit2:
2056de2fed61SPhilip Reames; PROLOG-NEXT:    ret i32 42
2057911991d2SPhilip Reames;
2058911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit(
2059911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:  entry:
2060*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n
2061*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
2062*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
206317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2064*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
206517b9cb18SPhilip Reames; PROLOG-BLOCK:       header.prol.preheader:
206617b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol
206717b9cb18SPhilip Reames; PROLOG-BLOCK:       header.prol:
206817b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.prol
206917b9cb18SPhilip Reames; PROLOG-BLOCK:       for.exiting_block.prol:
207017b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
207117b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol
207217b9cb18SPhilip Reames; PROLOG-BLOCK:       latch.prol:
2073323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %2 = load i32, i32* %a, align 4
207417b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
207517b9cb18SPhilip Reames; PROLOG-BLOCK:       header.prol.loopexit:
2076323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %2, %latch.prol ]
2077b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
2078323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ]
2079*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 1
2080323514deSNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchExit, label %entry.new
208117b9cb18SPhilip Reames; PROLOG-BLOCK:       entry.new:
2082911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header
2083911991d2SPhilip Reames; PROLOG-BLOCK:       header:
208417b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
208517b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
208617b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2087911991d2SPhilip Reames; PROLOG-BLOCK:       for.exiting_block:
2088911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
208917b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2090911991d2SPhilip Reames; PROLOG-BLOCK:       latch:
2091911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2092323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx, align 4
2093323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.02
209417b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
209572031407SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2096de2fed61SPhilip Reames; PROLOG-BLOCK:       for.exiting_block.1:
2097de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2098de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2099de2fed61SPhilip Reames; PROLOG-BLOCK:       latch.1:
2100de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2101323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
2102323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add
2103de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2104de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
2105de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !5
210617b9cb18SPhilip Reames; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
210717b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ 2, %for.exiting_block ], [ 2, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
210817b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
210917b9cb18SPhilip Reames; PROLOG-BLOCK:       latchExit.unr-lcssa:
211017b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 2, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
211117b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %latchExit
2112911991d2SPhilip Reames; PROLOG-BLOCK:       latchExit:
211317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2114911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret i32 %result
211517b9cb18SPhilip Reames; PROLOG-BLOCK:       for.exit2.loopexit:
211617b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %for.exit2
2117911991d2SPhilip Reames; PROLOG-BLOCK:       for.exit2:
2118911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret i32 42
2119911991d2SPhilip Reames;
2120cee313d2SEric Christopher
2121cee313d2SEric Christopherentry:
2122cee313d2SEric Christopher  br label %header
2123cee313d2SEric Christopher
2124cee313d2SEric Christopherheader:
2125cee313d2SEric Christopher  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
2126cee313d2SEric Christopher  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
2127cee313d2SEric Christopher  br i1 %cond, label %for.exit2, label %for.exiting_block
2128cee313d2SEric Christopher
2129cee313d2SEric Christopherfor.exiting_block:
2130cee313d2SEric Christopher  %cmp = icmp eq i64 %n, 42
2131cee313d2SEric Christopher  br i1 %cmp, label %latchExit, label %latch
2132cee313d2SEric Christopher
2133cee313d2SEric Christopherlatch:                                         ; preds = %latch, %entry
2134cee313d2SEric Christopher  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2135cee313d2SEric Christopher  %0 = load i32, i32* %arrayidx, align 4
2136cee313d2SEric Christopher  %add = add nsw i32 %0, %sum.02
2137cee313d2SEric Christopher  %indvars.iv.next = add i64 %indvars.iv, 1
2138cee313d2SEric Christopher  %exitcond = icmp eq i64 %indvars.iv.next, %n
2139cee313d2SEric Christopher  br i1 %exitcond, label %latchExit, label %header
2140cee313d2SEric Christopher
2141cee313d2SEric ChristopherlatchExit:                                          ; preds = %latch, %entry
2142cee313d2SEric Christopher  %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ]
2143cee313d2SEric Christopher  ret i32 %result
2144cee313d2SEric Christopher
2145cee313d2SEric Christopherfor.exit2:
2146cee313d2SEric Christopher  ret i32 42
2147cee313d2SEric Christopher}
2148cee313d2SEric Christopher
2149cee313d2SEric Christopher; Two exiting blocks to latch where the exiting blocks are Latch and a
2150cee313d2SEric Christopher; non-header
2151cee313d2SEric Christopher; Same as above test except the incoming value for latch Phi is from the header
2152cee313d2SEric Christopher; FIXME: We should be able to runtime unroll.
2153cee313d2SEric Christopherdefine i32 @otherblock_latch_same_exit2(i32* nocapture %a, i64 %n, i1 %cond) {
2154911991d2SPhilip Reames; EPILOG-LABEL: @otherblock_latch_same_exit2(
2155911991d2SPhilip Reames; EPILOG-NEXT:  entry:
2156*81c648a3SNikita Popov; EPILOG-NEXT:    %0 = freeze i64 %n
2157*81c648a3SNikita Popov; EPILOG-NEXT:    %1 = add i64 %0, -1
2158*81c648a3SNikita Popov; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
2159*81c648a3SNikita Popov; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
2160323514deSNikita Popov; EPILOG-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
216194d09142SPhilip Reames; EPILOG:       entry.new:
2162*81c648a3SNikita Popov; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
2163911991d2SPhilip Reames; EPILOG-NEXT:    br label %header
2164911991d2SPhilip Reames; EPILOG:       header:
216594d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
216694d09142SPhilip Reames; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
216737ead201SPhilip Reames; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
216894d09142SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2169911991d2SPhilip Reames; EPILOG:       for.exiting_block:
2170911991d2SPhilip Reames; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
217194d09142SPhilip Reames; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2172911991d2SPhilip Reames; EPILOG:       latch:
2173911991d2SPhilip Reames; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2174323514deSNikita Popov; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
2175323514deSNikita Popov; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.02
217694d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
217737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
217872031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2179de2fed61SPhilip Reames; EPILOG:       for.exiting_block.1:
2180de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2181de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2182de2fed61SPhilip Reames; EPILOG:       latch.1:
2183de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2184323514deSNikita Popov; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2185323514deSNikita Popov; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
2186de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
218737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
218872031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2189de2fed61SPhilip Reames; EPILOG:       for.exiting_block.2:
2190de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2191de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
2192de2fed61SPhilip Reames; EPILOG:       latch.2:
2193de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2194323514deSNikita Popov; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
2195323514deSNikita Popov; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
2196de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
219737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
219872031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2199de2fed61SPhilip Reames; EPILOG:       for.exiting_block.3:
2200de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2201de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
2202de2fed61SPhilip Reames; EPILOG:       latch.3:
2203de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2204323514deSNikita Popov; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
2205323514deSNikita Popov; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
2206de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
220737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
220872031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2209de2fed61SPhilip Reames; EPILOG:       for.exiting_block.4:
2210de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2211de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
2212de2fed61SPhilip Reames; EPILOG:       latch.4:
2213de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2214323514deSNikita Popov; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
2215323514deSNikita Popov; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2216de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
221737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
221872031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2219de2fed61SPhilip Reames; EPILOG:       for.exiting_block.5:
2220de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2221de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
2222de2fed61SPhilip Reames; EPILOG:       latch.5:
2223de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2224323514deSNikita Popov; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
2225323514deSNikita Popov; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2226de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
222737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
222872031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2229de2fed61SPhilip Reames; EPILOG:       for.exiting_block.6:
2230de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2231de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
2232de2fed61SPhilip Reames; EPILOG:       latch.6:
2233de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2234323514deSNikita Popov; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
2235323514deSNikita Popov; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2236de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
223737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
223872031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2239de2fed61SPhilip Reames; EPILOG:       for.exiting_block.7:
2240de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2241de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
2242de2fed61SPhilip Reames; EPILOG:       latch.7:
2243de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2244323514deSNikita Popov; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
2245323514deSNikita Popov; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2246de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
224737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
224837ead201SPhilip Reames; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
2249de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
225094d09142SPhilip Reames; EPILOG:       latchExit.unr-lcssa.loopexit:
225194d09142SPhilip Reames; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
225294d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
225394d09142SPhilip Reames; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
225494d09142SPhilip Reames; EPILOG-NEXT:    br label %latchExit.unr-lcssa
225594d09142SPhilip Reames; EPILOG:       latchExit.unr-lcssa:
225694d09142SPhilip Reames; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
225794d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
225894d09142SPhilip Reames; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
225994d09142SPhilip Reames; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
226094d09142SPhilip Reames; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
226194d09142SPhilip Reames; EPILOG:       header.epil.preheader:
226294d09142SPhilip Reames; EPILOG-NEXT:    br label %header.epil
226394d09142SPhilip Reames; EPILOG:       header.epil:
226494d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
226594d09142SPhilip Reames; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
226637ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
226794d09142SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
226894d09142SPhilip Reames; EPILOG:       for.exiting_block.epil:
226994d09142SPhilip Reames; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
227094d09142SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
227194d09142SPhilip Reames; EPILOG:       latch.epil:
227294d09142SPhilip Reames; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
2273323514deSNikita Popov; EPILOG-NEXT:    %11 = load i32, i32* %arrayidx.epil, align 4
2274323514deSNikita Popov; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil
227594d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
227694d09142SPhilip Reames; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
227737ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
227837ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
227994d09142SPhilip Reames; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !6
228094d09142SPhilip Reames; EPILOG:       latchExit.epilog-lcssa.loopexit:
228194d09142SPhilip Reames; EPILOG-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %for.exiting_block.2 ], [ %add.2, %for.exiting_block.3 ], [ %add.3, %for.exiting_block.4 ], [ %add.4, %for.exiting_block.5 ], [ %add.5, %for.exiting_block.6 ], [ %add.6, %for.exiting_block.7 ]
228294d09142SPhilip Reames; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
228394d09142SPhilip Reames; EPILOG:       latchExit.epilog-lcssa.loopexit3:
228494d09142SPhilip Reames; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
228594d09142SPhilip Reames; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
228694d09142SPhilip Reames; EPILOG:       latchExit.epilog-lcssa:
228794d09142SPhilip Reames; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
228894d09142SPhilip Reames; EPILOG-NEXT:    br label %latchExit
2289911991d2SPhilip Reames; EPILOG:       latchExit:
229094d09142SPhilip Reames; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2291911991d2SPhilip Reames; EPILOG-NEXT:    ret i32 %result
229294d09142SPhilip Reames; EPILOG:       for.exit2.loopexit:
229394d09142SPhilip Reames; EPILOG-NEXT:    br label %for.exit2
229494d09142SPhilip Reames; EPILOG:       for.exit2.loopexit2:
229594d09142SPhilip Reames; EPILOG-NEXT:    br label %for.exit2
2296911991d2SPhilip Reames; EPILOG:       for.exit2:
2297911991d2SPhilip Reames; EPILOG-NEXT:    ret i32 42
2298911991d2SPhilip Reames;
2299911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit2(
2300911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:  entry:
2301*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n
2302*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
2303*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
2304*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
2305323514deSNikita Popov; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
230694d09142SPhilip Reames; EPILOG-BLOCK:       entry.new:
2307*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
2308911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header
2309911991d2SPhilip Reames; EPILOG-BLOCK:       header:
231094d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
231194d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
231237ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
231394d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2314911991d2SPhilip Reames; EPILOG-BLOCK:       for.exiting_block:
2315911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
231694d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2317911991d2SPhilip Reames; EPILOG-BLOCK:       latch:
2318911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2319323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
2320323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
2321911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
232237ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
232372031407SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2324de2fed61SPhilip Reames; EPILOG-BLOCK:       for.exiting_block.1:
2325de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2326de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2327de2fed61SPhilip Reames; EPILOG-BLOCK:       latch.1:
2328de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2329323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2330323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2331de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
233237ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
233337ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
2334de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6
233594d09142SPhilip Reames; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
233694d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
233794d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
233894d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
233994d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
234094d09142SPhilip Reames; EPILOG-BLOCK:       latchExit.unr-lcssa:
234194d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
234294d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
234394d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
234494d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
234594d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
234694d09142SPhilip Reames; EPILOG-BLOCK:       header.epil.preheader:
234794d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header.epil
234894d09142SPhilip Reames; EPILOG-BLOCK:       header.epil:
234994d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
235094d09142SPhilip Reames; EPILOG-BLOCK:       for.exiting_block.epil:
235194d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
235294d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
235394d09142SPhilip Reames; EPILOG-BLOCK:       latch.epil:
2354b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
2355323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.epil, align 4
2356323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.unr
235794d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
235894d09142SPhilip Reames; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
235994d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ]
236094d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
236194d09142SPhilip Reames; EPILOG-BLOCK:       latchExit.epilog-lcssa:
2362b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
236394d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit
2364911991d2SPhilip Reames; EPILOG-BLOCK:       latchExit:
236594d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2366911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret i32 %result
236794d09142SPhilip Reames; EPILOG-BLOCK:       for.exit2.loopexit:
236894d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %for.exit2
2369911991d2SPhilip Reames; EPILOG-BLOCK:       for.exit2:
2370911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret i32 42
2371911991d2SPhilip Reames;
2372911991d2SPhilip Reames; PROLOG-LABEL: @otherblock_latch_same_exit2(
2373911991d2SPhilip Reames; PROLOG-NEXT:  entry:
2374*81c648a3SNikita Popov; PROLOG-NEXT:    %0 = freeze i64 %n
2375*81c648a3SNikita Popov; PROLOG-NEXT:    %1 = add i64 %0, -1
2376*81c648a3SNikita Popov; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
237717b9cb18SPhilip Reames; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2378*81c648a3SNikita Popov; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
237917b9cb18SPhilip Reames; PROLOG:       header.prol.preheader:
238017b9cb18SPhilip Reames; PROLOG-NEXT:    br label %header.prol
238117b9cb18SPhilip Reames; PROLOG:       header.prol:
238217b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
238317b9cb18SPhilip Reames; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
238437ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
238517b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol
238617b9cb18SPhilip Reames; PROLOG:       for.exiting_block.prol:
238717b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
238817b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol
238917b9cb18SPhilip Reames; PROLOG:       latch.prol:
239017b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
2391323514deSNikita Popov; PROLOG-NEXT:    %2 = load i32, i32* %arrayidx.prol, align 4
2392323514deSNikita Popov; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol
239317b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
239417b9cb18SPhilip Reames; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
239537ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
239637ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
239717b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !6
239817b9cb18SPhilip Reames; PROLOG:       header.prol.loopexit.unr-lcssa:
239917b9cb18SPhilip Reames; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
240017b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
240117b9cb18SPhilip Reames; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
240217b9cb18SPhilip Reames; PROLOG-NEXT:    br label %header.prol.loopexit
240317b9cb18SPhilip Reames; PROLOG:       header.prol.loopexit:
240417b9cb18SPhilip Reames; PROLOG-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
240517b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
240617b9cb18SPhilip Reames; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
2407*81c648a3SNikita Popov; PROLOG-NEXT:    %3 = icmp ult i64 %1, 7
2408323514deSNikita Popov; PROLOG-NEXT:    br i1 %3, label %latchExit, label %entry.new
240917b9cb18SPhilip Reames; PROLOG:       entry.new:
2410911991d2SPhilip Reames; PROLOG-NEXT:    br label %header
2411911991d2SPhilip Reames; PROLOG:       header:
241217b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
241317b9cb18SPhilip Reames; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
241417b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2415911991d2SPhilip Reames; PROLOG:       for.exiting_block:
2416911991d2SPhilip Reames; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
241717b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2418911991d2SPhilip Reames; PROLOG:       latch:
2419911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2420323514deSNikita Popov; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx, align 4
2421323514deSNikita Popov; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.02
2422911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
242372031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
242417b9cb18SPhilip Reames; PROLOG:       for.exiting_block.1:
242517b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
242617b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
242717b9cb18SPhilip Reames; PROLOG:       latch.1:
242817b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2429323514deSNikita Popov; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
2430323514deSNikita Popov; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add
243117b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
243272031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
243317b9cb18SPhilip Reames; PROLOG:       for.exiting_block.2:
243417b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
243517b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2
243617b9cb18SPhilip Reames; PROLOG:       latch.2:
243717b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2438323514deSNikita Popov; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.2, align 4
2439323514deSNikita Popov; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.1
244017b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
244172031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
244217b9cb18SPhilip Reames; PROLOG:       for.exiting_block.3:
244317b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
244417b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3
244517b9cb18SPhilip Reames; PROLOG:       latch.3:
244617b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2447323514deSNikita Popov; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.3, align 4
2448323514deSNikita Popov; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.2
244917b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
245072031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
245117b9cb18SPhilip Reames; PROLOG:       for.exiting_block.4:
245217b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
245317b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4
245417b9cb18SPhilip Reames; PROLOG:       latch.4:
245517b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2456323514deSNikita Popov; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.4, align 4
2457323514deSNikita Popov; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.3
245817b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
245972031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
246017b9cb18SPhilip Reames; PROLOG:       for.exiting_block.5:
246117b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
246217b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5
246317b9cb18SPhilip Reames; PROLOG:       latch.5:
246417b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2465323514deSNikita Popov; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.5, align 4
2466323514deSNikita Popov; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.4
246717b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
246872031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
246917b9cb18SPhilip Reames; PROLOG:       for.exiting_block.6:
247017b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
247117b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6
247217b9cb18SPhilip Reames; PROLOG:       latch.6:
247317b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2474323514deSNikita Popov; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.6, align 4
2475323514deSNikita Popov; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.5
247617b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
247772031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
247817b9cb18SPhilip Reames; PROLOG:       for.exiting_block.7:
247917b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
248017b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7
248117b9cb18SPhilip Reames; PROLOG:       latch.7:
248217b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2483323514deSNikita Popov; PROLOG-NEXT:    %11 = load i32, i32* %arrayidx.7, align 4
2484323514deSNikita Popov; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.6
248517b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
248617b9cb18SPhilip Reames; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
248717b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
2488de2fed61SPhilip Reames; PROLOG:       latchExit.unr-lcssa.loopexit:
2489de2fed61SPhilip Reames; PROLOG-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %for.exiting_block.2 ], [ %add.2, %for.exiting_block.3 ], [ %add.3, %for.exiting_block.4 ], [ %add.4, %for.exiting_block.5 ], [ %add.5, %for.exiting_block.6 ], [ %add.6, %for.exiting_block.7 ], [ %add.7, %latch.7 ]
2490de2fed61SPhilip Reames; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2491de2fed61SPhilip Reames; PROLOG:       latchExit.unr-lcssa.loopexit2:
2492de2fed61SPhilip Reames; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ]
2493de2fed61SPhilip Reames; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2494de2fed61SPhilip Reames; PROLOG:       latchExit.unr-lcssa:
2495de2fed61SPhilip Reames; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]
2496de2fed61SPhilip Reames; PROLOG-NEXT:    br label %latchExit
2497de2fed61SPhilip Reames; PROLOG:       latchExit:
2498de2fed61SPhilip Reames; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2499de2fed61SPhilip Reames; PROLOG-NEXT:    ret i32 %result
2500de2fed61SPhilip Reames; PROLOG:       for.exit2.loopexit:
2501de2fed61SPhilip Reames; PROLOG-NEXT:    br label %for.exit2
2502de2fed61SPhilip Reames; PROLOG:       for.exit2.loopexit1:
2503de2fed61SPhilip Reames; PROLOG-NEXT:    br label %for.exit2
2504de2fed61SPhilip Reames; PROLOG:       for.exit2:
2505de2fed61SPhilip Reames; PROLOG-NEXT:    ret i32 42
2506911991d2SPhilip Reames;
2507911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit2(
2508911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:  entry:
2509*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n
2510*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
2511*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
251217b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2513*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
251417b9cb18SPhilip Reames; PROLOG-BLOCK:       header.prol.preheader:
251517b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol
251617b9cb18SPhilip Reames; PROLOG-BLOCK:       header.prol:
251717b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.prol
251817b9cb18SPhilip Reames; PROLOG-BLOCK:       for.exiting_block.prol:
251917b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
252017b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol
252117b9cb18SPhilip Reames; PROLOG-BLOCK:       latch.prol:
2522323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %2 = load i32, i32* %a, align 4
252317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
252417b9cb18SPhilip Reames; PROLOG-BLOCK:       header.prol.loopexit:
2525323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %2, %latch.prol ]
2526b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
2527323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ]
2528*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 1
2529323514deSNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchExit, label %entry.new
253017b9cb18SPhilip Reames; PROLOG-BLOCK:       entry.new:
2531911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header
2532911991d2SPhilip Reames; PROLOG-BLOCK:       header:
253317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
253417b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
253517b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2536911991d2SPhilip Reames; PROLOG-BLOCK:       for.exiting_block:
2537911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
253817b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2539911991d2SPhilip Reames; PROLOG-BLOCK:       latch:
2540911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2541323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx, align 4
2542323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.02
254317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
254472031407SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2545de2fed61SPhilip Reames; PROLOG-BLOCK:       for.exiting_block.1:
2546de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2547de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
2548de2fed61SPhilip Reames; PROLOG-BLOCK:       latch.1:
2549de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2550323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
2551323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add
2552de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
2553de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
2554de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !6
255517b9cb18SPhilip Reames; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
255617b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
255717b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
255817b9cb18SPhilip Reames; PROLOG-BLOCK:       latchExit.unr-lcssa:
255917b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
256017b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %latchExit
2561911991d2SPhilip Reames; PROLOG-BLOCK:       latchExit:
256217b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2563911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret i32 %result
256417b9cb18SPhilip Reames; PROLOG-BLOCK:       for.exit2.loopexit:
256517b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %for.exit2
2566911991d2SPhilip Reames; PROLOG-BLOCK:       for.exit2:
2567911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret i32 42
2568911991d2SPhilip Reames;
2569cee313d2SEric Christopher
2570cee313d2SEric Christopherentry:
2571cee313d2SEric Christopher  br label %header
2572cee313d2SEric Christopher
2573cee313d2SEric Christopherheader:
2574cee313d2SEric Christopher  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
2575cee313d2SEric Christopher  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
2576cee313d2SEric Christopher  br i1 %cond, label %for.exit2, label %for.exiting_block
2577cee313d2SEric Christopher
2578cee313d2SEric Christopherfor.exiting_block:
2579cee313d2SEric Christopher  %cmp = icmp eq i64 %n, 42
2580cee313d2SEric Christopher  br i1 %cmp, label %latchExit, label %latch
2581cee313d2SEric Christopher
2582cee313d2SEric Christopherlatch:                                         ; preds = %latch, %entry
2583cee313d2SEric Christopher  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2584cee313d2SEric Christopher  %0 = load i32, i32* %arrayidx, align 4
2585cee313d2SEric Christopher  %add = add nsw i32 %0, %sum.02
2586cee313d2SEric Christopher  %indvars.iv.next = add i64 %indvars.iv, 1
2587cee313d2SEric Christopher  %exitcond = icmp eq i64 %indvars.iv.next, %n
2588cee313d2SEric Christopher  br i1 %exitcond, label %latchExit, label %header
2589cee313d2SEric Christopher
2590cee313d2SEric ChristopherlatchExit:                                          ; preds = %latch, %entry
2591cee313d2SEric Christopher  %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
2592cee313d2SEric Christopher  ret i32 %result
2593cee313d2SEric Christopher
2594cee313d2SEric Christopherfor.exit2:
2595cee313d2SEric Christopher  ret i32 42
2596cee313d2SEric Christopher}
2597cee313d2SEric Christopher
2598cee313d2SEric Christopher; Two exiting blocks to latch where the exiting blocks are Latch and a
2599cee313d2SEric Christopher; non-header
2600cee313d2SEric Christopher; Same as above test except the incoming value for cloned latch Phi is from the
2601cee313d2SEric Christopher; for.exiting_block.
2602cee313d2SEric Christopher; FIXME: We should be able to runtime unroll.
2603cee313d2SEric Christopherdefine i32 @otherblock_latch_same_exit3(i32* nocapture %a, i64 %n, i1 %cond) {
2604911991d2SPhilip Reames; EPILOG-LABEL: @otherblock_latch_same_exit3(
2605911991d2SPhilip Reames; EPILOG-NEXT:  entry:
2606*81c648a3SNikita Popov; EPILOG-NEXT:    %0 = freeze i64 %n
2607*81c648a3SNikita Popov; EPILOG-NEXT:    %1 = add i64 %0, -1
2608*81c648a3SNikita Popov; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
2609*81c648a3SNikita Popov; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
2610323514deSNikita Popov; EPILOG-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
261194d09142SPhilip Reames; EPILOG:       entry.new:
2612*81c648a3SNikita Popov; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
2613911991d2SPhilip Reames; EPILOG-NEXT:    br label %header
2614911991d2SPhilip Reames; EPILOG:       header:
261594d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
261694d09142SPhilip Reames; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
261737ead201SPhilip Reames; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
261894d09142SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2619911991d2SPhilip Reames; EPILOG:       for.exiting_block:
2620911991d2SPhilip Reames; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2621323514deSNikita Popov; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
2622323514deSNikita Popov; EPILOG-NEXT:    %add = add nsw i32 %3, %sum.02
2623911991d2SPhilip Reames; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
262494d09142SPhilip Reames; EPILOG-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2625911991d2SPhilip Reames; EPILOG:       latch:
262694d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
262737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
262872031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2629de2fed61SPhilip Reames; EPILOG:       for.exiting_block.1:
2630de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2631323514deSNikita Popov; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2632323514deSNikita Popov; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
2633de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2634de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2635de2fed61SPhilip Reames; EPILOG:       latch.1:
2636de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
263737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
263872031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
2639de2fed61SPhilip Reames; EPILOG:       for.exiting_block.2:
2640de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2641323514deSNikita Popov; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
2642323514deSNikita Popov; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
2643de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
2644de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.2, label %latchExit.epilog-lcssa.loopexit, label %latch.2
2645de2fed61SPhilip Reames; EPILOG:       latch.2:
2646de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
264737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
264872031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
2649de2fed61SPhilip Reames; EPILOG:       for.exiting_block.3:
2650de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2651323514deSNikita Popov; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
2652323514deSNikita Popov; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
2653de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
2654de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.3, label %latchExit.epilog-lcssa.loopexit, label %latch.3
2655de2fed61SPhilip Reames; EPILOG:       latch.3:
2656de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
265737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
265872031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
2659de2fed61SPhilip Reames; EPILOG:       for.exiting_block.4:
2660de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2661323514deSNikita Popov; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
2662323514deSNikita Popov; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
2663de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
2664de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.4, label %latchExit.epilog-lcssa.loopexit, label %latch.4
2665de2fed61SPhilip Reames; EPILOG:       latch.4:
2666de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
266737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
266872031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
2669de2fed61SPhilip Reames; EPILOG:       for.exiting_block.5:
2670de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2671323514deSNikita Popov; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
2672323514deSNikita Popov; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
2673de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
2674de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.5, label %latchExit.epilog-lcssa.loopexit, label %latch.5
2675de2fed61SPhilip Reames; EPILOG:       latch.5:
2676de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
267737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
267872031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
2679de2fed61SPhilip Reames; EPILOG:       for.exiting_block.6:
2680de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2681323514deSNikita Popov; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
2682323514deSNikita Popov; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
2683de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
2684de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.6, label %latchExit.epilog-lcssa.loopexit, label %latch.6
2685de2fed61SPhilip Reames; EPILOG:       latch.6:
2686de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
268737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
268872031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
2689de2fed61SPhilip Reames; EPILOG:       for.exiting_block.7:
2690de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2691323514deSNikita Popov; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
2692323514deSNikita Popov; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
2693de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
2694de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.7, label %latchExit.epilog-lcssa.loopexit, label %latch.7
2695de2fed61SPhilip Reames; EPILOG:       latch.7:
2696de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
269737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
269837ead201SPhilip Reames; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
2699de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latchExit.unr-lcssa.loopexit, label %header
270094d09142SPhilip Reames; EPILOG:       latchExit.unr-lcssa.loopexit:
270194d09142SPhilip Reames; EPILOG-NEXT:    %result.ph.ph = phi i32 [ %add.7, %latch.7 ]
270294d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
270394d09142SPhilip Reames; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
270494d09142SPhilip Reames; EPILOG-NEXT:    br label %latchExit.unr-lcssa
270594d09142SPhilip Reames; EPILOG:       latchExit.unr-lcssa:
270694d09142SPhilip Reames; EPILOG-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
270794d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
270894d09142SPhilip Reames; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
270994d09142SPhilip Reames; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
271094d09142SPhilip Reames; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
271194d09142SPhilip Reames; EPILOG:       header.epil.preheader:
271294d09142SPhilip Reames; EPILOG-NEXT:    br label %header.epil
271394d09142SPhilip Reames; EPILOG:       header.epil:
271494d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
271594d09142SPhilip Reames; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
271637ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
271794d09142SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %for.exit2.loopexit2, label %for.exiting_block.epil
271894d09142SPhilip Reames; EPILOG:       for.exiting_block.epil:
271994d09142SPhilip Reames; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
2720323514deSNikita Popov; EPILOG-NEXT:    %11 = load i32, i32* %arrayidx.epil, align 4
2721323514deSNikita Popov; EPILOG-NEXT:    %add.epil = add nsw i32 %11, %sum.02.epil
272294d09142SPhilip Reames; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
272394d09142SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa.loopexit3, label %latch.epil
272494d09142SPhilip Reames; EPILOG:       latch.epil:
272594d09142SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
272694d09142SPhilip Reames; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
272737ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
272837ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
272994d09142SPhilip Reames; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit3, !llvm.loop !7
273094d09142SPhilip Reames; EPILOG:       latchExit.epilog-lcssa.loopexit:
273194d09142SPhilip Reames; EPILOG-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %for.exiting_block.2 ], [ %add.2, %for.exiting_block.3 ], [ %add.3, %for.exiting_block.4 ], [ %add.4, %for.exiting_block.5 ], [ %add.5, %for.exiting_block.6 ], [ %add.6, %for.exiting_block.7 ]
273294d09142SPhilip Reames; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
273394d09142SPhilip Reames; EPILOG:       latchExit.epilog-lcssa.loopexit3:
273494d09142SPhilip Reames; EPILOG-NEXT:    %result.ph1.ph4 = phi i32 [ %sum.02.epil, %for.exiting_block.epil ], [ %add.epil, %latch.epil ]
273594d09142SPhilip Reames; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
273694d09142SPhilip Reames; EPILOG:       latchExit.epilog-lcssa:
273794d09142SPhilip Reames; EPILOG-NEXT:    %result.ph1 = phi i32 [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %result.ph1.ph4, %latchExit.epilog-lcssa.loopexit3 ]
273894d09142SPhilip Reames; EPILOG-NEXT:    br label %latchExit
2739911991d2SPhilip Reames; EPILOG:       latchExit:
274094d09142SPhilip Reames; EPILOG-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2741911991d2SPhilip Reames; EPILOG-NEXT:    ret i32 %result
274294d09142SPhilip Reames; EPILOG:       for.exit2.loopexit:
274394d09142SPhilip Reames; EPILOG-NEXT:    br label %for.exit2
274494d09142SPhilip Reames; EPILOG:       for.exit2.loopexit2:
274594d09142SPhilip Reames; EPILOG-NEXT:    br label %for.exit2
2746911991d2SPhilip Reames; EPILOG:       for.exit2:
2747911991d2SPhilip Reames; EPILOG-NEXT:    ret i32 42
2748911991d2SPhilip Reames;
2749911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit3(
2750911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:  entry:
2751*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n
2752*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
2753*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
2754*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
2755323514deSNikita Popov; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %entry.new
275694d09142SPhilip Reames; EPILOG-BLOCK:       entry.new:
2757*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
2758911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header
2759911991d2SPhilip Reames; EPILOG-BLOCK:       header:
276094d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
276194d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
276237ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
276394d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2764911991d2SPhilip Reames; EPILOG-BLOCK:       for.exiting_block:
2765911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2766323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
2767323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
2768911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
276994d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.epilog-lcssa.loopexit, label %latch
2770911991d2SPhilip Reames; EPILOG-BLOCK:       latch:
2771911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
277237ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
277372031407SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2774de2fed61SPhilip Reames; EPILOG-BLOCK:       for.exiting_block.1:
2775de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2776323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
2777323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
2778de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
2779de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.epilog-lcssa.loopexit, label %latch.1
2780de2fed61SPhilip Reames; EPILOG-BLOCK:       latch.1:
2781de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
278237ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
278337ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
2784de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7
278594d09142SPhilip Reames; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
278694d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %add.1, %latch.1 ]
278794d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
278894d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
278994d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
279094d09142SPhilip Reames; EPILOG-BLOCK:       latchExit.unr-lcssa:
279194d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %result.ph = phi i32 [ undef, %entry ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
279294d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latchExit.unr-lcssa.loopexit ]
279394d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latchExit.unr-lcssa.loopexit ]
279494d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
279594d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
279694d09142SPhilip Reames; EPILOG-BLOCK:       header.epil.preheader:
279794d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header.epil
279894d09142SPhilip Reames; EPILOG-BLOCK:       header.epil:
279994d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.epil
280094d09142SPhilip Reames; EPILOG-BLOCK:       for.exiting_block.epil:
2801b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
2802323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.epil, align 4
2803323514deSNikita Popov; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %5, %sum.02.unr
280494d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
280594d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %latchExit.epilog-lcssa, label %latch.epil
280694d09142SPhilip Reames; EPILOG-BLOCK:       latch.epil:
280794d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
280894d09142SPhilip Reames; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
280994d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %result.ph1.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ]
281094d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
281194d09142SPhilip Reames; EPILOG-BLOCK:       latchExit.epilog-lcssa:
2812b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT:    %result.ph1 = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %for.exiting_block.epil ], [ %result.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
281394d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit
2814911991d2SPhilip Reames; EPILOG-BLOCK:       latchExit:
281594d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %result.ph, %latchExit.unr-lcssa ], [ %result.ph1, %latchExit.epilog-lcssa ]
2816911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret i32 %result
281794d09142SPhilip Reames; EPILOG-BLOCK:       for.exit2.loopexit:
281894d09142SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %for.exit2
2819911991d2SPhilip Reames; EPILOG-BLOCK:       for.exit2:
2820911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret i32 42
2821911991d2SPhilip Reames;
2822911991d2SPhilip Reames; PROLOG-LABEL: @otherblock_latch_same_exit3(
2823911991d2SPhilip Reames; PROLOG-NEXT:  entry:
2824*81c648a3SNikita Popov; PROLOG-NEXT:    %0 = freeze i64 %n
2825*81c648a3SNikita Popov; PROLOG-NEXT:    %1 = add i64 %0, -1
2826*81c648a3SNikita Popov; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
282717b9cb18SPhilip Reames; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2828*81c648a3SNikita Popov; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
282917b9cb18SPhilip Reames; PROLOG:       header.prol.preheader:
283017b9cb18SPhilip Reames; PROLOG-NEXT:    br label %header.prol
283117b9cb18SPhilip Reames; PROLOG:       header.prol:
283217b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
283317b9cb18SPhilip Reames; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
283437ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
283517b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit1, label %for.exiting_block.prol
283617b9cb18SPhilip Reames; PROLOG:       for.exiting_block.prol:
283717b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
2838323514deSNikita Popov; PROLOG-NEXT:    %2 = load i32, i32* %arrayidx.prol, align 4
2839323514deSNikita Popov; PROLOG-NEXT:    %add.prol = add nsw i32 %2, %sum.02.prol
284017b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
284117b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa.loopexit2, label %latch.prol
284217b9cb18SPhilip Reames; PROLOG:       latch.prol:
284317b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
284417b9cb18SPhilip Reames; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
284537ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
284637ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
284717b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !7
284817b9cb18SPhilip Reames; PROLOG:       header.prol.loopexit.unr-lcssa:
284917b9cb18SPhilip Reames; PROLOG-NEXT:    %result.unr.ph = phi i32 [ %add.prol, %latch.prol ]
285017b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
285117b9cb18SPhilip Reames; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
285217b9cb18SPhilip Reames; PROLOG-NEXT:    br label %header.prol.loopexit
285317b9cb18SPhilip Reames; PROLOG:       header.prol.loopexit:
285417b9cb18SPhilip Reames; PROLOG-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %result.unr.ph, %header.prol.loopexit.unr-lcssa ]
285517b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
285617b9cb18SPhilip Reames; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
2857*81c648a3SNikita Popov; PROLOG-NEXT:    %3 = icmp ult i64 %1, 7
2858323514deSNikita Popov; PROLOG-NEXT:    br i1 %3, label %latchExit, label %entry.new
285917b9cb18SPhilip Reames; PROLOG:       entry.new:
2860911991d2SPhilip Reames; PROLOG-NEXT:    br label %header
2861911991d2SPhilip Reames; PROLOG:       header:
286217b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
286317b9cb18SPhilip Reames; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
286417b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2865911991d2SPhilip Reames; PROLOG:       for.exiting_block:
2866911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2867323514deSNikita Popov; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx, align 4
2868323514deSNikita Popov; PROLOG-NEXT:    %add = add nsw i32 %4, %sum.02
2869911991d2SPhilip Reames; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
287017b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2871911991d2SPhilip Reames; PROLOG:       latch:
2872911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
287372031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
287417b9cb18SPhilip Reames; PROLOG:       for.exiting_block.1:
287517b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2876323514deSNikita Popov; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
2877323514deSNikita Popov; PROLOG-NEXT:    %add.1 = add nsw i32 %5, %add
287817b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
287917b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
288017b9cb18SPhilip Reames; PROLOG:       latch.1:
288117b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
288272031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.2
288317b9cb18SPhilip Reames; PROLOG:       for.exiting_block.2:
288417b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
2885323514deSNikita Popov; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.2, align 4
2886323514deSNikita Popov; PROLOG-NEXT:    %add.2 = add nsw i32 %6, %add.1
288717b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
288817b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.2, label %latchExit.unr-lcssa.loopexit, label %latch.2
288917b9cb18SPhilip Reames; PROLOG:       latch.2:
289017b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
289172031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.3
289217b9cb18SPhilip Reames; PROLOG:       for.exiting_block.3:
289317b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
2894323514deSNikita Popov; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.3, align 4
2895323514deSNikita Popov; PROLOG-NEXT:    %add.3 = add nsw i32 %7, %add.2
289617b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
289717b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.3, label %latchExit.unr-lcssa.loopexit, label %latch.3
289817b9cb18SPhilip Reames; PROLOG:       latch.3:
289917b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
290072031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.4
290117b9cb18SPhilip Reames; PROLOG:       for.exiting_block.4:
290217b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
2903323514deSNikita Popov; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.4, align 4
2904323514deSNikita Popov; PROLOG-NEXT:    %add.4 = add nsw i32 %8, %add.3
290517b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
290617b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.4, label %latchExit.unr-lcssa.loopexit, label %latch.4
290717b9cb18SPhilip Reames; PROLOG:       latch.4:
290817b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
290972031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.5
291017b9cb18SPhilip Reames; PROLOG:       for.exiting_block.5:
291117b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
2912323514deSNikita Popov; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.5, align 4
2913323514deSNikita Popov; PROLOG-NEXT:    %add.5 = add nsw i32 %9, %add.4
291417b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
291517b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.5, label %latchExit.unr-lcssa.loopexit, label %latch.5
291617b9cb18SPhilip Reames; PROLOG:       latch.5:
291717b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
291872031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.6
291917b9cb18SPhilip Reames; PROLOG:       for.exiting_block.6:
292017b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
2921323514deSNikita Popov; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.6, align 4
2922323514deSNikita Popov; PROLOG-NEXT:    %add.6 = add nsw i32 %10, %add.5
292317b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
292417b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.6, label %latchExit.unr-lcssa.loopexit, label %latch.6
292517b9cb18SPhilip Reames; PROLOG:       latch.6:
292617b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
292772031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.7
292817b9cb18SPhilip Reames; PROLOG:       for.exiting_block.7:
292917b9cb18SPhilip Reames; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
2930323514deSNikita Popov; PROLOG-NEXT:    %11 = load i32, i32* %arrayidx.7, align 4
2931323514deSNikita Popov; PROLOG-NEXT:    %add.7 = add nsw i32 %11, %add.6
293217b9cb18SPhilip Reames; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
293317b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.7, label %latchExit.unr-lcssa.loopexit, label %latch.7
293417b9cb18SPhilip Reames; PROLOG:       latch.7:
293517b9cb18SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
293617b9cb18SPhilip Reames; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
293717b9cb18SPhilip Reames; PROLOG-NEXT:    br i1 %exitcond.7, label %latchExit.unr-lcssa.loopexit, label %header
2938de2fed61SPhilip Reames; PROLOG:       latchExit.unr-lcssa.loopexit:
2939de2fed61SPhilip Reames; PROLOG-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %for.exiting_block.2 ], [ %add.2, %for.exiting_block.3 ], [ %add.3, %for.exiting_block.4 ], [ %add.4, %for.exiting_block.5 ], [ %add.5, %for.exiting_block.6 ], [ %add.6, %for.exiting_block.7 ], [ %add.7, %latch.7 ]
2940de2fed61SPhilip Reames; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2941de2fed61SPhilip Reames; PROLOG:       latchExit.unr-lcssa.loopexit2:
2942de2fed61SPhilip Reames; PROLOG-NEXT:    %result.ph.ph3 = phi i32 [ %sum.02.prol, %for.exiting_block.prol ]
2943de2fed61SPhilip Reames; PROLOG-NEXT:    br label %latchExit.unr-lcssa
2944de2fed61SPhilip Reames; PROLOG:       latchExit.unr-lcssa:
2945de2fed61SPhilip Reames; PROLOG-NEXT:    %result.ph = phi i32 [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %result.ph.ph3, %latchExit.unr-lcssa.loopexit2 ]
2946de2fed61SPhilip Reames; PROLOG-NEXT:    br label %latchExit
2947de2fed61SPhilip Reames; PROLOG:       latchExit:
2948de2fed61SPhilip Reames; PROLOG-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
2949de2fed61SPhilip Reames; PROLOG-NEXT:    ret i32 %result
2950de2fed61SPhilip Reames; PROLOG:       for.exit2.loopexit:
2951de2fed61SPhilip Reames; PROLOG-NEXT:    br label %for.exit2
2952de2fed61SPhilip Reames; PROLOG:       for.exit2.loopexit1:
2953de2fed61SPhilip Reames; PROLOG-NEXT:    br label %for.exit2
2954de2fed61SPhilip Reames; PROLOG:       for.exit2:
2955de2fed61SPhilip Reames; PROLOG-NEXT:    ret i32 42
2956911991d2SPhilip Reames;
2957911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit3(
2958911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:  entry:
2959*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n
2960*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
2961*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
296217b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
2963*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
296417b9cb18SPhilip Reames; PROLOG-BLOCK:       header.prol.preheader:
296517b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol
296617b9cb18SPhilip Reames; PROLOG-BLOCK:       header.prol:
296717b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.prol
296817b9cb18SPhilip Reames; PROLOG-BLOCK:       for.exiting_block.prol:
2969323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %2 = load i32, i32* %a, align 4
297017b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
297117b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %latchExit.unr-lcssa, label %latch.prol
297217b9cb18SPhilip Reames; PROLOG-BLOCK:       latch.prol:
297317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
297417b9cb18SPhilip Reames; PROLOG-BLOCK:       header.prol.loopexit:
2975323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %result.unr = phi i32 [ undef, %entry ], [ %2, %latch.prol ]
2976b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
2977323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ]
2978*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %1, 1
2979323514deSNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchExit, label %entry.new
298017b9cb18SPhilip Reames; PROLOG-BLOCK:       entry.new:
2981911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header
2982911991d2SPhilip Reames; PROLOG-BLOCK:       header:
298317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
298417b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
298517b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block
2986911991d2SPhilip Reames; PROLOG-BLOCK:       for.exiting_block:
2987911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
2988323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx, align 4
2989323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %4, %sum.02
2990911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
299117b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit.unr-lcssa.loopexit, label %latch
2992911991d2SPhilip Reames; PROLOG-BLOCK:       latch:
299317b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
299472031407SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2.loopexit, label %for.exiting_block.1
2995de2fed61SPhilip Reames; PROLOG-BLOCK:       for.exiting_block.1:
2996de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
2997323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %5 = load i32, i32* %arrayidx.1, align 4
2998323514deSNikita Popov; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %5, %add
2999de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3000de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit.unr-lcssa.loopexit, label %latch.1
3001de2fed61SPhilip Reames; PROLOG-BLOCK:       latch.1:
3002de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
3003de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
3004de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit.unr-lcssa.loopexit, label %header, !llvm.loop !7
300517b9cb18SPhilip Reames; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
300617b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %result.ph.ph = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
300717b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
300817b9cb18SPhilip Reames; PROLOG-BLOCK:       latchExit.unr-lcssa:
300917b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %result.ph = phi i32 [ 0, %for.exiting_block.prol ], [ %result.ph.ph, %latchExit.unr-lcssa.loopexit ]
301017b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %latchExit
3011911991d2SPhilip Reames; PROLOG-BLOCK:       latchExit:
301217b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %result.unr, %header.prol.loopexit ], [ %result.ph, %latchExit.unr-lcssa ]
3013911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret i32 %result
301417b9cb18SPhilip Reames; PROLOG-BLOCK:       for.exit2.loopexit:
301517b9cb18SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %for.exit2
3016911991d2SPhilip Reames; PROLOG-BLOCK:       for.exit2:
3017911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret i32 42
3018911991d2SPhilip Reames;
3019cee313d2SEric Christopher
3020cee313d2SEric Christopherentry:
3021cee313d2SEric Christopher  br label %header
3022cee313d2SEric Christopher
3023cee313d2SEric Christopherheader:
3024cee313d2SEric Christopher  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
3025cee313d2SEric Christopher  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
3026cee313d2SEric Christopher  br i1 %cond, label %for.exit2, label %for.exiting_block
3027cee313d2SEric Christopher
3028cee313d2SEric Christopherfor.exiting_block:
3029cee313d2SEric Christopher  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3030cee313d2SEric Christopher  %0 = load i32, i32* %arrayidx, align 4
3031cee313d2SEric Christopher  %add = add nsw i32 %0, %sum.02
3032cee313d2SEric Christopher  %cmp = icmp eq i64 %n, 42
3033cee313d2SEric Christopher  br i1 %cmp, label %latchExit, label %latch
3034cee313d2SEric Christopher
3035cee313d2SEric Christopherlatch:                                         ; preds = %latch, %entry
3036cee313d2SEric Christopher  %indvars.iv.next = add i64 %indvars.iv, 1
3037cee313d2SEric Christopher  %exitcond = icmp eq i64 %indvars.iv.next, %n
3038cee313d2SEric Christopher  br i1 %exitcond, label %latchExit, label %header
3039cee313d2SEric Christopher
3040cee313d2SEric ChristopherlatchExit:                                          ; preds = %latch, %entry
3041cee313d2SEric Christopher  %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
3042cee313d2SEric Christopher  ret i32 %result
3043cee313d2SEric Christopher
3044cee313d2SEric Christopherfor.exit2:
3045cee313d2SEric Christopher  ret i32 42
3046cee313d2SEric Christopher}
3047cee313d2SEric Christopher
3048da327e72SPhilip Reames; Show a case where we have multiple exits, but (provably) exit on the
3049da327e72SPhilip Reames; first iteration and thus have nothing to unroll
3050da327e72SPhilip Reamesdefine void @non_loop(i32 %arg) {
3051da327e72SPhilip Reames; CHECK-LABEL: @non_loop(
3052911991d2SPhilip Reames; CHECK-NEXT:  entry:
3053911991d2SPhilip Reames; CHECK-NEXT:    %i = icmp sgt i32 undef, %arg
3054911991d2SPhilip Reames; CHECK-NEXT:    br i1 %i, label %preheader, label %returnblock
3055911991d2SPhilip Reames; CHECK:       preheader:
3056911991d2SPhilip Reames; CHECK-NEXT:    br label %header
3057911991d2SPhilip Reames; CHECK:       header:
3058911991d2SPhilip Reames; CHECK-NEXT:    br i1 true, label %latchExit, label %latch
3059911991d2SPhilip Reames; CHECK:       latch:
3060911991d2SPhilip Reames; CHECK-NEXT:    br label %latchExit
3061911991d2SPhilip Reames; CHECK:       latchExit:
3062911991d2SPhilip Reames; CHECK-NEXT:    %i2.ph = phi i32 [ %arg, %header ], [ -1, %latch ]
3063911991d2SPhilip Reames; CHECK-NEXT:    br label %returnblock
3064911991d2SPhilip Reames; CHECK:       returnblock:
3065911991d2SPhilip Reames; CHECK-NEXT:    %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ]
3066911991d2SPhilip Reames; CHECK-NEXT:    ret void
3067911991d2SPhilip Reames;
3068cee313d2SEric Christopher
3069cee313d2SEric Christopherentry:
307017a15c32SRoman Lebedev  %i = icmp sgt i32 undef, %arg
307117a15c32SRoman Lebedev  br i1 %i, label %preheader, label %returnblock
3072cee313d2SEric Christopher
3073cee313d2SEric Christopherpreheader:                                 ; preds = %entry
3074cee313d2SEric Christopher  br label %header
3075cee313d2SEric Christopher
3076cee313d2SEric Christopherheader:                                           ; preds = %preheader, %latch
307717a15c32SRoman Lebedev  %i4 = phi i32 [ %inc, %latch ], [ %arg, %preheader ]
307817a15c32SRoman Lebedev  %inc = add nsw i32 %i4, 1
3079cee313d2SEric Christopher  br i1 true, label %latchExit, label %latch
3080cee313d2SEric Christopher
3081cee313d2SEric Christopherlatch:                                            ; preds = %header
3082cee313d2SEric Christopher  %cmp = icmp slt i32 %inc, undef
3083cee313d2SEric Christopher  br i1 %cmp, label %header, label %latchExit
3084cee313d2SEric Christopher
3085cee313d2SEric ChristopherlatchExit:                                ; preds = %header, %latch
308617a15c32SRoman Lebedev  %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ]
3087cee313d2SEric Christopher  br label %returnblock
3088cee313d2SEric Christopher
3089cee313d2SEric Christopherreturnblock:                                         ; preds = %latchExit, %entry
309017a15c32SRoman Lebedev  %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ]
3091cee313d2SEric Christopher  ret void
3092cee313d2SEric Christopher}
3093cee313d2SEric Christopher
3094da327e72SPhilip Reames; Latch exit is shared by all exiting blocks
3095da327e72SPhilip Reamesdefine void @unique_exit(i32 %N, i32 %M) {
3096da327e72SPhilip Reames; EPILOG-LABEL: @unique_exit(
3097da327e72SPhilip Reames; EPILOG-NEXT:  preheader:
30988906a0feSPhilip Reames; EPILOG-NEXT:    %M.shifted = shl i32 %M, 3
30998906a0feSPhilip Reames; EPILOG-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1)
3100*81c648a3SNikita Popov; EPILOG-NEXT:    %0 = freeze i32 %umax
3101*81c648a3SNikita Popov; EPILOG-NEXT:    %1 = add i32 %0, -1
3102*81c648a3SNikita Popov; EPILOG-NEXT:    %xtraiter = and i32 %0, 7
3103*81c648a3SNikita Popov; EPILOG-NEXT:    %2 = icmp ult i32 %1, 7
3104323514deSNikita Popov; EPILOG-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %preheader.new
3105da327e72SPhilip Reames; EPILOG:       preheader.new:
3106*81c648a3SNikita Popov; EPILOG-NEXT:    %unroll_iter = sub i32 %0, %xtraiter
3107da327e72SPhilip Reames; EPILOG-NEXT:    br label %header
3108da327e72SPhilip Reames; EPILOG:       header:
3109da327e72SPhilip Reames; EPILOG-NEXT:    %i4 = phi i32 [ 0, %preheader.new ], [ %inc.7, %latch.7 ]
3110da327e72SPhilip Reames; EPILOG-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ]
3111da327e72SPhilip Reames; EPILOG-NEXT:    %inc = add nuw nsw i32 %i4, 1
3112da327e72SPhilip Reames; EPILOG-NEXT:    %cmp1 = icmp ult i32 %inc, %N
3113da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %cmp1, label %latch, label %latchExit.epilog-lcssa.loopexit
3114da327e72SPhilip Reames; EPILOG:       latch:
3115da327e72SPhilip Reames; EPILOG-NEXT:    %niter.next = add nuw nsw i32 %niter, 1
3116da327e72SPhilip Reames; EPILOG-NEXT:    %inc.1 = add nuw nsw i32 %inc, 1
3117da327e72SPhilip Reames; EPILOG-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N
3118da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.epilog-lcssa.loopexit
3119da327e72SPhilip Reames; EPILOG:       latch.1:
3120da327e72SPhilip Reames; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i32 %niter.next, 1
3121da327e72SPhilip Reames; EPILOG-NEXT:    %inc.2 = add nuw nsw i32 %inc.1, 1
3122da327e72SPhilip Reames; EPILOG-NEXT:    %cmp1.2 = icmp ult i32 %inc.2, %N
3123da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %cmp1.2, label %latch.2, label %latchExit.epilog-lcssa.loopexit
3124da327e72SPhilip Reames; EPILOG:       latch.2:
3125da327e72SPhilip Reames; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i32 %niter.next.1, 1
3126da327e72SPhilip Reames; EPILOG-NEXT:    %inc.3 = add nuw nsw i32 %inc.2, 1
3127da327e72SPhilip Reames; EPILOG-NEXT:    %cmp1.3 = icmp ult i32 %inc.3, %N
3128da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %cmp1.3, label %latch.3, label %latchExit.epilog-lcssa.loopexit
3129da327e72SPhilip Reames; EPILOG:       latch.3:
3130da327e72SPhilip Reames; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i32 %niter.next.2, 1
3131da327e72SPhilip Reames; EPILOG-NEXT:    %inc.4 = add nuw nsw i32 %inc.3, 1
3132da327e72SPhilip Reames; EPILOG-NEXT:    %cmp1.4 = icmp ult i32 %inc.4, %N
3133da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %cmp1.4, label %latch.4, label %latchExit.epilog-lcssa.loopexit
3134da327e72SPhilip Reames; EPILOG:       latch.4:
3135da327e72SPhilip Reames; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i32 %niter.next.3, 1
3136da327e72SPhilip Reames; EPILOG-NEXT:    %inc.5 = add nuw nsw i32 %inc.4, 1
3137da327e72SPhilip Reames; EPILOG-NEXT:    %cmp1.5 = icmp ult i32 %inc.5, %N
3138da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %cmp1.5, label %latch.5, label %latchExit.epilog-lcssa.loopexit
3139da327e72SPhilip Reames; EPILOG:       latch.5:
3140da327e72SPhilip Reames; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i32 %niter.next.4, 1
3141da327e72SPhilip Reames; EPILOG-NEXT:    %inc.6 = add nuw nsw i32 %inc.5, 1
3142da327e72SPhilip Reames; EPILOG-NEXT:    %cmp1.6 = icmp ult i32 %inc.6, %N
3143da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %cmp1.6, label %latch.6, label %latchExit.epilog-lcssa.loopexit
3144da327e72SPhilip Reames; EPILOG:       latch.6:
3145da327e72SPhilip Reames; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i32 %niter.next.5, 1
3146da327e72SPhilip Reames; EPILOG-NEXT:    %inc.7 = add nuw i32 %inc.6, 1
3147da327e72SPhilip Reames; EPILOG-NEXT:    %cmp1.7 = icmp ult i32 %inc.7, %N
3148da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %cmp1.7, label %latch.7, label %latchExit.epilog-lcssa.loopexit
3149da327e72SPhilip Reames; EPILOG:       latch.7:
3150da327e72SPhilip Reames; EPILOG-NEXT:    %niter.next.7 = add i32 %niter.next.6, 1
3151da327e72SPhilip Reames; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i32 %niter.next.7, %unroll_iter
3152da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %latchExit.unr-lcssa.loopexit
3153da327e72SPhilip Reames; EPILOG:       latchExit.unr-lcssa.loopexit:
3154da327e72SPhilip Reames; EPILOG-NEXT:    %i2.ph.ph.ph = phi i32 [ -1, %latch.7 ]
3155da327e72SPhilip Reames; EPILOG-NEXT:    %i4.unr.ph = phi i32 [ %inc.7, %latch.7 ]
3156da327e72SPhilip Reames; EPILOG-NEXT:    br label %latchExit.unr-lcssa
3157da327e72SPhilip Reames; EPILOG:       latchExit.unr-lcssa:
3158da327e72SPhilip Reames; EPILOG-NEXT:    %i2.ph.ph = phi i32 [ undef, %preheader ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ]
3159da327e72SPhilip Reames; EPILOG-NEXT:    %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %latchExit.unr-lcssa.loopexit ]
3160da327e72SPhilip Reames; EPILOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
3161da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
3162da327e72SPhilip Reames; EPILOG:       header.epil.preheader:
3163da327e72SPhilip Reames; EPILOG-NEXT:    br label %header.epil
3164da327e72SPhilip Reames; EPILOG:       header.epil:
3165da327e72SPhilip Reames; EPILOG-NEXT:    %i4.epil = phi i32 [ %inc.epil, %latch.epil ], [ %i4.unr, %header.epil.preheader ]
3166da327e72SPhilip Reames; EPILOG-NEXT:    %epil.iter = phi i32 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
3167da327e72SPhilip Reames; EPILOG-NEXT:    %inc.epil = add nuw i32 %i4.epil, 1
3168da327e72SPhilip Reames; EPILOG-NEXT:    %cmp1.epil = icmp ult i32 %inc.epil, %N
3169da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %cmp1.epil, label %latch.epil, label %latchExit.epilog-lcssa.loopexit2
3170da327e72SPhilip Reames; EPILOG:       latch.epil:
3171da327e72SPhilip Reames; EPILOG-NEXT:    %cmp.epil = icmp ult i32 %inc.epil, %M.shifted
3172da327e72SPhilip Reames; EPILOG-NEXT:    %epil.iter.next = add i32 %epil.iter, 1
3173da327e72SPhilip Reames; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i32 %epil.iter.next, %xtraiter
3174da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchExit.epilog-lcssa.loopexit2, !llvm.loop !8
3175da327e72SPhilip Reames; EPILOG:       latchExit.epilog-lcssa.loopexit:
3176da327e72SPhilip Reames; EPILOG-NEXT:    %i2.ph.ph1.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ %inc.1, %latch.1 ], [ %inc.2, %latch.2 ], [ %inc.3, %latch.3 ], [ %inc.4, %latch.4 ], [ %inc.5, %latch.5 ], [ %inc.6, %latch.6 ]
3177da327e72SPhilip Reames; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
3178da327e72SPhilip Reames; EPILOG:       latchExit.epilog-lcssa.loopexit2:
3179da327e72SPhilip Reames; EPILOG-NEXT:    %i2.ph.ph1.ph3 = phi i32 [ %i4.epil, %header.epil ], [ -1, %latch.epil ]
3180da327e72SPhilip Reames; EPILOG-NEXT:    br label %latchExit.epilog-lcssa
3181da327e72SPhilip Reames; EPILOG:       latchExit.epilog-lcssa:
3182da327e72SPhilip Reames; EPILOG-NEXT:    %i2.ph.ph1 = phi i32 [ %i2.ph.ph1.ph, %latchExit.epilog-lcssa.loopexit ], [ %i2.ph.ph1.ph3, %latchExit.epilog-lcssa.loopexit2 ]
3183da327e72SPhilip Reames; EPILOG-NEXT:    br label %latchExit
3184da327e72SPhilip Reames; EPILOG:       latchExit:
3185da327e72SPhilip Reames; EPILOG-NEXT:    %i2.ph = phi i32 [ %i2.ph.ph, %latchExit.unr-lcssa ], [ %i2.ph.ph1, %latchExit.epilog-lcssa ]
3186da327e72SPhilip Reames; EPILOG-NEXT:    ret void
3187da327e72SPhilip Reames;
3188da327e72SPhilip Reames; EPILOG-BLOCK-LABEL: @unique_exit(
3189da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:  preheader:
31908906a0feSPhilip Reames; EPILOG-BLOCK-NEXT:    %M.shifted = shl i32 %M, 3
31918906a0feSPhilip Reames; EPILOG-BLOCK-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1)
3192*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %0 = freeze i32 %umax
3193*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %1 = add i32 %0, -1
3194*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %xtraiter = and i32 %0, 1
3195*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %2 = icmp ult i32 %1, 1
3196323514deSNikita Popov; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchExit.unr-lcssa, label %preheader.new
3197da327e72SPhilip Reames; EPILOG-BLOCK:       preheader.new:
3198*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i32 %0, %xtraiter
3199da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header
3200da327e72SPhilip Reames; EPILOG-BLOCK:       header:
3201da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    %i4 = phi i32 [ 0, %preheader.new ], [ %inc.1, %latch.1 ]
3202da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ]
3203da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    %inc = add nuw nsw i32 %i4, 1
3204da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp1 = icmp ult i32 %inc, %N
3205da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp1, label %latch, label %latchExit.epilog-lcssa.loopexit
3206da327e72SPhilip Reames; EPILOG-BLOCK:       latch:
3207da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i32 %niter, 1
3208da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    %inc.1 = add nuw i32 %inc, 1
3209da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N
3210da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.epilog-lcssa.loopexit
3211da327e72SPhilip Reames; EPILOG-BLOCK:       latch.1:
3212da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i32 %niter.next, 1
3213da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i32 %niter.next.1, %unroll_iter
3214da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %latchExit.unr-lcssa.loopexit, !llvm.loop !8
3215da327e72SPhilip Reames; EPILOG-BLOCK:       latchExit.unr-lcssa.loopexit:
3216da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    %i2.ph.ph.ph = phi i32 [ -1, %latch.1 ]
3217da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    %i4.unr.ph = phi i32 [ %inc.1, %latch.1 ]
3218da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
3219da327e72SPhilip Reames; EPILOG-BLOCK:       latchExit.unr-lcssa:
3220da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    %i2.ph.ph = phi i32 [ undef, %preheader ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ]
3221da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %latchExit.unr-lcssa.loopexit ]
3222da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
3223da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchExit
3224da327e72SPhilip Reames; EPILOG-BLOCK:       header.epil.preheader:
3225da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header.epil
3226da327e72SPhilip Reames; EPILOG-BLOCK:       header.epil:
3227da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    %inc.epil = add nuw i32 %i4.unr, 1
3228da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp1.epil = icmp ult i32 %inc.epil, %N
3229da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp1.epil, label %latch.epil, label %latchExit.epilog-lcssa
3230da327e72SPhilip Reames; EPILOG-BLOCK:       latch.epil:
3231da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
3232da327e72SPhilip Reames; EPILOG-BLOCK:       latchExit.epilog-lcssa.loopexit:
3233da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    %i2.ph.ph1.ph = phi i32 [ %i4, %header ], [ %inc, %latch ]
3234da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit.epilog-lcssa
3235da327e72SPhilip Reames; EPILOG-BLOCK:       latchExit.epilog-lcssa:
3236da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    %i2.ph.ph1 = phi i32 [ -1, %latch.epil ], [ %i4.unr, %header.epil ], [ %i2.ph.ph1.ph, %latchExit.epilog-lcssa.loopexit ]
3237da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchExit
3238da327e72SPhilip Reames; EPILOG-BLOCK:       latchExit:
3239da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    %i2.ph = phi i32 [ %i2.ph.ph, %latchExit.unr-lcssa ], [ %i2.ph.ph1, %latchExit.epilog-lcssa ]
3240da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    ret void
3241da327e72SPhilip Reames;
3242da327e72SPhilip Reames; PROLOG-LABEL: @unique_exit(
3243da327e72SPhilip Reames; PROLOG-NEXT:  preheader:
32448906a0feSPhilip Reames; PROLOG-NEXT:    %M.shifted = shl i32 %M, 3
32458906a0feSPhilip Reames; PROLOG-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1)
3246*81c648a3SNikita Popov; PROLOG-NEXT:    %0 = freeze i32 %umax
3247*81c648a3SNikita Popov; PROLOG-NEXT:    %1 = add i32 %0, -1
3248*81c648a3SNikita Popov; PROLOG-NEXT:    %xtraiter = and i32 %0, 7
3249da327e72SPhilip Reames; PROLOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
3250*81c648a3SNikita Popov; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
3251da327e72SPhilip Reames; PROLOG:       header.prol.preheader:
3252da327e72SPhilip Reames; PROLOG-NEXT:    br label %header.prol
3253da327e72SPhilip Reames; PROLOG:       header.prol:
3254da327e72SPhilip Reames; PROLOG-NEXT:    %i4.prol = phi i32 [ %inc.prol, %latch.prol ], [ 0, %header.prol.preheader ]
3255da327e72SPhilip Reames; PROLOG-NEXT:    %prol.iter = phi i32 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
3256da327e72SPhilip Reames; PROLOG-NEXT:    %inc.prol = add nuw i32 %i4.prol, 1
3257da327e72SPhilip Reames; PROLOG-NEXT:    %cmp1.prol = icmp ult i32 %inc.prol, %N
3258da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %cmp1.prol, label %latch.prol, label %latchExit.unr-lcssa.loopexit1
3259da327e72SPhilip Reames; PROLOG:       latch.prol:
3260da327e72SPhilip Reames; PROLOG-NEXT:    %cmp.prol = icmp ult i32 %inc.prol, %M.shifted
3261da327e72SPhilip Reames; PROLOG-NEXT:    %prol.iter.next = add i32 %prol.iter, 1
3262da327e72SPhilip Reames; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i32 %prol.iter.next, %xtraiter
3263da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !8
3264da327e72SPhilip Reames; PROLOG:       header.prol.loopexit.unr-lcssa:
3265da327e72SPhilip Reames; PROLOG-NEXT:    %i4.unr.ph = phi i32 [ %inc.prol, %latch.prol ]
3266da327e72SPhilip Reames; PROLOG-NEXT:    %i2.ph.unr.ph = phi i32 [ -1, %latch.prol ]
3267da327e72SPhilip Reames; PROLOG-NEXT:    br label %header.prol.loopexit
3268da327e72SPhilip Reames; PROLOG:       header.prol.loopexit:
3269da327e72SPhilip Reames; PROLOG-NEXT:    %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %header.prol.loopexit.unr-lcssa ]
3270da327e72SPhilip Reames; PROLOG-NEXT:    %i2.ph.unr = phi i32 [ undef, %preheader ], [ %i2.ph.unr.ph, %header.prol.loopexit.unr-lcssa ]
3271*81c648a3SNikita Popov; PROLOG-NEXT:    %2 = icmp ult i32 %1, 7
3272323514deSNikita Popov; PROLOG-NEXT:    br i1 %2, label %latchExit, label %preheader.new
3273da327e72SPhilip Reames; PROLOG:       preheader.new:
3274da327e72SPhilip Reames; PROLOG-NEXT:    br label %header
3275da327e72SPhilip Reames; PROLOG:       header:
3276da327e72SPhilip Reames; PROLOG-NEXT:    %i4 = phi i32 [ %i4.unr, %preheader.new ], [ %inc.7, %latch.7 ]
3277da327e72SPhilip Reames; PROLOG-NEXT:    %inc = add nuw i32 %i4, 1
3278da327e72SPhilip Reames; PROLOG-NEXT:    %cmp1 = icmp ult i32 %inc, %N
3279da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %cmp1, label %latch, label %latchExit.unr-lcssa.loopexit
3280da327e72SPhilip Reames; PROLOG:       latch:
3281da327e72SPhilip Reames; PROLOG-NEXT:    %inc.1 = add nuw i32 %inc, 1
3282da327e72SPhilip Reames; PROLOG-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N
3283da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.unr-lcssa.loopexit
3284da327e72SPhilip Reames; PROLOG:       latch.1:
3285da327e72SPhilip Reames; PROLOG-NEXT:    %inc.2 = add nuw i32 %inc.1, 1
3286da327e72SPhilip Reames; PROLOG-NEXT:    %cmp1.2 = icmp ult i32 %inc.2, %N
3287da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %cmp1.2, label %latch.2, label %latchExit.unr-lcssa.loopexit
3288da327e72SPhilip Reames; PROLOG:       latch.2:
3289da327e72SPhilip Reames; PROLOG-NEXT:    %inc.3 = add nuw i32 %inc.2, 1
3290da327e72SPhilip Reames; PROLOG-NEXT:    %cmp1.3 = icmp ult i32 %inc.3, %N
3291da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %cmp1.3, label %latch.3, label %latchExit.unr-lcssa.loopexit
3292da327e72SPhilip Reames; PROLOG:       latch.3:
3293da327e72SPhilip Reames; PROLOG-NEXT:    %inc.4 = add nuw i32 %inc.3, 1
3294da327e72SPhilip Reames; PROLOG-NEXT:    %cmp1.4 = icmp ult i32 %inc.4, %N
3295da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %cmp1.4, label %latch.4, label %latchExit.unr-lcssa.loopexit
3296da327e72SPhilip Reames; PROLOG:       latch.4:
3297da327e72SPhilip Reames; PROLOG-NEXT:    %inc.5 = add nuw i32 %inc.4, 1
3298da327e72SPhilip Reames; PROLOG-NEXT:    %cmp1.5 = icmp ult i32 %inc.5, %N
3299da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %cmp1.5, label %latch.5, label %latchExit.unr-lcssa.loopexit
3300da327e72SPhilip Reames; PROLOG:       latch.5:
3301da327e72SPhilip Reames; PROLOG-NEXT:    %inc.6 = add nuw i32 %inc.5, 1
3302da327e72SPhilip Reames; PROLOG-NEXT:    %cmp1.6 = icmp ult i32 %inc.6, %N
3303da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %cmp1.6, label %latch.6, label %latchExit.unr-lcssa.loopexit
3304da327e72SPhilip Reames; PROLOG:       latch.6:
3305da327e72SPhilip Reames; PROLOG-NEXT:    %inc.7 = add nuw i32 %inc.6, 1
3306da327e72SPhilip Reames; PROLOG-NEXT:    %cmp1.7 = icmp ult i32 %inc.7, %N
3307da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %cmp1.7, label %latch.7, label %latchExit.unr-lcssa.loopexit
3308da327e72SPhilip Reames; PROLOG:       latch.7:
3309da327e72SPhilip Reames; PROLOG-NEXT:    %cmp.7 = icmp ult i32 %inc.7, %M.shifted
3310da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.7, label %header, label %latchExit.unr-lcssa.loopexit
3311da327e72SPhilip Reames; PROLOG:       latchExit.unr-lcssa.loopexit:
3312da327e72SPhilip Reames; PROLOG-NEXT:    %i2.ph.ph.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ %inc.1, %latch.1 ], [ %inc.2, %latch.2 ], [ %inc.3, %latch.3 ], [ %inc.4, %latch.4 ], [ %inc.5, %latch.5 ], [ %inc.6, %latch.6 ], [ -1, %latch.7 ]
3313da327e72SPhilip Reames; PROLOG-NEXT:    br label %latchExit.unr-lcssa
3314da327e72SPhilip Reames; PROLOG:       latchExit.unr-lcssa.loopexit1:
3315da327e72SPhilip Reames; PROLOG-NEXT:    %i2.ph.ph.ph2 = phi i32 [ %i4.prol, %header.prol ]
3316da327e72SPhilip Reames; PROLOG-NEXT:    br label %latchExit.unr-lcssa
3317da327e72SPhilip Reames; PROLOG:       latchExit.unr-lcssa:
3318da327e72SPhilip Reames; PROLOG-NEXT:    %i2.ph.ph = phi i32 [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ], [ %i2.ph.ph.ph2, %latchExit.unr-lcssa.loopexit1 ]
3319da327e72SPhilip Reames; PROLOG-NEXT:    br label %latchExit
3320da327e72SPhilip Reames; PROLOG:       latchExit:
3321da327e72SPhilip Reames; PROLOG-NEXT:    %i2.ph = phi i32 [ %i2.ph.unr, %header.prol.loopexit ], [ %i2.ph.ph, %latchExit.unr-lcssa ]
3322da327e72SPhilip Reames; PROLOG-NEXT:    ret void
3323da327e72SPhilip Reames;
3324da327e72SPhilip Reames; PROLOG-BLOCK-LABEL: @unique_exit(
3325da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:  preheader:
33268906a0feSPhilip Reames; PROLOG-BLOCK-NEXT:    %M.shifted = shl i32 %M, 3
33278906a0feSPhilip Reames; PROLOG-BLOCK-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1)
3328*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %0 = freeze i32 %umax
3329*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %1 = add i32 %0, -1
3330*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %xtraiter = and i32 %0, 1
3331da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
3332*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
3333da327e72SPhilip Reames; PROLOG-BLOCK:       header.prol.preheader:
3334da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol
3335da327e72SPhilip Reames; PROLOG-BLOCK:       header.prol:
3336da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp1.prol = icmp ult i32 1, %N
3337da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp1.prol, label %latch.prol, label %latchExit.unr-lcssa
3338da327e72SPhilip Reames; PROLOG-BLOCK:       latch.prol:
3339da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
3340da327e72SPhilip Reames; PROLOG-BLOCK:       header.prol.loopexit:
3341da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    %i4.unr = phi i32 [ 0, %preheader ], [ 1, %latch.prol ]
3342da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    %i2.ph.unr = phi i32 [ undef, %preheader ], [ -1, %latch.prol ]
3343*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %2 = icmp ult i32 %1, 1
3344323514deSNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchExit, label %preheader.new
3345da327e72SPhilip Reames; PROLOG-BLOCK:       preheader.new:
3346da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header
3347da327e72SPhilip Reames; PROLOG-BLOCK:       header:
3348da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    %i4 = phi i32 [ %i4.unr, %preheader.new ], [ %inc.1, %latch.1 ]
3349da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    %inc = add nuw i32 %i4, 1
3350da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp1 = icmp ult i32 %inc, %N
3351da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp1, label %latch, label %latchExit.unr-lcssa.loopexit
3352da327e72SPhilip Reames; PROLOG-BLOCK:       latch:
3353da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    %inc.1 = add nuw i32 %inc, 1
3354da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp1.1 = icmp ult i32 %inc.1, %N
3355da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp1.1, label %latch.1, label %latchExit.unr-lcssa.loopexit
3356da327e72SPhilip Reames; PROLOG-BLOCK:       latch.1:
3357da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ult i32 %inc.1, %M.shifted
3358da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %header, label %latchExit.unr-lcssa.loopexit, !llvm.loop !8
3359da327e72SPhilip Reames; PROLOG-BLOCK:       latchExit.unr-lcssa.loopexit:
3360da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    %i2.ph.ph.ph = phi i32 [ %i4, %header ], [ %inc, %latch ], [ -1, %latch.1 ]
3361da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %latchExit.unr-lcssa
3362da327e72SPhilip Reames; PROLOG-BLOCK:       latchExit.unr-lcssa:
3363da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    %i2.ph.ph = phi i32 [ 0, %header.prol ], [ %i2.ph.ph.ph, %latchExit.unr-lcssa.loopexit ]
3364da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %latchExit
3365da327e72SPhilip Reames; PROLOG-BLOCK:       latchExit:
3366da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    %i2.ph = phi i32 [ %i2.ph.unr, %header.prol.loopexit ], [ %i2.ph.ph, %latchExit.unr-lcssa ]
3367da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    ret void
3368da327e72SPhilip Reames;
3369da327e72SPhilip Reames
3370da327e72SPhilip Reamespreheader:
3371da327e72SPhilip Reames  %M.shifted = shl nuw i32 %M, 3
3372da327e72SPhilip Reames  br label %header
3373da327e72SPhilip Reames
3374da327e72SPhilip Reamesheader:                                           ; preds = %preheader, %latch
3375da327e72SPhilip Reames  %i4 = phi i32 [ %inc, %latch ], [ 0, %preheader ]
3376da327e72SPhilip Reames  %inc = add nuw i32 %i4, 1
3377da327e72SPhilip Reames  %cmp1 = icmp ult i32 %inc, %N
3378da327e72SPhilip Reames  br i1 %cmp1, label %latch, label %latchExit
3379da327e72SPhilip Reames
3380da327e72SPhilip Reameslatch:                                            ; preds = %header
3381da327e72SPhilip Reames  %cmp = icmp ult i32 %inc, %M.shifted
3382da327e72SPhilip Reames  br i1 %cmp, label %header, label %latchExit
3383da327e72SPhilip Reames
3384da327e72SPhilip ReameslatchExit:                                ; preds = %header, %latch
3385da327e72SPhilip Reames  %i2.ph = phi i32 [ %i4, %header ], [ -1, %latch ]
3386da327e72SPhilip Reames  ret void
3387da327e72SPhilip Reames}
3388da327e72SPhilip Reames
3389da327e72SPhilip Reames
3390cee313d2SEric Christopher; two exiting and two exit blocks.
3391cee313d2SEric Christopher; the non-latch exiting block has duplicate edges to the non-latch exit block.
3392cee313d2SEric Christopherdefine i64 @test5(i64 %trip, i64 %add, i1 %cond) {
3393911991d2SPhilip Reames; EPILOG-LABEL: @test5(
3394911991d2SPhilip Reames; EPILOG-NEXT:  entry:
3395*81c648a3SNikita Popov; EPILOG-NEXT:    %0 = freeze i64 %trip
3396*81c648a3SNikita Popov; EPILOG-NEXT:    %1 = add i64 %0, -1
3397*81c648a3SNikita Popov; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
3398*81c648a3SNikita Popov; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
3399323514deSNikita Popov; EPILOG-NEXT:    br i1 %2, label %latchexit.unr-lcssa, label %entry.new
3400911991d2SPhilip Reames; EPILOG:       entry.new:
3401*81c648a3SNikita Popov; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
3402911991d2SPhilip Reames; EPILOG-NEXT:    br label %loop_header
3403911991d2SPhilip Reames; EPILOG:       loop_header:
3404911991d2SPhilip Reames; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
3405911991d2SPhilip Reames; EPILOG-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
340637ead201SPhilip Reames; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
3407911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3408911991d2SPhilip Reames; EPILOG:       loop_exiting:
3409911991d2SPhilip Reames; EPILOG-NEXT:    %ivy = add i64 %iv, %add
3410911991d2SPhilip Reames; EPILOG-NEXT:    switch i64 %sum, label %loop_latch [
3411911991d2SPhilip Reames; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3412911991d2SPhilip Reames; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3413911991d2SPhilip Reames; EPILOG-NEXT:    ]
3414911991d2SPhilip Reames; EPILOG:       loop_latch:
3415911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3416911991d2SPhilip Reames; EPILOG-NEXT:    %sum.next = add i64 %sum, %add
341737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
3418911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3419911991d2SPhilip Reames; EPILOG:       loop_exiting.1:
3420911991d2SPhilip Reames; EPILOG-NEXT:    %ivy.1 = add i64 %iv_next, %add
3421911991d2SPhilip Reames; EPILOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3422911991d2SPhilip Reames; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3423911991d2SPhilip Reames; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3424911991d2SPhilip Reames; EPILOG-NEXT:    ]
3425911991d2SPhilip Reames; EPILOG:       loop_latch.1:
3426911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3427911991d2SPhilip Reames; EPILOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
342837ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
3429911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.2
3430911991d2SPhilip Reames; EPILOG:       loop_exiting.2:
3431911991d2SPhilip Reames; EPILOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add
3432911991d2SPhilip Reames; EPILOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
3433911991d2SPhilip Reames; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3434911991d2SPhilip Reames; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3435911991d2SPhilip Reames; EPILOG-NEXT:    ]
3436911991d2SPhilip Reames; EPILOG:       loop_latch.2:
3437911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
3438911991d2SPhilip Reames; EPILOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
343937ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
3440911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.3
3441911991d2SPhilip Reames; EPILOG:       loop_exiting.3:
3442911991d2SPhilip Reames; EPILOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add
3443911991d2SPhilip Reames; EPILOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
3444911991d2SPhilip Reames; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3445911991d2SPhilip Reames; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3446911991d2SPhilip Reames; EPILOG-NEXT:    ]
3447911991d2SPhilip Reames; EPILOG:       loop_latch.3:
3448911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
3449911991d2SPhilip Reames; EPILOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
345037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
3451911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.4
3452911991d2SPhilip Reames; EPILOG:       loop_exiting.4:
3453911991d2SPhilip Reames; EPILOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add
3454911991d2SPhilip Reames; EPILOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
3455911991d2SPhilip Reames; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3456911991d2SPhilip Reames; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3457911991d2SPhilip Reames; EPILOG-NEXT:    ]
3458911991d2SPhilip Reames; EPILOG:       loop_latch.4:
3459911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
3460911991d2SPhilip Reames; EPILOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
346137ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
3462911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.5
3463911991d2SPhilip Reames; EPILOG:       loop_exiting.5:
3464911991d2SPhilip Reames; EPILOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add
3465911991d2SPhilip Reames; EPILOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
3466911991d2SPhilip Reames; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3467911991d2SPhilip Reames; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3468911991d2SPhilip Reames; EPILOG-NEXT:    ]
3469911991d2SPhilip Reames; EPILOG:       loop_latch.5:
3470911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
3471911991d2SPhilip Reames; EPILOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
347237ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
3473911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.6
3474911991d2SPhilip Reames; EPILOG:       loop_exiting.6:
3475911991d2SPhilip Reames; EPILOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add
3476911991d2SPhilip Reames; EPILOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
3477911991d2SPhilip Reames; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3478911991d2SPhilip Reames; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3479911991d2SPhilip Reames; EPILOG-NEXT:    ]
3480911991d2SPhilip Reames; EPILOG:       loop_latch.6:
3481911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
3482911991d2SPhilip Reames; EPILOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
348337ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
3484911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.7
3485911991d2SPhilip Reames; EPILOG:       loop_exiting.7:
3486911991d2SPhilip Reames; EPILOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add
3487911991d2SPhilip Reames; EPILOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
3488911991d2SPhilip Reames; EPILOG-NEXT:    i64 24, label %exit1.loopexit
3489911991d2SPhilip Reames; EPILOG-NEXT:    i64 42, label %exit1.loopexit
3490911991d2SPhilip Reames; EPILOG-NEXT:    ]
3491cee313d2SEric Christopher; EPILOG:       loop_latch.7:
3492911991d2SPhilip Reames; EPILOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
3493911991d2SPhilip Reames; EPILOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
349437ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
349537ead201SPhilip Reames; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
3496911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %latchexit.unr-lcssa.loopexit
3497de2fed61SPhilip Reames; EPILOG:       exit1.loopexit:
3498de2fed61SPhilip Reames; 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 ]
3499de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1
3500de2fed61SPhilip Reames; EPILOG:       exit1.loopexit2:
3501de2fed61SPhilip Reames; EPILOG-NEXT:    %result.ph3 = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ]
3502de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1
3503de2fed61SPhilip Reames; EPILOG:       exit1:
3504de2fed61SPhilip Reames; EPILOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph3, %exit1.loopexit2 ]
3505de2fed61SPhilip Reames; EPILOG-NEXT:    ret i64 %result
3506de2fed61SPhilip Reames; EPILOG:       latchexit.unr-lcssa.loopexit:
3507de2fed61SPhilip Reames; EPILOG-NEXT:    %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3508de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
3509de2fed61SPhilip Reames; EPILOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3510de2fed61SPhilip Reames; EPILOG-NEXT:    br label %latchexit.unr-lcssa
3511de2fed61SPhilip Reames; EPILOG:       latchexit.unr-lcssa:
3512de2fed61SPhilip Reames; EPILOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ]
3513de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ]
3514de2fed61SPhilip Reames; EPILOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ]
3515de2fed61SPhilip Reames; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3516de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit
3517de2fed61SPhilip Reames; EPILOG:       loop_header.epil.preheader:
3518de2fed61SPhilip Reames; EPILOG-NEXT:    br label %loop_header.epil
3519de2fed61SPhilip Reames; EPILOG:       loop_header.epil:
3520de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
3521de2fed61SPhilip Reames; EPILOG-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]
352237ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
3523de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil
3524de2fed61SPhilip Reames; EPILOG:       loop_exiting.epil:
3525de2fed61SPhilip Reames; EPILOG-NEXT:    %ivy.epil = add i64 %iv.epil, %add
3526de2fed61SPhilip Reames; EPILOG-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
3527de2fed61SPhilip Reames; EPILOG-NEXT:    i64 24, label %exit1.loopexit2
3528de2fed61SPhilip Reames; EPILOG-NEXT:    i64 42, label %exit1.loopexit2
3529de2fed61SPhilip Reames; EPILOG-NEXT:    ]
3530de2fed61SPhilip Reames; EPILOG:       loop_latch.epil:
3531de2fed61SPhilip Reames; EPILOG-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
3532de2fed61SPhilip Reames; EPILOG-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
3533de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
353437ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
353537ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
3536da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %latchexit.epilog-lcssa, !llvm.loop !9
3537de2fed61SPhilip Reames; EPILOG:       latchexit.epilog-lcssa:
3538de2fed61SPhilip Reames; EPILOG-NEXT:    %sum.next.lcssa.ph1 = phi i64 [ %sum.next.epil, %loop_latch.epil ]
3539de2fed61SPhilip Reames; EPILOG-NEXT:    br label %latchexit
3540de2fed61SPhilip Reames; EPILOG:       latchexit:
3541de2fed61SPhilip Reames; EPILOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.lcssa.ph1, %latchexit.epilog-lcssa ]
3542de2fed61SPhilip Reames; EPILOG-NEXT:    ret i64 %sum.next.lcssa
3543911991d2SPhilip Reames;
3544911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @test5(
3545911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:  entry:
3546*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
3547*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
3548*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
3549*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
3550323514deSNikita Popov; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchexit.unr-lcssa, label %entry.new
3551911991d2SPhilip Reames; EPILOG-BLOCK:       entry.new:
3552*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
3553911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %loop_header
3554911991d2SPhilip Reames; EPILOG-BLOCK:       loop_header:
3555911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
3556911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
355737ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
3558911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3559911991d2SPhilip Reames; EPILOG-BLOCK:       loop_exiting:
3560911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %ivy = add i64 %iv, %add
3561911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
3562911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3563911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3564911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ]
3565911991d2SPhilip Reames; EPILOG-BLOCK:       loop_latch:
3566911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3567911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
356837ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
3569911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3570de2fed61SPhilip Reames; EPILOG-BLOCK:       loop_exiting.1:
3571de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add
3572de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3573de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3574de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3575de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    ]
3576de2fed61SPhilip Reames; EPILOG-BLOCK:       loop_latch.1:
3577de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3578de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
357937ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
358037ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
3581da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !9
3582911991d2SPhilip Reames; EPILOG-BLOCK:       exit1.loopexit:
3583911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]
3584911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit1
3585911991d2SPhilip Reames; EPILOG-BLOCK:       exit1:
3586911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %result = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ], [ %result.ph, %exit1.loopexit ]
3587911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret i64 %result
3588911991d2SPhilip Reames; EPILOG-BLOCK:       latchexit.unr-lcssa.loopexit:
3589911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3590911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
3591911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3592911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchexit.unr-lcssa
3593911991d2SPhilip Reames; EPILOG-BLOCK:       latchexit.unr-lcssa:
3594911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ]
3595911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ]
3596911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ]
3597911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3598911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit
3599911991d2SPhilip Reames; EPILOG-BLOCK:       loop_header.epil.preheader:
3600911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
3601911991d2SPhilip Reames; EPILOG-BLOCK:       loop_header.epil:
3602911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil
3603911991d2SPhilip Reames; EPILOG-BLOCK:       loop_exiting.epil:
3604b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT:    %ivy.epil = add i64 %iv.unr, %add
3605b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT:    switch i64 %sum.unr, label %loop_latch.epil [
3606911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    i64 24, label %exit1
3607911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    i64 42, label %exit1
3608911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ]
3609911991d2SPhilip Reames; EPILOG-BLOCK:       loop_latch.epil:
3610b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.next.epil = add i64 %sum.unr, %add
3611911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchexit
3612911991d2SPhilip Reames; EPILOG-BLOCK:       latchexit:
3613b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.epil, %loop_latch.epil ]
3614911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa
3615911991d2SPhilip Reames;
3616911991d2SPhilip Reames; PROLOG-LABEL: @test5(
3617911991d2SPhilip Reames; PROLOG-NEXT:  entry:
3618*81c648a3SNikita Popov; PROLOG-NEXT:    %0 = freeze i64 %trip
3619*81c648a3SNikita Popov; PROLOG-NEXT:    %1 = add i64 %0, -1
3620*81c648a3SNikita Popov; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
3621911991d2SPhilip Reames; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3622*81c648a3SNikita Popov; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
3623911991d2SPhilip Reames; PROLOG:       loop_header.prol.preheader:
3624911991d2SPhilip Reames; PROLOG-NEXT:    br label %loop_header.prol
3625911991d2SPhilip Reames; PROLOG:       loop_header.prol:
3626911991d2SPhilip Reames; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
3627911991d2SPhilip Reames; PROLOG-NEXT:    %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ]
362837ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
3629911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol
3630911991d2SPhilip Reames; PROLOG:       loop_exiting.prol:
3631911991d2SPhilip Reames; PROLOG-NEXT:    %ivy.prol = add i64 %iv.prol, %add
3632911991d2SPhilip Reames; PROLOG-NEXT:    switch i64 %sum.prol, label %loop_latch.prol [
3633911991d2SPhilip Reames; PROLOG-NEXT:    i64 24, label %exit1.loopexit1
3634911991d2SPhilip Reames; PROLOG-NEXT:    i64 42, label %exit1.loopexit1
3635911991d2SPhilip Reames; PROLOG-NEXT:    ]
3636911991d2SPhilip Reames; PROLOG:       loop_latch.prol:
3637911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.prol = add nuw nsw i64 %iv.prol, 1
3638911991d2SPhilip Reames; PROLOG-NEXT:    %sum.next.prol = add i64 %sum.prol, %add
3639911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
364037ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
364137ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
3642da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !9
3643911991d2SPhilip Reames; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
3644911991d2SPhilip Reames; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
3645911991d2SPhilip Reames; PROLOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
3646911991d2SPhilip Reames; PROLOG-NEXT:    %sum.next.lcssa.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
3647911991d2SPhilip Reames; PROLOG-NEXT:    br label %loop_header.prol.loopexit
3648911991d2SPhilip Reames; PROLOG:       loop_header.prol.loopexit:
3649911991d2SPhilip Reames; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
3650911991d2SPhilip Reames; PROLOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
3651911991d2SPhilip Reames; PROLOG-NEXT:    %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %sum.next.lcssa.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
3652*81c648a3SNikita Popov; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
3653323514deSNikita Popov; PROLOG-NEXT:    br i1 %2, label %latchexit, label %entry.new
3654911991d2SPhilip Reames; PROLOG:       entry.new:
3655911991d2SPhilip Reames; PROLOG-NEXT:    br label %loop_header
3656911991d2SPhilip Reames; PROLOG:       loop_header:
3657911991d2SPhilip Reames; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
3658911991d2SPhilip Reames; PROLOG-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
3659911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3660911991d2SPhilip Reames; PROLOG:       loop_exiting:
3661911991d2SPhilip Reames; PROLOG-NEXT:    %ivy = add i64 %iv, %add
3662911991d2SPhilip Reames; PROLOG-NEXT:    switch i64 %sum, label %loop_latch [
3663911991d2SPhilip Reames; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3664911991d2SPhilip Reames; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3665911991d2SPhilip Reames; PROLOG-NEXT:    ]
3666911991d2SPhilip Reames; PROLOG:       loop_latch:
3667911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3668911991d2SPhilip Reames; PROLOG-NEXT:    %sum.next = add i64 %sum, %add
3669911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3670911991d2SPhilip Reames; PROLOG:       loop_exiting.1:
3671911991d2SPhilip Reames; PROLOG-NEXT:    %ivy.1 = add i64 %iv_next, %add
3672911991d2SPhilip Reames; PROLOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3673911991d2SPhilip Reames; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3674911991d2SPhilip Reames; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3675911991d2SPhilip Reames; PROLOG-NEXT:    ]
3676911991d2SPhilip Reames; PROLOG:       loop_latch.1:
3677911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3678911991d2SPhilip Reames; PROLOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3679911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.2
3680911991d2SPhilip Reames; PROLOG:       loop_exiting.2:
3681911991d2SPhilip Reames; PROLOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add
3682911991d2SPhilip Reames; PROLOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
3683911991d2SPhilip Reames; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3684911991d2SPhilip Reames; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3685911991d2SPhilip Reames; PROLOG-NEXT:    ]
3686911991d2SPhilip Reames; PROLOG:       loop_latch.2:
3687911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
3688911991d2SPhilip Reames; PROLOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
3689911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.3
3690911991d2SPhilip Reames; PROLOG:       loop_exiting.3:
3691911991d2SPhilip Reames; PROLOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add
3692911991d2SPhilip Reames; PROLOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
3693911991d2SPhilip Reames; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3694911991d2SPhilip Reames; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3695911991d2SPhilip Reames; PROLOG-NEXT:    ]
3696911991d2SPhilip Reames; PROLOG:       loop_latch.3:
3697911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
3698911991d2SPhilip Reames; PROLOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
3699911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.4
3700911991d2SPhilip Reames; PROLOG:       loop_exiting.4:
3701911991d2SPhilip Reames; PROLOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add
3702911991d2SPhilip Reames; PROLOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
3703911991d2SPhilip Reames; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3704911991d2SPhilip Reames; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3705911991d2SPhilip Reames; PROLOG-NEXT:    ]
3706911991d2SPhilip Reames; PROLOG:       loop_latch.4:
3707911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
3708911991d2SPhilip Reames; PROLOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
3709911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.5
3710911991d2SPhilip Reames; PROLOG:       loop_exiting.5:
3711911991d2SPhilip Reames; PROLOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add
3712911991d2SPhilip Reames; PROLOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
3713911991d2SPhilip Reames; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3714911991d2SPhilip Reames; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3715911991d2SPhilip Reames; PROLOG-NEXT:    ]
3716911991d2SPhilip Reames; PROLOG:       loop_latch.5:
3717911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
3718911991d2SPhilip Reames; PROLOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
3719911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.6
3720911991d2SPhilip Reames; PROLOG:       loop_exiting.6:
3721911991d2SPhilip Reames; PROLOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add
3722911991d2SPhilip Reames; PROLOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
3723911991d2SPhilip Reames; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3724911991d2SPhilip Reames; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3725911991d2SPhilip Reames; PROLOG-NEXT:    ]
3726911991d2SPhilip Reames; PROLOG:       loop_latch.6:
3727911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
3728911991d2SPhilip Reames; PROLOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
3729911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.7
3730911991d2SPhilip Reames; PROLOG:       loop_exiting.7:
3731911991d2SPhilip Reames; PROLOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add
3732911991d2SPhilip Reames; PROLOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
3733911991d2SPhilip Reames; PROLOG-NEXT:    i64 24, label %exit1.loopexit
3734911991d2SPhilip Reames; PROLOG-NEXT:    i64 42, label %exit1.loopexit
3735911991d2SPhilip Reames; PROLOG-NEXT:    ]
3736cee313d2SEric Christopher; PROLOG:       loop_latch.7:
3737911991d2SPhilip Reames; PROLOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
3738911991d2SPhilip Reames; PROLOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
3739911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
3740911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %latchexit.unr-lcssa
3741de2fed61SPhilip Reames; PROLOG:       exit1.loopexit:
3742de2fed61SPhilip Reames; 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 ]
3743de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit1
3744de2fed61SPhilip Reames; PROLOG:       exit1.loopexit1:
3745de2fed61SPhilip Reames; PROLOG-NEXT:    %result.ph2 = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ]
3746de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit1
3747de2fed61SPhilip Reames; PROLOG:       exit1:
3748de2fed61SPhilip Reames; PROLOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph2, %exit1.loopexit1 ]
3749de2fed61SPhilip Reames; PROLOG-NEXT:    ret i64 %result
3750de2fed61SPhilip Reames; PROLOG:       latchexit.unr-lcssa:
3751de2fed61SPhilip Reames; PROLOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
3752de2fed61SPhilip Reames; PROLOG-NEXT:    br label %latchexit
3753de2fed61SPhilip Reames; PROLOG:       latchexit:
3754de2fed61SPhilip Reames; PROLOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]
3755de2fed61SPhilip Reames; PROLOG-NEXT:    ret i64 %sum.next.lcssa
3756911991d2SPhilip Reames;
3757911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @test5(
3758911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:  entry:
3759*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
3760*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
3761*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
3762911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3763*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
3764911991d2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol.preheader:
3765911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
3766911991d2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol:
3767911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol
3768911991d2SPhilip Reames; PROLOG-BLOCK:       loop_exiting.prol:
3769911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    switch i64 0, label %loop_latch.prol [
3770911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    i64 24, label %exit1
3771911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    i64 42, label %exit1
3772911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ]
3773911991d2SPhilip Reames; PROLOG-BLOCK:       loop_latch.prol:
3774911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
3775911991d2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol.loopexit:
3776b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
3777b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %add, %loop_latch.prol ]
3778b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %add, %loop_latch.prol ]
3779*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
3780323514deSNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchexit, label %entry.new
3781911991d2SPhilip Reames; PROLOG-BLOCK:       entry.new:
3782911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header
3783911991d2SPhilip Reames; PROLOG-BLOCK:       loop_header:
3784911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
3785911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
3786911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
3787911991d2SPhilip Reames; PROLOG-BLOCK:       loop_exiting:
3788911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %ivy = add i64 %iv, %add
3789911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
3790911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3791911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3792911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ]
3793911991d2SPhilip Reames; PROLOG-BLOCK:       loop_latch:
3794911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
3795911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
3796911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
3797de2fed61SPhilip Reames; PROLOG-BLOCK:       loop_exiting.1:
3798de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add
3799de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
3800de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
3801de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
3802de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    ]
3803de2fed61SPhilip Reames; PROLOG-BLOCK:       loop_latch.1:
3804de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
3805de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
3806de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
3807da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %latchexit.unr-lcssa, !llvm.loop !9
3808911991d2SPhilip Reames; PROLOG-BLOCK:       exit1.loopexit:
3809911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]
3810911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit1
3811911991d2SPhilip Reames; PROLOG-BLOCK:       exit1:
3812b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %result = phi i64 [ %add, %loop_exiting.prol ], [ %add, %loop_exiting.prol ], [ %result.ph, %exit1.loopexit ]
3813911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret i64 %result
3814911991d2SPhilip Reames; PROLOG-BLOCK:       latchexit.unr-lcssa:
3815911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
3816911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %latchexit
3817911991d2SPhilip Reames; PROLOG-BLOCK:       latchexit:
3818911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]
3819911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa
3820911991d2SPhilip Reames;
3821911991d2SPhilip Reames
3822cee313d2SEric Christopherentry:
3823cee313d2SEric Christopher  br label %loop_header
3824cee313d2SEric Christopher
3825cee313d2SEric Christopherloop_header:
3826cee313d2SEric Christopher  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
3827cee313d2SEric Christopher  %sum = phi i64 [ 0, %entry ], [ %sum.next, %loop_latch ]
3828cee313d2SEric Christopher  br i1 %cond, label %loop_latch, label %loop_exiting
3829cee313d2SEric Christopher
3830cee313d2SEric Christopherloop_exiting:
3831cee313d2SEric Christopher  %ivy = add i64 %iv, %add
3832cee313d2SEric Christopher  switch i64 %sum, label %loop_latch [
3833cee313d2SEric Christopher  i64 24, label %exit1
3834cee313d2SEric Christopher  i64 42, label %exit1
3835cee313d2SEric Christopher  ]
3836cee313d2SEric Christopher
3837cee313d2SEric Christopherloop_latch:
3838cee313d2SEric Christopher  %iv_next = add nuw nsw i64 %iv, 1
3839cee313d2SEric Christopher  %sum.next = add i64 %sum, %add
3840cee313d2SEric Christopher  %cmp = icmp ne i64 %iv_next, %trip
3841cee313d2SEric Christopher  br i1 %cmp, label %loop_header, label %latchexit
3842cee313d2SEric Christopher
3843cee313d2SEric Christopherexit1:
3844cee313d2SEric Christopher  %result = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ]
3845cee313d2SEric Christopher  ret i64 %result
3846cee313d2SEric Christopher
3847cee313d2SEric Christopherlatchexit:
3848cee313d2SEric Christopher  ret i64 %sum.next
3849cee313d2SEric Christopher}
3850cee313d2SEric Christopher
3851cee313d2SEric Christopher; test when exit blocks have successors.
3852cee313d2SEric Christopherdefine i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) {
3853911991d2SPhilip Reames; EPILOG-LABEL: @test6(
3854911991d2SPhilip Reames; EPILOG-NEXT:  entry:
3855*81c648a3SNikita Popov; EPILOG-NEXT:    %0 = freeze i64 %n
3856*81c648a3SNikita Popov; EPILOG-NEXT:    %1 = add i64 %0, -1
3857*81c648a3SNikita Popov; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
3858*81c648a3SNikita Popov; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
3859323514deSNikita Popov; EPILOG-NEXT:    br i1 %2, label %latch_exit.unr-lcssa, label %entry.new
3860911991d2SPhilip Reames; EPILOG:       entry.new:
3861*81c648a3SNikita Popov; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
3862911991d2SPhilip Reames; EPILOG-NEXT:    br label %header
3863911991d2SPhilip Reames; EPILOG:       header:
3864911991d2SPhilip Reames; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
3865911991d2SPhilip Reames; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
386637ead201SPhilip Reames; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %latch.7 ]
3867911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
3868911991d2SPhilip Reames; EPILOG:       for.exiting_block:
3869911991d2SPhilip Reames; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
3870911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
3871911991d2SPhilip Reames; EPILOG:       latch:
3872911991d2SPhilip Reames; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
3873911991d2SPhilip Reames; EPILOG-NEXT:    %load = load i32, i32* %arrayidx, align 4
3874911991d2SPhilip Reames; EPILOG-NEXT:    %add = add nsw i32 %load, %sum.02
3875911991d2SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
387637ead201SPhilip Reames; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
387772031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
3878911991d2SPhilip Reames; EPILOG:       for.exiting_block.1:
3879911991d2SPhilip Reames; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
3880911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
3881911991d2SPhilip Reames; EPILOG:       latch.1:
3882911991d2SPhilip Reames; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
3883911991d2SPhilip Reames; EPILOG-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
3884911991d2SPhilip Reames; EPILOG-NEXT:    %add.1 = add nsw i32 %load.1, %add
3885911991d2SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
388637ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
388772031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
3888911991d2SPhilip Reames; EPILOG:       for.exiting_block.2:
3889911991d2SPhilip Reames; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
3890911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
3891911991d2SPhilip Reames; EPILOG:       latch.2:
3892911991d2SPhilip Reames; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
3893911991d2SPhilip Reames; EPILOG-NEXT:    %load.2 = load i32, i32* %arrayidx.2, align 4
3894911991d2SPhilip Reames; EPILOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.1
3895911991d2SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
389637ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
389772031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
3898911991d2SPhilip Reames; EPILOG:       for.exiting_block.3:
3899911991d2SPhilip Reames; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
3900911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
3901911991d2SPhilip Reames; EPILOG:       latch.3:
3902911991d2SPhilip Reames; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
3903911991d2SPhilip Reames; EPILOG-NEXT:    %load.3 = load i32, i32* %arrayidx.3, align 4
3904911991d2SPhilip Reames; EPILOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.2
3905911991d2SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
390637ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
390772031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
3908911991d2SPhilip Reames; EPILOG:       for.exiting_block.4:
3909911991d2SPhilip Reames; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
3910911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
3911911991d2SPhilip Reames; EPILOG:       latch.4:
3912911991d2SPhilip Reames; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
3913911991d2SPhilip Reames; EPILOG-NEXT:    %load.4 = load i32, i32* %arrayidx.4, align 4
3914911991d2SPhilip Reames; EPILOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.3
3915911991d2SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
391637ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
391772031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
3918911991d2SPhilip Reames; EPILOG:       for.exiting_block.5:
3919911991d2SPhilip Reames; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
3920911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
3921911991d2SPhilip Reames; EPILOG:       latch.5:
3922911991d2SPhilip Reames; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
3923911991d2SPhilip Reames; EPILOG-NEXT:    %load.5 = load i32, i32* %arrayidx.5, align 4
3924911991d2SPhilip Reames; EPILOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.4
3925911991d2SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
392637ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
392772031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
3928911991d2SPhilip Reames; EPILOG:       for.exiting_block.6:
3929911991d2SPhilip Reames; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
3930911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
3931911991d2SPhilip Reames; EPILOG:       latch.6:
3932911991d2SPhilip Reames; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
3933911991d2SPhilip Reames; EPILOG-NEXT:    %load.6 = load i32, i32* %arrayidx.6, align 4
3934911991d2SPhilip Reames; EPILOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.5
3935911991d2SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
393637ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
393772031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
3938911991d2SPhilip Reames; EPILOG:       for.exiting_block.7:
3939911991d2SPhilip Reames; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
3940911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
3941cee313d2SEric Christopher; EPILOG:       latch.7:
3942911991d2SPhilip Reames; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
3943911991d2SPhilip Reames; EPILOG-NEXT:    %load.7 = load i32, i32* %arrayidx.7, align 4
3944911991d2SPhilip Reames; EPILOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.6
3945911991d2SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
394637ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
394737ead201SPhilip Reames; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
3948911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latch_exit.unr-lcssa.loopexit, label %header
3949de2fed61SPhilip Reames; EPILOG:       latch_exit.unr-lcssa.loopexit:
3950de2fed61SPhilip Reames; EPILOG-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %latch.7 ]
3951de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
3952de2fed61SPhilip Reames; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
3953de2fed61SPhilip Reames; EPILOG-NEXT:    br label %latch_exit.unr-lcssa
3954de2fed61SPhilip Reames; EPILOG:       latch_exit.unr-lcssa:
3955de2fed61SPhilip Reames; EPILOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ]
3956de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3957de2fed61SPhilip Reames; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ]
3958de2fed61SPhilip Reames; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
3959de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit
3960de2fed61SPhilip Reames; EPILOG:       header.epil.preheader:
3961de2fed61SPhilip Reames; EPILOG-NEXT:    br label %header.epil
3962de2fed61SPhilip Reames; EPILOG:       header.epil:
3963de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
3964de2fed61SPhilip Reames; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
396537ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
3966de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil
3967de2fed61SPhilip Reames; EPILOG:       for.exiting_block.epil:
3968de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
3969de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit2, label %latch.epil
3970de2fed61SPhilip Reames; EPILOG:       latch.epil:
3971de2fed61SPhilip Reames; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
3972de2fed61SPhilip Reames; EPILOG-NEXT:    %load.epil = load i32, i32* %arrayidx.epil, align 4
3973de2fed61SPhilip Reames; EPILOG-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.epil
3974de2fed61SPhilip Reames; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
3975de2fed61SPhilip Reames; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
397637ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
397737ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
3978da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latch_exit.epilog-lcssa, !llvm.loop !10
3979de2fed61SPhilip Reames; EPILOG:       latch_exit.epilog-lcssa:
3980de2fed61SPhilip Reames; EPILOG-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %latch.epil ]
3981de2fed61SPhilip Reames; EPILOG-NEXT:    br label %latch_exit
3982de2fed61SPhilip Reames; EPILOG:       latch_exit:
3983de2fed61SPhilip Reames; EPILOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %sum.0.lcssa.ph1, %latch_exit.epilog-lcssa ]
3984de2fed61SPhilip Reames; EPILOG-NEXT:    ret i32 %sum.0.lcssa
3985de2fed61SPhilip Reames; EPILOG:       for.exit2.loopexit:
398672031407SPhilip Reames; 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 ]
3987de2fed61SPhilip Reames; EPILOG-NEXT:    br label %for.exit2
3988de2fed61SPhilip Reames; EPILOG:       for.exit2.loopexit2:
3989de2fed61SPhilip Reames; EPILOG-NEXT:    %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
3990de2fed61SPhilip Reames; EPILOG-NEXT:    br label %for.exit2
3991de2fed61SPhilip Reames; EPILOG:       for.exit2:
3992de2fed61SPhilip Reames; EPILOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
3993de2fed61SPhilip Reames; EPILOG-NEXT:    %addx = add i32 %retval, %x
3994de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false
3995de2fed61SPhilip Reames; EPILOG:       exit_true:
3996de2fed61SPhilip Reames; EPILOG-NEXT:    ret i32 %retval
3997de2fed61SPhilip Reames; EPILOG:       exit_false:
3998de2fed61SPhilip Reames; EPILOG-NEXT:    ret i32 %addx
3999911991d2SPhilip Reames;
4000911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @test6(
4001911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:  entry:
4002*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %n
4003*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
4004*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4005*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4006323514deSNikita Popov; EPILOG-BLOCK-NEXT:    br i1 %2, label %latch_exit.unr-lcssa, label %entry.new
4007911991d2SPhilip Reames; EPILOG-BLOCK:       entry.new:
4008*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
4009911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header
4010911991d2SPhilip Reames; EPILOG-BLOCK:       header:
4011911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
4012911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
401337ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %latch.1 ]
4014911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
4015911991d2SPhilip Reames; EPILOG-BLOCK:       for.exiting_block:
4016911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
4017911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
4018911991d2SPhilip Reames; EPILOG-BLOCK:       latch:
4019911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
4020911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %load = load i32, i32* %arrayidx, align 4
4021911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %load, %sum.02
4022911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
402337ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
402472031407SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
4025de2fed61SPhilip Reames; EPILOG-BLOCK:       for.exiting_block.1:
4026de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
4027de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
4028de2fed61SPhilip Reames; EPILOG-BLOCK:       latch.1:
4029de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
4030de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
4031de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add
4032de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
403337ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
403437ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
4035da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latch_exit.unr-lcssa.loopexit, label %header, !llvm.loop !10
4036911991d2SPhilip Reames; EPILOG-BLOCK:       latch_exit.unr-lcssa.loopexit:
4037911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %latch.1 ]
4038911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
4039911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
4040911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latch_exit.unr-lcssa
4041911991d2SPhilip Reames; EPILOG-BLOCK:       latch_exit.unr-lcssa:
4042911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ]
4043911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ]
4044911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ]
4045911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4046911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit
4047911991d2SPhilip Reames; EPILOG-BLOCK:       header.epil.preheader:
4048911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header.epil
4049911991d2SPhilip Reames; EPILOG-BLOCK:       header.epil:
4050911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.epil
4051911991d2SPhilip Reames; EPILOG-BLOCK:       for.exiting_block.epil:
4052911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
4053911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %latch.epil
4054911991d2SPhilip Reames; EPILOG-BLOCK:       latch.epil:
4055b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.unr
4056911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %load.epil = load i32, i32* %arrayidx.epil, align 4
4057b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.unr
4058911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latch_exit
4059911991d2SPhilip Reames; EPILOG-BLOCK:       latch_exit:
4060b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %add.epil, %latch.epil ]
4061911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
4062911991d2SPhilip Reames; EPILOG-BLOCK:       for.exit2.loopexit:
406372031407SPhilip Reames; EPILOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]
4064911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %for.exit2
4065911991d2SPhilip Reames; EPILOG-BLOCK:       for.exit2:
4066b604fcb7SPhilip Reames; EPILOG-BLOCK-NEXT:    %retval = phi i32 [ %sum.02.unr, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ]
4067911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %addx = add i32 %retval, %x
4068911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false
4069911991d2SPhilip Reames; EPILOG-BLOCK:       exit_true:
4070911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret i32 %retval
4071911991d2SPhilip Reames; EPILOG-BLOCK:       exit_false:
4072911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret i32 %addx
4073911991d2SPhilip Reames;
4074911991d2SPhilip Reames; PROLOG-LABEL: @test6(
4075911991d2SPhilip Reames; PROLOG-NEXT:  entry:
4076*81c648a3SNikita Popov; PROLOG-NEXT:    %0 = freeze i64 %n
4077*81c648a3SNikita Popov; PROLOG-NEXT:    %1 = add i64 %0, -1
4078*81c648a3SNikita Popov; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
4079911991d2SPhilip Reames; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4080*81c648a3SNikita Popov; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4081911991d2SPhilip Reames; PROLOG:       header.prol.preheader:
4082911991d2SPhilip Reames; PROLOG-NEXT:    br label %header.prol
4083911991d2SPhilip Reames; PROLOG:       header.prol:
4084911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
4085911991d2SPhilip Reames; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
408637ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
4087911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol
4088911991d2SPhilip Reames; PROLOG:       for.exiting_block.prol:
4089911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
4090911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit1, label %latch.prol
4091911991d2SPhilip Reames; PROLOG:       latch.prol:
4092911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
4093911991d2SPhilip Reames; PROLOG-NEXT:    %load.prol = load i32, i32* %arrayidx.prol, align 4
4094911991d2SPhilip Reames; PROLOG-NEXT:    %add.prol = add nsw i32 %load.prol, %sum.02.prol
4095911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
4096911991d2SPhilip Reames; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
409737ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
409837ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
4099da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !10
4100911991d2SPhilip Reames; PROLOG:       header.prol.loopexit.unr-lcssa:
4101911991d2SPhilip Reames; PROLOG-NEXT:    %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %latch.prol ]
4102911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
4103911991d2SPhilip Reames; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
4104911991d2SPhilip Reames; PROLOG-NEXT:    br label %header.prol.loopexit
4105911991d2SPhilip Reames; PROLOG:       header.prol.loopexit:
4106911991d2SPhilip Reames; PROLOG-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ]
4107911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
4108911991d2SPhilip Reames; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
4109*81c648a3SNikita Popov; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
4110323514deSNikita Popov; PROLOG-NEXT:    br i1 %2, label %latch_exit, label %entry.new
4111911991d2SPhilip Reames; PROLOG:       entry.new:
4112911991d2SPhilip Reames; PROLOG-NEXT:    br label %header
4113911991d2SPhilip Reames; PROLOG:       header:
4114911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
4115911991d2SPhilip Reames; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
4116911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
4117911991d2SPhilip Reames; PROLOG:       for.exiting_block:
4118911991d2SPhilip Reames; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
4119911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
4120911991d2SPhilip Reames; PROLOG:       latch:
4121911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
4122911991d2SPhilip Reames; PROLOG-NEXT:    %load = load i32, i32* %arrayidx, align 4
4123911991d2SPhilip Reames; PROLOG-NEXT:    %add = add nsw i32 %load, %sum.02
4124911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
412572031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
4126911991d2SPhilip Reames; PROLOG:       for.exiting_block.1:
4127911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
4128911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
4129911991d2SPhilip Reames; PROLOG:       latch.1:
4130911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
4131911991d2SPhilip Reames; PROLOG-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
4132911991d2SPhilip Reames; PROLOG-NEXT:    %add.1 = add nsw i32 %load.1, %add
4133911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
413472031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
4135911991d2SPhilip Reames; PROLOG:       for.exiting_block.2:
4136911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
4137911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
4138911991d2SPhilip Reames; PROLOG:       latch.2:
4139911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
4140911991d2SPhilip Reames; PROLOG-NEXT:    %load.2 = load i32, i32* %arrayidx.2, align 4
4141911991d2SPhilip Reames; PROLOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.1
4142911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
414372031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
4144911991d2SPhilip Reames; PROLOG:       for.exiting_block.3:
4145911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
4146911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
4147911991d2SPhilip Reames; PROLOG:       latch.3:
4148911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
4149911991d2SPhilip Reames; PROLOG-NEXT:    %load.3 = load i32, i32* %arrayidx.3, align 4
4150911991d2SPhilip Reames; PROLOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.2
4151911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
415272031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
4153911991d2SPhilip Reames; PROLOG:       for.exiting_block.4:
4154911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
4155911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
4156911991d2SPhilip Reames; PROLOG:       latch.4:
4157911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
4158911991d2SPhilip Reames; PROLOG-NEXT:    %load.4 = load i32, i32* %arrayidx.4, align 4
4159911991d2SPhilip Reames; PROLOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.3
4160911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
416172031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
4162911991d2SPhilip Reames; PROLOG:       for.exiting_block.5:
4163911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
4164911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
4165911991d2SPhilip Reames; PROLOG:       latch.5:
4166911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
4167911991d2SPhilip Reames; PROLOG-NEXT:    %load.5 = load i32, i32* %arrayidx.5, align 4
4168911991d2SPhilip Reames; PROLOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.4
4169911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
417072031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
4171911991d2SPhilip Reames; PROLOG:       for.exiting_block.6:
4172911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
4173911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
4174911991d2SPhilip Reames; PROLOG:       latch.6:
4175911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
4176911991d2SPhilip Reames; PROLOG-NEXT:    %load.6 = load i32, i32* %arrayidx.6, align 4
4177911991d2SPhilip Reames; PROLOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.5
4178911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
417972031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
4180911991d2SPhilip Reames; PROLOG:       for.exiting_block.7:
4181911991d2SPhilip Reames; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
4182911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
4183cee313d2SEric Christopher; PROLOG:       latch.7:
4184911991d2SPhilip Reames; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
4185911991d2SPhilip Reames; PROLOG-NEXT:    %load.7 = load i32, i32* %arrayidx.7, align 4
4186911991d2SPhilip Reames; PROLOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.6
4187911991d2SPhilip Reames; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
4188911991d2SPhilip Reames; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
4189911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %exitcond.7, label %latch_exit.unr-lcssa, label %header
4190de2fed61SPhilip Reames; PROLOG:       latch_exit.unr-lcssa:
4191de2fed61SPhilip Reames; PROLOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %latch.7 ]
4192de2fed61SPhilip Reames; PROLOG-NEXT:    br label %latch_exit
4193de2fed61SPhilip Reames; PROLOG:       latch_exit:
4194de2fed61SPhilip Reames; PROLOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]
4195de2fed61SPhilip Reames; PROLOG-NEXT:    ret i32 %sum.0.lcssa
4196de2fed61SPhilip Reames; PROLOG:       for.exit2.loopexit:
419772031407SPhilip Reames; 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 ]
4198de2fed61SPhilip Reames; PROLOG-NEXT:    br label %for.exit2
4199de2fed61SPhilip Reames; PROLOG:       for.exit2.loopexit1:
4200de2fed61SPhilip Reames; PROLOG-NEXT:    %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
4201de2fed61SPhilip Reames; PROLOG-NEXT:    br label %for.exit2
4202de2fed61SPhilip Reames; PROLOG:       for.exit2:
4203de2fed61SPhilip Reames; PROLOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
4204de2fed61SPhilip Reames; PROLOG-NEXT:    %addx = add i32 %retval, %x
4205de2fed61SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false
4206de2fed61SPhilip Reames; PROLOG:       exit_true:
4207de2fed61SPhilip Reames; PROLOG-NEXT:    ret i32 %retval
4208de2fed61SPhilip Reames; PROLOG:       exit_false:
4209de2fed61SPhilip Reames; PROLOG-NEXT:    ret i32 %addx
4210911991d2SPhilip Reames;
4211911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @test6(
4212911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:  entry:
4213*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %n
4214*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
4215*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4216911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4217*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4218911991d2SPhilip Reames; PROLOG-BLOCK:       header.prol.preheader:
4219911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol
4220911991d2SPhilip Reames; PROLOG-BLOCK:       header.prol:
4221911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.prol
4222911991d2SPhilip Reames; PROLOG-BLOCK:       for.exiting_block.prol:
4223911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
4224911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %latch.prol
4225911991d2SPhilip Reames; PROLOG-BLOCK:       latch.prol:
4226b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %load.prol = load i32, i32* %a, align 4
4227911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
4228911991d2SPhilip Reames; PROLOG-BLOCK:       header.prol.loopexit:
4229b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %load.prol, %latch.prol ]
4230b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ]
4231b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %load.prol, %latch.prol ]
4232*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4233323514deSNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %2, label %latch_exit, label %entry.new
4234911991d2SPhilip Reames; PROLOG-BLOCK:       entry.new:
4235911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header
4236911991d2SPhilip Reames; PROLOG-BLOCK:       header:
4237911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
4238911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
4239911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
4240911991d2SPhilip Reames; PROLOG-BLOCK:       for.exiting_block:
4241911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
4242911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
4243911991d2SPhilip Reames; PROLOG-BLOCK:       latch:
4244911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
4245911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %load = load i32, i32* %arrayidx, align 4
4246911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %load, %sum.02
4247911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
424872031407SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
4249de2fed61SPhilip Reames; PROLOG-BLOCK:       for.exiting_block.1:
4250de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
4251de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
4252de2fed61SPhilip Reames; PROLOG-BLOCK:       latch.1:
4253de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
4254de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
4255de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add
4256de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
4257de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
4258da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latch_exit.unr-lcssa, label %header, !llvm.loop !10
4259911991d2SPhilip Reames; PROLOG-BLOCK:       latch_exit.unr-lcssa:
4260911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %latch.1 ]
4261911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %latch_exit
4262911991d2SPhilip Reames; PROLOG-BLOCK:       latch_exit:
4263911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]
4264911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
4265911991d2SPhilip Reames; PROLOG-BLOCK:       for.exit2.loopexit:
426672031407SPhilip Reames; PROLOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]
4267911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %for.exit2
4268911991d2SPhilip Reames; PROLOG-BLOCK:       for.exit2:
4269911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ]
4270911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %addx = add i32 %retval, %x
4271911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false
4272911991d2SPhilip Reames; PROLOG-BLOCK:       exit_true:
4273911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret i32 %retval
4274911991d2SPhilip Reames; PROLOG-BLOCK:       exit_false:
4275911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret i32 %addx
4276911991d2SPhilip Reames;
4277911991d2SPhilip Reames
4278cee313d2SEric Christopherentry:
4279cee313d2SEric Christopher  br label %header
4280cee313d2SEric Christopher
4281cee313d2SEric Christopherheader:
4282cee313d2SEric Christopher  %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
4283cee313d2SEric Christopher  %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
4284cee313d2SEric Christopher  br i1 false, label %for.exit2, label %for.exiting_block
4285cee313d2SEric Christopher
4286cee313d2SEric Christopherfor.exiting_block:
4287cee313d2SEric Christopher  %cmp = icmp eq i64 %n, 42
4288cee313d2SEric Christopher  br i1 %cmp, label %for.exit2, label %latch
4289cee313d2SEric Christopher
4290cee313d2SEric Christopherlatch:
4291cee313d2SEric Christopher  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
4292cee313d2SEric Christopher  %load = load i32, i32* %arrayidx, align 4
4293cee313d2SEric Christopher  %add = add nsw i32 %load, %sum.02
4294cee313d2SEric Christopher  %indvars.iv.next = add i64 %indvars.iv, 1
4295cee313d2SEric Christopher  %exitcond = icmp eq i64 %indvars.iv.next, %n
4296cee313d2SEric Christopher  br i1 %exitcond, label %latch_exit, label %header
4297cee313d2SEric Christopher
4298cee313d2SEric Christopherlatch_exit:
4299cee313d2SEric Christopher  %sum.0.lcssa = phi i32 [ %add, %latch ]
4300cee313d2SEric Christopher  ret i32 %sum.0.lcssa
4301cee313d2SEric Christopher
4302cee313d2SEric Christopherfor.exit2:
4303cee313d2SEric Christopher  %retval = phi i32 [ %sum.02, %header ], [ 42, %for.exiting_block ]
4304cee313d2SEric Christopher  %addx = add i32 %retval, %x
4305cee313d2SEric Christopher  br i1 %cond, label %exit_true, label %exit_false
4306cee313d2SEric Christopher
4307cee313d2SEric Christopherexit_true:
4308cee313d2SEric Christopher  ret i32 %retval
4309cee313d2SEric Christopher
4310cee313d2SEric Christopherexit_false:
4311cee313d2SEric Christopher  ret i32 %addx
4312cee313d2SEric Christopher}
4313cee313d2SEric Christopher
4314cee313d2SEric Christopher; test when value in exit block does not have VMap.
4315cee313d2SEric Christopherdefine i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) {
4316911991d2SPhilip Reames; EPILOG-LABEL: @test7(
4317911991d2SPhilip Reames; EPILOG-NEXT:  bb:
4318911991d2SPhilip Reames; EPILOG-NEXT:    %i = icmp slt i32 undef, 2
4319911991d2SPhilip Reames; EPILOG-NEXT:    %sext = sext i32 undef to i64
4320911991d2SPhilip Reames; EPILOG-NEXT:    %shft = ashr exact i32 %arg, 16
4321911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %i, label %loopexit2, label %preheader
4322911991d2SPhilip Reames; EPILOG:       preheader:
4323911991d2SPhilip Reames; EPILOG-NEXT:    %0 = add nsw i64 %sext, -1
4324*81c648a3SNikita Popov; EPILOG-NEXT:    %1 = freeze i64 %0
4325*81c648a3SNikita Popov; EPILOG-NEXT:    %2 = add i64 %1, -1
4326*81c648a3SNikita Popov; EPILOG-NEXT:    %xtraiter = and i64 %1, 7
4327*81c648a3SNikita Popov; EPILOG-NEXT:    %3 = icmp ult i64 %2, 7
4328323514deSNikita Popov; EPILOG-NEXT:    br i1 %3, label %latchexit.unr-lcssa, label %preheader.new
4329911991d2SPhilip Reames; EPILOG:       preheader.new:
4330*81c648a3SNikita Popov; EPILOG-NEXT:    %unroll_iter = sub i64 %1, %xtraiter
4331911991d2SPhilip Reames; EPILOG-NEXT:    br label %header
4332911991d2SPhilip Reames; EPILOG:       header:
4333911991d2SPhilip Reames; EPILOG-NEXT:    %i6 = phi i64 [ 1, %preheader.new ], [ %add.7, %latch.7 ]
433437ead201SPhilip Reames; EPILOG-NEXT:    %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ]
4335911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4336911991d2SPhilip Reames; EPILOG:       latch:
4337911991d2SPhilip Reames; EPILOG-NEXT:    %add = add nuw nsw i64 %i6, 1
433837ead201SPhilip Reames; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
433972031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4340de2fed61SPhilip Reames; EPILOG:       latch.1:
4341de2fed61SPhilip Reames; EPILOG-NEXT:    %add.1 = add nuw nsw i64 %add, 1
434237ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
434372031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.2
4344de2fed61SPhilip Reames; EPILOG:       latch.2:
4345de2fed61SPhilip Reames; EPILOG-NEXT:    %add.2 = add nuw nsw i64 %add.1, 1
434637ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
434772031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.3
4348de2fed61SPhilip Reames; EPILOG:       latch.3:
4349de2fed61SPhilip Reames; EPILOG-NEXT:    %add.3 = add nuw nsw i64 %add.2, 1
435037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
435172031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.4
4352de2fed61SPhilip Reames; EPILOG:       latch.4:
4353de2fed61SPhilip Reames; EPILOG-NEXT:    %add.4 = add nuw nsw i64 %add.3, 1
435437ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
435572031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.5
4356de2fed61SPhilip Reames; EPILOG:       latch.5:
4357de2fed61SPhilip Reames; EPILOG-NEXT:    %add.5 = add nuw nsw i64 %add.4, 1
435837ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
435972031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.6
4360de2fed61SPhilip Reames; EPILOG:       latch.6:
4361de2fed61SPhilip Reames; EPILOG-NEXT:    %add.6 = add nuw nsw i64 %add.5, 1
436237ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
436372031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.7
4364de2fed61SPhilip Reames; EPILOG:       latch.7:
4365de2fed61SPhilip Reames; EPILOG-NEXT:    %add.7 = add nuw nsw i64 %add.6, 1
436637ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
436737ead201SPhilip Reames; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
4368de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %latchexit.unr-lcssa.loopexit
4369911991d2SPhilip Reames; EPILOG:       latchexit.unr-lcssa.loopexit:
4370911991d2SPhilip Reames; EPILOG-NEXT:    %i6.unr.ph = phi i64 [ %add.7, %latch.7 ]
4371911991d2SPhilip Reames; EPILOG-NEXT:    br label %latchexit.unr-lcssa
4372911991d2SPhilip Reames; EPILOG:       latchexit.unr-lcssa:
4373911991d2SPhilip Reames; EPILOG-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ]
4374911991d2SPhilip Reames; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4375911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit
4376911991d2SPhilip Reames; EPILOG:       header.epil.preheader:
4377911991d2SPhilip Reames; EPILOG-NEXT:    br label %header.epil
4378911991d2SPhilip Reames; EPILOG:       header.epil:
4379911991d2SPhilip Reames; EPILOG-NEXT:    %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ], [ %add.epil, %latch.epil ]
438037ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
4381911991d2SPhilip Reames; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit1, label %latch.epil
4382911991d2SPhilip Reames; EPILOG:       latch.epil:
4383911991d2SPhilip Reames; EPILOG-NEXT:    %add.epil = add nuw nsw i64 %i6.epil, 1
4384911991d2SPhilip Reames; EPILOG-NEXT:    %i9.epil = icmp slt i64 %add.epil, %sext
438537ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
438637ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
4387da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchexit.epilog-lcssa, !llvm.loop !11
4388911991d2SPhilip Reames; EPILOG:       latchexit.epilog-lcssa:
4389911991d2SPhilip Reames; EPILOG-NEXT:    br label %latchexit
4390911991d2SPhilip Reames; EPILOG:       latchexit:
4391911991d2SPhilip Reames; EPILOG-NEXT:    unreachable
4392911991d2SPhilip Reames; EPILOG:       loopexit2:
4393911991d2SPhilip Reames; EPILOG-NEXT:    ret i32 %shft
4394911991d2SPhilip Reames; EPILOG:       loopexit1.loopexit:
439572031407SPhilip Reames; 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 ]
4396911991d2SPhilip Reames; EPILOG-NEXT:    br label %loopexit1
4397911991d2SPhilip Reames; EPILOG:       loopexit1.loopexit1:
4398911991d2SPhilip Reames; EPILOG-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.epil ]
4399911991d2SPhilip Reames; EPILOG-NEXT:    br label %loopexit1
4400911991d2SPhilip Reames; EPILOG:       loopexit1:
4401911991d2SPhilip Reames; EPILOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
4402911991d2SPhilip Reames; EPILOG-NEXT:    ret i32 %sext3
4403911991d2SPhilip Reames;
4404911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @test7(
4405911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:  bb:
4406911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %i = icmp slt i32 undef, 2
4407911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sext = sext i32 undef to i64
4408911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %shft = ashr exact i32 %arg, 16
4409911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %i, label %loopexit2, label %preheader
4410911991d2SPhilip Reames; EPILOG-BLOCK:       preheader:
4411911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %0 = add nsw i64 %sext, -1
4412*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %1 = freeze i64 %0
4413*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %2 = add i64 %1, -1
4414*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %1, 1
4415*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %3 = icmp ult i64 %2, 1
4416323514deSNikita Popov; EPILOG-BLOCK-NEXT:    br i1 %3, label %latchexit.unr-lcssa, label %preheader.new
4417911991d2SPhilip Reames; EPILOG-BLOCK:       preheader.new:
4418*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %1, %xtraiter
4419911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header
4420911991d2SPhilip Reames; EPILOG-BLOCK:       header:
4421911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %i6 = phi i64 [ 1, %preheader.new ], [ %add.1, %latch.1 ]
442237ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ]
4423911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4424911991d2SPhilip Reames; EPILOG-BLOCK:       latch:
4425911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %add = add nuw nsw i64 %i6, 1
442637ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
442772031407SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4428de2fed61SPhilip Reames; EPILOG-BLOCK:       latch.1:
4429de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %add, 1
443037ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
443137ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
4432da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !11
4433911991d2SPhilip Reames; EPILOG-BLOCK:       latchexit.unr-lcssa.loopexit:
4434911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchexit.unr-lcssa
4435911991d2SPhilip Reames; EPILOG-BLOCK:       latchexit.unr-lcssa:
4436911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4437911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit
4438911991d2SPhilip Reames; EPILOG-BLOCK:       header.epil.preheader:
4439911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header.epil
4440911991d2SPhilip Reames; EPILOG-BLOCK:       header.epil:
4441911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1, label %latch.epil
4442911991d2SPhilip Reames; EPILOG-BLOCK:       latch.epil:
4443911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %latchexit
4444911991d2SPhilip Reames; EPILOG-BLOCK:       latchexit:
4445911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    unreachable
4446911991d2SPhilip Reames; EPILOG-BLOCK:       loopexit2:
4447911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret i32 %shft
4448911991d2SPhilip Reames; EPILOG-BLOCK:       loopexit1.loopexit:
444972031407SPhilip Reames; EPILOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]
4450911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %loopexit1
4451911991d2SPhilip Reames; EPILOG-BLOCK:       loopexit1:
4452911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.epil ], [ %sext3.ph, %loopexit1.loopexit ]
4453911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret i32 %sext3
4454911991d2SPhilip Reames;
4455911991d2SPhilip Reames; PROLOG-LABEL: @test7(
4456911991d2SPhilip Reames; PROLOG-NEXT:  bb:
4457911991d2SPhilip Reames; PROLOG-NEXT:    %i = icmp slt i32 undef, 2
4458911991d2SPhilip Reames; PROLOG-NEXT:    %sext = sext i32 undef to i64
4459911991d2SPhilip Reames; PROLOG-NEXT:    %shft = ashr exact i32 %arg, 16
4460911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %i, label %loopexit2, label %preheader
4461911991d2SPhilip Reames; PROLOG:       preheader:
4462911991d2SPhilip Reames; PROLOG-NEXT:    %0 = add nsw i64 %sext, -1
4463*81c648a3SNikita Popov; PROLOG-NEXT:    %1 = freeze i64 %0
4464*81c648a3SNikita Popov; PROLOG-NEXT:    %2 = add i64 %1, -1
4465*81c648a3SNikita Popov; PROLOG-NEXT:    %xtraiter = and i64 %1, 7
4466911991d2SPhilip Reames; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4467*81c648a3SNikita Popov; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4468911991d2SPhilip Reames; PROLOG:       header.prol.preheader:
4469911991d2SPhilip Reames; PROLOG-NEXT:    br label %header.prol
4470911991d2SPhilip Reames; PROLOG:       header.prol:
4471911991d2SPhilip Reames; PROLOG-NEXT:    %i6.prol = phi i64 [ 1, %header.prol.preheader ], [ %add.prol, %latch.prol ]
447237ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
4473911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit1, label %latch.prol
4474911991d2SPhilip Reames; PROLOG:       latch.prol:
4475911991d2SPhilip Reames; PROLOG-NEXT:    %add.prol = add nuw nsw i64 %i6.prol, 1
4476911991d2SPhilip Reames; PROLOG-NEXT:    %i9.prol = icmp slt i64 %add.prol, %sext
447737ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
447837ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
4479da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !11
4480911991d2SPhilip Reames; PROLOG:       header.prol.loopexit.unr-lcssa:
4481911991d2SPhilip Reames; PROLOG-NEXT:    %i6.unr.ph = phi i64 [ %add.prol, %latch.prol ]
4482911991d2SPhilip Reames; PROLOG-NEXT:    br label %header.prol.loopexit
4483911991d2SPhilip Reames; PROLOG:       header.prol.loopexit:
4484911991d2SPhilip Reames; PROLOG-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %header.prol.loopexit.unr-lcssa ]
4485*81c648a3SNikita Popov; PROLOG-NEXT:    %3 = icmp ult i64 %2, 7
4486323514deSNikita Popov; PROLOG-NEXT:    br i1 %3, label %latchexit, label %preheader.new
4487911991d2SPhilip Reames; PROLOG:       preheader.new:
4488911991d2SPhilip Reames; PROLOG-NEXT:    br label %header
4489911991d2SPhilip Reames; PROLOG:       header:
4490911991d2SPhilip Reames; PROLOG-NEXT:    %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.7, %latch.7 ]
4491911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4492911991d2SPhilip Reames; PROLOG:       latch:
4493911991d2SPhilip Reames; PROLOG-NEXT:    %add = add nuw nsw i64 %i6, 1
449472031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4495911991d2SPhilip Reames; PROLOG:       latch.1:
4496911991d2SPhilip Reames; PROLOG-NEXT:    %add.1 = add nuw nsw i64 %add, 1
449772031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.2
4498911991d2SPhilip Reames; PROLOG:       latch.2:
4499911991d2SPhilip Reames; PROLOG-NEXT:    %add.2 = add nuw nsw i64 %add.1, 1
450072031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.3
4501911991d2SPhilip Reames; PROLOG:       latch.3:
4502911991d2SPhilip Reames; PROLOG-NEXT:    %add.3 = add nuw nsw i64 %add.2, 1
450372031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.4
4504911991d2SPhilip Reames; PROLOG:       latch.4:
4505911991d2SPhilip Reames; PROLOG-NEXT:    %add.4 = add nuw nsw i64 %add.3, 1
450672031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.5
4507911991d2SPhilip Reames; PROLOG:       latch.5:
4508911991d2SPhilip Reames; PROLOG-NEXT:    %add.5 = add nuw nsw i64 %add.4, 1
450972031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.6
4510911991d2SPhilip Reames; PROLOG:       latch.6:
4511911991d2SPhilip Reames; PROLOG-NEXT:    %add.6 = add nuw nsw i64 %add.5, 1
451272031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.7
4513911991d2SPhilip Reames; PROLOG:       latch.7:
4514911991d2SPhilip Reames; PROLOG-NEXT:    %add.7 = add nuw nsw i64 %add.6, 1
4515911991d2SPhilip Reames; PROLOG-NEXT:    %i9.7 = icmp slt i64 %add.7, %sext
4516911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %i9.7, label %header, label %latchexit.unr-lcssa
4517de2fed61SPhilip Reames; PROLOG:       latchexit.unr-lcssa:
4518de2fed61SPhilip Reames; PROLOG-NEXT:    br label %latchexit
4519de2fed61SPhilip Reames; PROLOG:       latchexit:
4520de2fed61SPhilip Reames; PROLOG-NEXT:    unreachable
4521de2fed61SPhilip Reames; PROLOG:       loopexit2:
4522de2fed61SPhilip Reames; PROLOG-NEXT:    ret i32 %shft
4523de2fed61SPhilip Reames; PROLOG:       loopexit1.loopexit:
452472031407SPhilip Reames; 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 ]
4525de2fed61SPhilip Reames; PROLOG-NEXT:    br label %loopexit1
4526de2fed61SPhilip Reames; PROLOG:       loopexit1.loopexit1:
4527de2fed61SPhilip Reames; PROLOG-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.prol ]
4528de2fed61SPhilip Reames; PROLOG-NEXT:    br label %loopexit1
4529de2fed61SPhilip Reames; PROLOG:       loopexit1:
4530de2fed61SPhilip Reames; PROLOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
4531de2fed61SPhilip Reames; PROLOG-NEXT:    ret i32 %sext3
4532911991d2SPhilip Reames;
4533911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @test7(
4534911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:  bb:
4535911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %i = icmp slt i32 undef, 2
4536911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %sext = sext i32 undef to i64
4537911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %shft = ashr exact i32 %arg, 16
4538911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %i, label %loopexit2, label %preheader
4539911991d2SPhilip Reames; PROLOG-BLOCK:       preheader:
4540911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %0 = add nsw i64 %sext, -1
4541*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %1 = freeze i64 %0
4542*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %2 = add i64 %1, -1
4543*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %1, 1
4544911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4545*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
4546911991d2SPhilip Reames; PROLOG-BLOCK:       header.prol.preheader:
4547911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol
4548911991d2SPhilip Reames; PROLOG-BLOCK:       header.prol:
4549911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1, label %latch.prol
4550911991d2SPhilip Reames; PROLOG-BLOCK:       latch.prol:
4551911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
4552911991d2SPhilip Reames; PROLOG-BLOCK:       header.prol.loopexit:
4553b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ 2, %latch.prol ]
4554*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %3 = icmp ult i64 %2, 1
4555323514deSNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %3, label %latchexit, label %preheader.new
4556911991d2SPhilip Reames; PROLOG-BLOCK:       preheader.new:
4557911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header
4558911991d2SPhilip Reames; PROLOG-BLOCK:       header:
4559911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.1, %latch.1 ]
4560911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
4561911991d2SPhilip Reames; PROLOG-BLOCK:       latch:
4562911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %add = add nuw nsw i64 %i6, 1
456372031407SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
4564de2fed61SPhilip Reames; PROLOG-BLOCK:       latch.1:
4565de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %add, 1
4566de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %i9.1 = icmp slt i64 %add.1, %sext
4567da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %i9.1, label %header, label %latchexit.unr-lcssa, !llvm.loop !11
4568911991d2SPhilip Reames; PROLOG-BLOCK:       latchexit.unr-lcssa:
4569911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %latchexit
4570911991d2SPhilip Reames; PROLOG-BLOCK:       latchexit:
4571911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    unreachable
4572911991d2SPhilip Reames; PROLOG-BLOCK:       loopexit2:
4573911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret i32 %shft
4574911991d2SPhilip Reames; PROLOG-BLOCK:       loopexit1.loopexit:
457572031407SPhilip Reames; PROLOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]
4576911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loopexit1
4577911991d2SPhilip Reames; PROLOG-BLOCK:       loopexit1:
4578911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.prol ], [ %sext3.ph, %loopexit1.loopexit ]
4579911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret i32 %sext3
4580911991d2SPhilip Reames;
4581cee313d2SEric Christopherbb:
458217a15c32SRoman Lebedev  %i = icmp slt i32 undef, 2
4583cee313d2SEric Christopher  %sext = sext i32 undef to i64
4584cee313d2SEric Christopher  %shft = ashr exact i32 %arg, 16
458517a15c32SRoman Lebedev  br i1 %i, label %loopexit2, label %preheader
4586cee313d2SEric Christopher
4587cee313d2SEric Christopherpreheader:                                              ; preds = %bb2
4588cee313d2SEric Christopher  br label %header
4589cee313d2SEric Christopher
4590cee313d2SEric Christopherheader:                                              ; preds = %latch, %preheader
459117a15c32SRoman Lebedev  %i6 = phi i64 [ 1, %preheader ], [ %add, %latch ]
4592cee313d2SEric Christopher  br i1 false, label %loopexit1, label %latch
4593cee313d2SEric Christopher
4594cee313d2SEric Christopherlatch:                                              ; preds = %header
459517a15c32SRoman Lebedev  %add = add nuw nsw i64 %i6, 1
459617a15c32SRoman Lebedev  %i9 = icmp slt i64 %add, %sext
459717a15c32SRoman Lebedev  br i1 %i9, label %header, label %latchexit
4598cee313d2SEric Christopher
4599cee313d2SEric Christopherlatchexit:                                             ; preds = %latch
4600cee313d2SEric Christopher  unreachable
4601cee313d2SEric Christopher
4602cee313d2SEric Christopherloopexit2:                                             ; preds = %bb2
4603cee313d2SEric Christopher  ret i32 %shft
4604cee313d2SEric Christopher
4605cee313d2SEric Christopherloopexit1:                                             ; preds = %header
4606cee313d2SEric Christopher  %sext3 = phi i32 [ %shft, %header ]
4607cee313d2SEric Christopher  ret i32 %sext3
4608cee313d2SEric Christopher}
4609cee313d2SEric Christopher
4610fa82a3d0SPhilip Reames; Nested loop and inner loop is unrolled.  The tricky bit here is that
4611fa82a3d0SPhilip Reames; several blocks in the inner loop fall out of the outer block when we
4612fa82a3d0SPhilip Reames; use the epilogue block remainder strategy.
4613cee313d2SEric Christopherdefine void @test8() {
4614911991d2SPhilip Reames; EPILOG-LABEL: @test8(
4615911991d2SPhilip Reames; EPILOG-NEXT:  bb:
4616911991d2SPhilip Reames; EPILOG-NEXT:    br label %outerloop
4617fa82a3d0SPhilip Reames; EPILOG:       outerloop.loopexit.loopexit:
4618fa82a3d0SPhilip Reames; EPILOG-NEXT:    br label %outerloop.loopexit
4619fa82a3d0SPhilip Reames; EPILOG:       outerloop.loopexit.loopexit1:
4620fa82a3d0SPhilip Reames; EPILOG-NEXT:    br label %outerloop.loopexit
4621911991d2SPhilip Reames; EPILOG:       outerloop.loopexit:
4622911991d2SPhilip Reames; EPILOG-NEXT:    br label %outerloop
4623911991d2SPhilip Reames; EPILOG:       outerloop:
4624911991d2SPhilip Reames; EPILOG-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]
4625fa82a3d0SPhilip Reames; EPILOG-NEXT:    %0 = sub i64 100, %i
4626fa82a3d0SPhilip Reames; EPILOG-NEXT:    %1 = sub i64 99, %i
4627fa82a3d0SPhilip Reames; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
4628fa82a3d0SPhilip Reames; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
4629fa82a3d0SPhilip Reames; EPILOG-NEXT:    br i1 %2, label %exit.unr-lcssa, label %outerloop.new
4630fa82a3d0SPhilip Reames; EPILOG:       outerloop.new:
4631fa82a3d0SPhilip Reames; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
4632911991d2SPhilip Reames; EPILOG-NEXT:    br label %innerH
4633911991d2SPhilip Reames; EPILOG:       innerH:
4634fa82a3d0SPhilip Reames; EPILOG-NEXT:    %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.7, %latch.7 ]
463537ead201SPhilip Reames; EPILOG-NEXT:    %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.7, %latch.7 ]
4636911991d2SPhilip Reames; EPILOG-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4637fa82a3d0SPhilip Reames; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4638911991d2SPhilip Reames; EPILOG:       latch:
463937ead201SPhilip Reames; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
4640fa82a3d0SPhilip Reames; EPILOG-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
464172031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4642fa82a3d0SPhilip Reames; EPILOG:       latch.1:
464337ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
4644fa82a3d0SPhilip Reames; EPILOG-NEXT:    %i4.2 = add nuw nsw i64 %i4.1, 1
464572031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.2
4646fa82a3d0SPhilip Reames; EPILOG:       latch.2:
464737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
4648fa82a3d0SPhilip Reames; EPILOG-NEXT:    %i4.3 = add nuw nsw i64 %i4.2, 1
464972031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.3
4650fa82a3d0SPhilip Reames; EPILOG:       latch.3:
465137ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
4652fa82a3d0SPhilip Reames; EPILOG-NEXT:    %i4.4 = add nuw nsw i64 %i4.3, 1
465372031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.4
4654fa82a3d0SPhilip Reames; EPILOG:       latch.4:
465537ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
4656fa82a3d0SPhilip Reames; EPILOG-NEXT:    %i4.5 = add nuw nsw i64 %i4.4, 1
465772031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.5
4658fa82a3d0SPhilip Reames; EPILOG:       latch.5:
465937ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
4660fa82a3d0SPhilip Reames; EPILOG-NEXT:    %i4.6 = add nuw nsw i64 %i4.5, 1
466172031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.6
4662fa82a3d0SPhilip Reames; EPILOG:       latch.6:
466337ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
4664fa82a3d0SPhilip Reames; EPILOG-NEXT:    %i4.7 = add nuw nsw i64 %i4.6, 1
466572031407SPhilip Reames; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.7
4666fa82a3d0SPhilip Reames; EPILOG:       latch.7:
466737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
466837ead201SPhilip Reames; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
4669fa82a3d0SPhilip Reames; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %innerH, label %exit.unr-lcssa.loopexit
4670de2fed61SPhilip Reames; EPILOG:       exit.unr-lcssa.loopexit:
4671de2fed61SPhilip Reames; EPILOG-NEXT:    %i3.unr.ph = phi i64 [ %i4.7, %latch.7 ]
4672de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit.unr-lcssa
4673de2fed61SPhilip Reames; EPILOG:       exit.unr-lcssa:
4674de2fed61SPhilip Reames; EPILOG-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %exit.unr-lcssa.loopexit ]
4675de2fed61SPhilip Reames; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4676de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit
4677de2fed61SPhilip Reames; EPILOG:       innerH.epil.preheader:
4678de2fed61SPhilip Reames; EPILOG-NEXT:    br label %innerH.epil
4679de2fed61SPhilip Reames; EPILOG:       innerH.epil:
4680de2fed61SPhilip Reames; EPILOG-NEXT:    %i3.epil = phi i64 [ %i4.epil, %latch.epil ], [ %i3.unr, %innerH.epil.preheader ]
468137ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %innerH.epil.preheader ], [ %epil.iter.next, %latch.epil ]
4682de2fed61SPhilip Reames; EPILOG-NEXT:    %i4.epil = add nuw nsw i64 %i3.epil, 1
4683de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit1, label %latch.epil
4684de2fed61SPhilip Reames; EPILOG:       latch.epil:
4685de2fed61SPhilip Reames; EPILOG-NEXT:    %i6.epil = icmp ult i64 %i4.epil, 100
468637ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
468737ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
4688da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %innerH.epil, label %exit.epilog-lcssa, !llvm.loop !12
4689de2fed61SPhilip Reames; EPILOG:       exit.epilog-lcssa:
4690de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit
4691de2fed61SPhilip Reames; EPILOG:       exit.loopexit:
4692de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit
4693de2fed61SPhilip Reames; EPILOG:       exit:
4694de2fed61SPhilip Reames; EPILOG-NEXT:    ret void
4695911991d2SPhilip Reames;
4696911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @test8(
4697911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:  bb:
4698911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %outerloop
4699fa82a3d0SPhilip Reames; EPILOG-BLOCK:       outerloop.loopexit.loopexit:
4700fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %outerloop.loopexit
4701911991d2SPhilip Reames; EPILOG-BLOCK:       outerloop.loopexit:
4702fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %exit.unr-lcssa.1, label %outerloop.new.1
4703fa82a3d0SPhilip Reames; EPILOG-BLOCK:       outerloop.new.1:
4704fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %innerH.1
4705fa82a3d0SPhilip Reames; EPILOG-BLOCK:       innerH.1:
4706fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    %i3.1 = phi i64 [ 0, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ]
470737ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.1 = phi i64 [ 0, %outerloop.new.1 ], [ %niter.next.1.1, %latch.1.1 ]
470837ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %i4.12 = add nuw nsw i64 %i3.1, 1
470937ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.14
471037ead201SPhilip Reames; EPILOG-BLOCK:       latch.14:
471137ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.13 = add nuw nsw i64 %niter.1, 1
471237ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i4.12, 1
471372031407SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1
4714911991d2SPhilip Reames; EPILOG-BLOCK:       latch.1.1:
471537ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1.1 = add i64 %niter.next.13, 1
471637ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1.1 = icmp ne i64 %niter.next.1.1, 100
4717da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit.1, !llvm.loop !12
4718fa82a3d0SPhilip Reames; EPILOG-BLOCK:       exit.unr-lcssa.loopexit.1:
4719fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit.unr-lcssa.1
4720fa82a3d0SPhilip Reames; EPILOG-BLOCK:       outerloop.loopexit.loopexit.1:
4721fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %outerloop.loopexit.1
4722fa82a3d0SPhilip Reames; EPILOG-BLOCK:       exit.unr-lcssa.1:
4723fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %innerH.epil.preheader.1, label %exit.loopexit
4724fa82a3d0SPhilip Reames; EPILOG-BLOCK:       innerH.epil.preheader.1:
4725fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %innerH.epil.1
4726fa82a3d0SPhilip Reames; EPILOG-BLOCK:       innerH.epil.1:
4727fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.epil
4728911991d2SPhilip Reames; EPILOG-BLOCK:       outerloop.loopexit.1:
4729da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !13
4730de2fed61SPhilip Reames; EPILOG-BLOCK:       outerloop:
4731de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]
4732de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %0 = sub i64 100, %i
4733de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %1 = sub i64 99, %i
4734de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4735de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4736de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit.unr-lcssa, label %outerloop.new
4737de2fed61SPhilip Reames; EPILOG-BLOCK:       outerloop.new:
4738de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
4739de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %innerH
4740de2fed61SPhilip Reames; EPILOG-BLOCK:       innerH:
4741de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %i3 = phi i64 [ %i, %outerloop.new ], [ %i4.1, %latch.1 ]
474237ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %outerloop.new ], [ %niter.next.1, %latch.1 ]
4743de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4744de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4745de2fed61SPhilip Reames; EPILOG-BLOCK:       latch:
474637ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
4747de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
474872031407SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4749de2fed61SPhilip Reames; EPILOG-BLOCK:       latch.1:
475037ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
475137ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
4752da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !12
4753de2fed61SPhilip Reames; EPILOG-BLOCK:       exit.unr-lcssa.loopexit:
4754de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4755de2fed61SPhilip Reames; EPILOG-BLOCK:       exit.unr-lcssa:
4756de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4757de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %innerH.epil.preheader, label %exit.loopexit
4758de2fed61SPhilip Reames; EPILOG-BLOCK:       innerH.epil.preheader:
4759de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %innerH.epil
4760de2fed61SPhilip Reames; EPILOG-BLOCK:       innerH.epil:
4761de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.epil
4762de2fed61SPhilip Reames; EPILOG-BLOCK:       latch.epil:
4763de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit
4764de2fed61SPhilip Reames; EPILOG-BLOCK:       exit.loopexit:
4765de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit
4766de2fed61SPhilip Reames; EPILOG-BLOCK:       exit:
4767de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    ret void
4768911991d2SPhilip Reames;
4769911991d2SPhilip Reames; PROLOG-LABEL: @test8(
4770911991d2SPhilip Reames; PROLOG-NEXT:  bb:
4771911991d2SPhilip Reames; PROLOG-NEXT:    br label %outerloop
4772911991d2SPhilip Reames; PROLOG:       outerloop.loopexit.loopexit:
4773911991d2SPhilip Reames; PROLOG-NEXT:    br label %outerloop.loopexit
4774911991d2SPhilip Reames; PROLOG:       outerloop.loopexit.loopexit1:
4775911991d2SPhilip Reames; PROLOG-NEXT:    br label %outerloop.loopexit
4776911991d2SPhilip Reames; PROLOG:       outerloop.loopexit:
4777911991d2SPhilip Reames; PROLOG-NEXT:    br label %outerloop
4778cee313d2SEric Christopher; PROLOG:       outerloop:
4779911991d2SPhilip Reames; PROLOG-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]
4780911991d2SPhilip Reames; PROLOG-NEXT:    %0 = sub i64 100, %i
4781911991d2SPhilip Reames; PROLOG-NEXT:    %1 = sub i64 99, %i
4782911991d2SPhilip Reames; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
4783911991d2SPhilip Reames; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4784911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit
4785911991d2SPhilip Reames; PROLOG:       innerH.prol.preheader:
4786911991d2SPhilip Reames; PROLOG-NEXT:    br label %innerH.prol
4787911991d2SPhilip Reames; PROLOG:       innerH.prol:
4788911991d2SPhilip Reames; PROLOG-NEXT:    %i3.prol = phi i64 [ %i4.prol, %latch.prol ], [ %i, %innerH.prol.preheader ]
478937ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %innerH.prol.preheader ], [ %prol.iter.next, %latch.prol ]
4790911991d2SPhilip Reames; PROLOG-NEXT:    %i4.prol = add nuw nsw i64 %i3.prol, 1
4791911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit1, label %latch.prol
4792911991d2SPhilip Reames; PROLOG:       latch.prol:
4793911991d2SPhilip Reames; PROLOG-NEXT:    %i6.prol = icmp ult i64 %i4.prol, 100
479437ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
479537ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
4796da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %innerH.prol, label %innerH.prol.loopexit.unr-lcssa, !llvm.loop !12
4797911991d2SPhilip Reames; PROLOG:       innerH.prol.loopexit.unr-lcssa:
4798911991d2SPhilip Reames; PROLOG-NEXT:    %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ]
4799911991d2SPhilip Reames; PROLOG-NEXT:    br label %innerH.prol.loopexit
4800911991d2SPhilip Reames; PROLOG:       innerH.prol.loopexit:
4801911991d2SPhilip Reames; PROLOG-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %innerH.prol.loopexit.unr-lcssa ]
4802911991d2SPhilip Reames; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
4803911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %2, label %exit.loopexit, label %outerloop.new
4804911991d2SPhilip Reames; PROLOG:       outerloop.new:
4805911991d2SPhilip Reames; PROLOG-NEXT:    br label %innerH
4806911991d2SPhilip Reames; PROLOG:       innerH:
4807911991d2SPhilip Reames; PROLOG-NEXT:    %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.7, %latch.7 ]
4808911991d2SPhilip Reames; PROLOG-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4809911991d2SPhilip Reames; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4810911991d2SPhilip Reames; PROLOG:       latch:
4811911991d2SPhilip Reames; PROLOG-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
481272031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4813911991d2SPhilip Reames; PROLOG:       latch.1:
4814911991d2SPhilip Reames; PROLOG-NEXT:    %i4.2 = add nuw nsw i64 %i4.1, 1
481572031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.2
4816911991d2SPhilip Reames; PROLOG:       latch.2:
4817911991d2SPhilip Reames; PROLOG-NEXT:    %i4.3 = add nuw nsw i64 %i4.2, 1
481872031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.3
4819911991d2SPhilip Reames; PROLOG:       latch.3:
4820911991d2SPhilip Reames; PROLOG-NEXT:    %i4.4 = add nuw nsw i64 %i4.3, 1
482172031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.4
4822911991d2SPhilip Reames; PROLOG:       latch.4:
4823911991d2SPhilip Reames; PROLOG-NEXT:    %i4.5 = add nuw nsw i64 %i4.4, 1
482472031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.5
4825911991d2SPhilip Reames; PROLOG:       latch.5:
4826911991d2SPhilip Reames; PROLOG-NEXT:    %i4.6 = add nuw nsw i64 %i4.5, 1
482772031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.6
4828cee313d2SEric Christopher; PROLOG:       latch.6:
4829911991d2SPhilip Reames; PROLOG-NEXT:    %i4.7 = add nuw nsw i64 %i4.6, 1
483072031407SPhilip Reames; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.7
48310f22e783SRoman Lebedev; PROLOG:       latch.7:
4832911991d2SPhilip Reames; PROLOG-NEXT:    %i6.7 = icmp ult i64 %i4.7, 100
483317a15c32SRoman Lebedev; PROLOG-NEXT:    br i1 %i6.7, label %innerH, label %exit.unr-lcssa
4834de2fed61SPhilip Reames; PROLOG:       exit.unr-lcssa:
4835de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit
4836de2fed61SPhilip Reames; PROLOG:       exit.loopexit:
4837de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit
4838de2fed61SPhilip Reames; PROLOG:       exit:
4839de2fed61SPhilip Reames; PROLOG-NEXT:    ret void
4840911991d2SPhilip Reames;
4841911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @test8(
4842911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:  bb:
4843911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %outerloop
4844911991d2SPhilip Reames; PROLOG-BLOCK:       outerloop.loopexit.loopexit:
4845911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %outerloop.loopexit
4846911991d2SPhilip Reames; PROLOG-BLOCK:       outerloop.loopexit:
4847b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %innerH.prol.preheader.1, label %innerH.prol.loopexit.1
4848de2fed61SPhilip Reames; PROLOG-BLOCK:       innerH.prol.preheader.1:
4849de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %innerH.prol.1
4850de2fed61SPhilip Reames; PROLOG-BLOCK:       innerH.prol.1:
4851de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.prol.1
4852de2fed61SPhilip Reames; PROLOG-BLOCK:       latch.prol.1:
4853de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit.1
4854de2fed61SPhilip Reames; PROLOG-BLOCK:       innerH.prol.loopexit.1:
4855de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %i3.unr.1 = phi i64 [ 0, %outerloop.loopexit ], [ 1, %latch.prol.1 ]
4856de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %exit.loopexit, label %outerloop.new.1
4857de2fed61SPhilip Reames; PROLOG-BLOCK:       outerloop.new.1:
4858de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %innerH.1
4859de2fed61SPhilip Reames; PROLOG-BLOCK:       innerH.1:
4860de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %i3.1 = phi i64 [ %i3.unr.1, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ]
4861de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %i4.11 = add nuw nsw i64 %i3.1, 1
4862de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.12
4863de2fed61SPhilip Reames; PROLOG-BLOCK:       latch.12:
4864de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i4.11, 1
486572031407SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1
4866de2fed61SPhilip Reames; PROLOG-BLOCK:       latch.1.1:
4867de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %i6.1.1 = icmp ult i64 %i4.1.1, 100
4868da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %i6.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit3, !llvm.loop !12
4869de2fed61SPhilip Reames; PROLOG-BLOCK:       outerloop.loopexit.loopexit.1:
4870de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %outerloop.loopexit.1
4871de2fed61SPhilip Reames; PROLOG-BLOCK:       outerloop.loopexit.1:
4872da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !13
4873911991d2SPhilip Reames; PROLOG-BLOCK:       outerloop:
4874911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]
4875911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %0 = sub i64 100, %i
4876911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %1 = sub i64 99, %i
4877911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
4878911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
4879b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit
4880911991d2SPhilip Reames; PROLOG-BLOCK:       innerH.prol.preheader:
4881911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %innerH.prol
4882911991d2SPhilip Reames; PROLOG-BLOCK:       innerH.prol:
4883911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %i4.prol = add nuw nsw i64 %i, 1
4884911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.prol
4885911991d2SPhilip Reames; PROLOG-BLOCK:       latch.prol:
4886911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit
4887911991d2SPhilip Reames; PROLOG-BLOCK:       innerH.prol.loopexit:
4888b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i4.prol, %latch.prol ]
4889911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
4890911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit.loopexit, label %outerloop.new
4891911991d2SPhilip Reames; PROLOG-BLOCK:       outerloop.new:
4892911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %innerH
4893911991d2SPhilip Reames; PROLOG-BLOCK:       innerH:
4894b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.1, %latch.1 ]
4895911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %i4 = add nuw nsw i64 %i3, 1
4896911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
4897911991d2SPhilip Reames; PROLOG-BLOCK:       latch:
4898911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
489972031407SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
4900de2fed61SPhilip Reames; PROLOG-BLOCK:       latch.1:
4901de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %i6.1 = icmp ult i64 %i4.1, 100
4902da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %i6.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !12
4903911991d2SPhilip Reames; PROLOG-BLOCK:       exit.unr-lcssa.loopexit:
4904911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4905911991d2SPhilip Reames; PROLOG-BLOCK:       exit.unr-lcssa.loopexit3:
4906911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa
4907911991d2SPhilip Reames; PROLOG-BLOCK:       exit.unr-lcssa:
4908911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit
4909911991d2SPhilip Reames; PROLOG-BLOCK:       exit.loopexit:
4910911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit
4911911991d2SPhilip Reames; PROLOG-BLOCK:       exit:
4912911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret void
4913911991d2SPhilip Reames;
4914911991d2SPhilip Reames
4915cee313d2SEric Christopherbb:
4916cee313d2SEric Christopher  br label %outerloop
4917cee313d2SEric Christopher
4918cee313d2SEric Christopherouterloop:                                              ; preds = %innerH, %bb
491917a15c32SRoman Lebedev  %i = phi i64 [ 3, %bb ], [ 0, %innerH ]
4920cee313d2SEric Christopher  br label %innerH
4921cee313d2SEric Christopher
4922cee313d2SEric ChristopherinnerH:                                              ; preds = %latch, %outerloop
492317a15c32SRoman Lebedev  %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ]
492417a15c32SRoman Lebedev  %i4 = add nuw nsw i64 %i3, 1
4925cee313d2SEric Christopher  br i1 false, label %outerloop, label %latch
4926cee313d2SEric Christopher
4927cee313d2SEric Christopherlatch:                                              ; preds = %innerH
492817a15c32SRoman Lebedev  %i6 = icmp ult i64 %i4, 100
492917a15c32SRoman Lebedev  br i1 %i6, label %innerH, label %exit
4930cee313d2SEric Christopher
4931cee313d2SEric Christopherexit:                                              ; preds = %latch
4932cee313d2SEric Christopher  ret void
4933cee313d2SEric Christopher}
4934cee313d2SEric Christopher
4935cee313d2SEric Christopherdeclare i8 addrspace(1)* @foo(i32)
4936cee313d2SEric Christopher; inner loop prolog unrolled
4937cee313d2SEric Christopher; a value from outer loop is used in exit block of inner loop.
4938cee313d2SEric Christopher; Don't create VMap entries for such values (%trip).
4939cee313d2SEric Christopherdefine i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) {
4940911991d2SPhilip Reames; EPILOG-LABEL: @test9(
4941911991d2SPhilip Reames; EPILOG-NEXT:  bb:
4942fa82a3d0SPhilip Reames; EPILOG-NEXT:    %0 = add i32 %n, -1
4943911991d2SPhilip Reames; EPILOG-NEXT:    br label %outerloopHdr
4944911991d2SPhilip Reames; EPILOG:       outerloopHdr:
4945911991d2SPhilip Reames; EPILOG-NEXT:    %trip = add i32 %n, -1
4946911991d2SPhilip Reames; EPILOG-NEXT:    %outercnd = icmp slt i32 0, %trip
4947911991d2SPhilip Reames; EPILOG-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
4948911991d2SPhilip Reames; EPILOG:       preheader:
4949911991d2SPhilip Reames; EPILOG-NEXT:    %i4 = zext i32 0 to i64
4950*81c648a3SNikita Popov; EPILOG-NEXT:    %1 = freeze i32 %0
4951*81c648a3SNikita Popov; EPILOG-NEXT:    %2 = add i32 %1, -1
4952*81c648a3SNikita Popov; EPILOG-NEXT:    %xtraiter = and i32 %1, 7
4953*81c648a3SNikita Popov; EPILOG-NEXT:    %3 = icmp ult i32 %2, 7
4954323514deSNikita Popov; EPILOG-NEXT:    br i1 %3, label %outerLatch.loopexit.unr-lcssa, label %preheader.new
4955fa82a3d0SPhilip Reames; EPILOG:       preheader.new:
4956*81c648a3SNikita Popov; EPILOG-NEXT:    %unroll_iter = sub i32 %1, %xtraiter
4957911991d2SPhilip Reames; EPILOG-NEXT:    br label %header
4958911991d2SPhilip Reames; EPILOG:       header:
4959fa82a3d0SPhilip Reames; EPILOG-NEXT:    %phi = phi i64 [ %i4, %preheader.new ], [ %iv.next.7, %latch.7 ]
496037ead201SPhilip Reames; EPILOG-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.7, %latch.7 ]
4961fa82a3d0SPhilip Reames; EPILOG-NEXT:    br i1 true, label %latch, label %innerexit.loopexit
4962fa82a3d0SPhilip Reames; EPILOG:       innerexit.loopexit:
496372031407SPhilip Reames; EPILOG-NEXT:    %trip.lcssa.ph = phi i32 [ %trip, %header ], [ %trip, %latch ], [ %trip, %latch.1 ], [ %trip, %latch.2 ], [ %trip, %latch.3 ], [ %trip, %latch.4 ], [ %trip, %latch.5 ], [ %trip, %latch.6 ]
4964fa82a3d0SPhilip Reames; EPILOG-NEXT:    br label %innerexit
4965fa82a3d0SPhilip Reames; EPILOG:       innerexit.loopexit1:
4966fa82a3d0SPhilip Reames; EPILOG-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.epil ]
4967fa82a3d0SPhilip Reames; EPILOG-NEXT:    br label %innerexit
4968911991d2SPhilip Reames; EPILOG:       innerexit:
4969fa82a3d0SPhilip Reames; EPILOG-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
4970911991d2SPhilip Reames; EPILOG-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
4971911991d2SPhilip Reames; EPILOG-NEXT:    ret i8 addrspace(1)* %i9
4972911991d2SPhilip Reames; EPILOG:       latch:
4973911991d2SPhilip Reames; EPILOG-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
497437ead201SPhilip Reames; EPILOG-NEXT:    %niter.next = add nuw nsw i32 %niter, 1
497572031407SPhilip Reames; EPILOG-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit
4976fa82a3d0SPhilip Reames; EPILOG:       latch.1:
4977fa82a3d0SPhilip Reames; EPILOG-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
497837ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i32 %niter.next, 1
497972031407SPhilip Reames; EPILOG-NEXT:    br i1 true, label %latch.2, label %innerexit.loopexit
4980fa82a3d0SPhilip Reames; EPILOG:       latch.2:
4981fa82a3d0SPhilip Reames; EPILOG-NEXT:    %iv.next.2 = add nuw nsw i64 %iv.next.1, 1
498237ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i32 %niter.next.1, 1
498372031407SPhilip Reames; EPILOG-NEXT:    br i1 true, label %latch.3, label %innerexit.loopexit
4984fa82a3d0SPhilip Reames; EPILOG:       latch.3:
4985fa82a3d0SPhilip Reames; EPILOG-NEXT:    %iv.next.3 = add nuw nsw i64 %iv.next.2, 1
498637ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i32 %niter.next.2, 1
498772031407SPhilip Reames; EPILOG-NEXT:    br i1 true, label %latch.4, label %innerexit.loopexit
4988fa82a3d0SPhilip Reames; EPILOG:       latch.4:
4989fa82a3d0SPhilip Reames; EPILOG-NEXT:    %iv.next.4 = add nuw nsw i64 %iv.next.3, 1
499037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i32 %niter.next.3, 1
499172031407SPhilip Reames; EPILOG-NEXT:    br i1 true, label %latch.5, label %innerexit.loopexit
4992fa82a3d0SPhilip Reames; EPILOG:       latch.5:
4993fa82a3d0SPhilip Reames; EPILOG-NEXT:    %iv.next.5 = add nuw nsw i64 %iv.next.4, 1
499437ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i32 %niter.next.4, 1
499572031407SPhilip Reames; EPILOG-NEXT:    br i1 true, label %latch.6, label %innerexit.loopexit
4996fa82a3d0SPhilip Reames; EPILOG:       latch.6:
4997fa82a3d0SPhilip Reames; EPILOG-NEXT:    %iv.next.6 = add nuw nsw i64 %iv.next.5, 1
499837ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i32 %niter.next.5, 1
499972031407SPhilip Reames; EPILOG-NEXT:    br i1 true, label %latch.7, label %innerexit.loopexit
5000fa82a3d0SPhilip Reames; EPILOG:       latch.7:
5001fa82a3d0SPhilip Reames; EPILOG-NEXT:    %iv.next.7 = add nuw nsw i64 %iv.next.6, 1
500237ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.7 = add i32 %niter.next.6, 1
500337ead201SPhilip Reames; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i32 %niter.next.7, %unroll_iter
5004fa82a3d0SPhilip Reames; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit
5005de2fed61SPhilip Reames; EPILOG:       outerLatch.loopexit.unr-lcssa.loopexit:
5006de2fed61SPhilip Reames; EPILOG-NEXT:    %phi.unr.ph = phi i64 [ %iv.next.7, %latch.7 ]
5007de2fed61SPhilip Reames; EPILOG-NEXT:    br label %outerLatch.loopexit.unr-lcssa
5008de2fed61SPhilip Reames; EPILOG:       outerLatch.loopexit.unr-lcssa:
5009de2fed61SPhilip Reames; EPILOG-NEXT:    %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %outerLatch.loopexit.unr-lcssa.loopexit ]
5010de2fed61SPhilip Reames; EPILOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
5011de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit
5012de2fed61SPhilip Reames; EPILOG:       header.epil.preheader:
5013de2fed61SPhilip Reames; EPILOG-NEXT:    br label %header.epil
5014de2fed61SPhilip Reames; EPILOG:       header.epil:
5015de2fed61SPhilip Reames; EPILOG-NEXT:    %phi.epil = phi i64 [ %phi.unr, %header.epil.preheader ], [ %iv.next.epil, %latch.epil ]
501637ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter = phi i32 [ 0, %header.epil.preheader ], [ %epil.iter.next, %latch.epil ]
5017de2fed61SPhilip Reames; EPILOG-NEXT:    %i7.epil = trunc i64 %phi.epil to i32
5018de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 true, label %latch.epil, label %innerexit.loopexit1
5019de2fed61SPhilip Reames; EPILOG:       latch.epil:
5020de2fed61SPhilip Reames; EPILOG-NEXT:    %i11.epil = add nsw i32 %i7.epil, 1
5021de2fed61SPhilip Reames; EPILOG-NEXT:    %innercnd.epil = icmp slt i32 %i11.epil, %trip
5022de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.next.epil = add nuw nsw i64 %phi.epil, 1
502337ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.next = add i32 %epil.iter, 1
502437ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i32 %epil.iter.next, %xtraiter
5025da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %outerLatch.loopexit.epilog-lcssa, !llvm.loop !13
5026de2fed61SPhilip Reames; EPILOG:       outerLatch.loopexit.epilog-lcssa:
5027de2fed61SPhilip Reames; EPILOG-NEXT:    br label %outerLatch.loopexit
5028de2fed61SPhilip Reames; EPILOG:       outerLatch.loopexit:
5029de2fed61SPhilip Reames; EPILOG-NEXT:    br label %outerLatch
5030de2fed61SPhilip Reames; EPILOG:       outerLatch:
5031de2fed61SPhilip Reames; EPILOG-NEXT:    br label %outerloopHdr
5032911991d2SPhilip Reames;
5033911991d2SPhilip Reames; EPILOG-BLOCK-LABEL: @test9(
5034911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:  bb:
5035fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    %0 = add i32 %n, -1
5036911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %outerloopHdr
5037911991d2SPhilip Reames; EPILOG-BLOCK:       outerloopHdr:
5038911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %trip = add i32 %n, -1
5039911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %outercnd = icmp slt i32 0, %trip
5040911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
5041911991d2SPhilip Reames; EPILOG-BLOCK:       preheader:
5042*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %1 = freeze i32 %0
5043*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %2 = add i32 %1, -1
5044*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %xtraiter = and i32 %1, 1
5045*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %3 = icmp ult i32 %2, 1
5046323514deSNikita Popov; EPILOG-BLOCK-NEXT:    br i1 %3, label %outerLatch.loopexit.unr-lcssa, label %preheader.new
5047fa82a3d0SPhilip Reames; EPILOG-BLOCK:       preheader.new:
5048*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i32 %1, %xtraiter
5049911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header
5050911991d2SPhilip Reames; EPILOG-BLOCK:       header:
5051fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    %phi = phi i64 [ 0, %preheader.new ], [ %iv.next.1, %latch.1 ]
505237ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter = phi i32 [ 0, %preheader.new ], [ %niter.next.1, %latch.1 ]
5053fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 true, label %latch, label %innerexit.loopexit.loopexit
5054fa82a3d0SPhilip Reames; EPILOG-BLOCK:       innerexit.loopexit.loopexit:
505572031407SPhilip Reames; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ]
5056fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %innerexit.loopexit
5057fa82a3d0SPhilip Reames; EPILOG-BLOCK:       innerexit.loopexit.loopexit6:
505872031407SPhilip Reames; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph.ph7 = phi i32 [ %trip.1, %latch.15 ], [ %trip.1, %header.1 ]
5059fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %innerexit.loopexit
5060911991d2SPhilip Reames; EPILOG-BLOCK:       innerexit.loopexit:
5061fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph7, %innerexit.loopexit.loopexit6 ]
5062911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %innerexit
5063fa82a3d0SPhilip Reames; EPILOG-BLOCK:       innerexit.loopexit1:
5064fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.epil ], [ %trip.1, %header.epil.1 ]
5065911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %innerexit
5066911991d2SPhilip Reames; EPILOG-BLOCK:       innerexit:
5067fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
5068911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
5069911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret i8 addrspace(1)* %i9
5070911991d2SPhilip Reames; EPILOG-BLOCK:       latch:
5071911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
507237ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i32 %niter, 1
507372031407SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit.loopexit
5074de2fed61SPhilip Reames; EPILOG-BLOCK:       latch.1:
5075de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
507637ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i32 %niter.next, 1
507737ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i32 %niter.next.1, %unroll_iter
5078da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %header, label %outerLatch.loopexit.unr-lcssa.loopexit, !llvm.loop !14
5079fa82a3d0SPhilip Reames; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa.loopexit:
5080fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit.unr-lcssa
5081fa82a3d0SPhilip Reames; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa:
5082fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
5083fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %outerLatch.loopexit
5084fa82a3d0SPhilip Reames; EPILOG-BLOCK:       header.epil.preheader:
5085fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header.epil
5086fa82a3d0SPhilip Reames; EPILOG-BLOCK:       header.epil:
5087fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.epil, label %innerexit.loopexit1
5088fa82a3d0SPhilip Reames; EPILOG-BLOCK:       latch.epil:
5089fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit
5090911991d2SPhilip Reames; EPILOG-BLOCK:       outerLatch.loopexit:
5091911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %outerLatch
5092911991d2SPhilip Reames; EPILOG-BLOCK:       outerLatch:
5093911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -1
5094911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.1
5095911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.1
5096911991d2SPhilip Reames; EPILOG-BLOCK:       preheader.1:
5097*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %4 = freeze i32 %0
5098*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %5 = add i32 %4, -1
5099*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %xtraiter.1 = and i32 %4, 1
5100*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %6 = icmp ult i32 %5, 1
5101*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    br i1 %6, label %outerLatch.loopexit.unr-lcssa.1, label %preheader.new.1
5102fa82a3d0SPhilip Reames; EPILOG-BLOCK:       preheader.new.1:
5103*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %unroll_iter.1 = sub i32 %4, %xtraiter.1
5104fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header.1
5105fa82a3d0SPhilip Reames; EPILOG-BLOCK:       header.1:
5106fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    %phi.1 = phi i64 [ 0, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ]
510737ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.1 = phi i32 [ 0, %preheader.new.1 ], [ %niter.next.1.1, %latch.1.1 ]
5108fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.15, label %innerexit.loopexit.loopexit6
5109fa82a3d0SPhilip Reames; EPILOG-BLOCK:       latch.15:
5110fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv.next.13 = add nuw nsw i64 %phi.1, 1
511137ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.14 = add nuw nsw i32 %niter.1, 1
511272031407SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit6
5113911991d2SPhilip Reames; EPILOG-BLOCK:       latch.1.1:
5114fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv.next.1.1 = add nuw nsw i64 %iv.next.13, 1
511537ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1.1 = add i32 %niter.next.14, 1
511637ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1.1 = icmp ne i32 %niter.next.1.1, %unroll_iter.1
5117da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.loopexit.1, !llvm.loop !14
5118fa82a3d0SPhilip Reames; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa.loopexit.1:
5119fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit.unr-lcssa.1
5120fa82a3d0SPhilip Reames; EPILOG-BLOCK:       outerLatch.loopexit.unr-lcssa.1:
5121fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0
5122fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod.1, label %header.epil.preheader.1, label %outerLatch.loopexit.1
5123fa82a3d0SPhilip Reames; EPILOG-BLOCK:       header.epil.preheader.1:
5124fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %header.epil.1
5125fa82a3d0SPhilip Reames; EPILOG-BLOCK:       header.epil.1:
5126fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.epil.1, label %innerexit.loopexit1
5127fa82a3d0SPhilip Reames; EPILOG-BLOCK:       latch.epil.1:
5128fa82a3d0SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %outerLatch.loopexit.1
5129911991d2SPhilip Reames; EPILOG-BLOCK:       outerLatch.loopexit.1:
5130911991d2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %outerLatch.1
5131911991d2SPhilip Reames; EPILOG-BLOCK:       outerLatch.1:
5132da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %outerloopHdr, !llvm.loop !15
5133911991d2SPhilip Reames;
5134911991d2SPhilip Reames; PROLOG-LABEL: @test9(
5135911991d2SPhilip Reames; PROLOG-NEXT:  bb:
5136911991d2SPhilip Reames; PROLOG-NEXT:    %0 = add i32 %n, -1
5137911991d2SPhilip Reames; PROLOG-NEXT:    br label %outerloopHdr
5138911991d2SPhilip Reames; PROLOG:       outerloopHdr:
5139911991d2SPhilip Reames; PROLOG-NEXT:    %trip = add i32 %n, -1
5140911991d2SPhilip Reames; PROLOG-NEXT:    %outercnd = icmp slt i32 0, %trip
5141911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
5142911991d2SPhilip Reames; PROLOG:       preheader:
5143911991d2SPhilip Reames; PROLOG-NEXT:    %i4 = zext i32 0 to i64
5144*81c648a3SNikita Popov; PROLOG-NEXT:    %1 = freeze i32 %0
5145*81c648a3SNikita Popov; PROLOG-NEXT:    %2 = add i32 %1, -1
5146*81c648a3SNikita Popov; PROLOG-NEXT:    %xtraiter = and i32 %1, 7
5147911991d2SPhilip Reames; PROLOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
5148*81c648a3SNikita Popov; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
5149911991d2SPhilip Reames; PROLOG:       header.prol.preheader:
5150911991d2SPhilip Reames; PROLOG-NEXT:    br label %header.prol
5151cee313d2SEric Christopher; PROLOG:       header.prol:
5152911991d2SPhilip Reames; PROLOG-NEXT:    %phi.prol = phi i64 [ %i4, %header.prol.preheader ], [ %iv.next.prol, %latch.prol ]
515337ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter = phi i32 [ 0, %header.prol.preheader ], [ %prol.iter.next, %latch.prol ]
5154911991d2SPhilip Reames; PROLOG-NEXT:    %i7.prol = trunc i64 %phi.prol to i32
5155911991d2SPhilip Reames; PROLOG-NEXT:    br i1 true, label %latch.prol, label %innerexit.loopexit1
5156cee313d2SEric Christopher; PROLOG:       latch.prol:
5157911991d2SPhilip Reames; PROLOG-NEXT:    %i11.prol = add nsw i32 %i7.prol, 1
5158911991d2SPhilip Reames; PROLOG-NEXT:    %innercnd.prol = icmp slt i32 %i11.prol, %trip
5159911991d2SPhilip Reames; PROLOG-NEXT:    %iv.next.prol = add nuw nsw i64 %phi.prol, 1
516037ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.next = add i32 %prol.iter, 1
516137ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i32 %prol.iter.next, %xtraiter
5162da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !13
5163911991d2SPhilip Reames; PROLOG:       header.prol.loopexit.unr-lcssa:
5164911991d2SPhilip Reames; PROLOG-NEXT:    %phi.unr.ph = phi i64 [ %iv.next.prol, %latch.prol ]
5165911991d2SPhilip Reames; PROLOG-NEXT:    br label %header.prol.loopexit
5166911991d2SPhilip Reames; PROLOG:       header.prol.loopexit:
5167911991d2SPhilip Reames; PROLOG-NEXT:    %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %header.prol.loopexit.unr-lcssa ]
5168*81c648a3SNikita Popov; PROLOG-NEXT:    %3 = icmp ult i32 %2, 7
5169323514deSNikita Popov; PROLOG-NEXT:    br i1 %3, label %outerLatch.loopexit, label %preheader.new
5170911991d2SPhilip Reames; PROLOG:       preheader.new:
5171911991d2SPhilip Reames; PROLOG-NEXT:    br label %header
5172911991d2SPhilip Reames; PROLOG:       header:
5173911991d2SPhilip Reames; PROLOG-NEXT:    %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.7, %latch.7 ]
5174911991d2SPhilip Reames; PROLOG-NEXT:    br i1 true, label %latch, label %innerexit.loopexit
5175911991d2SPhilip Reames; PROLOG:       innerexit.loopexit:
517672031407SPhilip Reames; 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 ]
5177911991d2SPhilip Reames; PROLOG-NEXT:    br label %innerexit
5178911991d2SPhilip Reames; PROLOG:       innerexit.loopexit1:
5179911991d2SPhilip Reames; PROLOG-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ]
5180911991d2SPhilip Reames; PROLOG-NEXT:    br label %innerexit
5181911991d2SPhilip Reames; PROLOG:       innerexit:
5182911991d2SPhilip Reames; PROLOG-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
5183911991d2SPhilip Reames; PROLOG-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
5184911991d2SPhilip Reames; PROLOG-NEXT:    ret i8 addrspace(1)* %i9
5185911991d2SPhilip Reames; PROLOG:       latch:
5186911991d2SPhilip Reames; PROLOG-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
518772031407SPhilip Reames; PROLOG-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit
5188911991d2SPhilip Reames; PROLOG:       latch.1:
5189911991d2SPhilip Reames; PROLOG-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
519072031407SPhilip Reames; PROLOG-NEXT:    br i1 true, label %latch.2, label %innerexit.loopexit
5191911991d2SPhilip Reames; PROLOG:       latch.2:
5192911991d2SPhilip Reames; PROLOG-NEXT:    %iv.next.2 = add nuw nsw i64 %iv.next.1, 1
519372031407SPhilip Reames; PROLOG-NEXT:    br i1 true, label %latch.3, label %innerexit.loopexit
5194911991d2SPhilip Reames; PROLOG:       latch.3:
5195911991d2SPhilip Reames; PROLOG-NEXT:    %iv.next.3 = add nuw nsw i64 %iv.next.2, 1
519672031407SPhilip Reames; PROLOG-NEXT:    br i1 true, label %latch.4, label %innerexit.loopexit
5197911991d2SPhilip Reames; PROLOG:       latch.4:
5198911991d2SPhilip Reames; PROLOG-NEXT:    %iv.next.4 = add nuw nsw i64 %iv.next.3, 1
519972031407SPhilip Reames; PROLOG-NEXT:    br i1 true, label %latch.5, label %innerexit.loopexit
5200911991d2SPhilip Reames; PROLOG:       latch.5:
5201911991d2SPhilip Reames; PROLOG-NEXT:    %iv.next.5 = add nuw nsw i64 %iv.next.4, 1
520272031407SPhilip Reames; PROLOG-NEXT:    br i1 true, label %latch.6, label %innerexit.loopexit
5203911991d2SPhilip Reames; PROLOG:       latch.6:
5204911991d2SPhilip Reames; PROLOG-NEXT:    %iv.next.6 = add nuw nsw i64 %iv.next.5, 1
5205911991d2SPhilip Reames; PROLOG-NEXT:    %i7.7 = trunc i64 %iv.next.6 to i32
520672031407SPhilip Reames; PROLOG-NEXT:    br i1 true, label %latch.7, label %innerexit.loopexit
5207911991d2SPhilip Reames; PROLOG:       latch.7:
5208911991d2SPhilip Reames; PROLOG-NEXT:    %i11.7 = add nsw i32 %i7.7, 1
5209911991d2SPhilip Reames; PROLOG-NEXT:    %innercnd.7 = icmp slt i32 %i11.7, %trip
5210911991d2SPhilip Reames; PROLOG-NEXT:    %iv.next.7 = add nuw nsw i64 %iv.next.6, 1
5211911991d2SPhilip Reames; PROLOG-NEXT:    br i1 %innercnd.7, label %header, label %outerLatch.loopexit.unr-lcssa
5212de2fed61SPhilip Reames; PROLOG:       outerLatch.loopexit.unr-lcssa:
5213de2fed61SPhilip Reames; PROLOG-NEXT:    br label %outerLatch.loopexit
5214de2fed61SPhilip Reames; PROLOG:       outerLatch.loopexit:
5215de2fed61SPhilip Reames; PROLOG-NEXT:    br label %outerLatch
5216de2fed61SPhilip Reames; PROLOG:       outerLatch:
5217de2fed61SPhilip Reames; PROLOG-NEXT:    br label %outerloopHdr
5218911991d2SPhilip Reames;
5219911991d2SPhilip Reames; PROLOG-BLOCK-LABEL: @test9(
5220911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:  bb:
5221911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %0 = add i32 %n, -1
5222911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %outerloopHdr
5223911991d2SPhilip Reames; PROLOG-BLOCK:       outerloopHdr:
5224911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %trip = add i32 %n, -1
5225911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %outercnd = icmp slt i32 0, %trip
5226911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
5227911991d2SPhilip Reames; PROLOG-BLOCK:       preheader:
5228*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %1 = freeze i32 %0
5229*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %2 = add i32 %1, -1
5230*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %xtraiter = and i32 %1, 1
5231911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
5232*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
5233911991d2SPhilip Reames; PROLOG-BLOCK:       header.prol.preheader:
5234911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol
5235911991d2SPhilip Reames; PROLOG-BLOCK:       header.prol:
5236911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.prol, label %innerexit.loopexit1
5237911991d2SPhilip Reames; PROLOG-BLOCK:       latch.prol:
5238911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
5239911991d2SPhilip Reames; PROLOG-BLOCK:       header.prol.loopexit:
5240b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %phi.unr = phi i64 [ 0, %preheader ], [ 1, %latch.prol ]
5241*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %3 = icmp ult i32 %2, 1
5242323514deSNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %3, label %outerLatch.loopexit, label %preheader.new
5243911991d2SPhilip Reames; PROLOG-BLOCK:       preheader.new:
5244911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header
5245911991d2SPhilip Reames; PROLOG-BLOCK:       header:
5246b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.1, %latch.1 ]
5247911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 true, label %latch, label %innerexit.loopexit.loopexit
5248911991d2SPhilip Reames; PROLOG-BLOCK:       innerexit.loopexit.loopexit:
524972031407SPhilip Reames; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ]
5250911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %innerexit.loopexit
5251911991d2SPhilip Reames; PROLOG-BLOCK:       innerexit.loopexit.loopexit5:
525272031407SPhilip Reames; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph.ph6 = phi i32 [ %trip.1, %latch.14 ], [ %trip.1, %header.1 ]
5253911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %innerexit.loopexit
5254911991d2SPhilip Reames; PROLOG-BLOCK:       innerexit.loopexit:
5255911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph6, %innerexit.loopexit.loopexit5 ]
5256911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %innerexit
5257911991d2SPhilip Reames; PROLOG-BLOCK:       innerexit.loopexit1:
5258911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ], [ %trip.1, %header.prol.1 ]
5259911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %innerexit
5260911991d2SPhilip Reames; PROLOG-BLOCK:       innerexit:
5261911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
5262911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
5263911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret i8 addrspace(1)* %i9
5264911991d2SPhilip Reames; PROLOG-BLOCK:       latch:
5265911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
5266911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %i7.1 = trunc i64 %iv.next to i32
526772031407SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit.loopexit
5268de2fed61SPhilip Reames; PROLOG-BLOCK:       latch.1:
5269de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %i11.1 = add nsw i32 %i7.1, 1
5270de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %innercnd.1 = icmp slt i32 %i11.1, %trip
5271de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
5272da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %innercnd.1, label %header, label %outerLatch.loopexit.unr-lcssa, !llvm.loop !14
5273911991d2SPhilip Reames; PROLOG-BLOCK:       outerLatch.loopexit.unr-lcssa:
5274911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %outerLatch.loopexit
5275911991d2SPhilip Reames; PROLOG-BLOCK:       outerLatch.loopexit:
5276911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %outerLatch
5277911991d2SPhilip Reames; PROLOG-BLOCK:       outerLatch:
5278911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -1
5279911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.1
5280911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.1
5281911991d2SPhilip Reames; PROLOG-BLOCK:       preheader.1:
5282*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %4 = freeze i32 %0
5283*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %5 = add i32 %4, -1
5284*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %xtraiter.1 = and i32 %4, 1
5285911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0
5286*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod.1, label %header.prol.preheader.1, label %header.prol.loopexit.1
5287911991d2SPhilip Reames; PROLOG-BLOCK:       header.prol.preheader.1:
5288911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol.1
5289911991d2SPhilip Reames; PROLOG-BLOCK:       header.prol.1:
5290911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.prol.1, label %innerexit.loopexit1
5291911991d2SPhilip Reames; PROLOG-BLOCK:       latch.prol.1:
5292911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit.1
5293911991d2SPhilip Reames; PROLOG-BLOCK:       header.prol.loopexit.1:
5294b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %phi.unr.1 = phi i64 [ 0, %preheader.1 ], [ 1, %latch.prol.1 ]
5295*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %6 = icmp ult i32 %5, 1
5296*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %6, label %outerLatch.loopexit.1, label %preheader.new.1
5297911991d2SPhilip Reames; PROLOG-BLOCK:       preheader.new.1:
5298911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %header.1
5299911991d2SPhilip Reames; PROLOG-BLOCK:       header.1:
5300b604fcb7SPhilip Reames; PROLOG-BLOCK-NEXT:    %phi.1 = phi i64 [ %phi.unr.1, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ]
5301911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.14, label %innerexit.loopexit.loopexit5
5302911991d2SPhilip Reames; PROLOG-BLOCK:       latch.14:
5303911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv.next.13 = add nuw nsw i64 %phi.1, 1
5304911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %i7.1.1 = trunc i64 %iv.next.13 to i32
530572031407SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit5
5306911991d2SPhilip Reames; PROLOG-BLOCK:       latch.1.1:
5307911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %i11.1.1 = add nsw i32 %i7.1.1, 1
5308911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.1
5309911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv.next.1.1 = add nuw nsw i64 %iv.next.13, 1
5310da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %innercnd.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.1, !llvm.loop !14
5311911991d2SPhilip Reames; PROLOG-BLOCK:       outerLatch.loopexit.unr-lcssa.1:
5312911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %outerLatch.loopexit.1
5313911991d2SPhilip Reames; PROLOG-BLOCK:       outerLatch.loopexit.1:
5314911991d2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %outerLatch.1
5315911991d2SPhilip Reames; PROLOG-BLOCK:       outerLatch.1:
5316da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %outerloopHdr, !llvm.loop !15
5317911991d2SPhilip Reames;
5318cee313d2SEric Christopherbb:
5319cee313d2SEric Christopher  br label %outerloopHdr
5320cee313d2SEric Christopher
5321cee313d2SEric ChristopherouterloopHdr:                                              ; preds = %outerLatch, %bb
5322cee313d2SEric Christopher  %trip = add i32 %n, -1
5323cee313d2SEric Christopher  %outercnd = icmp slt i32 0, %trip
5324cee313d2SEric Christopher  br i1 %outercnd, label %preheader, label %outerLatch
5325cee313d2SEric Christopher
5326cee313d2SEric Christopherpreheader:                                              ; preds = %outerloopHdr
532717a15c32SRoman Lebedev  %i4 = zext i32 0 to i64
5328cee313d2SEric Christopher  br label %header
5329cee313d2SEric Christopher
5330cee313d2SEric Christopherheader:                                              ; preds = %latch, %preheader
533117a15c32SRoman Lebedev  %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ]
533217a15c32SRoman Lebedev  %i7 = trunc i64 %phi to i32
5333cee313d2SEric Christopher  br i1 true, label %latch, label %innerexit
5334cee313d2SEric Christopher
5335cee313d2SEric Christopherinnerexit:                                              ; preds = %header
533617a15c32SRoman Lebedev  %i9 = call i8 addrspace(1)* @foo(i32 %trip)
533717a15c32SRoman Lebedev  ret i8 addrspace(1)* %i9
5338cee313d2SEric Christopher
5339cee313d2SEric Christopherlatch:                                             ; preds = %header
534017a15c32SRoman Lebedev  %i11 = add nsw i32 %i7, 1
534117a15c32SRoman Lebedev  %innercnd = icmp slt i32 %i11, %trip
5342cee313d2SEric Christopher  %iv.next = add nuw nsw i64 %phi, 1
5343cee313d2SEric Christopher  br i1 %innercnd, label %header, label %outerLatch
5344cee313d2SEric Christopher
5345cee313d2SEric ChristopherouterLatch:                                             ; preds = %latch, %outerloopHdr
5346cee313d2SEric Christopher  br label %outerloopHdr
5347cee313d2SEric Christopher}
5348e01c91f2SPhilip Reames
5349e01c91f2SPhilip Reamesdeclare void @bar()
5350e01c91f2SPhilip Reames
5351e01c91f2SPhilip Reames; This is a case where we should be able to eliminate N-1 copies
5352e01c91f2SPhilip Reames; of the early exit test in the main loop when runtime unrolling
5353e01c91f2SPhilip Reames; by N.
5354e01c91f2SPhilip Reamesdefine void @test10(i64 %trip, i64 %trip2) {
5355e01c91f2SPhilip Reames; EPILOG-LABEL: @test10(
5356e01c91f2SPhilip Reames; EPILOG-NEXT:  entry:
5357*81c648a3SNikita Popov; EPILOG-NEXT:    %0 = freeze i64 %trip
5358*81c648a3SNikita Popov; EPILOG-NEXT:    %1 = add i64 %0, -1
5359*81c648a3SNikita Popov; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
5360*81c648a3SNikita Popov; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
5361323514deSNikita Popov; EPILOG-NEXT:    br i1 %2, label %exit2.unr-lcssa, label %entry.new
5362e01c91f2SPhilip Reames; EPILOG:       entry.new:
5363*81c648a3SNikita Popov; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
5364e01c91f2SPhilip Reames; EPILOG-NEXT:    br label %loop_header
5365e01c91f2SPhilip Reames; EPILOG:       loop_header:
5366e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
536737ead201SPhilip Reames; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
5368e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
5369e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5370e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5371e01c91f2SPhilip Reames; EPILOG:       loop_latch:
5372e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
537337ead201SPhilip Reames; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5374e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
5375e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5376e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5377e01c91f2SPhilip Reames; EPILOG:       loop_latch.1:
5378e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
537937ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
5380e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
5381e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
5382e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit
5383e01c91f2SPhilip Reames; EPILOG:       loop_latch.2:
5384e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
538537ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
5386e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
5387e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
5388e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit
5389e01c91f2SPhilip Reames; EPILOG:       loop_latch.3:
5390e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
539137ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
5392e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
5393e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
5394e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit
5395e01c91f2SPhilip Reames; EPILOG:       loop_latch.4:
5396e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
539737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
5398e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
5399e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
5400e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit
5401e01c91f2SPhilip Reames; EPILOG:       loop_latch.5:
5402e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
540337ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
5404e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
5405e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
5406e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit
5407e01c91f2SPhilip Reames; EPILOG:       loop_latch.6:
5408e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
540937ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
5410e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
5411e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
5412e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit
5413e01c91f2SPhilip Reames; EPILOG:       loop_latch.7:
5414e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
541537ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
541637ead201SPhilip Reames; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
5417e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit
5418de2fed61SPhilip Reames; EPILOG:       exit1.loopexit:
5419de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1
5420de2fed61SPhilip Reames; EPILOG:       exit1.loopexit1:
5421de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1
5422de2fed61SPhilip Reames; EPILOG:       exit1:
5423de2fed61SPhilip Reames; EPILOG-NEXT:    ret void
5424de2fed61SPhilip Reames; EPILOG:       exit2.unr-lcssa.loopexit:
5425de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
5426de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit2.unr-lcssa
5427de2fed61SPhilip Reames; EPILOG:       exit2.unr-lcssa:
5428de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ]
5429de2fed61SPhilip Reames; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5430de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5431de2fed61SPhilip Reames; EPILOG:       loop_header.epil.preheader:
5432de2fed61SPhilip Reames; EPILOG-NEXT:    br label %loop_header.epil
5433de2fed61SPhilip Reames; EPILOG:       loop_header.epil:
5434de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
543537ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
5436de2fed61SPhilip Reames; EPILOG-NEXT:    call void @bar()
5437de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil, %trip2
5438de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1.loopexit1
5439de2fed61SPhilip Reames; EPILOG:       loop_latch.epil:
5440de2fed61SPhilip Reames; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
5441de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
544237ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
544337ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
5444da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !14
5445de2fed61SPhilip Reames; EPILOG:       exit2.epilog-lcssa:
5446de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit2
5447de2fed61SPhilip Reames; EPILOG:       exit2:
5448de2fed61SPhilip Reames; EPILOG-NEXT:    ret void
5449e01c91f2SPhilip Reames;
5450e01c91f2SPhilip Reames; EPILOG-BLOCK-LABEL: @test10(
5451e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:  entry:
5452*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
5453*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
5454*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
5455*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
5456323514deSNikita Popov; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit2.unr-lcssa, label %entry.new
5457e01c91f2SPhilip Reames; EPILOG-BLOCK:       entry.new:
5458*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
5459e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %loop_header
5460e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_header:
5461e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
546237ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
5463e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    call void @bar()
5464e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5465e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5466e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_latch:
5467e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
546837ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5469e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    call void @bar()
5470e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5471e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5472de2fed61SPhilip Reames; EPILOG-BLOCK:       loop_latch.1:
5473de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
547437ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
547537ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
5476da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !16
5477e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit1.loopexit:
5478e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit1
5479e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit1:
5480e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret void
5481e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit2.unr-lcssa.loopexit:
5482e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
5483e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit2.unr-lcssa
5484e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit2.unr-lcssa:
5485e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ]
5486e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5487e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5488e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_header.epil.preheader:
5489e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
5490e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_header.epil:
5491e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    call void @bar()
5492e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp_early.epil = icmp ne i64 %iv.unr, %trip2
5493e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1
5494e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_latch.epil:
5495e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit2
5496e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit2:
5497e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret void
5498e01c91f2SPhilip Reames;
5499e01c91f2SPhilip Reames; PROLOG-LABEL: @test10(
5500e01c91f2SPhilip Reames; PROLOG-NEXT:  entry:
5501*81c648a3SNikita Popov; PROLOG-NEXT:    %0 = freeze i64 %trip
5502*81c648a3SNikita Popov; PROLOG-NEXT:    %1 = add i64 %0, -1
5503*81c648a3SNikita Popov; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
5504e01c91f2SPhilip Reames; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5505*81c648a3SNikita Popov; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5506e01c91f2SPhilip Reames; PROLOG:       loop_header.prol.preheader:
5507e01c91f2SPhilip Reames; PROLOG-NEXT:    br label %loop_header.prol
5508e01c91f2SPhilip Reames; PROLOG:       loop_header.prol:
5509e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
551037ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
5511e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
5512e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.prol = icmp ne i64 %iv.prol, %trip2
5513e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1.loopexit1
5514e01c91f2SPhilip Reames; PROLOG:       loop_latch.prol:
5515e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
5516e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
551737ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
551837ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
5519da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !14
5520e01c91f2SPhilip Reames; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
5521e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
5522e01c91f2SPhilip Reames; PROLOG-NEXT:    br label %loop_header.prol.loopexit
5523e01c91f2SPhilip Reames; PROLOG:       loop_header.prol.loopexit:
5524e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
5525*81c648a3SNikita Popov; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
5526323514deSNikita Popov; PROLOG-NEXT:    br i1 %2, label %exit2, label %entry.new
5527e01c91f2SPhilip Reames; PROLOG:       entry.new:
5528e01c91f2SPhilip Reames; PROLOG-NEXT:    br label %loop_header
5529e01c91f2SPhilip Reames; PROLOG:       loop_header:
5530e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5531e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
5532e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5533e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5534e01c91f2SPhilip Reames; PROLOG:       loop_latch:
5535e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
5536e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
5537e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5538e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5539e01c91f2SPhilip Reames; PROLOG:       loop_latch.1:
5540e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5541e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
5542e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
5543e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit
5544e01c91f2SPhilip Reames; PROLOG:       loop_latch.2:
5545e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
5546e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
5547e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
5548e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit
5549e01c91f2SPhilip Reames; PROLOG:       loop_latch.3:
5550e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
5551e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
5552e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
5553e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit
5554e01c91f2SPhilip Reames; PROLOG:       loop_latch.4:
5555e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
5556e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
5557e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
5558e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit
5559e01c91f2SPhilip Reames; PROLOG:       loop_latch.5:
5560e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
5561e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
5562e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
5563e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit
5564e01c91f2SPhilip Reames; PROLOG:       loop_latch.6:
5565e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
5566e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
5567e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
5568e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit
5569e01c91f2SPhilip Reames; PROLOG:       loop_latch.7:
5570e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
5571e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
5572e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa
5573de2fed61SPhilip Reames; PROLOG:       exit1.loopexit:
5574de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit1
5575de2fed61SPhilip Reames; PROLOG:       exit1.loopexit1:
5576de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit1
5577de2fed61SPhilip Reames; PROLOG:       exit1:
5578de2fed61SPhilip Reames; PROLOG-NEXT:    ret void
5579de2fed61SPhilip Reames; PROLOG:       exit2.unr-lcssa:
5580de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit2
5581de2fed61SPhilip Reames; PROLOG:       exit2:
5582de2fed61SPhilip Reames; PROLOG-NEXT:    ret void
5583e01c91f2SPhilip Reames;
5584e01c91f2SPhilip Reames; PROLOG-BLOCK-LABEL: @test10(
5585e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:  entry:
5586*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
5587*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
5588*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
5589e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5590*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5591e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol.preheader:
5592e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
5593e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol:
5594e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    call void @bar()
5595e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp_early.prol = icmp ne i64 0, %trip2
5596e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1
5597e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_latch.prol:
5598e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
5599e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol.loopexit:
5600e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
5601*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
5602323514deSNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit2, label %entry.new
5603e01c91f2SPhilip Reames; PROLOG-BLOCK:       entry.new:
5604e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header
5605e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header:
5606e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5607e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    call void @bar()
5608e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5609e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
5610e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_latch:
5611e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
5612e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    call void @bar()
5613e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5614e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
5615de2fed61SPhilip Reames; PROLOG-BLOCK:       loop_latch.1:
5616de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5617de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
5618da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !16
5619e01c91f2SPhilip Reames; PROLOG-BLOCK:       exit1.loopexit:
5620e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit1
5621e01c91f2SPhilip Reames; PROLOG-BLOCK:       exit1:
5622e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret void
5623e01c91f2SPhilip Reames; PROLOG-BLOCK:       exit2.unr-lcssa:
5624e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit2
5625e01c91f2SPhilip Reames; PROLOG-BLOCK:       exit2:
5626e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret void
5627e01c91f2SPhilip Reames;
5628e01c91f2SPhilip Reamesentry:
5629e01c91f2SPhilip Reames  br label %loop_header
5630e01c91f2SPhilip Reames
5631e01c91f2SPhilip Reamesloop_header:
5632e01c91f2SPhilip Reames  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
5633e01c91f2SPhilip Reames  call void @bar()
5634e01c91f2SPhilip Reames  %cmp_early = icmp ne i64 %iv, %trip2
5635e01c91f2SPhilip Reames  br i1 %cmp_early, label %loop_latch, label %exit1
5636e01c91f2SPhilip Reames
5637e01c91f2SPhilip Reamesloop_latch:
5638e01c91f2SPhilip Reames  %iv_next = add i64 %iv, 1
5639e01c91f2SPhilip Reames  %cmp = icmp ne i64 %iv_next, %trip
5640e01c91f2SPhilip Reames  br i1 %cmp, label %loop_header, label %exit2
5641e01c91f2SPhilip Reames
5642e01c91f2SPhilip Reamesexit1:
5643e01c91f2SPhilip Reames  ret void
5644e01c91f2SPhilip Reames
5645e01c91f2SPhilip Reamesexit2:
5646e01c91f2SPhilip Reames  ret void
5647e01c91f2SPhilip Reames}
5648e01c91f2SPhilip Reames
5649e01c91f2SPhilip Reames; With a loop invariant, we can eliminate the last N-1
5650e01c91f2SPhilip Reames; copies of the exit test in the unrolled main loop body.
5651e01c91f2SPhilip Reamesdefine void @test11(i64 %trip, i1 %cond) {
5652e01c91f2SPhilip Reames; EPILOG-LABEL: @test11(
5653e01c91f2SPhilip Reames; EPILOG-NEXT:  entry:
5654*81c648a3SNikita Popov; EPILOG-NEXT:    %0 = freeze i64 %trip
5655*81c648a3SNikita Popov; EPILOG-NEXT:    %1 = add i64 %0, -1
5656*81c648a3SNikita Popov; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
5657*81c648a3SNikita Popov; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
5658323514deSNikita Popov; EPILOG-NEXT:    br i1 %2, label %exit2.unr-lcssa, label %entry.new
5659e01c91f2SPhilip Reames; EPILOG:       entry.new:
5660*81c648a3SNikita Popov; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
5661e01c91f2SPhilip Reames; EPILOG-NEXT:    br label %loop_header
5662e01c91f2SPhilip Reames; EPILOG:       loop_header:
5663e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
566437ead201SPhilip Reames; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
5665e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
5666e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5667e01c91f2SPhilip Reames; EPILOG:       loop_latch:
5668e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
566937ead201SPhilip Reames; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5670e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
567172031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5672e01c91f2SPhilip Reames; EPILOG:       loop_latch.1:
5673e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
567437ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
5675e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
567672031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.loopexit
5677e01c91f2SPhilip Reames; EPILOG:       loop_latch.2:
5678e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
567937ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
5680e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
568172031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.loopexit
5682e01c91f2SPhilip Reames; EPILOG:       loop_latch.3:
5683e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
568437ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
5685e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
568672031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.loopexit
5687e01c91f2SPhilip Reames; EPILOG:       loop_latch.4:
5688e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
568937ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
5690e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
569172031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.loopexit
5692e01c91f2SPhilip Reames; EPILOG:       loop_latch.5:
5693e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
569437ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
5695e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
569672031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.loopexit
5697e01c91f2SPhilip Reames; EPILOG:       loop_latch.6:
5698e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
569937ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
5700e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
570172031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.loopexit
5702e01c91f2SPhilip Reames; EPILOG:       loop_latch.7:
5703e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
570437ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
570537ead201SPhilip Reames; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
5706e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit
5707de2fed61SPhilip Reames; EPILOG:       exit1.loopexit:
5708de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1
5709de2fed61SPhilip Reames; EPILOG:       exit1.loopexit1:
5710de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1
5711de2fed61SPhilip Reames; EPILOG:       exit1:
5712de2fed61SPhilip Reames; EPILOG-NEXT:    ret void
5713de2fed61SPhilip Reames; EPILOG:       exit2.unr-lcssa.loopexit:
5714de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
5715de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit2.unr-lcssa
5716de2fed61SPhilip Reames; EPILOG:       exit2.unr-lcssa:
5717de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ]
5718de2fed61SPhilip Reames; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5719de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5720de2fed61SPhilip Reames; EPILOG:       loop_header.epil.preheader:
5721de2fed61SPhilip Reames; EPILOG-NEXT:    br label %loop_header.epil
5722de2fed61SPhilip Reames; EPILOG:       loop_header.epil:
5723de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
572437ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
5725de2fed61SPhilip Reames; EPILOG-NEXT:    call void @bar()
5726de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1.loopexit1
5727de2fed61SPhilip Reames; EPILOG:       loop_latch.epil:
5728de2fed61SPhilip Reames; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
5729de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
573037ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
573137ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
5732da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !15
5733de2fed61SPhilip Reames; EPILOG:       exit2.epilog-lcssa:
5734de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit2
5735de2fed61SPhilip Reames; EPILOG:       exit2:
5736de2fed61SPhilip Reames; EPILOG-NEXT:    ret void
5737e01c91f2SPhilip Reames;
5738e01c91f2SPhilip Reames; EPILOG-BLOCK-LABEL: @test11(
5739e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:  entry:
5740*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
5741*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
5742*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
5743*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
5744323514deSNikita Popov; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit2.unr-lcssa, label %entry.new
5745e01c91f2SPhilip Reames; EPILOG-BLOCK:       entry.new:
5746*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
5747e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %loop_header
5748e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_header:
5749e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
575037ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
5751e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    call void @bar()
5752e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5753e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_latch:
5754e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
575537ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5756e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    call void @bar()
575772031407SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5758de2fed61SPhilip Reames; EPILOG-BLOCK:       loop_latch.1:
5759de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
576037ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
576137ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
5762da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !17
5763e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit1.loopexit:
5764e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit1
5765e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit1:
5766e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret void
5767e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit2.unr-lcssa.loopexit:
5768e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit2.unr-lcssa
5769e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit2.unr-lcssa:
5770e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5771e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
5772e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_header.epil.preheader:
5773e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
5774e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_header.epil:
5775e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    call void @bar()
5776e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1
5777e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_latch.epil:
5778e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit2
5779e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit2:
5780e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret void
5781e01c91f2SPhilip Reames;
5782e01c91f2SPhilip Reames; PROLOG-LABEL: @test11(
5783e01c91f2SPhilip Reames; PROLOG-NEXT:  entry:
5784*81c648a3SNikita Popov; PROLOG-NEXT:    %0 = freeze i64 %trip
5785*81c648a3SNikita Popov; PROLOG-NEXT:    %1 = add i64 %0, -1
5786*81c648a3SNikita Popov; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
5787e01c91f2SPhilip Reames; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5788*81c648a3SNikita Popov; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5789e01c91f2SPhilip Reames; PROLOG:       loop_header.prol.preheader:
5790e01c91f2SPhilip Reames; PROLOG-NEXT:    br label %loop_header.prol
5791e01c91f2SPhilip Reames; PROLOG:       loop_header.prol:
5792e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
579337ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
5794e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
5795e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1.loopexit1
5796e01c91f2SPhilip Reames; PROLOG:       loop_latch.prol:
5797e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
5798e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
579937ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
580037ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
5801da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !15
5802e01c91f2SPhilip Reames; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
5803e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
5804e01c91f2SPhilip Reames; PROLOG-NEXT:    br label %loop_header.prol.loopexit
5805e01c91f2SPhilip Reames; PROLOG:       loop_header.prol.loopexit:
5806e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
5807*81c648a3SNikita Popov; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
5808323514deSNikita Popov; PROLOG-NEXT:    br i1 %2, label %exit2, label %entry.new
5809e01c91f2SPhilip Reames; PROLOG:       entry.new:
5810e01c91f2SPhilip Reames; PROLOG-NEXT:    br label %loop_header
5811e01c91f2SPhilip Reames; PROLOG:       loop_header:
5812e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
5813e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
5814e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5815e01c91f2SPhilip Reames; PROLOG:       loop_latch:
5816e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
5817e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
581872031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5819e01c91f2SPhilip Reames; PROLOG:       loop_latch.1:
5820e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5821e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
582272031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.loopexit
5823e01c91f2SPhilip Reames; PROLOG:       loop_latch.2:
5824e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
5825e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
582672031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.loopexit
5827e01c91f2SPhilip Reames; PROLOG:       loop_latch.3:
5828e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
5829e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
583072031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.loopexit
5831e01c91f2SPhilip Reames; PROLOG:       loop_latch.4:
5832e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
5833e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
583472031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.loopexit
5835e01c91f2SPhilip Reames; PROLOG:       loop_latch.5:
5836e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
5837e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
583872031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.loopexit
5839e01c91f2SPhilip Reames; PROLOG:       loop_latch.6:
5840e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
5841e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
584272031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.loopexit
5843e01c91f2SPhilip Reames; PROLOG:       loop_latch.7:
5844e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
5845e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
5846e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa
5847de2fed61SPhilip Reames; PROLOG:       exit1.loopexit:
5848de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit1
5849de2fed61SPhilip Reames; PROLOG:       exit1.loopexit1:
5850de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit1
5851de2fed61SPhilip Reames; PROLOG:       exit1:
5852de2fed61SPhilip Reames; PROLOG-NEXT:    ret void
5853de2fed61SPhilip Reames; PROLOG:       exit2.unr-lcssa:
5854de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit2
5855de2fed61SPhilip Reames; PROLOG:       exit2:
5856de2fed61SPhilip Reames; PROLOG-NEXT:    ret void
5857e01c91f2SPhilip Reames;
5858e01c91f2SPhilip Reames; PROLOG-BLOCK-LABEL: @test11(
5859e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:  entry:
5860*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
5861*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
5862*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
5863e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
5864*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
5865e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol.preheader:
5866e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
5867e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol:
5868e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    call void @bar()
5869e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1
5870e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_latch.prol:
5871e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
5872e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol.loopexit:
5873e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
5874*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
5875323514deSNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit2, label %entry.new
5876e01c91f2SPhilip Reames; PROLOG-BLOCK:       entry.new:
5877e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header
5878e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header:
5879e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
5880e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    call void @bar()
5881e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.loopexit
5882e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_latch:
5883e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
5884e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    call void @bar()
588572031407SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.loopexit
5886de2fed61SPhilip Reames; PROLOG-BLOCK:       loop_latch.1:
5887de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
5888de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
5889da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !17
5890e01c91f2SPhilip Reames; PROLOG-BLOCK:       exit1.loopexit:
5891e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit1
5892e01c91f2SPhilip Reames; PROLOG-BLOCK:       exit1:
5893e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret void
5894e01c91f2SPhilip Reames; PROLOG-BLOCK:       exit2.unr-lcssa:
5895e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit2
5896e01c91f2SPhilip Reames; PROLOG-BLOCK:       exit2:
5897e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    ret void
5898e01c91f2SPhilip Reames;
5899e01c91f2SPhilip Reamesentry:
5900e01c91f2SPhilip Reames  br label %loop_header
5901e01c91f2SPhilip Reames
5902e01c91f2SPhilip Reamesloop_header:
5903e01c91f2SPhilip Reames  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
5904e01c91f2SPhilip Reames  call void @bar()
5905e01c91f2SPhilip Reames  br i1 %cond, label %loop_latch, label %exit1
5906e01c91f2SPhilip Reames
5907e01c91f2SPhilip Reamesloop_latch:
5908e01c91f2SPhilip Reames  %iv_next = add i64 %iv, 1
5909e01c91f2SPhilip Reames  %cmp = icmp ne i64 %iv_next, %trip
5910e01c91f2SPhilip Reames  br i1 %cmp, label %loop_header, label %exit2
5911e01c91f2SPhilip Reames
5912e01c91f2SPhilip Reamesexit1:
5913e01c91f2SPhilip Reames  ret void
5914e01c91f2SPhilip Reames
5915e01c91f2SPhilip Reamesexit2:
5916e01c91f2SPhilip Reames  ret void
5917e01c91f2SPhilip Reames}
5918e01c91f2SPhilip Reames
5919e01c91f2SPhilip Reames; Combine a computeable and invariant test to make sure
5920e01c91f2SPhilip Reames; the interaction of both doesn't do anything weird
5921e01c91f2SPhilip Reamesdefine void @test12(i64 %trip, i64 %trip2, i1 %cond) {
5922e01c91f2SPhilip Reames; EPILOG-LABEL: @test12(
5923e01c91f2SPhilip Reames; EPILOG-NEXT:  entry:
5924*81c648a3SNikita Popov; EPILOG-NEXT:    %0 = freeze i64 %trip
5925*81c648a3SNikita Popov; EPILOG-NEXT:    %1 = add i64 %0, -1
5926*81c648a3SNikita Popov; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
5927*81c648a3SNikita Popov; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
5928323514deSNikita Popov; EPILOG-NEXT:    br i1 %2, label %exit1.unr-lcssa, label %entry.new
5929e01c91f2SPhilip Reames; EPILOG:       entry.new:
5930*81c648a3SNikita Popov; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
5931e01c91f2SPhilip Reames; EPILOG-NEXT:    br label %loop_header
5932e01c91f2SPhilip Reames; EPILOG:       loop_header:
5933e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
593437ead201SPhilip Reames; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
5935e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
5936e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
5937e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
5938e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2:
5939e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit
5940e01c91f2SPhilip Reames; EPILOG:       loop_latch:
5941e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
594237ead201SPhilip Reames; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
5943e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
5944e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
5945e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
5946e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.1:
594772031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
5948e01c91f2SPhilip Reames; EPILOG:       loop_latch.1:
5949e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
595037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
5951e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
5952e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
5953e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit
5954e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.2:
595572031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit
5956e01c91f2SPhilip Reames; EPILOG:       loop_latch.2:
5957e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
595837ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
5959e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
5960e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
5961e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit
5962e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.3:
596372031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit
5964e01c91f2SPhilip Reames; EPILOG:       loop_latch.3:
5965e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
596637ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
5967e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
5968e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
5969e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit
5970e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.4:
597172031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit
5972e01c91f2SPhilip Reames; EPILOG:       loop_latch.4:
5973e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
597437ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
5975e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
5976e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
5977e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit
5978e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.5:
597972031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit
5980e01c91f2SPhilip Reames; EPILOG:       loop_latch.5:
5981e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
598237ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
5983e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
5984e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
5985e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit
5986e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.6:
598772031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit
5988e01c91f2SPhilip Reames; EPILOG:       loop_latch.6:
5989e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
599037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
5991e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
5992e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
5993e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit
5994e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.7:
599572031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit
5996e01c91f2SPhilip Reames; EPILOG:       loop_latch.7:
5997e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
599837ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
599937ead201SPhilip Reames; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
6000e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6001de2fed61SPhilip Reames; EPILOG:       exit1.unr-lcssa.loopexit:
6002de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
6003de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1.unr-lcssa
6004de2fed61SPhilip Reames; EPILOG:       exit1.unr-lcssa:
6005de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
6006de2fed61SPhilip Reames; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6007de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6008de2fed61SPhilip Reames; EPILOG:       loop_header.epil.preheader:
6009de2fed61SPhilip Reames; EPILOG-NEXT:    br label %loop_header.epil
6010de2fed61SPhilip Reames; EPILOG:       loop_header.epil:
6011de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
601237ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
6013de2fed61SPhilip Reames; EPILOG-NEXT:    call void @bar()
6014de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil, %trip2
6015de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1
6016de2fed61SPhilip Reames; EPILOG:       loop_exiting_bb2.epil:
6017de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1
6018de2fed61SPhilip Reames; EPILOG:       loop_latch.epil:
6019de2fed61SPhilip Reames; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
6020de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
602137ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
602237ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
6023da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !16
6024de2fed61SPhilip Reames; EPILOG:       exit1.epilog-lcssa.loopexit:
6025de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6026de2fed61SPhilip Reames; EPILOG:       exit1.epilog-lcssa.loopexit1:
6027de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6028de2fed61SPhilip Reames; EPILOG:       exit1.epilog-lcssa:
6029de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1
6030de2fed61SPhilip Reames; EPILOG:       exit1:
6031de2fed61SPhilip Reames; EPILOG-NEXT:    ret void
6032e01c91f2SPhilip Reames;
6033e01c91f2SPhilip Reames; EPILOG-BLOCK-LABEL: @test12(
6034e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:  entry:
6035*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
6036*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
6037*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
6038*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
6039323514deSNikita Popov; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit1.unr-lcssa, label %entry.new
6040e01c91f2SPhilip Reames; EPILOG-BLOCK:       entry.new:
6041*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
6042e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %loop_header
6043e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_header:
6044e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
604537ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
6046e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    call void @bar()
6047e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6048e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6049e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_exiting_bb2:
6050e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6051e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_latch:
6052e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
605337ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
6054e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    call void @bar()
6055e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6056e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6057de2fed61SPhilip Reames; EPILOG-BLOCK:       loop_exiting_bb2.1:
605872031407SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6059de2fed61SPhilip Reames; EPILOG-BLOCK:       loop_latch.1:
6060de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
606137ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
606237ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
6063da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18
6064e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit1.unr-lcssa.loopexit:
6065e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
6066e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6067e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit1.unr-lcssa:
6068e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
6069e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6070e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6071e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_header.epil.preheader:
6072e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
6073e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_header.epil:
6074e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    call void @bar()
6075e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp_early.epil = icmp ne i64 %iv.unr, %trip2
6076e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa
6077e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_exiting_bb2.epil:
6078e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa
6079e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_latch.epil:
6080e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6081e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit1.epilog-lcssa.loopexit:
6082e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6083e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit1.epilog-lcssa:
6084e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit1
6085e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit1:
6086e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret void
6087e01c91f2SPhilip Reames;
6088e01c91f2SPhilip Reames; PROLOG-LABEL: @test12(
6089e01c91f2SPhilip Reames; PROLOG-NEXT:  entry:
6090*81c648a3SNikita Popov; PROLOG-NEXT:    %0 = freeze i64 %trip
6091*81c648a3SNikita Popov; PROLOG-NEXT:    %1 = add i64 %0, -1
6092*81c648a3SNikita Popov; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
6093e01c91f2SPhilip Reames; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6094*81c648a3SNikita Popov; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6095e01c91f2SPhilip Reames; PROLOG:       loop_header.prol.preheader:
6096e01c91f2SPhilip Reames; PROLOG-NEXT:    br label %loop_header.prol
6097e01c91f2SPhilip Reames; PROLOG:       loop_header.prol:
6098e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
609937ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
6100e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6101e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.prol = icmp ne i64 %iv.prol, %trip2
6102e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1
6103e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.prol:
6104e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1
6105e01c91f2SPhilip Reames; PROLOG:       loop_latch.prol:
6106e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
6107e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
610837ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
610937ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
6110da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !16
6111e01c91f2SPhilip Reames; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
6112e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
6113e01c91f2SPhilip Reames; PROLOG-NEXT:    br label %loop_header.prol.loopexit
6114e01c91f2SPhilip Reames; PROLOG:       loop_header.prol.loopexit:
6115e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
6116*81c648a3SNikita Popov; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
6117323514deSNikita Popov; PROLOG-NEXT:    br i1 %2, label %exit1, label %entry.new
6118e01c91f2SPhilip Reames; PROLOG:       entry.new:
6119e01c91f2SPhilip Reames; PROLOG-NEXT:    br label %loop_header
6120e01c91f2SPhilip Reames; PROLOG:       loop_header:
6121e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6122e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6123e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6124e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6125e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2:
6126e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit
6127e01c91f2SPhilip Reames; PROLOG:       loop_latch:
6128e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
6129e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6130e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6131e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6132e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.1:
613372031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6134e01c91f2SPhilip Reames; PROLOG:       loop_latch.1:
6135e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6136e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6137e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
6138e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit
6139e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.2:
614072031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %exit1.unr-lcssa.loopexit
6141e01c91f2SPhilip Reames; PROLOG:       loop_latch.2:
6142e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
6143e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6144e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
6145e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit
6146e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.3:
614772031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %exit1.unr-lcssa.loopexit
6148e01c91f2SPhilip Reames; PROLOG:       loop_latch.3:
6149e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
6150e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6151e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
6152e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit
6153e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.4:
615472031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %exit1.unr-lcssa.loopexit
6155e01c91f2SPhilip Reames; PROLOG:       loop_latch.4:
6156e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
6157e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6158e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
6159e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit
6160e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.5:
616172031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %exit1.unr-lcssa.loopexit
6162e01c91f2SPhilip Reames; PROLOG:       loop_latch.5:
6163e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
6164e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6165e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
6166e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit
6167e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.6:
616872031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %exit1.unr-lcssa.loopexit
6169e01c91f2SPhilip Reames; PROLOG:       loop_latch.6:
6170e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
6171e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6172e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
6173e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit
6174e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.7:
617572031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %exit1.unr-lcssa.loopexit
6176e01c91f2SPhilip Reames; PROLOG:       loop_latch.7:
6177e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
6178e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
6179e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6180de2fed61SPhilip Reames; PROLOG:       exit1.unr-lcssa.loopexit:
6181de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit1.unr-lcssa
6182de2fed61SPhilip Reames; PROLOG:       exit1.unr-lcssa.loopexit1:
6183de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit1.unr-lcssa
6184de2fed61SPhilip Reames; PROLOG:       exit1.unr-lcssa:
6185de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit1
6186de2fed61SPhilip Reames; PROLOG:       exit1:
6187de2fed61SPhilip Reames; PROLOG-NEXT:    ret void
6188e01c91f2SPhilip Reames;
6189e01c91f2SPhilip Reames; PROLOG-BLOCK-LABEL: @test12(
6190e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:  entry:
6191*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
6192*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
6193*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
6194e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6195*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6196e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol.preheader:
6197e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
6198e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol:
6199e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    call void @bar()
6200e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp_early.prol = icmp ne i64 0, %trip2
6201e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa
6202e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_exiting_bb2.prol:
6203e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa
6204e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_latch.prol:
6205e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
6206e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol.loopexit:
6207e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
6208*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
6209323514deSNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit1, label %entry.new
6210e01c91f2SPhilip Reames; PROLOG-BLOCK:       entry.new:
6211e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header
6212e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header:
6213e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6214e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    call void @bar()
6215e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6216e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6217e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_exiting_bb2:
6218e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit
6219e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_latch:
6220e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
6221e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    call void @bar()
6222e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6223e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6224e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_exiting_bb2.1:
622572031407SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6226e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_latch.1:
6227e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6228e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
6229da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18
6230de2fed61SPhilip Reames; PROLOG-BLOCK:       exit1.unr-lcssa.loopexit:
6231de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6232de2fed61SPhilip Reames; PROLOG-BLOCK:       exit1.unr-lcssa:
6233de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit1
6234de2fed61SPhilip Reames; PROLOG-BLOCK:       exit1:
6235de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    ret void
6236e01c91f2SPhilip Reames;
6237e01c91f2SPhilip Reamesentry:
6238e01c91f2SPhilip Reames  br label %loop_header
6239e01c91f2SPhilip Reames
6240e01c91f2SPhilip Reamesloop_header:
6241e01c91f2SPhilip Reames  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
6242e01c91f2SPhilip Reames  call void @bar()
6243e01c91f2SPhilip Reames  %cmp_early = icmp ne i64 %iv, %trip2
6244e01c91f2SPhilip Reames  br i1 %cmp_early, label %loop_exiting_bb2, label %exit1
6245e01c91f2SPhilip Reames
6246e01c91f2SPhilip Reamesloop_exiting_bb2:
6247e01c91f2SPhilip Reames  br i1 %cond, label %loop_latch, label %exit1
6248e01c91f2SPhilip Reames
6249e01c91f2SPhilip Reamesloop_latch:
6250e01c91f2SPhilip Reames  %iv_next = add i64 %iv, 1
6251e01c91f2SPhilip Reames  %cmp = icmp ne i64 %iv_next, %trip
6252e01c91f2SPhilip Reames  br i1 %cmp, label %loop_header, label %exit1
6253e01c91f2SPhilip Reames
6254e01c91f2SPhilip Reamesexit1:
6255e01c91f2SPhilip Reames  ret void
6256e01c91f2SPhilip Reames}
6257e01c91f2SPhilip Reames
6258e01c91f2SPhilip Reamesdeclare i1 @unknown_cond()
6259e01c91f2SPhilip Reames
6260e01c91f2SPhilip Reames; Mix of computable and uncompatable exits
6261e01c91f2SPhilip Reamesdefine void @test13(i64 %trip, i64 %trip2) {
6262e01c91f2SPhilip Reames; EPILOG-LABEL: @test13(
6263e01c91f2SPhilip Reames; EPILOG-NEXT:  entry:
6264*81c648a3SNikita Popov; EPILOG-NEXT:    %0 = freeze i64 %trip
6265*81c648a3SNikita Popov; EPILOG-NEXT:    %1 = add i64 %0, -1
6266*81c648a3SNikita Popov; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
6267*81c648a3SNikita Popov; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
6268323514deSNikita Popov; EPILOG-NEXT:    br i1 %2, label %exit1.unr-lcssa, label %entry.new
6269e01c91f2SPhilip Reames; EPILOG:       entry.new:
6270*81c648a3SNikita Popov; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
6271e01c91f2SPhilip Reames; EPILOG-NEXT:    br label %loop_header
6272e01c91f2SPhilip Reames; EPILOG:       loop_header:
6273e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
627437ead201SPhilip Reames; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
6275e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
6276e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6277e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6278e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2:
6279e01c91f2SPhilip Reames; EPILOG-NEXT:    %unknown = call i1 @unknown_cond()
6280e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6281e01c91f2SPhilip Reames; EPILOG:       loop_latch:
6282e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
628337ead201SPhilip Reames; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
6284e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
6285e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6286e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6287e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.1:
6288e01c91f2SPhilip Reames; EPILOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
6289e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6290e01c91f2SPhilip Reames; EPILOG:       loop_latch.1:
6291e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
629237ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
6293e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
6294e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
6295e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit
6296e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.2:
6297e01c91f2SPhilip Reames; EPILOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
6298e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit
6299e01c91f2SPhilip Reames; EPILOG:       loop_latch.2:
6300e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
630137ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
6302e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
6303e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
6304e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit
6305e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.3:
6306e01c91f2SPhilip Reames; EPILOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
6307e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit
6308e01c91f2SPhilip Reames; EPILOG:       loop_latch.3:
6309e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
631037ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
6311e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
6312e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
6313e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit
6314e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.4:
6315e01c91f2SPhilip Reames; EPILOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
6316e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit
6317e01c91f2SPhilip Reames; EPILOG:       loop_latch.4:
6318e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
631937ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
6320e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
6321e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
6322e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit
6323e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.5:
6324e01c91f2SPhilip Reames; EPILOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
6325e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit
6326e01c91f2SPhilip Reames; EPILOG:       loop_latch.5:
6327e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
632837ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
6329e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
6330e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
6331e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit
6332e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.6:
6333e01c91f2SPhilip Reames; EPILOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
6334e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit
6335e01c91f2SPhilip Reames; EPILOG:       loop_latch.6:
6336e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
633737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
6338e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
6339e01c91f2SPhilip Reames; EPILOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
6340e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit
6341e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.7:
6342e01c91f2SPhilip Reames; EPILOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
6343e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit
6344e01c91f2SPhilip Reames; EPILOG:       loop_latch.7:
6345e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
634637ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
634737ead201SPhilip Reames; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
6348e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6349de2fed61SPhilip Reames; EPILOG:       exit1.unr-lcssa.loopexit:
6350de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
6351de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1.unr-lcssa
6352de2fed61SPhilip Reames; EPILOG:       exit1.unr-lcssa:
6353de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
6354de2fed61SPhilip Reames; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6355de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6356de2fed61SPhilip Reames; EPILOG:       loop_header.epil.preheader:
6357de2fed61SPhilip Reames; EPILOG-NEXT:    br label %loop_header.epil
6358de2fed61SPhilip Reames; EPILOG:       loop_header.epil:
6359de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
636037ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
6361de2fed61SPhilip Reames; EPILOG-NEXT:    call void @bar()
6362de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp_early.epil = icmp ne i64 %iv.epil, %trip2
6363de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1
6364de2fed61SPhilip Reames; EPILOG:       loop_exiting_bb2.epil:
6365de2fed61SPhilip Reames; EPILOG-NEXT:    %unknown.epil = call i1 @unknown_cond()
6366de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1
6367de2fed61SPhilip Reames; EPILOG:       loop_latch.epil:
6368de2fed61SPhilip Reames; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
6369de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
637037ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
637137ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
6372da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !17
6373de2fed61SPhilip Reames; EPILOG:       exit1.epilog-lcssa.loopexit:
6374de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6375de2fed61SPhilip Reames; EPILOG:       exit1.epilog-lcssa.loopexit1:
6376de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6377de2fed61SPhilip Reames; EPILOG:       exit1.epilog-lcssa:
6378de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1
6379de2fed61SPhilip Reames; EPILOG:       exit1:
6380de2fed61SPhilip Reames; EPILOG-NEXT:    ret void
6381e01c91f2SPhilip Reames;
6382e01c91f2SPhilip Reames; EPILOG-BLOCK-LABEL: @test13(
6383e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:  entry:
6384*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
6385*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
6386*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
6387*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
6388323514deSNikita Popov; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit1.unr-lcssa, label %entry.new
6389e01c91f2SPhilip Reames; EPILOG-BLOCK:       entry.new:
6390*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
6391e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %loop_header
6392e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_header:
6393e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
639437ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
6395e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    call void @bar()
6396e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6397e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6398e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_exiting_bb2:
6399e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6400e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6401e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_latch:
6402e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
640337ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
6404e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    call void @bar()
6405e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6406e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6407de2fed61SPhilip Reames; EPILOG-BLOCK:       loop_exiting_bb2.1:
6408de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6409de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6410de2fed61SPhilip Reames; EPILOG-BLOCK:       loop_latch.1:
6411de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
641237ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
641337ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
6414da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19
6415e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit1.unr-lcssa.loopexit:
6416e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
6417e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6418e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit1.unr-lcssa:
6419e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
6420e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6421e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6422e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_header.epil.preheader:
6423e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
6424e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_header.epil:
6425e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    call void @bar()
6426e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %cmp_early.epil = icmp ne i64 %iv.unr, %trip2
6427e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa
6428e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_exiting_bb2.epil:
6429e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %unknown.epil = call i1 @unknown_cond()
6430e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa
6431e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_latch.epil:
6432e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6433e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit1.epilog-lcssa.loopexit:
6434e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6435e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit1.epilog-lcssa:
6436e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit1
6437e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit1:
6438e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret void
6439e01c91f2SPhilip Reames;
6440e01c91f2SPhilip Reames; PROLOG-LABEL: @test13(
6441e01c91f2SPhilip Reames; PROLOG-NEXT:  entry:
6442*81c648a3SNikita Popov; PROLOG-NEXT:    %0 = freeze i64 %trip
6443*81c648a3SNikita Popov; PROLOG-NEXT:    %1 = add i64 %0, -1
6444*81c648a3SNikita Popov; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
6445e01c91f2SPhilip Reames; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6446*81c648a3SNikita Popov; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6447e01c91f2SPhilip Reames; PROLOG:       loop_header.prol.preheader:
6448e01c91f2SPhilip Reames; PROLOG-NEXT:    br label %loop_header.prol
6449e01c91f2SPhilip Reames; PROLOG:       loop_header.prol:
6450e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
645137ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
6452e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6453e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.prol = icmp ne i64 %iv.prol, %trip2
6454e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1
6455e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.prol:
6456e01c91f2SPhilip Reames; PROLOG-NEXT:    %unknown.prol = call i1 @unknown_cond()
6457e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1
6458e01c91f2SPhilip Reames; PROLOG:       loop_latch.prol:
6459e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
6460e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
646137ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
646237ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
6463da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !17
6464e01c91f2SPhilip Reames; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
6465e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
6466e01c91f2SPhilip Reames; PROLOG-NEXT:    br label %loop_header.prol.loopexit
6467e01c91f2SPhilip Reames; PROLOG:       loop_header.prol.loopexit:
6468e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
6469*81c648a3SNikita Popov; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
6470323514deSNikita Popov; PROLOG-NEXT:    br i1 %2, label %exit1, label %entry.new
6471e01c91f2SPhilip Reames; PROLOG:       entry.new:
6472e01c91f2SPhilip Reames; PROLOG-NEXT:    br label %loop_header
6473e01c91f2SPhilip Reames; PROLOG:       loop_header:
6474e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6475e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6476e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6477e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6478e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2:
6479e01c91f2SPhilip Reames; PROLOG-NEXT:    %unknown = call i1 @unknown_cond()
6480e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6481e01c91f2SPhilip Reames; PROLOG:       loop_latch:
6482e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
6483e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6484e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6485e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6486e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.1:
6487e01c91f2SPhilip Reames; PROLOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
6488e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6489e01c91f2SPhilip Reames; PROLOG:       loop_latch.1:
6490e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6491e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6492e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
6493e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit
6494e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.2:
6495e01c91f2SPhilip Reames; PROLOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
6496e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit
6497e01c91f2SPhilip Reames; PROLOG:       loop_latch.2:
6498e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
6499e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6500e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
6501e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit
6502e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.3:
6503e01c91f2SPhilip Reames; PROLOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
6504e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit
6505e01c91f2SPhilip Reames; PROLOG:       loop_latch.3:
6506e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
6507e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6508e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
6509e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit
6510e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.4:
6511e01c91f2SPhilip Reames; PROLOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
6512e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit
6513e01c91f2SPhilip Reames; PROLOG:       loop_latch.4:
6514e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
6515e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6516e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
6517e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit
6518e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.5:
6519e01c91f2SPhilip Reames; PROLOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
6520e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit
6521e01c91f2SPhilip Reames; PROLOG:       loop_latch.5:
6522e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
6523e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6524e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
6525e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit
6526e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.6:
6527e01c91f2SPhilip Reames; PROLOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
6528e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit
6529e01c91f2SPhilip Reames; PROLOG:       loop_latch.6:
6530e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
6531e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6532e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
6533e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit
6534e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.7:
6535e01c91f2SPhilip Reames; PROLOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
6536e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit
6537e01c91f2SPhilip Reames; PROLOG:       loop_latch.7:
6538e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
6539e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
6540e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6541de2fed61SPhilip Reames; PROLOG:       exit1.unr-lcssa.loopexit:
6542de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit1.unr-lcssa
6543de2fed61SPhilip Reames; PROLOG:       exit1.unr-lcssa.loopexit1:
6544de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit1.unr-lcssa
6545de2fed61SPhilip Reames; PROLOG:       exit1.unr-lcssa:
6546de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit1
6547de2fed61SPhilip Reames; PROLOG:       exit1:
6548de2fed61SPhilip Reames; PROLOG-NEXT:    ret void
6549e01c91f2SPhilip Reames;
6550e01c91f2SPhilip Reames; PROLOG-BLOCK-LABEL: @test13(
6551e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:  entry:
6552*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
6553*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
6554*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
6555e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6556*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6557e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol.preheader:
6558e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
6559e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol:
6560e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    call void @bar()
6561e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp_early.prol = icmp ne i64 0, %trip2
6562e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa
6563e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_exiting_bb2.prol:
6564e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %unknown.prol = call i1 @unknown_cond()
6565e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa
6566e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_latch.prol:
6567e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
6568e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol.loopexit:
6569e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
6570*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
6571323514deSNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit1, label %entry.new
6572e01c91f2SPhilip Reames; PROLOG-BLOCK:       entry.new:
6573e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header
6574e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header:
6575e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6576e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    call void @bar()
6577e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp_early = icmp ne i64 %iv, %trip2
6578e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6579e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_exiting_bb2:
6580e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6581e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6582e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_latch:
6583e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
6584e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    call void @bar()
6585e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp_early.1 = icmp ne i64 %iv_next, %trip2
6586e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6587e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_exiting_bb2.1:
6588e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6589e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6590e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_latch.1:
6591e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6592e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
6593da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19
6594de2fed61SPhilip Reames; PROLOG-BLOCK:       exit1.unr-lcssa.loopexit:
6595de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6596de2fed61SPhilip Reames; PROLOG-BLOCK:       exit1.unr-lcssa:
6597de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit1
6598de2fed61SPhilip Reames; PROLOG-BLOCK:       exit1:
6599de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    ret void
6600e01c91f2SPhilip Reames;
6601e01c91f2SPhilip Reamesentry:
6602e01c91f2SPhilip Reames  br label %loop_header
6603e01c91f2SPhilip Reames
6604e01c91f2SPhilip Reamesloop_header:
6605e01c91f2SPhilip Reames  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
6606e01c91f2SPhilip Reames  call void @bar()
6607e01c91f2SPhilip Reames  %cmp_early = icmp ne i64 %iv, %trip2
6608e01c91f2SPhilip Reames  br i1 %cmp_early, label %loop_exiting_bb2, label %exit1
6609e01c91f2SPhilip Reames
6610e01c91f2SPhilip Reamesloop_exiting_bb2:
6611e01c91f2SPhilip Reames  %unknown = call i1 @unknown_cond()
6612e01c91f2SPhilip Reames  br i1 %unknown, label %loop_latch, label %exit1
6613e01c91f2SPhilip Reames
6614e01c91f2SPhilip Reamesloop_latch:
6615e01c91f2SPhilip Reames  %iv_next = add i64 %iv, 1
6616e01c91f2SPhilip Reames  %cmp = icmp ne i64 %iv_next, %trip
6617e01c91f2SPhilip Reames  br i1 %cmp, label %loop_header, label %exit1
6618e01c91f2SPhilip Reames
6619e01c91f2SPhilip Reamesexit1:
6620e01c91f2SPhilip Reames  ret void
6621e01c91f2SPhilip Reames}
6622e01c91f2SPhilip Reames
6623e01c91f2SPhilip Reames; Mix of invariant and (even in theory) uncomputable exits
6624e01c91f2SPhilip Reamesdefine void @test14(i64 %trip, i1 %cond) {
6625e01c91f2SPhilip Reames; EPILOG-LABEL: @test14(
6626e01c91f2SPhilip Reames; EPILOG-NEXT:  entry:
6627*81c648a3SNikita Popov; EPILOG-NEXT:    %0 = freeze i64 %trip
6628*81c648a3SNikita Popov; EPILOG-NEXT:    %1 = add i64 %0, -1
6629*81c648a3SNikita Popov; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
6630*81c648a3SNikita Popov; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
6631323514deSNikita Popov; EPILOG-NEXT:    br i1 %2, label %exit1.unr-lcssa, label %entry.new
6632e01c91f2SPhilip Reames; EPILOG:       entry.new:
6633*81c648a3SNikita Popov; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
6634e01c91f2SPhilip Reames; EPILOG-NEXT:    br label %loop_header
6635e01c91f2SPhilip Reames; EPILOG:       loop_header:
6636e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
663737ead201SPhilip Reames; EPILOG-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.7, %loop_latch.7 ]
6638e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
6639e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6640e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2:
6641e01c91f2SPhilip Reames; EPILOG-NEXT:    %unknown = call i1 @unknown_cond()
6642e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6643e01c91f2SPhilip Reames; EPILOG:       loop_latch:
6644e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
664537ead201SPhilip Reames; EPILOG-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
6646e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
664772031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6648e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.1:
6649e01c91f2SPhilip Reames; EPILOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
6650e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6651e01c91f2SPhilip Reames; EPILOG:       loop_latch.1:
6652e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
665337ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.1 = add nuw nsw i64 %niter.next, 1
6654e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
665572031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit
6656e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.2:
6657e01c91f2SPhilip Reames; EPILOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
6658e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit
6659e01c91f2SPhilip Reames; EPILOG:       loop_latch.2:
6660e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
666137ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.2 = add nuw nsw i64 %niter.next.1, 1
6662e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
666372031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit
6664e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.3:
6665e01c91f2SPhilip Reames; EPILOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
6666e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit
6667e01c91f2SPhilip Reames; EPILOG:       loop_latch.3:
6668e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
666937ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.3 = add nuw nsw i64 %niter.next.2, 1
6670e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
667172031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit
6672e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.4:
6673e01c91f2SPhilip Reames; EPILOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
6674e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit
6675e01c91f2SPhilip Reames; EPILOG:       loop_latch.4:
6676e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
667737ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.4 = add nuw nsw i64 %niter.next.3, 1
6678e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
667972031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit
6680e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.5:
6681e01c91f2SPhilip Reames; EPILOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
6682e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit
6683e01c91f2SPhilip Reames; EPILOG:       loop_latch.5:
6684e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
668537ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.5 = add nuw nsw i64 %niter.next.4, 1
6686e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
668772031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit
6688e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.6:
6689e01c91f2SPhilip Reames; EPILOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
6690e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit
6691e01c91f2SPhilip Reames; EPILOG:       loop_latch.6:
6692e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
669337ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.6 = add nuw nsw i64 %niter.next.5, 1
6694e01c91f2SPhilip Reames; EPILOG-NEXT:    call void @bar()
669572031407SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit
6696e01c91f2SPhilip Reames; EPILOG:       loop_exiting_bb2.7:
6697e01c91f2SPhilip Reames; EPILOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
6698e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit
6699e01c91f2SPhilip Reames; EPILOG:       loop_latch.7:
6700e01c91f2SPhilip Reames; EPILOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
670137ead201SPhilip Reames; EPILOG-NEXT:    %niter.next.7 = add i64 %niter.next.6, 1
670237ead201SPhilip Reames; EPILOG-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.next.7, %unroll_iter
6703e01c91f2SPhilip Reames; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6704de2fed61SPhilip Reames; EPILOG:       exit1.unr-lcssa.loopexit:
6705de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
6706de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1.unr-lcssa
6707de2fed61SPhilip Reames; EPILOG:       exit1.unr-lcssa:
6708de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
6709de2fed61SPhilip Reames; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6710de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6711de2fed61SPhilip Reames; EPILOG:       loop_header.epil.preheader:
6712de2fed61SPhilip Reames; EPILOG-NEXT:    br label %loop_header.epil
6713de2fed61SPhilip Reames; EPILOG:       loop_header.epil:
6714de2fed61SPhilip Reames; EPILOG-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
671537ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter = phi i64 [ 0, %loop_header.epil.preheader ], [ %epil.iter.next, %loop_latch.epil ]
6716de2fed61SPhilip Reames; EPILOG-NEXT:    call void @bar()
6717de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1
6718de2fed61SPhilip Reames; EPILOG:       loop_exiting_bb2.epil:
6719de2fed61SPhilip Reames; EPILOG-NEXT:    %unknown.epil = call i1 @unknown_cond()
6720de2fed61SPhilip Reames; EPILOG-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1
6721de2fed61SPhilip Reames; EPILOG:       loop_latch.epil:
6722de2fed61SPhilip Reames; EPILOG-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
6723de2fed61SPhilip Reames; EPILOG-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
672437ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.next = add i64 %epil.iter, 1
672537ead201SPhilip Reames; EPILOG-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.next, %xtraiter
6726da327e72SPhilip Reames; EPILOG-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !18
6727de2fed61SPhilip Reames; EPILOG:       exit1.epilog-lcssa.loopexit:
6728de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6729de2fed61SPhilip Reames; EPILOG:       exit1.epilog-lcssa.loopexit1:
6730de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1.epilog-lcssa
6731de2fed61SPhilip Reames; EPILOG:       exit1.epilog-lcssa:
6732de2fed61SPhilip Reames; EPILOG-NEXT:    br label %exit1
6733de2fed61SPhilip Reames; EPILOG:       exit1:
6734de2fed61SPhilip Reames; EPILOG-NEXT:    ret void
6735e01c91f2SPhilip Reames;
6736e01c91f2SPhilip Reames; EPILOG-BLOCK-LABEL: @test14(
6737e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:  entry:
6738*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %0 = freeze i64 %trip
6739*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %1 = add i64 %0, -1
6740*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
6741*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
6742323514deSNikita Popov; EPILOG-BLOCK-NEXT:    br i1 %2, label %exit1.unr-lcssa, label %entry.new
6743e01c91f2SPhilip Reames; EPILOG-BLOCK:       entry.new:
6744*81c648a3SNikita Popov; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
6745e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %loop_header
6746e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_header:
6747e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
674837ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ 0, %entry.new ], [ %niter.next.1, %loop_latch.1 ]
6749e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    call void @bar()
6750e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
6751e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_exiting_bb2:
6752e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6753e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
6754e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_latch:
6755e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
675637ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next = add nuw nsw i64 %niter, 1
6757e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    call void @bar()
675872031407SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
6759de2fed61SPhilip Reames; EPILOG-BLOCK:       loop_exiting_bb2.1:
6760de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6761de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
6762de2fed61SPhilip Reames; EPILOG-BLOCK:       loop_latch.1:
6763de2fed61SPhilip Reames; EPILOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
676437ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.next.1 = add i64 %niter.next, 1
676537ead201SPhilip Reames; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp ne i64 %niter.next.1, %unroll_iter
6766da327e72SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !20
6767e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit1.unr-lcssa.loopexit:
6768e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6769e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit1.unr-lcssa:
6770e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6771e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
6772e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_header.epil.preheader:
6773e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
6774e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_header.epil:
6775e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    call void @bar()
6776e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa
6777e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_exiting_bb2.epil:
6778e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    %unknown.epil = call i1 @unknown_cond()
6779e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa
6780e01c91f2SPhilip Reames; EPILOG-BLOCK:       loop_latch.epil:
6781e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6782e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit1.epilog-lcssa.loopexit:
6783e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit1.epilog-lcssa
6784e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit1.epilog-lcssa:
6785e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    br label %exit1
6786e01c91f2SPhilip Reames; EPILOG-BLOCK:       exit1:
6787e01c91f2SPhilip Reames; EPILOG-BLOCK-NEXT:    ret void
6788e01c91f2SPhilip Reames;
6789e01c91f2SPhilip Reames; PROLOG-LABEL: @test14(
6790e01c91f2SPhilip Reames; PROLOG-NEXT:  entry:
6791*81c648a3SNikita Popov; PROLOG-NEXT:    %0 = freeze i64 %trip
6792*81c648a3SNikita Popov; PROLOG-NEXT:    %1 = add i64 %0, -1
6793*81c648a3SNikita Popov; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
6794e01c91f2SPhilip Reames; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6795*81c648a3SNikita Popov; PROLOG-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6796e01c91f2SPhilip Reames; PROLOG:       loop_header.prol.preheader:
6797e01c91f2SPhilip Reames; PROLOG-NEXT:    br label %loop_header.prol
6798e01c91f2SPhilip Reames; PROLOG:       loop_header.prol:
6799e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
680037ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter = phi i64 [ 0, %loop_header.prol.preheader ], [ %prol.iter.next, %loop_latch.prol ]
6801e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6802e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1
6803e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.prol:
6804e01c91f2SPhilip Reames; PROLOG-NEXT:    %unknown.prol = call i1 @unknown_cond()
6805e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1
6806e01c91f2SPhilip Reames; PROLOG:       loop_latch.prol:
6807e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
6808e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
680937ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.next = add i64 %prol.iter, 1
681037ead201SPhilip Reames; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i64 %prol.iter.next, %xtraiter
6811da327e72SPhilip Reames; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !18
6812e01c91f2SPhilip Reames; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
6813e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
6814e01c91f2SPhilip Reames; PROLOG-NEXT:    br label %loop_header.prol.loopexit
6815e01c91f2SPhilip Reames; PROLOG:       loop_header.prol.loopexit:
6816e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
6817*81c648a3SNikita Popov; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
6818323514deSNikita Popov; PROLOG-NEXT:    br i1 %2, label %exit1, label %entry.new
6819e01c91f2SPhilip Reames; PROLOG:       entry.new:
6820e01c91f2SPhilip Reames; PROLOG-NEXT:    br label %loop_header
6821e01c91f2SPhilip Reames; PROLOG:       loop_header:
6822e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
6823e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
6824e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6825e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2:
6826e01c91f2SPhilip Reames; PROLOG-NEXT:    %unknown = call i1 @unknown_cond()
6827e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6828e01c91f2SPhilip Reames; PROLOG:       loop_latch:
6829e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
6830e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
683172031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6832e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.1:
6833e01c91f2SPhilip Reames; PROLOG-NEXT:    %unknown.1 = call i1 @unknown_cond()
6834e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6835e01c91f2SPhilip Reames; PROLOG:       loop_latch.1:
6836e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6837e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
683872031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit
6839e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.2:
6840e01c91f2SPhilip Reames; PROLOG-NEXT:    %unknown.2 = call i1 @unknown_cond()
6841e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit
6842e01c91f2SPhilip Reames; PROLOG:       loop_latch.2:
6843e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
6844e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
684572031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit
6846e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.3:
6847e01c91f2SPhilip Reames; PROLOG-NEXT:    %unknown.3 = call i1 @unknown_cond()
6848e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit
6849e01c91f2SPhilip Reames; PROLOG:       loop_latch.3:
6850e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
6851e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
685272031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit
6853e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.4:
6854e01c91f2SPhilip Reames; PROLOG-NEXT:    %unknown.4 = call i1 @unknown_cond()
6855e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit
6856e01c91f2SPhilip Reames; PROLOG:       loop_latch.4:
6857e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
6858e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
685972031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit
6860e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.5:
6861e01c91f2SPhilip Reames; PROLOG-NEXT:    %unknown.5 = call i1 @unknown_cond()
6862e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit
6863e01c91f2SPhilip Reames; PROLOG:       loop_latch.5:
6864e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
6865e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
686672031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit
6867e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.6:
6868e01c91f2SPhilip Reames; PROLOG-NEXT:    %unknown.6 = call i1 @unknown_cond()
6869e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit
6870e01c91f2SPhilip Reames; PROLOG:       loop_latch.6:
6871e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
6872e01c91f2SPhilip Reames; PROLOG-NEXT:    call void @bar()
687372031407SPhilip Reames; PROLOG-NEXT:    br i1 %cond, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit
6874e01c91f2SPhilip Reames; PROLOG:       loop_exiting_bb2.7:
6875e01c91f2SPhilip Reames; PROLOG-NEXT:    %unknown.7 = call i1 @unknown_cond()
6876e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit
6877e01c91f2SPhilip Reames; PROLOG:       loop_latch.7:
6878e01c91f2SPhilip Reames; PROLOG-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
6879e01c91f2SPhilip Reames; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
6880e01c91f2SPhilip Reames; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
6881de2fed61SPhilip Reames; PROLOG:       exit1.unr-lcssa.loopexit:
6882de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit1.unr-lcssa
6883de2fed61SPhilip Reames; PROLOG:       exit1.unr-lcssa.loopexit1:
6884de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit1.unr-lcssa
6885de2fed61SPhilip Reames; PROLOG:       exit1.unr-lcssa:
6886de2fed61SPhilip Reames; PROLOG-NEXT:    br label %exit1
6887de2fed61SPhilip Reames; PROLOG:       exit1:
6888de2fed61SPhilip Reames; PROLOG-NEXT:    ret void
6889e01c91f2SPhilip Reames;
6890e01c91f2SPhilip Reames; PROLOG-BLOCK-LABEL: @test14(
6891e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:  entry:
6892*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %0 = freeze i64 %trip
6893*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %1 = add i64 %0, -1
6894*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
6895e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
6896*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
6897e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol.preheader:
6898e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header.prol
6899e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol:
6900e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    call void @bar()
6901e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa
6902e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_exiting_bb2.prol:
6903e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %unknown.prol = call i1 @unknown_cond()
6904e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa
6905e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_latch.prol:
6906e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
6907e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header.prol.loopexit:
6908e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
6909*81c648a3SNikita Popov; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
6910323514deSNikita Popov; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit1, label %entry.new
6911e01c91f2SPhilip Reames; PROLOG-BLOCK:       entry.new:
6912e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %loop_header
6913e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_header:
6914e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
6915e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    call void @bar()
6916e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
6917e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_exiting_bb2:
6918e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %unknown = call i1 @unknown_cond()
6919e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
6920e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_latch:
6921e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
6922e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    call void @bar()
692372031407SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
6924e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_exiting_bb2.1:
6925e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %unknown.1 = call i1 @unknown_cond()
6926e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
6927e01c91f2SPhilip Reames; PROLOG-BLOCK:       loop_latch.1:
6928e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %iv_next.1 = add i64 %iv_next, 1
6929e01c91f2SPhilip Reames; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
6930da327e72SPhilip Reames; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !20
6931de2fed61SPhilip Reames; PROLOG-BLOCK:       exit1.unr-lcssa.loopexit:
6932de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit1.unr-lcssa
6933de2fed61SPhilip Reames; PROLOG-BLOCK:       exit1.unr-lcssa:
6934de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    br label %exit1
6935de2fed61SPhilip Reames; PROLOG-BLOCK:       exit1:
6936de2fed61SPhilip Reames; PROLOG-BLOCK-NEXT:    ret void
6937e01c91f2SPhilip Reames;
6938e01c91f2SPhilip Reamesentry:
6939e01c91f2SPhilip Reames  br label %loop_header
6940e01c91f2SPhilip Reames
6941e01c91f2SPhilip Reamesloop_header:
6942e01c91f2SPhilip Reames  %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
6943e01c91f2SPhilip Reames  call void @bar()
6944e01c91f2SPhilip Reames  br i1 %cond, label %loop_exiting_bb2, label %exit1
6945e01c91f2SPhilip Reames
6946e01c91f2SPhilip Reamesloop_exiting_bb2:
6947e01c91f2SPhilip Reames  %unknown = call i1 @unknown_cond()
6948e01c91f2SPhilip Reames  br i1 %unknown, label %loop_latch, label %exit1
6949e01c91f2SPhilip Reames
6950e01c91f2SPhilip Reamesloop_latch:
6951e01c91f2SPhilip Reames  %iv_next = add i64 %iv, 1
6952e01c91f2SPhilip Reames  %cmp = icmp ne i64 %iv_next, %trip
6953e01c91f2SPhilip Reames  br i1 %cmp, label %loop_header, label %exit1
6954e01c91f2SPhilip Reames
6955e01c91f2SPhilip Reamesexit1:
6956e01c91f2SPhilip Reames  ret void
6957e01c91f2SPhilip Reames}
6958