[llvm] e01c91f - [tests] Add coverage for cases we can prune exits when runtlme unrolling
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 12 09:43:26 PST 2021
Author: Philip Reames
Date: 2021-11-12T09:43:16-08:00
New Revision: e01c91f242fc7d8ebb2c6267758838d90f17d58c
URL: https://github.com/llvm/llvm-project/commit/e01c91f242fc7d8ebb2c6267758838d90f17d58c
DIFF: https://github.com/llvm/llvm-project/commit/e01c91f242fc7d8ebb2c6267758838d90f17d58c.diff
LOG: [tests] Add coverage for cases we can prune exits when runtlme unrolling
Added:
Modified:
llvm/test/Transforms/LoopUnroll/runtime-loop-multiple-exits.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/LoopUnroll/runtime-loop-multiple-exits.ll b/llvm/test/Transforms/LoopUnroll/runtime-loop-multiple-exits.ll
index 2d961aad6a5c4..617e2e6d2765f 100644
--- a/llvm/test/Transforms/LoopUnroll/runtime-loop-multiple-exits.ll
+++ b/llvm/test/Transforms/LoopUnroll/runtime-loop-multiple-exits.ll
@@ -5001,3 +5001,1593 @@ latch: ; preds = %header
outerLatch: ; preds = %latch, %outerloopHdr
br label %outerloopHdr
}
+
+declare void @bar()
+
+; This is a case where we should be able to eliminate N-1 copies
+; of the early exit test in the main loop when runtime unrolling
+; by N.
+define void @test10(i64 %trip, i64 %trip2) {
+; EPILOG-LABEL: @test10(
+; EPILOG-NEXT: entry:
+; EPILOG-NEXT: %0 = add i64 %trip, -1
+; EPILOG-NEXT: %xtraiter = and i64 %trip, 7
+; EPILOG-NEXT: %1 = icmp ult i64 %0, 7
+; EPILOG-NEXT: br i1 %1, label %exit2.unr-lcssa, label %entry.new
+; EPILOG: entry.new:
+; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter
+; EPILOG-NEXT: br label %loop_header
+; EPILOG: loop_header:
+; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
+; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ]
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2
+; EPILOG-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
+; EPILOG: loop_latch:
+; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1
+; EPILOG-NEXT: %niter.nsub = sub i64 %niter, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
+; EPILOG: exit1.loopexit:
+; EPILOG-NEXT: br label %exit1
+; EPILOG: exit1.loopexit1:
+; EPILOG-NEXT: br label %exit1
+; EPILOG: exit1:
+; EPILOG-NEXT: ret void
+; EPILOG: exit2.unr-lcssa.loopexit:
+; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
+; EPILOG-NEXT: br label %exit2.unr-lcssa
+; EPILOG: exit2.unr-lcssa:
+; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ]
+; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
+; EPILOG: loop_header.epil.preheader:
+; EPILOG-NEXT: br label %loop_header.epil
+; EPILOG: loop_header.epil:
+; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
+; EPILOG-NEXT: %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ]
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.epil = icmp ne i64 %iv.epil, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1.loopexit1
+; EPILOG: loop_latch.epil:
+; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1
+; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip
+; EPILOG-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1
+; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
+; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !13
+; EPILOG: exit2.epilog-lcssa:
+; EPILOG-NEXT: br label %exit2
+; EPILOG: exit2:
+; EPILOG-NEXT: ret void
+; EPILOG: loop_latch.1:
+; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1
+; EPILOG-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit
+; EPILOG: loop_latch.2:
+; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
+; EPILOG-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit
+; EPILOG: loop_latch.3:
+; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
+; EPILOG-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit
+; EPILOG: loop_latch.4:
+; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
+; EPILOG-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit
+; EPILOG: loop_latch.5:
+; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
+; EPILOG-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit
+; EPILOG: loop_latch.6:
+; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
+; EPILOG-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit
+; EPILOG: loop_latch.7:
+; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1
+; EPILOG-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1
+; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0
+; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit
+;
+; EPILOG-BLOCK-LABEL: @test10(
+; EPILOG-BLOCK-NEXT: entry:
+; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1
+; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1
+; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1
+; EPILOG-BLOCK-NEXT: br i1 %1, label %exit2.unr-lcssa, label %entry.new
+; EPILOG-BLOCK: entry.new:
+; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter
+; EPILOG-BLOCK-NEXT: br label %loop_header
+; EPILOG-BLOCK: loop_header:
+; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT: call void @bar()
+; EPILOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2
+; EPILOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
+; EPILOG-BLOCK: loop_latch:
+; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1
+; EPILOG-BLOCK-NEXT: %niter.nsub = sub i64 %niter, 1
+; EPILOG-BLOCK-NEXT: call void @bar()
+; EPILOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2
+; EPILOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
+; EPILOG-BLOCK: exit1.loopexit:
+; EPILOG-BLOCK-NEXT: br label %exit1
+; EPILOG-BLOCK: exit1:
+; EPILOG-BLOCK-NEXT: ret void
+; EPILOG-BLOCK: exit2.unr-lcssa.loopexit:
+; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT: br label %exit2.unr-lcssa
+; EPILOG-BLOCK: exit2.unr-lcssa:
+; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ]
+; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
+; EPILOG-BLOCK: loop_header.epil.preheader:
+; EPILOG-BLOCK-NEXT: br label %loop_header.epil
+; EPILOG-BLOCK: loop_header.epil:
+; EPILOG-BLOCK-NEXT: call void @bar()
+; EPILOG-BLOCK-NEXT: %cmp_early.epil = icmp ne i64 %iv.unr, %trip2
+; EPILOG-BLOCK-NEXT: br i1 %cmp_early.epil, label %loop_latch.epil, label %exit1
+; EPILOG-BLOCK: loop_latch.epil:
+; EPILOG-BLOCK-NEXT: br label %exit2
+; EPILOG-BLOCK: exit2:
+; EPILOG-BLOCK-NEXT: ret void
+; EPILOG-BLOCK: loop_latch.1:
+; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1
+; EPILOG-BLOCK-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0
+; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !15
+;
+; PROLOG-LABEL: @test10(
+; PROLOG-NEXT: entry:
+; PROLOG-NEXT: %0 = add i64 %trip, -1
+; PROLOG-NEXT: %xtraiter = and i64 %trip, 7
+; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
+; PROLOG: loop_header.prol.preheader:
+; PROLOG-NEXT: br label %loop_header.prol
+; PROLOG: loop_header.prol:
+; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
+; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ]
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.prol = icmp ne i64 %iv.prol, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1.loopexit1
+; PROLOG: loop_latch.prol:
+; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1
+; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip
+; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1
+; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
+; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !13
+; PROLOG: loop_header.prol.loopexit.unr-lcssa:
+; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
+; PROLOG-NEXT: br label %loop_header.prol.loopexit
+; PROLOG: loop_header.prol.loopexit:
+; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
+; PROLOG-NEXT: %1 = icmp ult i64 %0, 7
+; PROLOG-NEXT: br i1 %1, label %exit2, label %entry.new
+; PROLOG: entry.new:
+; PROLOG-NEXT: br label %loop_header
+; PROLOG: loop_header:
+; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2
+; PROLOG-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
+; PROLOG: loop_latch:
+; PROLOG-NEXT: %iv_next = add i64 %iv, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
+; PROLOG: exit1.loopexit:
+; PROLOG-NEXT: br label %exit1
+; PROLOG: exit1.loopexit1:
+; PROLOG-NEXT: br label %exit1
+; PROLOG: exit1:
+; PROLOG-NEXT: ret void
+; PROLOG: exit2.unr-lcssa:
+; PROLOG-NEXT: br label %exit2
+; PROLOG: exit2:
+; PROLOG-NEXT: ret void
+; PROLOG: loop_latch.1:
+; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.2, label %loop_latch.2, label %exit1.loopexit
+; PROLOG: loop_latch.2:
+; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.3, label %loop_latch.3, label %exit1.loopexit
+; PROLOG: loop_latch.3:
+; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.4, label %loop_latch.4, label %exit1.loopexit
+; PROLOG: loop_latch.4:
+; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.5, label %loop_latch.5, label %exit1.loopexit
+; PROLOG: loop_latch.5:
+; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.6, label %loop_latch.6, label %exit1.loopexit
+; PROLOG: loop_latch.6:
+; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.7, label %loop_latch.7, label %exit1.loopexit
+; PROLOG: loop_latch.7:
+; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1
+; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip
+; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa
+;
+; PROLOG-BLOCK-LABEL: @test10(
+; PROLOG-BLOCK-NEXT: entry:
+; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1
+; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1
+; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
+; PROLOG-BLOCK: loop_header.prol.preheader:
+; PROLOG-BLOCK-NEXT: br label %loop_header.prol
+; PROLOG-BLOCK: loop_header.prol:
+; PROLOG-BLOCK-NEXT: call void @bar()
+; PROLOG-BLOCK-NEXT: %cmp_early.prol = icmp ne i64 0, %trip2
+; PROLOG-BLOCK-NEXT: br i1 %cmp_early.prol, label %loop_latch.prol, label %exit1
+; PROLOG-BLOCK: loop_latch.prol:
+; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit
+; PROLOG-BLOCK: loop_header.prol.loopexit:
+; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
+; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1
+; PROLOG-BLOCK-NEXT: br i1 %1, label %exit2, label %entry.new
+; PROLOG-BLOCK: entry.new:
+; PROLOG-BLOCK-NEXT: br label %loop_header
+; PROLOG-BLOCK: loop_header:
+; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
+; PROLOG-BLOCK-NEXT: call void @bar()
+; PROLOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2
+; PROLOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_latch, label %exit1.loopexit
+; PROLOG-BLOCK: loop_latch:
+; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1
+; PROLOG-BLOCK-NEXT: call void @bar()
+; PROLOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2
+; PROLOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_latch.1, label %exit1.loopexit
+; PROLOG-BLOCK: exit1.loopexit:
+; PROLOG-BLOCK-NEXT: br label %exit1
+; PROLOG-BLOCK: exit1:
+; PROLOG-BLOCK-NEXT: ret void
+; PROLOG-BLOCK: exit2.unr-lcssa:
+; PROLOG-BLOCK-NEXT: br label %exit2
+; PROLOG-BLOCK: exit2:
+; PROLOG-BLOCK-NEXT: ret void
+; PROLOG-BLOCK: loop_latch.1:
+; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1
+; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip
+; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !15
+;
+entry:
+ br label %loop_header
+
+loop_header:
+ %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
+ call void @bar()
+ %cmp_early = icmp ne i64 %iv, %trip2
+ br i1 %cmp_early, label %loop_latch, label %exit1
+
+loop_latch:
+ %iv_next = add i64 %iv, 1
+ %cmp = icmp ne i64 %iv_next, %trip
+ br i1 %cmp, label %loop_header, label %exit2
+
+exit1:
+ ret void
+
+exit2:
+ ret void
+}
+
+; With a loop invariant, we can eliminate the last N-1
+; copies of the exit test in the unrolled main loop body.
+define void @test11(i64 %trip, i1 %cond) {
+; EPILOG-LABEL: @test11(
+; EPILOG-NEXT: entry:
+; EPILOG-NEXT: %0 = add i64 %trip, -1
+; EPILOG-NEXT: %xtraiter = and i64 %trip, 7
+; EPILOG-NEXT: %1 = icmp ult i64 %0, 7
+; EPILOG-NEXT: br i1 %1, label %exit2.unr-lcssa, label %entry.new
+; EPILOG: entry.new:
+; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter
+; EPILOG-NEXT: br label %loop_header
+; EPILOG: loop_header:
+; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
+; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ]
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit
+; EPILOG: loop_latch:
+; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1
+; EPILOG-NEXT: %niter.nsub = sub i64 %niter, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit
+; EPILOG: exit1.loopexit:
+; EPILOG-NEXT: br label %exit1
+; EPILOG: exit1.loopexit1:
+; EPILOG-NEXT: br label %exit1
+; EPILOG: exit1:
+; EPILOG-NEXT: ret void
+; EPILOG: exit2.unr-lcssa.loopexit:
+; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
+; EPILOG-NEXT: br label %exit2.unr-lcssa
+; EPILOG: exit2.unr-lcssa:
+; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.unr-lcssa.loopexit ]
+; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
+; EPILOG: loop_header.epil.preheader:
+; EPILOG-NEXT: br label %loop_header.epil
+; EPILOG: loop_header.epil:
+; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
+; EPILOG-NEXT: %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ]
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1.loopexit1
+; EPILOG: loop_latch.epil:
+; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1
+; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip
+; EPILOG-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1
+; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
+; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.epilog-lcssa, !llvm.loop !14
+; EPILOG: exit2.epilog-lcssa:
+; EPILOG-NEXT: br label %exit2
+; EPILOG: exit2:
+; EPILOG-NEXT: ret void
+; EPILOG: loop_latch.1:
+; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1
+; EPILOG-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.loopexit
+; EPILOG: loop_latch.2:
+; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
+; EPILOG-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.loopexit
+; EPILOG: loop_latch.3:
+; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
+; EPILOG-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.loopexit
+; EPILOG: loop_latch.4:
+; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
+; EPILOG-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.loopexit
+; EPILOG: loop_latch.5:
+; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
+; EPILOG-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.loopexit
+; EPILOG: loop_latch.6:
+; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
+; EPILOG-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.loopexit
+; EPILOG: loop_latch.7:
+; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1
+; EPILOG-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1
+; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0
+; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit2.unr-lcssa.loopexit
+;
+; EPILOG-BLOCK-LABEL: @test11(
+; EPILOG-BLOCK-NEXT: entry:
+; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1
+; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1
+; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1
+; EPILOG-BLOCK-NEXT: br i1 %1, label %exit2.unr-lcssa, label %entry.new
+; EPILOG-BLOCK: entry.new:
+; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter
+; EPILOG-BLOCK-NEXT: br label %loop_header
+; EPILOG-BLOCK: loop_header:
+; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT: call void @bar()
+; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit
+; EPILOG-BLOCK: loop_latch:
+; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1
+; EPILOG-BLOCK-NEXT: %niter.nsub = sub i64 %niter, 1
+; EPILOG-BLOCK-NEXT: call void @bar()
+; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit
+; EPILOG-BLOCK: exit1.loopexit:
+; EPILOG-BLOCK-NEXT: br label %exit1
+; EPILOG-BLOCK: exit1:
+; EPILOG-BLOCK-NEXT: ret void
+; EPILOG-BLOCK: exit2.unr-lcssa.loopexit:
+; EPILOG-BLOCK-NEXT: br label %exit2.unr-lcssa
+; EPILOG-BLOCK: exit2.unr-lcssa:
+; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2
+; EPILOG-BLOCK: loop_header.epil.preheader:
+; EPILOG-BLOCK-NEXT: br label %loop_header.epil
+; EPILOG-BLOCK: loop_header.epil:
+; EPILOG-BLOCK-NEXT: call void @bar()
+; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1
+; EPILOG-BLOCK: loop_latch.epil:
+; EPILOG-BLOCK-NEXT: br label %exit2
+; EPILOG-BLOCK: exit2:
+; EPILOG-BLOCK-NEXT: ret void
+; EPILOG-BLOCK: loop_latch.1:
+; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1
+; EPILOG-BLOCK-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0
+; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit2.unr-lcssa.loopexit, !llvm.loop !16
+;
+; PROLOG-LABEL: @test11(
+; PROLOG-NEXT: entry:
+; PROLOG-NEXT: %0 = add i64 %trip, -1
+; PROLOG-NEXT: %xtraiter = and i64 %trip, 7
+; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
+; PROLOG: loop_header.prol.preheader:
+; PROLOG-NEXT: br label %loop_header.prol
+; PROLOG: loop_header.prol:
+; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
+; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ]
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1.loopexit1
+; PROLOG: loop_latch.prol:
+; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1
+; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip
+; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1
+; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
+; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !14
+; PROLOG: loop_header.prol.loopexit.unr-lcssa:
+; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
+; PROLOG-NEXT: br label %loop_header.prol.loopexit
+; PROLOG: loop_header.prol.loopexit:
+; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
+; PROLOG-NEXT: %1 = icmp ult i64 %0, 7
+; PROLOG-NEXT: br i1 %1, label %exit2, label %entry.new
+; PROLOG: entry.new:
+; PROLOG-NEXT: br label %loop_header
+; PROLOG: loop_header:
+; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit
+; PROLOG: loop_latch:
+; PROLOG-NEXT: %iv_next = add i64 %iv, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit
+; PROLOG: exit1.loopexit:
+; PROLOG-NEXT: br label %exit1
+; PROLOG: exit1.loopexit1:
+; PROLOG-NEXT: br label %exit1
+; PROLOG: exit1:
+; PROLOG-NEXT: ret void
+; PROLOG: exit2.unr-lcssa:
+; PROLOG-NEXT: br label %exit2
+; PROLOG: exit2:
+; PROLOG-NEXT: ret void
+; PROLOG: loop_latch.1:
+; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.loopexit
+; PROLOG: loop_latch.2:
+; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.loopexit
+; PROLOG: loop_latch.3:
+; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.loopexit
+; PROLOG: loop_latch.4:
+; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.loopexit
+; PROLOG: loop_latch.5:
+; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.loopexit
+; PROLOG: loop_latch.6:
+; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.loopexit
+; PROLOG: loop_latch.7:
+; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1
+; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip
+; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit2.unr-lcssa
+;
+; PROLOG-BLOCK-LABEL: @test11(
+; PROLOG-BLOCK-NEXT: entry:
+; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1
+; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1
+; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
+; PROLOG-BLOCK: loop_header.prol.preheader:
+; PROLOG-BLOCK-NEXT: br label %loop_header.prol
+; PROLOG-BLOCK: loop_header.prol:
+; PROLOG-BLOCK-NEXT: call void @bar()
+; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1
+; PROLOG-BLOCK: loop_latch.prol:
+; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit
+; PROLOG-BLOCK: loop_header.prol.loopexit:
+; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
+; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1
+; PROLOG-BLOCK-NEXT: br i1 %1, label %exit2, label %entry.new
+; PROLOG-BLOCK: entry.new:
+; PROLOG-BLOCK-NEXT: br label %loop_header
+; PROLOG-BLOCK: loop_header:
+; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
+; PROLOG-BLOCK-NEXT: call void @bar()
+; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.loopexit
+; PROLOG-BLOCK: loop_latch:
+; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1
+; PROLOG-BLOCK-NEXT: call void @bar()
+; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.loopexit
+; PROLOG-BLOCK: exit1.loopexit:
+; PROLOG-BLOCK-NEXT: br label %exit1
+; PROLOG-BLOCK: exit1:
+; PROLOG-BLOCK-NEXT: ret void
+; PROLOG-BLOCK: exit2.unr-lcssa:
+; PROLOG-BLOCK-NEXT: br label %exit2
+; PROLOG-BLOCK: exit2:
+; PROLOG-BLOCK-NEXT: ret void
+; PROLOG-BLOCK: loop_latch.1:
+; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1
+; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip
+; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit2.unr-lcssa, !llvm.loop !16
+;
+entry:
+ br label %loop_header
+
+loop_header:
+ %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
+ call void @bar()
+ br i1 %cond, label %loop_latch, label %exit1
+
+loop_latch:
+ %iv_next = add i64 %iv, 1
+ %cmp = icmp ne i64 %iv_next, %trip
+ br i1 %cmp, label %loop_header, label %exit2
+
+exit1:
+ ret void
+
+exit2:
+ ret void
+}
+
+; Combine a computeable and invariant test to make sure
+; the interaction of both doesn't do anything weird
+define void @test12(i64 %trip, i64 %trip2, i1 %cond) {
+; EPILOG-LABEL: @test12(
+; EPILOG-NEXT: entry:
+; EPILOG-NEXT: %0 = add i64 %trip, -1
+; EPILOG-NEXT: %xtraiter = and i64 %trip, 7
+; EPILOG-NEXT: %1 = icmp ult i64 %0, 7
+; EPILOG-NEXT: br i1 %1, label %exit1.unr-lcssa, label %entry.new
+; EPILOG: entry.new:
+; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter
+; EPILOG-NEXT: br label %loop_header
+; EPILOG: loop_header:
+; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
+; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ]
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2
+; EPILOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2:
+; EPILOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch:
+; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1
+; EPILOG-NEXT: %niter.nsub = sub i64 %niter, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
+; EPILOG: exit1.unr-lcssa.loopexit:
+; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
+; EPILOG-NEXT: br label %exit1.unr-lcssa
+; EPILOG: exit1.unr-lcssa:
+; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
+; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
+; EPILOG: loop_header.epil.preheader:
+; EPILOG-NEXT: br label %loop_header.epil
+; EPILOG: loop_header.epil:
+; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
+; EPILOG-NEXT: %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ]
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.epil = icmp ne i64 %iv.epil, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1
+; EPILOG: loop_exiting_bb2.epil:
+; EPILOG-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1
+; EPILOG: loop_latch.epil:
+; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1
+; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip
+; EPILOG-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1
+; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
+; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !15
+; EPILOG: exit1.epilog-lcssa.loopexit:
+; EPILOG-NEXT: br label %exit1.epilog-lcssa
+; EPILOG: exit1.epilog-lcssa.loopexit1:
+; EPILOG-NEXT: br label %exit1.epilog-lcssa
+; EPILOG: exit1.epilog-lcssa:
+; EPILOG-NEXT: br label %exit1
+; EPILOG: exit1:
+; EPILOG-NEXT: ret void
+; EPILOG: loop_exiting_bb2.1:
+; EPILOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.1:
+; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1
+; EPILOG-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2.2:
+; EPILOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.2:
+; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
+; EPILOG-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2.3:
+; EPILOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.3:
+; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
+; EPILOG-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2.4:
+; EPILOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.4:
+; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
+; EPILOG-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2.5:
+; EPILOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.5:
+; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
+; EPILOG-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2.6:
+; EPILOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.6:
+; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
+; EPILOG-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2.7:
+; EPILOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.7:
+; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1
+; EPILOG-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1
+; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0
+; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
+;
+; EPILOG-BLOCK-LABEL: @test12(
+; EPILOG-BLOCK-NEXT: entry:
+; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1
+; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1
+; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1
+; EPILOG-BLOCK-NEXT: br i1 %1, label %exit1.unr-lcssa, label %entry.new
+; EPILOG-BLOCK: entry.new:
+; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter
+; EPILOG-BLOCK-NEXT: br label %loop_header
+; EPILOG-BLOCK: loop_header:
+; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT: call void @bar()
+; EPILOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2
+; EPILOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
+; EPILOG-BLOCK: loop_exiting_bb2:
+; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.epilog-lcssa.loopexit
+; EPILOG-BLOCK: loop_latch:
+; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1
+; EPILOG-BLOCK-NEXT: %niter.nsub = sub i64 %niter, 1
+; EPILOG-BLOCK-NEXT: call void @bar()
+; EPILOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2
+; EPILOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
+; EPILOG-BLOCK: exit1.unr-lcssa.loopexit:
+; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT: br label %exit1.unr-lcssa
+; EPILOG-BLOCK: exit1.unr-lcssa:
+; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
+; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
+; EPILOG-BLOCK: loop_header.epil.preheader:
+; EPILOG-BLOCK-NEXT: br label %loop_header.epil
+; EPILOG-BLOCK: loop_header.epil:
+; EPILOG-BLOCK-NEXT: call void @bar()
+; EPILOG-BLOCK-NEXT: %cmp_early.epil = icmp ne i64 %iv.unr, %trip2
+; EPILOG-BLOCK-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa
+; EPILOG-BLOCK: loop_exiting_bb2.epil:
+; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.epil, label %exit1.epilog-lcssa
+; EPILOG-BLOCK: loop_latch.epil:
+; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa
+; EPILOG-BLOCK: exit1.epilog-lcssa.loopexit:
+; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa
+; EPILOG-BLOCK: exit1.epilog-lcssa:
+; EPILOG-BLOCK-NEXT: br label %exit1
+; EPILOG-BLOCK: exit1:
+; EPILOG-BLOCK-NEXT: ret void
+; EPILOG-BLOCK: loop_exiting_bb2.1:
+; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
+; EPILOG-BLOCK: loop_latch.1:
+; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1
+; EPILOG-BLOCK-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0
+; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !17
+;
+; PROLOG-LABEL: @test12(
+; PROLOG-NEXT: entry:
+; PROLOG-NEXT: %0 = add i64 %trip, -1
+; PROLOG-NEXT: %xtraiter = and i64 %trip, 7
+; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
+; PROLOG: loop_header.prol.preheader:
+; PROLOG-NEXT: br label %loop_header.prol
+; PROLOG: loop_header.prol:
+; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
+; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ]
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.prol = icmp ne i64 %iv.prol, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1
+; PROLOG: loop_exiting_bb2.prol:
+; PROLOG-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1
+; PROLOG: loop_latch.prol:
+; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1
+; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip
+; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1
+; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
+; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !15
+; PROLOG: loop_header.prol.loopexit.unr-lcssa:
+; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
+; PROLOG-NEXT: br label %loop_header.prol.loopexit
+; PROLOG: loop_header.prol.loopexit:
+; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
+; PROLOG-NEXT: %1 = icmp ult i64 %0, 7
+; PROLOG-NEXT: br i1 %1, label %exit1, label %entry.new
+; PROLOG: entry.new:
+; PROLOG-NEXT: br label %loop_header
+; PROLOG: loop_header:
+; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2
+; PROLOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2:
+; PROLOG-NEXT: br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch:
+; PROLOG-NEXT: %iv_next = add i64 %iv, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
+; PROLOG: exit1.unr-lcssa.loopexit:
+; PROLOG-NEXT: br label %exit1.unr-lcssa
+; PROLOG: exit1.unr-lcssa.loopexit1:
+; PROLOG-NEXT: br label %exit1.unr-lcssa
+; PROLOG: exit1.unr-lcssa:
+; PROLOG-NEXT: br label %exit1
+; PROLOG: exit1:
+; PROLOG-NEXT: ret void
+; PROLOG: loop_exiting_bb2.1:
+; PROLOG-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.1:
+; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2.2:
+; PROLOG-NEXT: br i1 %cond, label %loop_latch.2, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.2:
+; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2.3:
+; PROLOG-NEXT: br i1 %cond, label %loop_latch.3, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.3:
+; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2.4:
+; PROLOG-NEXT: br i1 %cond, label %loop_latch.4, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.4:
+; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2.5:
+; PROLOG-NEXT: br i1 %cond, label %loop_latch.5, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.5:
+; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2.6:
+; PROLOG-NEXT: br i1 %cond, label %loop_latch.6, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.6:
+; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2.7:
+; PROLOG-NEXT: br i1 %cond, label %loop_latch.7, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.7:
+; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1
+; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip
+; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
+;
+; PROLOG-BLOCK-LABEL: @test12(
+; PROLOG-BLOCK-NEXT: entry:
+; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1
+; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1
+; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
+; PROLOG-BLOCK: loop_header.prol.preheader:
+; PROLOG-BLOCK-NEXT: br label %loop_header.prol
+; PROLOG-BLOCK: loop_header.prol:
+; PROLOG-BLOCK-NEXT: call void @bar()
+; PROLOG-BLOCK-NEXT: %cmp_early.prol = icmp ne i64 0, %trip2
+; PROLOG-BLOCK-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa
+; PROLOG-BLOCK: loop_exiting_bb2.prol:
+; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.prol, label %exit1.unr-lcssa
+; PROLOG-BLOCK: loop_latch.prol:
+; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit
+; PROLOG-BLOCK: loop_header.prol.loopexit:
+; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
+; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1
+; PROLOG-BLOCK-NEXT: br i1 %1, label %exit1, label %entry.new
+; PROLOG-BLOCK: entry.new:
+; PROLOG-BLOCK-NEXT: br label %loop_header
+; PROLOG-BLOCK: loop_header:
+; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
+; PROLOG-BLOCK-NEXT: call void @bar()
+; PROLOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2
+; PROLOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
+; PROLOG-BLOCK: loop_exiting_bb2:
+; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch, label %exit1.unr-lcssa.loopexit
+; PROLOG-BLOCK: loop_latch:
+; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1
+; PROLOG-BLOCK-NEXT: call void @bar()
+; PROLOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2
+; PROLOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
+; PROLOG-BLOCK: exit1.unr-lcssa.loopexit:
+; PROLOG-BLOCK-NEXT: br label %exit1.unr-lcssa
+; PROLOG-BLOCK: exit1.unr-lcssa:
+; PROLOG-BLOCK-NEXT: br label %exit1
+; PROLOG-BLOCK: exit1:
+; PROLOG-BLOCK-NEXT: ret void
+; PROLOG-BLOCK: loop_exiting_bb2.1:
+; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
+; PROLOG-BLOCK: loop_latch.1:
+; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1
+; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip
+; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !17
+;
+entry:
+ br label %loop_header
+
+loop_header:
+ %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
+ call void @bar()
+ %cmp_early = icmp ne i64 %iv, %trip2
+ br i1 %cmp_early, label %loop_exiting_bb2, label %exit1
+
+loop_exiting_bb2:
+ br i1 %cond, label %loop_latch, label %exit1
+
+loop_latch:
+ %iv_next = add i64 %iv, 1
+ %cmp = icmp ne i64 %iv_next, %trip
+ br i1 %cmp, label %loop_header, label %exit1
+
+exit1:
+ ret void
+}
+
+declare i1 @unknown_cond()
+
+; Mix of computable and uncompatable exits
+define void @test13(i64 %trip, i64 %trip2) {
+; EPILOG-LABEL: @test13(
+; EPILOG-NEXT: entry:
+; EPILOG-NEXT: %0 = add i64 %trip, -1
+; EPILOG-NEXT: %xtraiter = and i64 %trip, 7
+; EPILOG-NEXT: %1 = icmp ult i64 %0, 7
+; EPILOG-NEXT: br i1 %1, label %exit1.unr-lcssa, label %entry.new
+; EPILOG: entry.new:
+; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter
+; EPILOG-NEXT: br label %loop_header
+; EPILOG: loop_header:
+; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
+; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ]
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2
+; EPILOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2:
+; EPILOG-NEXT: %unknown = call i1 @unknown_cond()
+; EPILOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch:
+; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1
+; EPILOG-NEXT: %niter.nsub = sub i64 %niter, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
+; EPILOG: exit1.unr-lcssa.loopexit:
+; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
+; EPILOG-NEXT: br label %exit1.unr-lcssa
+; EPILOG: exit1.unr-lcssa:
+; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
+; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
+; EPILOG: loop_header.epil.preheader:
+; EPILOG-NEXT: br label %loop_header.epil
+; EPILOG: loop_header.epil:
+; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
+; EPILOG-NEXT: %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ]
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.epil = icmp ne i64 %iv.epil, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1
+; EPILOG: loop_exiting_bb2.epil:
+; EPILOG-NEXT: %unknown.epil = call i1 @unknown_cond()
+; EPILOG-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1
+; EPILOG: loop_latch.epil:
+; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1
+; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip
+; EPILOG-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1
+; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
+; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !16
+; EPILOG: exit1.epilog-lcssa.loopexit:
+; EPILOG-NEXT: br label %exit1.epilog-lcssa
+; EPILOG: exit1.epilog-lcssa.loopexit1:
+; EPILOG-NEXT: br label %exit1.epilog-lcssa
+; EPILOG: exit1.epilog-lcssa:
+; EPILOG-NEXT: br label %exit1
+; EPILOG: exit1:
+; EPILOG-NEXT: ret void
+; EPILOG: loop_exiting_bb2.1:
+; EPILOG-NEXT: %unknown.1 = call i1 @unknown_cond()
+; EPILOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.1:
+; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1
+; EPILOG-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2.2:
+; EPILOG-NEXT: %unknown.2 = call i1 @unknown_cond()
+; EPILOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.2:
+; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
+; EPILOG-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2.3:
+; EPILOG-NEXT: %unknown.3 = call i1 @unknown_cond()
+; EPILOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.3:
+; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
+; EPILOG-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2.4:
+; EPILOG-NEXT: %unknown.4 = call i1 @unknown_cond()
+; EPILOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.4:
+; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
+; EPILOG-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2.5:
+; EPILOG-NEXT: %unknown.5 = call i1 @unknown_cond()
+; EPILOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.5:
+; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
+; EPILOG-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2.6:
+; EPILOG-NEXT: %unknown.6 = call i1 @unknown_cond()
+; EPILOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.6:
+; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
+; EPILOG-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
+; EPILOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2.7:
+; EPILOG-NEXT: %unknown.7 = call i1 @unknown_cond()
+; EPILOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.7:
+; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1
+; EPILOG-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1
+; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0
+; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
+;
+; EPILOG-BLOCK-LABEL: @test13(
+; EPILOG-BLOCK-NEXT: entry:
+; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1
+; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1
+; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1
+; EPILOG-BLOCK-NEXT: br i1 %1, label %exit1.unr-lcssa, label %entry.new
+; EPILOG-BLOCK: entry.new:
+; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter
+; EPILOG-BLOCK-NEXT: br label %loop_header
+; EPILOG-BLOCK: loop_header:
+; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT: call void @bar()
+; EPILOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2
+; EPILOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
+; EPILOG-BLOCK: loop_exiting_bb2:
+; EPILOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond()
+; EPILOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
+; EPILOG-BLOCK: loop_latch:
+; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1
+; EPILOG-BLOCK-NEXT: %niter.nsub = sub i64 %niter, 1
+; EPILOG-BLOCK-NEXT: call void @bar()
+; EPILOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2
+; EPILOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
+; EPILOG-BLOCK: exit1.unr-lcssa.loopexit:
+; EPILOG-BLOCK-NEXT: %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT: br label %exit1.unr-lcssa
+; EPILOG-BLOCK: exit1.unr-lcssa:
+; EPILOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
+; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
+; EPILOG-BLOCK: loop_header.epil.preheader:
+; EPILOG-BLOCK-NEXT: br label %loop_header.epil
+; EPILOG-BLOCK: loop_header.epil:
+; EPILOG-BLOCK-NEXT: call void @bar()
+; EPILOG-BLOCK-NEXT: %cmp_early.epil = icmp ne i64 %iv.unr, %trip2
+; EPILOG-BLOCK-NEXT: br i1 %cmp_early.epil, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa
+; EPILOG-BLOCK: loop_exiting_bb2.epil:
+; EPILOG-BLOCK-NEXT: %unknown.epil = call i1 @unknown_cond()
+; EPILOG-BLOCK-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa
+; EPILOG-BLOCK: loop_latch.epil:
+; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa
+; EPILOG-BLOCK: exit1.epilog-lcssa.loopexit:
+; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa
+; EPILOG-BLOCK: exit1.epilog-lcssa:
+; EPILOG-BLOCK-NEXT: br label %exit1
+; EPILOG-BLOCK: exit1:
+; EPILOG-BLOCK-NEXT: ret void
+; EPILOG-BLOCK: loop_exiting_bb2.1:
+; EPILOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond()
+; EPILOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
+; EPILOG-BLOCK: loop_latch.1:
+; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1
+; EPILOG-BLOCK-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0
+; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18
+;
+; PROLOG-LABEL: @test13(
+; PROLOG-NEXT: entry:
+; PROLOG-NEXT: %0 = add i64 %trip, -1
+; PROLOG-NEXT: %xtraiter = and i64 %trip, 7
+; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
+; PROLOG: loop_header.prol.preheader:
+; PROLOG-NEXT: br label %loop_header.prol
+; PROLOG: loop_header.prol:
+; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
+; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ]
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.prol = icmp ne i64 %iv.prol, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1
+; PROLOG: loop_exiting_bb2.prol:
+; PROLOG-NEXT: %unknown.prol = call i1 @unknown_cond()
+; PROLOG-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1
+; PROLOG: loop_latch.prol:
+; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1
+; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip
+; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1
+; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
+; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !16
+; PROLOG: loop_header.prol.loopexit.unr-lcssa:
+; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
+; PROLOG-NEXT: br label %loop_header.prol.loopexit
+; PROLOG: loop_header.prol.loopexit:
+; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
+; PROLOG-NEXT: %1 = icmp ult i64 %0, 7
+; PROLOG-NEXT: br i1 %1, label %exit1, label %entry.new
+; PROLOG: entry.new:
+; PROLOG-NEXT: br label %loop_header
+; PROLOG: loop_header:
+; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early = icmp ne i64 %iv, %trip2
+; PROLOG-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2:
+; PROLOG-NEXT: %unknown = call i1 @unknown_cond()
+; PROLOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch:
+; PROLOG-NEXT: %iv_next = add i64 %iv, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
+; PROLOG: exit1.unr-lcssa.loopexit:
+; PROLOG-NEXT: br label %exit1.unr-lcssa
+; PROLOG: exit1.unr-lcssa.loopexit1:
+; PROLOG-NEXT: br label %exit1.unr-lcssa
+; PROLOG: exit1.unr-lcssa:
+; PROLOG-NEXT: br label %exit1
+; PROLOG: exit1:
+; PROLOG-NEXT: ret void
+; PROLOG: loop_exiting_bb2.1:
+; PROLOG-NEXT: %unknown.1 = call i1 @unknown_cond()
+; PROLOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.1:
+; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.2 = icmp ne i64 %iv_next.1, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.2, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2.2:
+; PROLOG-NEXT: %unknown.2 = call i1 @unknown_cond()
+; PROLOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.2:
+; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.3 = icmp ne i64 %iv_next.2, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.3, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2.3:
+; PROLOG-NEXT: %unknown.3 = call i1 @unknown_cond()
+; PROLOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.3:
+; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.4 = icmp ne i64 %iv_next.3, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.4, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2.4:
+; PROLOG-NEXT: %unknown.4 = call i1 @unknown_cond()
+; PROLOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.4:
+; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.5 = icmp ne i64 %iv_next.4, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.5, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2.5:
+; PROLOG-NEXT: %unknown.5 = call i1 @unknown_cond()
+; PROLOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.5:
+; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.6 = icmp ne i64 %iv_next.5, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.6, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2.6:
+; PROLOG-NEXT: %unknown.6 = call i1 @unknown_cond()
+; PROLOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.6:
+; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: %cmp_early.7 = icmp ne i64 %iv_next.6, %trip2
+; PROLOG-NEXT: br i1 %cmp_early.7, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2.7:
+; PROLOG-NEXT: %unknown.7 = call i1 @unknown_cond()
+; PROLOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.7:
+; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1
+; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip
+; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
+;
+; PROLOG-BLOCK-LABEL: @test13(
+; PROLOG-BLOCK-NEXT: entry:
+; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1
+; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1
+; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
+; PROLOG-BLOCK: loop_header.prol.preheader:
+; PROLOG-BLOCK-NEXT: br label %loop_header.prol
+; PROLOG-BLOCK: loop_header.prol:
+; PROLOG-BLOCK-NEXT: call void @bar()
+; PROLOG-BLOCK-NEXT: %cmp_early.prol = icmp ne i64 0, %trip2
+; PROLOG-BLOCK-NEXT: br i1 %cmp_early.prol, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa
+; PROLOG-BLOCK: loop_exiting_bb2.prol:
+; PROLOG-BLOCK-NEXT: %unknown.prol = call i1 @unknown_cond()
+; PROLOG-BLOCK-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa
+; PROLOG-BLOCK: loop_latch.prol:
+; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit
+; PROLOG-BLOCK: loop_header.prol.loopexit:
+; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
+; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1
+; PROLOG-BLOCK-NEXT: br i1 %1, label %exit1, label %entry.new
+; PROLOG-BLOCK: entry.new:
+; PROLOG-BLOCK-NEXT: br label %loop_header
+; PROLOG-BLOCK: loop_header:
+; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
+; PROLOG-BLOCK-NEXT: call void @bar()
+; PROLOG-BLOCK-NEXT: %cmp_early = icmp ne i64 %iv, %trip2
+; PROLOG-BLOCK-NEXT: br i1 %cmp_early, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
+; PROLOG-BLOCK: loop_exiting_bb2:
+; PROLOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond()
+; PROLOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
+; PROLOG-BLOCK: loop_latch:
+; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1
+; PROLOG-BLOCK-NEXT: call void @bar()
+; PROLOG-BLOCK-NEXT: %cmp_early.1 = icmp ne i64 %iv_next, %trip2
+; PROLOG-BLOCK-NEXT: br i1 %cmp_early.1, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
+; PROLOG-BLOCK: exit1.unr-lcssa.loopexit:
+; PROLOG-BLOCK-NEXT: br label %exit1.unr-lcssa
+; PROLOG-BLOCK: exit1.unr-lcssa:
+; PROLOG-BLOCK-NEXT: br label %exit1
+; PROLOG-BLOCK: exit1:
+; PROLOG-BLOCK-NEXT: ret void
+; PROLOG-BLOCK: loop_exiting_bb2.1:
+; PROLOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond()
+; PROLOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
+; PROLOG-BLOCK: loop_latch.1:
+; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1
+; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip
+; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !18
+;
+entry:
+ br label %loop_header
+
+loop_header:
+ %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
+ call void @bar()
+ %cmp_early = icmp ne i64 %iv, %trip2
+ br i1 %cmp_early, label %loop_exiting_bb2, label %exit1
+
+loop_exiting_bb2:
+ %unknown = call i1 @unknown_cond()
+ br i1 %unknown, label %loop_latch, label %exit1
+
+loop_latch:
+ %iv_next = add i64 %iv, 1
+ %cmp = icmp ne i64 %iv_next, %trip
+ br i1 %cmp, label %loop_header, label %exit1
+
+exit1:
+ ret void
+}
+
+; Mix of invariant and (even in theory) uncomputable exits
+define void @test14(i64 %trip, i1 %cond) {
+; EPILOG-LABEL: @test14(
+; EPILOG-NEXT: entry:
+; EPILOG-NEXT: %0 = add i64 %trip, -1
+; EPILOG-NEXT: %xtraiter = and i64 %trip, 7
+; EPILOG-NEXT: %1 = icmp ult i64 %0, 7
+; EPILOG-NEXT: br i1 %1, label %exit1.unr-lcssa, label %entry.new
+; EPILOG: entry.new:
+; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter
+; EPILOG-NEXT: br label %loop_header
+; EPILOG: loop_header:
+; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
+; EPILOG-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ]
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2:
+; EPILOG-NEXT: %unknown = call i1 @unknown_cond()
+; EPILOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch:
+; EPILOG-NEXT: %iv_next = add nuw nsw i64 %iv, 1
+; EPILOG-NEXT: %niter.nsub = sub i64 %niter, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
+; EPILOG: exit1.unr-lcssa.loopexit:
+; EPILOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
+; EPILOG-NEXT: br label %exit1.unr-lcssa
+; EPILOG: exit1.unr-lcssa:
+; EPILOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit1.unr-lcssa.loopexit ]
+; EPILOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
+; EPILOG: loop_header.epil.preheader:
+; EPILOG-NEXT: br label %loop_header.epil
+; EPILOG: loop_header.epil:
+; EPILOG-NEXT: %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
+; EPILOG-NEXT: %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ]
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa.loopexit1
+; EPILOG: loop_exiting_bb2.epil:
+; EPILOG-NEXT: %unknown.epil = call i1 @unknown_cond()
+; EPILOG-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa.loopexit1
+; EPILOG: loop_latch.epil:
+; EPILOG-NEXT: %iv_next.epil = add i64 %iv.epil, 1
+; EPILOG-NEXT: %cmp.epil = icmp ne i64 %iv_next.epil, %trip
+; EPILOG-NEXT: %epil.iter.sub = sub i64 %epil.iter, 1
+; EPILOG-NEXT: %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
+; EPILOG-NEXT: br i1 %epil.iter.cmp, label %loop_header.epil, label %exit1.epilog-lcssa.loopexit1, !llvm.loop !17
+; EPILOG: exit1.epilog-lcssa.loopexit:
+; EPILOG-NEXT: br label %exit1.epilog-lcssa
+; EPILOG: exit1.epilog-lcssa.loopexit1:
+; EPILOG-NEXT: br label %exit1.epilog-lcssa
+; EPILOG: exit1.epilog-lcssa:
+; EPILOG-NEXT: br label %exit1
+; EPILOG: exit1:
+; EPILOG-NEXT: ret void
+; EPILOG: loop_exiting_bb2.1:
+; EPILOG-NEXT: %unknown.1 = call i1 @unknown_cond()
+; EPILOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.1:
+; EPILOG-NEXT: %iv_next.1 = add nuw nsw i64 %iv_next, 1
+; EPILOG-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.2, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2.2:
+; EPILOG-NEXT: %unknown.2 = call i1 @unknown_cond()
+; EPILOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.2:
+; EPILOG-NEXT: %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
+; EPILOG-NEXT: %niter.nsub.2 = sub i64 %niter.nsub.1, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.3, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2.3:
+; EPILOG-NEXT: %unknown.3 = call i1 @unknown_cond()
+; EPILOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.3:
+; EPILOG-NEXT: %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
+; EPILOG-NEXT: %niter.nsub.3 = sub i64 %niter.nsub.2, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.4, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2.4:
+; EPILOG-NEXT: %unknown.4 = call i1 @unknown_cond()
+; EPILOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.4:
+; EPILOG-NEXT: %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
+; EPILOG-NEXT: %niter.nsub.4 = sub i64 %niter.nsub.3, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.5, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2.5:
+; EPILOG-NEXT: %unknown.5 = call i1 @unknown_cond()
+; EPILOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.5:
+; EPILOG-NEXT: %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
+; EPILOG-NEXT: %niter.nsub.5 = sub i64 %niter.nsub.4, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.6, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2.6:
+; EPILOG-NEXT: %unknown.6 = call i1 @unknown_cond()
+; EPILOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.6:
+; EPILOG-NEXT: %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
+; EPILOG-NEXT: %niter.nsub.6 = sub i64 %niter.nsub.5, 1
+; EPILOG-NEXT: call void @bar()
+; EPILOG-NEXT: br i1 %cond, label %loop_exiting_bb2.7, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_exiting_bb2.7:
+; EPILOG-NEXT: %unknown.7 = call i1 @unknown_cond()
+; EPILOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.epilog-lcssa.loopexit
+; EPILOG: loop_latch.7:
+; EPILOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1
+; EPILOG-NEXT: %niter.nsub.7 = sub i64 %niter.nsub.6, 1
+; EPILOG-NEXT: %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0
+; EPILOG-NEXT: br i1 %niter.ncmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
+;
+; EPILOG-BLOCK-LABEL: @test14(
+; EPILOG-BLOCK-NEXT: entry:
+; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1
+; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1
+; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1
+; EPILOG-BLOCK-NEXT: br i1 %1, label %exit1.unr-lcssa, label %entry.new
+; EPILOG-BLOCK: entry.new:
+; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter
+; EPILOG-BLOCK-NEXT: br label %loop_header
+; EPILOG-BLOCK: loop_header:
+; EPILOG-BLOCK-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT: %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT: call void @bar()
+; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.epilog-lcssa.loopexit
+; EPILOG-BLOCK: loop_exiting_bb2:
+; EPILOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond()
+; EPILOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.epilog-lcssa.loopexit
+; EPILOG-BLOCK: loop_latch:
+; EPILOG-BLOCK-NEXT: %iv_next = add nuw nsw i64 %iv, 1
+; EPILOG-BLOCK-NEXT: %niter.nsub = sub i64 %niter, 1
+; EPILOG-BLOCK-NEXT: call void @bar()
+; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.epilog-lcssa.loopexit
+; EPILOG-BLOCK: exit1.unr-lcssa.loopexit:
+; EPILOG-BLOCK-NEXT: br label %exit1.unr-lcssa
+; EPILOG-BLOCK: exit1.unr-lcssa:
+; EPILOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit1
+; EPILOG-BLOCK: loop_header.epil.preheader:
+; EPILOG-BLOCK-NEXT: br label %loop_header.epil
+; EPILOG-BLOCK: loop_header.epil:
+; EPILOG-BLOCK-NEXT: call void @bar()
+; EPILOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.epil, label %exit1.epilog-lcssa
+; EPILOG-BLOCK: loop_exiting_bb2.epil:
+; EPILOG-BLOCK-NEXT: %unknown.epil = call i1 @unknown_cond()
+; EPILOG-BLOCK-NEXT: br i1 %unknown.epil, label %loop_latch.epil, label %exit1.epilog-lcssa
+; EPILOG-BLOCK: loop_latch.epil:
+; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa
+; EPILOG-BLOCK: exit1.epilog-lcssa.loopexit:
+; EPILOG-BLOCK-NEXT: br label %exit1.epilog-lcssa
+; EPILOG-BLOCK: exit1.epilog-lcssa:
+; EPILOG-BLOCK-NEXT: br label %exit1
+; EPILOG-BLOCK: exit1:
+; EPILOG-BLOCK-NEXT: ret void
+; EPILOG-BLOCK: loop_exiting_bb2.1:
+; EPILOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond()
+; EPILOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.epilog-lcssa.loopexit
+; EPILOG-BLOCK: loop_latch.1:
+; EPILOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1
+; EPILOG-BLOCK-NEXT: %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-BLOCK-NEXT: %niter.ncmp.1 = icmp ne i64 %niter.nsub.1, 0
+; EPILOG-BLOCK-NEXT: br i1 %niter.ncmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19
+;
+; PROLOG-LABEL: @test14(
+; PROLOG-NEXT: entry:
+; PROLOG-NEXT: %0 = add i64 %trip, -1
+; PROLOG-NEXT: %xtraiter = and i64 %trip, 7
+; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; PROLOG-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
+; PROLOG: loop_header.prol.preheader:
+; PROLOG-NEXT: br label %loop_header.prol
+; PROLOG: loop_header.prol:
+; PROLOG-NEXT: %iv.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %iv_next.prol, %loop_latch.prol ]
+; PROLOG-NEXT: %prol.iter = phi i64 [ %xtraiter, %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ]
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa.loopexit1
+; PROLOG: loop_exiting_bb2.prol:
+; PROLOG-NEXT: %unknown.prol = call i1 @unknown_cond()
+; PROLOG-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa.loopexit1
+; PROLOG: loop_latch.prol:
+; PROLOG-NEXT: %iv_next.prol = add i64 %iv.prol, 1
+; PROLOG-NEXT: %cmp.prol = icmp ne i64 %iv_next.prol, %trip
+; PROLOG-NEXT: %prol.iter.sub = sub i64 %prol.iter, 1
+; PROLOG-NEXT: %prol.iter.cmp = icmp ne i64 %prol.iter.sub, 0
+; PROLOG-NEXT: br i1 %prol.iter.cmp, label %loop_header.prol, label %loop_header.prol.loopexit.unr-lcssa, !llvm.loop !17
+; PROLOG: loop_header.prol.loopexit.unr-lcssa:
+; PROLOG-NEXT: %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
+; PROLOG-NEXT: br label %loop_header.prol.loopexit
+; PROLOG: loop_header.prol.loopexit:
+; PROLOG-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
+; PROLOG-NEXT: %1 = icmp ult i64 %0, 7
+; PROLOG-NEXT: br i1 %1, label %exit1, label %entry.new
+; PROLOG: entry.new:
+; PROLOG-NEXT: br label %loop_header
+; PROLOG: loop_header:
+; PROLOG-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2:
+; PROLOG-NEXT: %unknown = call i1 @unknown_cond()
+; PROLOG-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch:
+; PROLOG-NEXT: %iv_next = add i64 %iv, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
+; PROLOG: exit1.unr-lcssa.loopexit:
+; PROLOG-NEXT: br label %exit1.unr-lcssa
+; PROLOG: exit1.unr-lcssa.loopexit1:
+; PROLOG-NEXT: br label %exit1.unr-lcssa
+; PROLOG: exit1.unr-lcssa:
+; PROLOG-NEXT: br label %exit1
+; PROLOG: exit1:
+; PROLOG-NEXT: ret void
+; PROLOG: loop_exiting_bb2.1:
+; PROLOG-NEXT: %unknown.1 = call i1 @unknown_cond()
+; PROLOG-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.1:
+; PROLOG-NEXT: %iv_next.1 = add i64 %iv_next, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.2, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2.2:
+; PROLOG-NEXT: %unknown.2 = call i1 @unknown_cond()
+; PROLOG-NEXT: br i1 %unknown.2, label %loop_latch.2, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.2:
+; PROLOG-NEXT: %iv_next.2 = add i64 %iv_next.1, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.3, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2.3:
+; PROLOG-NEXT: %unknown.3 = call i1 @unknown_cond()
+; PROLOG-NEXT: br i1 %unknown.3, label %loop_latch.3, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.3:
+; PROLOG-NEXT: %iv_next.3 = add i64 %iv_next.2, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.4, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2.4:
+; PROLOG-NEXT: %unknown.4 = call i1 @unknown_cond()
+; PROLOG-NEXT: br i1 %unknown.4, label %loop_latch.4, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.4:
+; PROLOG-NEXT: %iv_next.4 = add i64 %iv_next.3, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.5, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2.5:
+; PROLOG-NEXT: %unknown.5 = call i1 @unknown_cond()
+; PROLOG-NEXT: br i1 %unknown.5, label %loop_latch.5, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.5:
+; PROLOG-NEXT: %iv_next.5 = add i64 %iv_next.4, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.6, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2.6:
+; PROLOG-NEXT: %unknown.6 = call i1 @unknown_cond()
+; PROLOG-NEXT: br i1 %unknown.6, label %loop_latch.6, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.6:
+; PROLOG-NEXT: %iv_next.6 = add i64 %iv_next.5, 1
+; PROLOG-NEXT: call void @bar()
+; PROLOG-NEXT: br i1 %cond, label %loop_exiting_bb2.7, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_exiting_bb2.7:
+; PROLOG-NEXT: %unknown.7 = call i1 @unknown_cond()
+; PROLOG-NEXT: br i1 %unknown.7, label %loop_latch.7, label %exit1.unr-lcssa.loopexit
+; PROLOG: loop_latch.7:
+; PROLOG-NEXT: %iv_next.7 = add i64 %iv_next.6, 1
+; PROLOG-NEXT: %cmp.7 = icmp ne i64 %iv_next.7, %trip
+; PROLOG-NEXT: br i1 %cmp.7, label %loop_header, label %exit1.unr-lcssa.loopexit
+;
+; PROLOG-BLOCK-LABEL: @test14(
+; PROLOG-BLOCK-NEXT: entry:
+; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1
+; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1
+; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0
+; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod, label %loop_header.prol.preheader, label %loop_header.prol.loopexit
+; PROLOG-BLOCK: loop_header.prol.preheader:
+; PROLOG-BLOCK-NEXT: br label %loop_header.prol
+; PROLOG-BLOCK: loop_header.prol:
+; PROLOG-BLOCK-NEXT: call void @bar()
+; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.prol, label %exit1.unr-lcssa
+; PROLOG-BLOCK: loop_exiting_bb2.prol:
+; PROLOG-BLOCK-NEXT: %unknown.prol = call i1 @unknown_cond()
+; PROLOG-BLOCK-NEXT: br i1 %unknown.prol, label %loop_latch.prol, label %exit1.unr-lcssa
+; PROLOG-BLOCK: loop_latch.prol:
+; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit
+; PROLOG-BLOCK: loop_header.prol.loopexit:
+; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ]
+; PROLOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1
+; PROLOG-BLOCK-NEXT: br i1 %1, label %exit1, label %entry.new
+; PROLOG-BLOCK: entry.new:
+; PROLOG-BLOCK-NEXT: br label %loop_header
+; PROLOG-BLOCK: loop_header:
+; PROLOG-BLOCK-NEXT: %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.1, %loop_latch.1 ]
+; PROLOG-BLOCK-NEXT: call void @bar()
+; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2, label %exit1.unr-lcssa.loopexit
+; PROLOG-BLOCK: loop_exiting_bb2:
+; PROLOG-BLOCK-NEXT: %unknown = call i1 @unknown_cond()
+; PROLOG-BLOCK-NEXT: br i1 %unknown, label %loop_latch, label %exit1.unr-lcssa.loopexit
+; PROLOG-BLOCK: loop_latch:
+; PROLOG-BLOCK-NEXT: %iv_next = add i64 %iv, 1
+; PROLOG-BLOCK-NEXT: call void @bar()
+; PROLOG-BLOCK-NEXT: br i1 %cond, label %loop_exiting_bb2.1, label %exit1.unr-lcssa.loopexit
+; PROLOG-BLOCK: exit1.unr-lcssa.loopexit:
+; PROLOG-BLOCK-NEXT: br label %exit1.unr-lcssa
+; PROLOG-BLOCK: exit1.unr-lcssa:
+; PROLOG-BLOCK-NEXT: br label %exit1
+; PROLOG-BLOCK: exit1:
+; PROLOG-BLOCK-NEXT: ret void
+; PROLOG-BLOCK: loop_exiting_bb2.1:
+; PROLOG-BLOCK-NEXT: %unknown.1 = call i1 @unknown_cond()
+; PROLOG-BLOCK-NEXT: br i1 %unknown.1, label %loop_latch.1, label %exit1.unr-lcssa.loopexit
+; PROLOG-BLOCK: loop_latch.1:
+; PROLOG-BLOCK-NEXT: %iv_next.1 = add i64 %iv_next, 1
+; PROLOG-BLOCK-NEXT: %cmp.1 = icmp ne i64 %iv_next.1, %trip
+; PROLOG-BLOCK-NEXT: br i1 %cmp.1, label %loop_header, label %exit1.unr-lcssa.loopexit, !llvm.loop !19
+;
+entry:
+ br label %loop_header
+
+loop_header:
+ %iv = phi i64 [ 0, %entry ], [ %iv_next, %loop_latch ]
+ call void @bar()
+ br i1 %cond, label %loop_exiting_bb2, label %exit1
+
+loop_exiting_bb2:
+ %unknown = call i1 @unknown_cond()
+ br i1 %unknown, label %loop_latch, label %exit1
+
+loop_latch:
+ %iv_next = add i64 %iv, 1
+ %cmp = icmp ne i64 %iv_next, %trip
+ br i1 %cmp, label %loop_header, label %exit1
+
+exit1:
+ ret void
+}
More information about the llvm-commits
mailing list