[llvm] 911991d - [tests] Autogen an unroll test for ease of update

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 3 11:05:12 PDT 2021


Author: Philip Reames
Date: 2021-08-03T11:05:07-07:00
New Revision: 911991d20adcb133a5c95ed22c0785fa202b8855

URL: https://github.com/llvm/llvm-project/commit/911991d20adcb133a5c95ed22c0785fa202b8855
DIFF: https://github.com/llvm/llvm-project/commit/911991d20adcb133a5c95ed22c0785fa202b8855.diff

LOG: [tests] Autogen an unroll test for ease of update

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 d2028bb8a197..c52575e4b03a 100644
--- a/llvm/test/Transforms/LoopUnroll/runtime-loop-multiple-exits.ll
+++ b/llvm/test/Transforms/LoopUnroll/runtime-loop-multiple-exits.ll
@@ -1,54 +1,478 @@
-; 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-prefix=EPILOG-NO-IC
-; 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 -instcombine -S | FileCheck %s -check-prefix=EPILOG
-; 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 -instcombine -S
-; 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 -instcombine -S | FileCheck %s -check-prefix=PROLOG
-; 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 -instcombine -S
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: -p
+; RUN: opt < %s -loop-unroll -unroll-runtime=true -unroll-runtime-epilog=true -unroll-runtime-multi-exit=true -verify-loop-lcssa -verify-dom-info -verify-loop-info -S | FileCheck %s -check-prefixes=CHECK,EPILOG-NO-IC
+; 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
+; 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
+; 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
+; 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
 
 ; REQUIRES: asserts
 
-; the third and fifth RUNs generate an epilog/prolog remainder block for all the test
-; cases below (it does not generate a loop).
-
 ; test with three exiting and three exit blocks.
 ; none of the exit blocks have successors
 define void @test1(i64 %trip, i1 %cond) {
-; EPILOG: test1(
+; EPILOG-NO-IC-LABEL: @test1(
+; EPILOG-NO-IC-NEXT:  entry:
+; EPILOG-NO-IC-NEXT:    %0 = add i64 %trip, -1
+; EPILOG-NO-IC-NEXT:    %xtraiter = and i64 %trip, 7
+; EPILOG-NO-IC-NEXT:    %1 = icmp ult i64 %0, 7
+; EPILOG-NO-IC-NEXT:    br i1 %1, label %exit2.loopexit.unr-lcssa, label %entry.new
+; EPILOG-NO-IC:       entry.new:
+; EPILOG-NO-IC-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
+; EPILOG-NO-IC-NEXT:    br label %loop_header
+; EPILOG-NO-IC:       loop_header:
+; EPILOG-NO-IC-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
+; EPILOG-NO-IC-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ]
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
+; EPILOG-NO-IC:       loop_exiting_bb1:
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
+; EPILOG-NO-IC:       loop_exiting_bb2:
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
+; EPILOG-NO-IC:       exit3.loopexit:
+; EPILOG-NO-IC-NEXT:    br label %exit3
+; EPILOG-NO-IC:       exit3.loopexit2:
+; EPILOG-NO-IC-NEXT:    br label %exit3
+; EPILOG-NO-IC:       exit3:
+; EPILOG-NO-IC-NEXT:    ret void
+; EPILOG-NO-IC:       loop_latch:
+; EPILOG-NO-IC-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub = sub i64 %niter, 1
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
+; EPILOG-NO-IC:       exit1.loopexit:
+; EPILOG-NO-IC-NEXT:    br label %exit1
+; EPILOG-NO-IC:       exit1.loopexit1:
+; EPILOG-NO-IC-NEXT:    br label %exit1
+; EPILOG-NO-IC:       exit1:
+; EPILOG-NO-IC-NEXT:    ret void
+; EPILOG-NO-IC:       exit2.loopexit.unr-lcssa.loopexit:
+; EPILOG-NO-IC-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
+; EPILOG-NO-IC-NEXT:    br label %exit2.loopexit.unr-lcssa
+; EPILOG-NO-IC:       exit2.loopexit.unr-lcssa:
+; EPILOG-NO-IC-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
+; EPILOG-NO-IC-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-NO-IC-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
+; EPILOG-NO-IC:       loop_header.epil.preheader:
+; EPILOG-NO-IC-NEXT:    br label %loop_header.epil
+; EPILOG-NO-IC:       loop_header.epil:
+; EPILOG-NO-IC-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
+; EPILOG-NO-IC-NEXT:    %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ]
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil
+; EPILOG-NO-IC:       loop_exiting_bb1.epil:
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loop_exiting_bb2.epil, label %exit1.loopexit1
+; EPILOG-NO-IC:       loop_exiting_bb2.epil:
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loop_latch.epil, label %exit3.loopexit2
+; EPILOG-NO-IC:       loop_latch.epil:
+; EPILOG-NO-IC-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
+; EPILOG-NO-IC-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
+; EPILOG-NO-IC-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
+; EPILOG-NO-IC-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
+; EPILOG-NO-IC-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !0
+; EPILOG-NO-IC:       exit2.loopexit.epilog-lcssa:
+; EPILOG-NO-IC-NEXT:    br label %exit2.loopexit
+; EPILOG-NO-IC:       exit2.loopexit:
+; EPILOG-NO-IC-NEXT:    ret void
+; EPILOG-NO-IC:       loop_exiting_bb1.1:
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
+; EPILOG-NO-IC:       loop_exiting_bb2.1:
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
+; EPILOG-NO-IC:       loop_latch.1:
+; EPILOG-NO-IC-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2
+; EPILOG-NO-IC:       loop_exiting_bb1.2:
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit
+; EPILOG-NO-IC:       loop_exiting_bb2.2:
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loop_latch.2, label %exit3.loopexit
+; EPILOG-NO-IC:       loop_latch.2:
+; EPILOG-NO-IC-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3
+; EPILOG-NO-IC:       loop_exiting_bb1.3:
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit
+; EPILOG-NO-IC:       loop_exiting_bb2.3:
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loop_latch.3, label %exit3.loopexit
+; EPILOG-NO-IC:       loop_latch.3:
+; EPILOG-NO-IC-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4
+; EPILOG-NO-IC:       loop_exiting_bb1.4:
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit
+; EPILOG-NO-IC:       loop_exiting_bb2.4:
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loop_latch.4, label %exit3.loopexit
+; EPILOG-NO-IC:       loop_latch.4:
+; EPILOG-NO-IC-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5
+; EPILOG-NO-IC:       loop_exiting_bb1.5:
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit
+; EPILOG-NO-IC:       loop_exiting_bb2.5:
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loop_latch.5, label %exit3.loopexit
+; EPILOG-NO-IC:       loop_latch.5:
+; EPILOG-NO-IC-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6
+; EPILOG-NO-IC:       loop_exiting_bb1.6:
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit
+; EPILOG-NO-IC:       loop_exiting_bb2.6:
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loop_latch.6, label %exit3.loopexit
+; EPILOG-NO-IC:       loop_latch.6:
+; EPILOG-NO-IC-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7
+; EPILOG-NO-IC:       loop_exiting_bb1.7:
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit
+; EPILOG-NO-IC:       loop_exiting_bb2.7:
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loop_latch.7, label %exit3.loopexit
+; EPILOG-NO-IC:       loop_latch.7:
+; EPILOG-NO-IC-NEXT:    %iv_next.7 = add i64 %iv_next.6, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
+; EPILOG-NO-IC-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0
+; EPILOG-NO-IC-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit
+;
+; EPILOG-LABEL: @test1(
 ; EPILOG-NEXT:  entry:
-; EPILOG-NEXT:    [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1
-; EPILOG-NEXT:    [[XTRAITER:%.*]] = and i64 [[TRIP]], 7
-; EPILOG-NEXT:    [[TMP1:%.*]] = icmp ult i64 [[TMP0]], 7
-; EPILOG-NEXT:    br i1 [[TMP1]], label %exit2.loopexit.unr-lcssa, label [[ENTRY_NEW:%.*]]
+; 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.loopexit.unr-lcssa, label %entry.new
 ; EPILOG:       entry.new:
-; EPILOG-NEXT:    [[UNROLL_ITER:%.*]] = and i64 [[TRIP]], -8
-; EPILOG-NEXT:    br label [[LOOP_HEADER:%.*]]
-; EPILOG:  loop_latch.epil:
-; EPILOG-NEXT:     %epil.iter.sub = add i64 %epil.iter, -1
-; EPILOG-NEXT:     %epil.iter.cmp.not = icmp eq i64 %epil.iter.sub, 0
-; EPILOG-NEXT:     br i1 %epil.iter.cmp.not, label %exit2.loopexit.epilog-lcssa, label %loop_header.epil
-; EPILOG:  loop_latch.7:
-; EPILOG-NEXT:     %niter.nsub.7 = add i64 %niter, -8
-; EPILOG-NEXT:     %niter.ncmp.7.not = icmp eq i64 %niter.nsub.7, 0
-; EPILOG-NEXT:     br i1 %niter.ncmp.7.not, label %exit2.loopexit.unr-lcssa.loopexit, label %loop_header
-
-; PROLOG: test1(
+; 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:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
+; EPILOG:       loop_exiting_bb1:
+; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
+; EPILOG:       loop_exiting_bb2:
+; EPILOG-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
+; EPILOG:       exit3.loopexit:
+; EPILOG-NEXT:    br label %exit3
+; EPILOG:       exit3.loopexit2:
+; EPILOG-NEXT:    br label %exit3
+; EPILOG:       exit3:
+; EPILOG-NEXT:    ret void
+; EPILOG:       loop_latch:
+; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
+; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
+; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
+; EPILOG:       exit1.loopexit:
+; EPILOG-NEXT:    br label %exit1
+; EPILOG:       exit1.loopexit1:
+; EPILOG-NEXT:    br label %exit1
+; EPILOG:       exit1:
+; EPILOG-NEXT:    ret void
+; EPILOG:       exit2.loopexit.unr-lcssa.loopexit:
+; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
+; EPILOG-NEXT:    br label %exit2.loopexit.unr-lcssa
+; EPILOG:       exit2.loopexit.unr-lcssa:
+; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.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.loopexit
+; 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:    br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil
+; EPILOG:       loop_exiting_bb1.epil:
+; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.epil, label %exit1.loopexit1
+; EPILOG:       loop_exiting_bb2.epil:
+; EPILOG-NEXT:    br i1 false, label %loop_latch.epil, label %exit3.loopexit2
+; 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.loopexit.epilog-lcssa, !llvm.loop !0
+; EPILOG:       exit2.loopexit.epilog-lcssa:
+; EPILOG-NEXT:    br label %exit2.loopexit
+; EPILOG:       exit2.loopexit:
+; EPILOG-NEXT:    ret void
+; EPILOG:       loop_exiting_bb1.1:
+; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
+; EPILOG:       loop_exiting_bb2.1:
+; EPILOG-NEXT:    br i1 false, label %loop_latch.1, label %exit3.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:    br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2
+; EPILOG:       loop_exiting_bb1.2:
+; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit
+; EPILOG:       loop_exiting_bb2.2:
+; EPILOG-NEXT:    br i1 false, label %loop_latch.2, label %exit3.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:    br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3
+; EPILOG:       loop_exiting_bb1.3:
+; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit
+; EPILOG:       loop_exiting_bb2.3:
+; EPILOG-NEXT:    br i1 false, label %loop_latch.3, label %exit3.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:    br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4
+; EPILOG:       loop_exiting_bb1.4:
+; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit
+; EPILOG:       loop_exiting_bb2.4:
+; EPILOG-NEXT:    br i1 false, label %loop_latch.4, label %exit3.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:    br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5
+; EPILOG:       loop_exiting_bb1.5:
+; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit
+; EPILOG:       loop_exiting_bb2.5:
+; EPILOG-NEXT:    br i1 false, label %loop_latch.5, label %exit3.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:    br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6
+; EPILOG:       loop_exiting_bb1.6:
+; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit
+; EPILOG:       loop_exiting_bb2.6:
+; EPILOG-NEXT:    br i1 false, label %loop_latch.6, label %exit3.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:    br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7
+; EPILOG:       loop_exiting_bb1.7:
+; EPILOG-NEXT:    br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit
+; EPILOG:       loop_exiting_bb2.7:
+; EPILOG-NEXT:    br i1 false, label %loop_latch.7, label %exit3.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.loopexit.unr-lcssa.loopexit
+;
+; EPILOG-BLOCK-LABEL: @test1(
+; 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.loopexit.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:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
+; EPILOG-BLOCK:       loop_exiting_bb1:
+; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
+; EPILOG-BLOCK:       loop_exiting_bb2:
+; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
+; EPILOG-BLOCK:       exit3.loopexit:
+; EPILOG-BLOCK-NEXT:    br label %exit3
+; EPILOG-BLOCK:       exit3:
+; EPILOG-BLOCK-NEXT:    ret void
+; 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:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
+; EPILOG-BLOCK:       exit1.loopexit:
+; EPILOG-BLOCK-NEXT:    br label %exit1
+; EPILOG-BLOCK:       exit1:
+; EPILOG-BLOCK-NEXT:    ret void
+; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa.loopexit:
+; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit.unr-lcssa
+; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa:
+; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.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.loopexit
+; EPILOG-BLOCK:       loop_header.epil.preheader:
+; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
+; EPILOG-BLOCK:       loop_header.epil:
+; EPILOG-BLOCK-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ]
+; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting_bb1.epil
+; EPILOG-BLOCK:       loop_exiting_bb1.epil:
+; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.epil, label %exit1
+; EPILOG-BLOCK:       loop_exiting_bb2.epil:
+; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch.epil, label %exit3
+; EPILOG-BLOCK:       loop_latch.epil:
+; EPILOG-BLOCK-NEXT:    %iv_next.epil = add i64 %iv.epil, 1
+; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
+; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit.epilog-lcssa
+; EPILOG-BLOCK:       exit2.loopexit.epilog-lcssa:
+; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit
+; EPILOG-BLOCK:       exit2.loopexit:
+; EPILOG-BLOCK-NEXT:    ret void
+; EPILOG-BLOCK:       loop_exiting_bb1.1:
+; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
+; EPILOG-BLOCK:       loop_exiting_bb2.1:
+; EPILOG-BLOCK-NEXT:    br i1 false, label %loop_latch.1, label %exit3.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 %exit2.loopexit.unr-lcssa.loopexit, !llvm.loop !0
+;
+; PROLOG-LABEL: @test1(
 ; PROLOG-NEXT:  entry:
-; PROLOG-NEXT:    [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1
-; PROLOG-NEXT:    [[XTRAITER:%.*]] = and i64 [[TRIP]], 7
-; PROLOG-NEXT:    [[TMP1:%.*]] = icmp eq i64 [[XTRAITER]], 0
-; PROLOG-NEXT:    br i1 [[TMP1]], label %loop_header.prol.loopexit, label %loop_header.prol.preheader
+; 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:    %prol.iter = phi i64 [ %xtraiter, %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ]
 ; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol
+; PROLOG:       loop_exiting_bb1.prol:
+; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.prol, label %exit1.loopexit1
+; PROLOG:       loop_exiting_bb2.prol:
+; PROLOG-NEXT:    br i1 false, label %loop_latch.prol, label %exit3.loopexit2
 ; PROLOG:       loop_latch.prol:
 ; PROLOG-NEXT:    %iv_next.prol = add i64 %iv.prol, 1
-; PROLOG-NEXT:    %prol.iter.sub = add i64 %prol.iter, -1
-; PROLOG-NEXT:    %prol.iter.cmp.not = icmp eq i64 %prol.iter.sub, 0
-; PROLOG-NEXT:    br i1 %prol.iter.cmp.not, label %loop_header.prol.loopexit.unr-lcssa, label %loop_header.prol
-; PROLOG:  loop_latch.7:
-; PROLOG-NEXT:     %iv_next.7 = add i64 %iv, 8
-; PROLOG-NEXT:     %cmp.7.not = icmp eq i64 %iv_next.7, %trip
-; PROLOG-NEXT:     br i1 %cmp.7.not, label %exit2.loopexit.unr-lcssa, label %loop_header
+; 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 !0
+; 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.loopexit, 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:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
+; PROLOG:       loop_exiting_bb1:
+; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
+; PROLOG:       loop_exiting_bb2:
+; PROLOG-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
+; PROLOG:       exit3.loopexit:
+; PROLOG-NEXT:    br label %exit3
+; PROLOG:       exit3.loopexit2:
+; PROLOG-NEXT:    br label %exit3
+; PROLOG:       exit3:
+; PROLOG-NEXT:    ret void
+; PROLOG:       loop_latch:
+; PROLOG-NEXT:    %iv_next = add i64 %iv, 1
+; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
+; PROLOG:       exit1.loopexit:
+; PROLOG-NEXT:    br label %exit1
+; PROLOG:       exit1.loopexit1:
+; PROLOG-NEXT:    br label %exit1
+; PROLOG:       exit1:
+; PROLOG-NEXT:    ret void
+; PROLOG:       exit2.loopexit.unr-lcssa:
+; PROLOG-NEXT:    br label %exit2.loopexit
+; PROLOG:       exit2.loopexit:
+; PROLOG-NEXT:    ret void
+; PROLOG:       loop_exiting_bb1.1:
+; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
+; PROLOG:       loop_exiting_bb2.1:
+; PROLOG-NEXT:    br i1 false, label %loop_latch.1, label %exit3.loopexit
+; PROLOG:       loop_latch.1:
+; PROLOG-NEXT:    %iv_next.1 = add i64 %iv_next, 1
+; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting_bb1.2
+; PROLOG:       loop_exiting_bb1.2:
+; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.2, label %exit1.loopexit
+; PROLOG:       loop_exiting_bb2.2:
+; PROLOG-NEXT:    br i1 false, label %loop_latch.2, label %exit3.loopexit
+; PROLOG:       loop_latch.2:
+; PROLOG-NEXT:    %iv_next.2 = add i64 %iv_next.1, 1
+; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting_bb1.3
+; PROLOG:       loop_exiting_bb1.3:
+; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.3, label %exit1.loopexit
+; PROLOG:       loop_exiting_bb2.3:
+; PROLOG-NEXT:    br i1 false, label %loop_latch.3, label %exit3.loopexit
+; PROLOG:       loop_latch.3:
+; PROLOG-NEXT:    %iv_next.3 = add i64 %iv_next.2, 1
+; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting_bb1.4
+; PROLOG:       loop_exiting_bb1.4:
+; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.4, label %exit1.loopexit
+; PROLOG:       loop_exiting_bb2.4:
+; PROLOG-NEXT:    br i1 false, label %loop_latch.4, label %exit3.loopexit
+; PROLOG:       loop_latch.4:
+; PROLOG-NEXT:    %iv_next.4 = add i64 %iv_next.3, 1
+; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting_bb1.5
+; PROLOG:       loop_exiting_bb1.5:
+; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.5, label %exit1.loopexit
+; PROLOG:       loop_exiting_bb2.5:
+; PROLOG-NEXT:    br i1 false, label %loop_latch.5, label %exit3.loopexit
+; PROLOG:       loop_latch.5:
+; PROLOG-NEXT:    %iv_next.5 = add i64 %iv_next.4, 1
+; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting_bb1.6
+; PROLOG:       loop_exiting_bb1.6:
+; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.6, label %exit1.loopexit
+; PROLOG:       loop_exiting_bb2.6:
+; PROLOG-NEXT:    br i1 false, label %loop_latch.6, label %exit3.loopexit
+; PROLOG:       loop_latch.6:
+; PROLOG-NEXT:    %iv_next.6 = add i64 %iv_next.5, 1
+; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting_bb1.7
+; PROLOG:       loop_exiting_bb1.7:
+; PROLOG-NEXT:    br i1 false, label %loop_exiting_bb2.7, label %exit1.loopexit
+; PROLOG:       loop_exiting_bb2.7:
+; PROLOG-NEXT:    br i1 false, label %loop_latch.7, label %exit3.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.loopexit.unr-lcssa
+;
+; PROLOG-BLOCK-LABEL: @test1(
+; 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:    br i1 %cond, label %loop_latch.prol, label %loop_exiting_bb1.prol
+; PROLOG-BLOCK:       loop_exiting_bb1.prol:
+; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.prol, label %exit1
+; PROLOG-BLOCK:       loop_exiting_bb2.prol:
+; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch.prol, label %exit3
+; PROLOG-BLOCK:       loop_latch.prol:
+; PROLOG-BLOCK-NEXT:    %iv_next.prol = add i64 0, 1
+; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
+; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
+; PROLOG-BLOCK:       loop_header.prol.loopexit:
+; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv_next.prol, %loop_latch.prol ]
+; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
+; PROLOG-BLOCK-NEXT:    br i1 %1, label %exit2.loopexit, 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:    br i1 %cond, label %loop_latch, label %loop_exiting_bb1
+; PROLOG-BLOCK:       loop_exiting_bb1:
+; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2, label %exit1.loopexit
+; PROLOG-BLOCK:       loop_exiting_bb2:
+; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch, label %exit3.loopexit
+; PROLOG-BLOCK:       exit3.loopexit:
+; PROLOG-BLOCK-NEXT:    br label %exit3
+; PROLOG-BLOCK:       exit3:
+; PROLOG-BLOCK-NEXT:    ret void
+; PROLOG-BLOCK:       loop_latch:
+; PROLOG-BLOCK-NEXT:    %iv_next = add i64 %iv, 1
+; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting_bb1.1
+; PROLOG-BLOCK:       exit1.loopexit:
+; PROLOG-BLOCK-NEXT:    br label %exit1
+; PROLOG-BLOCK:       exit1:
+; PROLOG-BLOCK-NEXT:    ret void
+; PROLOG-BLOCK:       exit2.loopexit.unr-lcssa:
+; PROLOG-BLOCK-NEXT:    br label %exit2.loopexit
+; PROLOG-BLOCK:       exit2.loopexit:
+; PROLOG-BLOCK-NEXT:    ret void
+; PROLOG-BLOCK:       loop_exiting_bb1.1:
+; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_exiting_bb2.1, label %exit1.loopexit
+; PROLOG-BLOCK:       loop_exiting_bb2.1:
+; PROLOG-BLOCK-NEXT:    br i1 false, label %loop_latch.1, label %exit3.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 %exit2.loopexit.unr-lcssa, !llvm.loop !0
+;
+
 entry:
   br label %loop_header
 
@@ -71,7 +495,7 @@ loop_latch:
   br i1 %cmp, label %loop_header, label %exit2.loopexit
 
 exit1:
- ret void
+  ret void
 
 exit2.loopexit:
   ret void
@@ -84,29 +508,558 @@ exit2.loopexit:
 ; %sum.02 and %add. Both of these are incoming values for phi from every exiting
 ; unrolled block.
 define i32 @test2(i32* nocapture %a, i64 %n) {
-; EPILOG: test2(
-; EPILOG: for.exit2.loopexit:
-; 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 ],
+; EPILOG-NO-IC-LABEL: @test2(
+; EPILOG-NO-IC-NEXT:  entry:
+; EPILOG-NO-IC-NEXT:    %0 = add i64 %n, -1
+; EPILOG-NO-IC-NEXT:    %xtraiter = and i64 %n, 7
+; EPILOG-NO-IC-NEXT:    %1 = icmp ult i64 %0, 7
+; EPILOG-NO-IC-NEXT:    br i1 %1, label %for.end.unr-lcssa, label %entry.new
+; EPILOG-NO-IC:       entry.new:
+; EPILOG-NO-IC-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
+; EPILOG-NO-IC-NEXT:    br label %header
+; EPILOG-NO-IC:       header:
+; EPILOG-NO-IC-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ]
+; EPILOG-NO-IC-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %for.body.7 ]
+; EPILOG-NO-IC-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %for.body.7 ]
+; EPILOG-NO-IC-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
+; EPILOG-NO-IC:       for.exiting_block:
+; EPILOG-NO-IC-NEXT:    %cmp = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
+; EPILOG-NO-IC:       for.body:
+; EPILOG-NO-IC-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; EPILOG-NO-IC-NEXT:    %2 = load i32, i32* %arrayidx, align 4
+; EPILOG-NO-IC-NEXT:    %add = add nsw i32 %2, %sum.02
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub = sub i64 %niter, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
+; EPILOG-NO-IC:       for.end.unr-lcssa.loopexit:
+; EPILOG-NO-IC-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %for.body.7 ]
+; EPILOG-NO-IC-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %for.body.7 ]
+; EPILOG-NO-IC-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %for.body.7 ]
+; EPILOG-NO-IC-NEXT:    br label %for.end.unr-lcssa
+; EPILOG-NO-IC:       for.end.unr-lcssa:
+; EPILOG-NO-IC-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ]
+; EPILOG-NO-IC-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ]
+; EPILOG-NO-IC-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ]
+; EPILOG-NO-IC-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-NO-IC-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %for.end
+; EPILOG-NO-IC:       header.epil.preheader:
+; EPILOG-NO-IC-NEXT:    br label %header.epil
+; EPILOG-NO-IC:       header.epil:
+; EPILOG-NO-IC-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %for.body.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
+; EPILOG-NO-IC-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %for.body.epil ], [ %sum.02.unr, %header.epil.preheader ]
+; EPILOG-NO-IC-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %for.body.epil ]
+; EPILOG-NO-IC-NEXT:    br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil
+; EPILOG-NO-IC:       for.exiting_block.epil:
+; EPILOG-NO-IC-NEXT:    %cmp.epil = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit2, label %for.body.epil
+; EPILOG-NO-IC:       for.body.epil:
+; EPILOG-NO-IC-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
+; EPILOG-NO-IC-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
+; EPILOG-NO-IC-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
+; EPILOG-NO-IC-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
+; EPILOG-NO-IC-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
+; EPILOG-NO-IC-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
+; EPILOG-NO-IC-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %for.end.epilog-lcssa, !llvm.loop !2
+; EPILOG-NO-IC:       for.end.epilog-lcssa:
+; EPILOG-NO-IC-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %for.body.epil ]
+; EPILOG-NO-IC-NEXT:    br label %for.end
+; EPILOG-NO-IC:       for.end:
+; EPILOG-NO-IC-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %sum.0.lcssa.ph1, %for.end.epilog-lcssa ]
+; EPILOG-NO-IC-NEXT:    ret i32 %sum.0.lcssa
+; EPILOG-NO-IC:       for.exit2.loopexit:
+; EPILOG-NO-IC-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ], [ %add.1, %for.body.1 ], [ 42, %for.exiting_block.2 ], [ %add.2, %for.body.2 ], [ 42, %for.exiting_block.3 ], [ %add.3, %for.body.3 ], [ 42, %for.exiting_block.4 ], [ %add.4, %for.body.4 ], [ 42, %for.exiting_block.5 ], [ %add.5, %for.body.5 ], [ 42, %for.exiting_block.6 ], [ %add.6, %for.body.6 ], [ 42, %for.exiting_block.7 ]
+; EPILOG-NO-IC-NEXT:    br label %for.exit2
+; EPILOG-NO-IC:       for.exit2.loopexit2:
+; EPILOG-NO-IC-NEXT:    %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
+; EPILOG-NO-IC-NEXT:    br label %for.exit2
+; EPILOG-NO-IC:       for.exit2:
+; EPILOG-NO-IC-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
+; EPILOG-NO-IC-NEXT:    ret i32 %retval
+; EPILOG-NO-IC:       for.exiting_block.1:
+; EPILOG-NO-IC-NEXT:    %cmp.1 = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
+; EPILOG-NO-IC:       for.body.1:
+; EPILOG-NO-IC-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
+; EPILOG-NO-IC-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
+; EPILOG-NO-IC-NEXT:    %add.1 = add nsw i32 %4, %add
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
+; EPILOG-NO-IC:       for.exiting_block.2:
+; EPILOG-NO-IC-NEXT:    %cmp.2 = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2
+; EPILOG-NO-IC:       for.body.2:
+; EPILOG-NO-IC-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
+; EPILOG-NO-IC-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
+; EPILOG-NO-IC-NEXT:    %add.2 = add nsw i32 %5, %add.1
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
+; EPILOG-NO-IC:       for.exiting_block.3:
+; EPILOG-NO-IC-NEXT:    %cmp.3 = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3
+; EPILOG-NO-IC:       for.body.3:
+; EPILOG-NO-IC-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
+; EPILOG-NO-IC-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
+; EPILOG-NO-IC-NEXT:    %add.3 = add nsw i32 %6, %add.2
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
+; EPILOG-NO-IC:       for.exiting_block.4:
+; EPILOG-NO-IC-NEXT:    %cmp.4 = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4
+; EPILOG-NO-IC:       for.body.4:
+; EPILOG-NO-IC-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
+; EPILOG-NO-IC-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
+; EPILOG-NO-IC-NEXT:    %add.4 = add nsw i32 %7, %add.3
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
+; EPILOG-NO-IC:       for.exiting_block.5:
+; EPILOG-NO-IC-NEXT:    %cmp.5 = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5
+; EPILOG-NO-IC:       for.body.5:
+; EPILOG-NO-IC-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
+; EPILOG-NO-IC-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
+; EPILOG-NO-IC-NEXT:    %add.5 = add nsw i32 %8, %add.4
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
+; EPILOG-NO-IC:       for.exiting_block.6:
+; EPILOG-NO-IC-NEXT:    %cmp.6 = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6
+; EPILOG-NO-IC:       for.body.6:
+; EPILOG-NO-IC-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
+; EPILOG-NO-IC-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
+; EPILOG-NO-IC-NEXT:    %add.6 = add nsw i32 %9, %add.5
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
+; EPILOG-NO-IC:       for.exiting_block.7:
+; EPILOG-NO-IC-NEXT:    %cmp.7 = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7
+; EPILOG-NO-IC:       for.body.7:
+; EPILOG-NO-IC-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
+; EPILOG-NO-IC-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
+; EPILOG-NO-IC-NEXT:    %add.7 = add nsw i32 %10, %add.6
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
+; EPILOG-NO-IC-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
+; EPILOG-NO-IC-NEXT:    br i1 %niter.ncmp.7, label %for.end.unr-lcssa.loopexit, label %header
+;
+; EPILOG-LABEL: @test2(
+; EPILOG-NEXT:  entry:
+; EPILOG-NEXT:    %0 = add i64 %n, -1
+; EPILOG-NEXT:    %xtraiter = and i64 %n, 7
+; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
+; EPILOG-NEXT:    br i1 %1, label %for.end.unr-lcssa, label %entry.new
+; EPILOG:       entry.new:
+; EPILOG-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
+; EPILOG-NEXT:    br label %header
+; EPILOG:       header:
+; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ]
+; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %for.body.7 ]
+; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %for.body.7 ]
+; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
+; EPILOG:       for.exiting_block:
+; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
+; EPILOG:       for.body:
+; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; EPILOG-NEXT:    %2 = load i32, i32* %arrayidx, align 4
+; EPILOG-NEXT:    %add = add nsw i32 %2, %sum.02
+; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
+; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
+; EPILOG:       for.end.unr-lcssa.loopexit:
+; EPILOG-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %for.body.7 ]
+; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %for.body.7 ]
+; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %for.body.7 ]
+; EPILOG-NEXT:    br label %for.end.unr-lcssa
+; EPILOG:       for.end.unr-lcssa:
+; EPILOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ]
+; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ]
+; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ]
+; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %for.end
+; EPILOG:       header.epil.preheader:
+; EPILOG-NEXT:    br label %header.epil
+; EPILOG:       header.epil:
+; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %for.body.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
+; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %for.body.epil ], [ %sum.02.unr, %header.epil.preheader ]
+; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %for.body.epil ]
+; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil
+; EPILOG:       for.exiting_block.epil:
+; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit2, label %for.body.epil
+; EPILOG:       for.body.epil:
+; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
+; EPILOG-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
+; EPILOG-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
+; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
+; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
+; 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 %header.epil, label %for.end.epilog-lcssa, !llvm.loop !2
+; EPILOG:       for.end.epilog-lcssa:
+; EPILOG-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %for.body.epil ]
+; EPILOG-NEXT:    br label %for.end
+; EPILOG:       for.end:
+; EPILOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %sum.0.lcssa.ph1, %for.end.epilog-lcssa ]
+; EPILOG-NEXT:    ret i32 %sum.0.lcssa
+; EPILOG:       for.exit2.loopexit:
+; 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 ]
 ; EPILOG-NEXT:    br label %for.exit2
-; EPILOG: for.exit2.loopexit2:
+; EPILOG:       for.exit2.loopexit2:
 ; EPILOG-NEXT:    %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
 ; EPILOG-NEXT:    br label %for.exit2
-; EPILOG: for.exit2:
+; EPILOG:       for.exit2:
 ; EPILOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
 ; EPILOG-NEXT:    ret i32 %retval
-; EPILOG: %niter.nsub.7 = add i64 %niter, -8
-
-; PROLOG: test2(
-; PROLOG: for.exit2.loopexit:
-; 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 ],
+; EPILOG:       for.exiting_block.1:
+; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
+; EPILOG:       for.body.1:
+; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
+; EPILOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
+; EPILOG-NEXT:    %add.1 = add nsw i32 %4, %add
+; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
+; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
+; EPILOG:       for.exiting_block.2:
+; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2
+; EPILOG:       for.body.2:
+; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
+; EPILOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
+; EPILOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
+; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
+; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
+; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
+; EPILOG:       for.exiting_block.3:
+; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3
+; EPILOG:       for.body.3:
+; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
+; EPILOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
+; EPILOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
+; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
+; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
+; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
+; EPILOG:       for.exiting_block.4:
+; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4
+; EPILOG:       for.body.4:
+; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
+; EPILOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
+; EPILOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
+; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
+; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
+; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
+; EPILOG:       for.exiting_block.5:
+; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5
+; EPILOG:       for.body.5:
+; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
+; EPILOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
+; EPILOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
+; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
+; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
+; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
+; EPILOG:       for.exiting_block.6:
+; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6
+; EPILOG:       for.body.6:
+; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
+; EPILOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
+; EPILOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
+; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
+; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
+; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
+; EPILOG:       for.exiting_block.7:
+; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7
+; EPILOG:       for.body.7:
+; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
+; EPILOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
+; EPILOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
+; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
+; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
+; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
+; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %for.end.unr-lcssa.loopexit, label %header
+;
+; EPILOG-BLOCK-LABEL: @test2(
+; EPILOG-BLOCK-NEXT:  entry:
+; EPILOG-BLOCK-NEXT:    %0 = add i64 %n, -1
+; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
+; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
+; EPILOG-BLOCK-NEXT:    br i1 %1, label %for.end.unr-lcssa, label %entry.new
+; EPILOG-BLOCK:       entry.new:
+; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
+; EPILOG-BLOCK-NEXT:    br label %header
+; EPILOG-BLOCK:       header:
+; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ]
+; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %for.body.1 ]
+; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %for.body.1 ]
+; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
+; EPILOG-BLOCK:       for.exiting_block:
+; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
+; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
+; EPILOG-BLOCK:       for.body:
+; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; EPILOG-BLOCK-NEXT:    %2 = load i32, i32* %arrayidx, align 4
+; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %2, %sum.02
+; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
+; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
+; EPILOG-BLOCK:       for.end.unr-lcssa.loopexit:
+; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %for.body.1 ]
+; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %for.body.1 ]
+; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %for.body.1 ]
+; EPILOG-BLOCK-NEXT:    br label %for.end.unr-lcssa
+; EPILOG-BLOCK:       for.end.unr-lcssa:
+; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %for.end.unr-lcssa.loopexit ]
+; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %for.end.unr-lcssa.loopexit ]
+; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %for.end.unr-lcssa.loopexit ]
+; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %for.end
+; EPILOG-BLOCK:       header.epil.preheader:
+; EPILOG-BLOCK-NEXT:    br label %header.epil
+; EPILOG-BLOCK:       header.epil:
+; EPILOG-BLOCK-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.unr, %header.epil.preheader ]
+; EPILOG-BLOCK-NEXT:    %sum.02.epil = phi i32 [ %sum.02.unr, %header.epil.preheader ]
+; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.epil
+; EPILOG-BLOCK:       for.exiting_block.epil:
+; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
+; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %for.body.epil
+; EPILOG-BLOCK:       for.body.epil:
+; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
+; EPILOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx.epil, align 4
+; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %3, %sum.02.epil
+; EPILOG-BLOCK-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
+; EPILOG-BLOCK-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
+; EPILOG-BLOCK-NEXT:    br label %for.end.epilog-lcssa
+; EPILOG-BLOCK:       for.end.epilog-lcssa:
+; EPILOG-BLOCK-NEXT:    br label %for.end
+; EPILOG-BLOCK:       for.end:
+; EPILOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %for.end.unr-lcssa ], [ %add.epil, %for.end.epilog-lcssa ]
+; EPILOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
+; EPILOG-BLOCK:       for.exit2.loopexit:
+; EPILOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ]
+; EPILOG-BLOCK-NEXT:    br label %for.exit2
+; EPILOG-BLOCK:       for.exit2:
+; EPILOG-BLOCK-NEXT:    %retval = phi i32 [ %sum.02.epil, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ]
+; EPILOG-BLOCK-NEXT:    ret i32 %retval
+; EPILOG-BLOCK:       for.exiting_block.1:
+; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
+; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
+; EPILOG-BLOCK:       for.body.1:
+; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
+; EPILOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
+; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
+; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
+; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0
+; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %for.end.unr-lcssa.loopexit, label %header, !llvm.loop !2
+;
+; PROLOG-LABEL: @test2(
+; PROLOG-NEXT:  entry:
+; PROLOG-NEXT:    %0 = add i64 %n, -1
+; PROLOG-NEXT:    %xtraiter = and i64 %n, 7
+; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
+; PROLOG:       header.prol.preheader:
+; PROLOG-NEXT:    br label %header.prol
+; PROLOG:       header.prol:
+; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %for.body.prol ], [ 0, %header.prol.preheader ]
+; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %for.body.prol ], [ 0, %header.prol.preheader ]
+; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %for.body.prol ]
+; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol
+; PROLOG:       for.exiting_block.prol:
+; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit1, label %for.body.prol
+; PROLOG:       for.body.prol:
+; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
+; PROLOG-NEXT:    %1 = load i32, i32* %arrayidx.prol, align 4
+; PROLOG-NEXT:    %add.prol = add nsw i32 %1, %sum.02.prol
+; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
+; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
+; 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 %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !2
+; PROLOG:       header.prol.loopexit.unr-lcssa:
+; PROLOG-NEXT:    %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %for.body.prol ]
+; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %for.body.prol ]
+; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %for.body.prol ]
+; PROLOG-NEXT:    br label %header.prol.loopexit
+; PROLOG:       header.prol.loopexit:
+; PROLOG-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ]
+; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
+; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
+; PROLOG-NEXT:    %2 = icmp ult i64 %0, 7
+; PROLOG-NEXT:    br i1 %2, label %for.end, label %entry.new
+; PROLOG:       entry.new:
+; PROLOG-NEXT:    br label %header
+; PROLOG:       header:
+; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ]
+; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %for.body.7 ]
+; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
+; PROLOG:       for.exiting_block:
+; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
+; PROLOG:       for.body:
+; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; PROLOG-NEXT:    %3 = load i32, i32* %arrayidx, align 4
+; PROLOG-NEXT:    %add = add nsw i32 %3, %sum.02
+; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
+; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
+; PROLOG:       for.end.unr-lcssa:
+; PROLOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %for.body.7 ]
+; PROLOG-NEXT:    br label %for.end
+; PROLOG:       for.end:
+; PROLOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ]
+; PROLOG-NEXT:    ret i32 %sum.0.lcssa
+; PROLOG:       for.exit2.loopexit:
+; 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 ]
 ; PROLOG-NEXT:    br label %for.exit2
-; PROLOG: for.exit2.loopexit1:
+; PROLOG:       for.exit2.loopexit1:
 ; PROLOG-NEXT:    %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
 ; PROLOG-NEXT:    br label %for.exit2
-; PROLOG: for.exit2:
+; PROLOG:       for.exit2:
 ; PROLOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
 ; PROLOG-NEXT:    ret i32 %retval
-; PROLOG: %indvars.iv.next.7 = add i64 %indvars.iv, 8
+; PROLOG:       for.exiting_block.1:
+; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
+; PROLOG:       for.body.1:
+; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
+; PROLOG-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
+; PROLOG-NEXT:    %add.1 = add nsw i32 %4, %add
+; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
+; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
+; PROLOG:       for.exiting_block.2:
+; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %for.body.2
+; PROLOG:       for.body.2:
+; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
+; PROLOG-NEXT:    %5 = load i32, i32* %arrayidx.2, align 4
+; PROLOG-NEXT:    %add.2 = add nsw i32 %5, %add.1
+; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
+; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
+; PROLOG:       for.exiting_block.3:
+; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %for.body.3
+; PROLOG:       for.body.3:
+; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
+; PROLOG-NEXT:    %6 = load i32, i32* %arrayidx.3, align 4
+; PROLOG-NEXT:    %add.3 = add nsw i32 %6, %add.2
+; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
+; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
+; PROLOG:       for.exiting_block.4:
+; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %for.body.4
+; PROLOG:       for.body.4:
+; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
+; PROLOG-NEXT:    %7 = load i32, i32* %arrayidx.4, align 4
+; PROLOG-NEXT:    %add.4 = add nsw i32 %7, %add.3
+; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
+; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
+; PROLOG:       for.exiting_block.5:
+; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %for.body.5
+; PROLOG:       for.body.5:
+; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
+; PROLOG-NEXT:    %8 = load i32, i32* %arrayidx.5, align 4
+; PROLOG-NEXT:    %add.5 = add nsw i32 %8, %add.4
+; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
+; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
+; PROLOG:       for.exiting_block.6:
+; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %for.body.6
+; PROLOG:       for.body.6:
+; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
+; PROLOG-NEXT:    %9 = load i32, i32* %arrayidx.6, align 4
+; PROLOG-NEXT:    %add.6 = add nsw i32 %9, %add.5
+; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
+; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
+; PROLOG:       for.exiting_block.7:
+; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %for.body.7
+; PROLOG:       for.body.7:
+; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
+; PROLOG-NEXT:    %10 = load i32, i32* %arrayidx.7, align 4
+; PROLOG-NEXT:    %add.7 = add nsw i32 %10, %add.6
+; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
+; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
+; PROLOG-NEXT:    br i1 %exitcond.7, label %for.end.unr-lcssa, label %header
+;
+; PROLOG-BLOCK-LABEL: @test2(
+; PROLOG-BLOCK-NEXT:  entry:
+; PROLOG-BLOCK-NEXT:    %0 = add i64 %n, -1
+; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
+; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
+; PROLOG-BLOCK:       header.prol.preheader:
+; PROLOG-BLOCK-NEXT:    br label %header.prol
+; PROLOG-BLOCK:       header.prol:
+; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.prol
+; PROLOG-BLOCK:       for.exiting_block.prol:
+; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
+; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %for.body.prol
+; PROLOG-BLOCK:       for.body.prol:
+; PROLOG-BLOCK-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 0
+; PROLOG-BLOCK-NEXT:    %1 = load i32, i32* %arrayidx.prol, align 4
+; PROLOG-BLOCK-NEXT:    %add.prol = add nsw i32 %1, 0
+; PROLOG-BLOCK-NEXT:    %indvars.iv.next.prol = add i64 0, 1
+; PROLOG-BLOCK-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
+; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
+; PROLOG-BLOCK:       header.prol.loopexit:
+; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %add.prol, %for.body.prol ]
+; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.next.prol, %for.body.prol ]
+; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %add.prol, %for.body.prol ]
+; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %0, 1
+; PROLOG-BLOCK-NEXT:    br i1 %2, label %for.end, label %entry.new
+; PROLOG-BLOCK:       entry.new:
+; PROLOG-BLOCK-NEXT:    br label %header
+; PROLOG-BLOCK:       header:
+; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %for.body.1 ]
+; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %for.body.1 ]
+; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
+; PROLOG-BLOCK:       for.exiting_block:
+; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
+; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %for.body
+; PROLOG-BLOCK:       for.body:
+; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; PROLOG-BLOCK-NEXT:    %3 = load i32, i32* %arrayidx, align 4
+; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %3, %sum.02
+; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
+; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
+; PROLOG-BLOCK:       for.end.unr-lcssa:
+; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %for.body.1 ]
+; PROLOG-BLOCK-NEXT:    br label %for.end
+; PROLOG-BLOCK:       for.end:
+; PROLOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %for.end.unr-lcssa ]
+; PROLOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
+; PROLOG-BLOCK:       for.exit2.loopexit:
+; PROLOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %for.body ], [ 42, %for.exiting_block.1 ]
+; PROLOG-BLOCK-NEXT:    br label %for.exit2
+; PROLOG-BLOCK:       for.exit2:
+; PROLOG-BLOCK-NEXT:    %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ]
+; PROLOG-BLOCK-NEXT:    ret i32 %retval
+; PROLOG-BLOCK:       for.exiting_block.1:
+; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
+; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %for.body.1
+; PROLOG-BLOCK:       for.body.1:
+; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
+; PROLOG-BLOCK-NEXT:    %4 = load i32, i32* %arrayidx.1, align 4
+; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %4, %add
+; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
+; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
+; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %for.end.unr-lcssa, label %header, !llvm.loop !2
+;
+
 
 entry:
   br label %header
@@ -117,8 +1070,8 @@ header:
   br i1 false, label %for.exit2, label %for.exiting_block
 
 for.exiting_block:
- %cmp = icmp eq i64 %n, 42
- br i1 %cmp, label %for.exit2, label %for.body
+  %cmp = icmp eq i64 %n, 42
+  br i1 %cmp, label %for.exit2, label %for.body
 
 for.body:
   %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
@@ -140,42 +1093,553 @@ for.exit2:
 ; test with two exiting and three exit blocks.
 ; the non-latch exiting block has a switch.
 define void @test3(i64 %trip, i64 %add) {
-; EPILOG: test3(
+; EPILOG-NO-IC-LABEL: @test3(
+; EPILOG-NO-IC-NEXT:  entry:
+; EPILOG-NO-IC-NEXT:    %0 = add i64 %trip, -1
+; EPILOG-NO-IC-NEXT:    %xtraiter = and i64 %trip, 7
+; EPILOG-NO-IC-NEXT:    %1 = icmp ult i64 %0, 7
+; EPILOG-NO-IC-NEXT:    br i1 %1, label %exit2.loopexit.unr-lcssa, label %entry.new
+; EPILOG-NO-IC:       entry.new:
+; EPILOG-NO-IC-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
+; EPILOG-NO-IC-NEXT:    br label %loop_header
+; EPILOG-NO-IC:       loop_header:
+; EPILOG-NO-IC-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
+; EPILOG-NO-IC-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
+; EPILOG-NO-IC-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ]
+; EPILOG-NO-IC-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
+; EPILOG-NO-IC:       loop_exiting_bb1:
+; EPILOG-NO-IC-NEXT:    switch i64 %sum, label %loop_latch [
+; EPILOG-NO-IC-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    i64 42, label %exit3.loopexit
+; EPILOG-NO-IC-NEXT:    ]
+; EPILOG-NO-IC:       exit3.loopexit:
+; EPILOG-NO-IC-NEXT:    br label %exit3
+; EPILOG-NO-IC:       exit3.loopexit2:
+; EPILOG-NO-IC-NEXT:    br label %exit3
+; EPILOG-NO-IC:       exit3:
+; EPILOG-NO-IC-NEXT:    ret void
+; EPILOG-NO-IC:       loop_latch:
+; EPILOG-NO-IC-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
+; EPILOG-NO-IC-NEXT:    %sum.next = add i64 %sum, %add
+; EPILOG-NO-IC-NEXT:    %niter.nsub = sub i64 %niter, 1
+; EPILOG-NO-IC-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
+; EPILOG-NO-IC:       exit1.loopexit:
+; EPILOG-NO-IC-NEXT:    br label %exit1
+; EPILOG-NO-IC:       exit1.loopexit1:
+; EPILOG-NO-IC-NEXT:    br label %exit1
+; EPILOG-NO-IC:       exit1:
+; EPILOG-NO-IC-NEXT:    ret void
+; EPILOG-NO-IC:       exit2.loopexit.unr-lcssa.loopexit:
+; EPILOG-NO-IC-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
+; EPILOG-NO-IC-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
+; EPILOG-NO-IC-NEXT:    br label %exit2.loopexit.unr-lcssa
+; EPILOG-NO-IC:       exit2.loopexit.unr-lcssa:
+; EPILOG-NO-IC-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
+; EPILOG-NO-IC-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
+; EPILOG-NO-IC-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-NO-IC-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %exit2.loopexit
+; EPILOG-NO-IC:       loop_header.epil.preheader:
+; EPILOG-NO-IC-NEXT:    br label %loop_header.epil
+; EPILOG-NO-IC:       loop_header.epil:
+; EPILOG-NO-IC-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
+; EPILOG-NO-IC-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]
+; EPILOG-NO-IC-NEXT:    %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ]
+; EPILOG-NO-IC-NEXT:    br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil
+; EPILOG-NO-IC:       loop_exiting_bb1.epil:
+; EPILOG-NO-IC-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
+; EPILOG-NO-IC-NEXT:    i64 24, label %exit1.loopexit1
+; EPILOG-NO-IC-NEXT:    i64 42, label %exit3.loopexit2
+; EPILOG-NO-IC-NEXT:    ]
+; EPILOG-NO-IC:       loop_latch.epil:
+; EPILOG-NO-IC-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
+; EPILOG-NO-IC-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
+; EPILOG-NO-IC-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
+; EPILOG-NO-IC-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
+; EPILOG-NO-IC-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
+; EPILOG-NO-IC-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %exit2.loopexit.epilog-lcssa, !llvm.loop !3
+; EPILOG-NO-IC:       exit2.loopexit.epilog-lcssa:
+; EPILOG-NO-IC-NEXT:    br label %exit2.loopexit
+; EPILOG-NO-IC:       exit2.loopexit:
+; EPILOG-NO-IC-NEXT:    ret void
+; EPILOG-NO-IC:       loop_exiting_bb1.1:
+; EPILOG-NO-IC-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
+; EPILOG-NO-IC-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    i64 42, label %exit3.loopexit
+; EPILOG-NO-IC-NEXT:    ]
+; EPILOG-NO-IC:       loop_latch.1:
+; EPILOG-NO-IC-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
+; EPILOG-NO-IC-NEXT:    %sum.next.1 = add i64 %sum.next, %add
+; EPILOG-NO-IC-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-NO-IC-NEXT:    br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2
+; EPILOG-NO-IC:       loop_exiting_bb1.2:
+; EPILOG-NO-IC-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
+; EPILOG-NO-IC-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    i64 42, label %exit3.loopexit
+; EPILOG-NO-IC-NEXT:    ]
+; EPILOG-NO-IC:       loop_latch.2:
+; EPILOG-NO-IC-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
+; EPILOG-NO-IC-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
+; EPILOG-NO-IC-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
+; EPILOG-NO-IC-NEXT:    br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3
+; EPILOG-NO-IC:       loop_exiting_bb1.3:
+; EPILOG-NO-IC-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
+; EPILOG-NO-IC-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    i64 42, label %exit3.loopexit
+; EPILOG-NO-IC-NEXT:    ]
+; EPILOG-NO-IC:       loop_latch.3:
+; EPILOG-NO-IC-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
+; EPILOG-NO-IC-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
+; EPILOG-NO-IC-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
+; EPILOG-NO-IC-NEXT:    br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4
+; EPILOG-NO-IC:       loop_exiting_bb1.4:
+; EPILOG-NO-IC-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
+; EPILOG-NO-IC-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    i64 42, label %exit3.loopexit
+; EPILOG-NO-IC-NEXT:    ]
+; EPILOG-NO-IC:       loop_latch.4:
+; EPILOG-NO-IC-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
+; EPILOG-NO-IC-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
+; EPILOG-NO-IC-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
+; EPILOG-NO-IC-NEXT:    br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5
+; EPILOG-NO-IC:       loop_exiting_bb1.5:
+; EPILOG-NO-IC-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
+; EPILOG-NO-IC-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    i64 42, label %exit3.loopexit
+; EPILOG-NO-IC-NEXT:    ]
+; EPILOG-NO-IC:       loop_latch.5:
+; EPILOG-NO-IC-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
+; EPILOG-NO-IC-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
+; EPILOG-NO-IC-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
+; EPILOG-NO-IC-NEXT:    br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6
+; EPILOG-NO-IC:       loop_exiting_bb1.6:
+; EPILOG-NO-IC-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
+; EPILOG-NO-IC-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    i64 42, label %exit3.loopexit
+; EPILOG-NO-IC-NEXT:    ]
+; EPILOG-NO-IC:       loop_latch.6:
+; EPILOG-NO-IC-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
+; EPILOG-NO-IC-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
+; EPILOG-NO-IC-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
+; EPILOG-NO-IC-NEXT:    br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7
+; EPILOG-NO-IC:       loop_exiting_bb1.7:
+; EPILOG-NO-IC-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
+; EPILOG-NO-IC-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    i64 42, label %exit3.loopexit
+; EPILOG-NO-IC-NEXT:    ]
+; EPILOG-NO-IC:       loop_latch.7:
+; EPILOG-NO-IC-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
+; EPILOG-NO-IC-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
+; EPILOG-NO-IC-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
+; EPILOG-NO-IC-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0
+; EPILOG-NO-IC-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa.loopexit
+;
+; EPILOG-LABEL: @test3(
 ; EPILOG-NEXT:  entry:
-; EPILOG-NEXT:    [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1
-; EPILOG-NEXT:    [[XTRAITER:%.*]] = and i64 [[TRIP]], 7
-; EPILOG-NEXT:    [[TMP1:%.*]] = icmp ult i64 [[TMP0]], 7
-; EPILOG-NEXT:    br i1 [[TMP1]], label %exit2.loopexit.unr-lcssa, label [[ENTRY_NEW:%.*]]
+; 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.loopexit.unr-lcssa, label %entry.new
 ; EPILOG:       entry.new:
-; EPILOG-NEXT:    %unroll_iter = and i64 [[TRIP]], -8
-; EPILOG-NEXT:    br label [[LOOP_HEADER:%.*]]
-; EPILOG:  loop_header:
-; EPILOG-NEXT:     %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
-; EPILOG-NEXT:     %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ]
-; EPILOG:  loop_exiting_bb1.7:
-; EPILOG-NEXT:     switch i64 %sum.next.6, label %loop_latch.7
-; EPILOG:  loop_latch.7:
-; EPILOG-NEXT:     %sum.next.7 = add i64 %sum.next.6, %add
-; EPILOG-NEXT:     %niter.nsub.7 = add i64 %niter, -8
-; EPILOG-NEXT:     %niter.ncmp.7.not = icmp eq i64 %niter.nsub.7, 0
-; EPILOG-NEXT:     br i1 %niter.ncmp.7.not, label %exit2.loopexit.unr-lcssa.loopexit, label %loop_header
-
-; PROLOG:  test3(
+; 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:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
+; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ]
+; EPILOG-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
+; EPILOG:       loop_exiting_bb1:
+; EPILOG-NEXT:    switch i64 %sum, label %loop_latch [
+; EPILOG-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NEXT:    i64 42, label %exit3.loopexit
+; EPILOG-NEXT:    ]
+; EPILOG:       exit3.loopexit:
+; EPILOG-NEXT:    br label %exit3
+; EPILOG:       exit3.loopexit2:
+; EPILOG-NEXT:    br label %exit3
+; EPILOG:       exit3:
+; EPILOG-NEXT:    ret void
+; EPILOG:       loop_latch:
+; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
+; EPILOG-NEXT:    %sum.next = add i64 %sum, %add
+; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
+; EPILOG-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
+; EPILOG:       exit1.loopexit:
+; EPILOG-NEXT:    br label %exit1
+; EPILOG:       exit1.loopexit1:
+; EPILOG-NEXT:    br label %exit1
+; EPILOG:       exit1:
+; EPILOG-NEXT:    ret void
+; EPILOG:       exit2.loopexit.unr-lcssa.loopexit:
+; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
+; EPILOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
+; EPILOG-NEXT:    br label %exit2.loopexit.unr-lcssa
+; EPILOG:       exit2.loopexit.unr-lcssa:
+; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
+; EPILOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.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.loopexit
+; 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:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]
+; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ]
+; EPILOG-NEXT:    br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil
+; EPILOG:       loop_exiting_bb1.epil:
+; EPILOG-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
+; EPILOG-NEXT:    i64 24, label %exit1.loopexit1
+; EPILOG-NEXT:    i64 42, label %exit3.loopexit2
+; EPILOG-NEXT:    ]
+; EPILOG:       loop_latch.epil:
+; EPILOG-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
+; EPILOG-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
+; 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.loopexit.epilog-lcssa, !llvm.loop !3
+; EPILOG:       exit2.loopexit.epilog-lcssa:
+; EPILOG-NEXT:    br label %exit2.loopexit
+; EPILOG:       exit2.loopexit:
+; EPILOG-NEXT:    ret void
+; EPILOG:       loop_exiting_bb1.1:
+; EPILOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
+; EPILOG-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NEXT:    i64 42, label %exit3.loopexit
+; EPILOG-NEXT:    ]
+; EPILOG:       loop_latch.1:
+; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
+; EPILOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
+; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-NEXT:    br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2
+; EPILOG:       loop_exiting_bb1.2:
+; EPILOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
+; EPILOG-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NEXT:    i64 42, label %exit3.loopexit
+; EPILOG-NEXT:    ]
+; EPILOG:       loop_latch.2:
+; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
+; EPILOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
+; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
+; EPILOG-NEXT:    br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3
+; EPILOG:       loop_exiting_bb1.3:
+; EPILOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
+; EPILOG-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NEXT:    i64 42, label %exit3.loopexit
+; EPILOG-NEXT:    ]
+; EPILOG:       loop_latch.3:
+; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
+; EPILOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
+; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
+; EPILOG-NEXT:    br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4
+; EPILOG:       loop_exiting_bb1.4:
+; EPILOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
+; EPILOG-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NEXT:    i64 42, label %exit3.loopexit
+; EPILOG-NEXT:    ]
+; EPILOG:       loop_latch.4:
+; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
+; EPILOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
+; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
+; EPILOG-NEXT:    br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5
+; EPILOG:       loop_exiting_bb1.5:
+; EPILOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
+; EPILOG-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NEXT:    i64 42, label %exit3.loopexit
+; EPILOG-NEXT:    ]
+; EPILOG:       loop_latch.5:
+; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
+; EPILOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
+; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
+; EPILOG-NEXT:    br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6
+; EPILOG:       loop_exiting_bb1.6:
+; EPILOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
+; EPILOG-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NEXT:    i64 42, label %exit3.loopexit
+; EPILOG-NEXT:    ]
+; EPILOG:       loop_latch.6:
+; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
+; EPILOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
+; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
+; EPILOG-NEXT:    br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7
+; EPILOG:       loop_exiting_bb1.7:
+; EPILOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
+; EPILOG-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NEXT:    i64 42, label %exit3.loopexit
+; EPILOG-NEXT:    ]
+; EPILOG:       loop_latch.7:
+; EPILOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
+; EPILOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
+; 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.loopexit.unr-lcssa.loopexit
+;
+; EPILOG-BLOCK-LABEL: @test3(
+; 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.loopexit.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:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
+; EPILOG-BLOCK:       loop_exiting_bb1:
+; EPILOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
+; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
+; EPILOG-BLOCK-NEXT:    ]
+; EPILOG-BLOCK:       exit3.loopexit:
+; EPILOG-BLOCK-NEXT:    br label %exit3
+; EPILOG-BLOCK:       exit3:
+; EPILOG-BLOCK-NEXT:    ret void
+; EPILOG-BLOCK:       loop_latch:
+; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
+; EPILOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
+; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
+; EPILOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
+; EPILOG-BLOCK:       exit1.loopexit:
+; EPILOG-BLOCK-NEXT:    br label %exit1
+; EPILOG-BLOCK:       exit1:
+; EPILOG-BLOCK-NEXT:    ret void
+; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa.loopexit:
+; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit.unr-lcssa
+; EPILOG-BLOCK:       exit2.loopexit.unr-lcssa:
+; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %exit2.loopexit.unr-lcssa.loopexit ]
+; EPILOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %exit2.loopexit.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.loopexit
+; EPILOG-BLOCK:       loop_header.epil.preheader:
+; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
+; EPILOG-BLOCK:       loop_header.epil:
+; EPILOG-BLOCK-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ]
+; EPILOG-BLOCK-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ]
+; EPILOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.epil, label %loop_exiting_bb1.epil
+; EPILOG-BLOCK:       loop_exiting_bb1.epil:
+; EPILOG-BLOCK-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
+; EPILOG-BLOCK-NEXT:    i64 24, label %exit1
+; EPILOG-BLOCK-NEXT:    i64 42, label %exit3
+; EPILOG-BLOCK-NEXT:    ]
+; EPILOG-BLOCK:       loop_latch.epil:
+; EPILOG-BLOCK-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
+; EPILOG-BLOCK-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
+; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
+; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit.epilog-lcssa
+; EPILOG-BLOCK:       exit2.loopexit.epilog-lcssa:
+; EPILOG-BLOCK-NEXT:    br label %exit2.loopexit
+; EPILOG-BLOCK:       exit2.loopexit:
+; EPILOG-BLOCK-NEXT:    ret void
+; EPILOG-BLOCK:       loop_exiting_bb1.1:
+; EPILOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
+; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
+; EPILOG-BLOCK-NEXT:    ]
+; EPILOG-BLOCK:       loop_latch.1:
+; EPILOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
+; EPILOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
+; 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.loopexit.unr-lcssa.loopexit, !llvm.loop !3
+;
+; PROLOG-LABEL: @test3(
 ; PROLOG-NEXT:  entry:
-; PROLOG-NEXT:    [[TMP0:%.*]] = add i64 [[TRIP:%.*]], -1
-; PROLOG-NEXT:    [[XTRAITER:%.*]] = and i64 [[TRIP]], 7
-; PROLOG-NEXT:    [[TMP1:%.*]] = icmp eq i64 [[XTRAITER]], 0
-; PROLOG-NEXT:    br i1 [[TMP1]], label %loop_header.prol.loopexit, label %loop_header.prol.preheader
-; PROLOG:  loop_header:
-; PROLOG-NEXT:     %iv = phi i64 [ %iv.unr, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
-; PROLOG-NEXT:     %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
-; PROLOG:  loop_exiting_bb1.7:
-; PROLOG-NEXT:     switch i64 %sum.next.6, label %loop_latch.7
-; PROLOG:  loop_latch.7:
-; PROLOG-NEXT:     %iv_next.7 = add nuw nsw i64 %iv, 8
-; PROLOG-NEXT:     %sum.next.7 = add i64 %sum.next.6, %add
-; PROLOG-NEXT:     %cmp.7.not = icmp eq i64 %iv_next.7, %trip
-; PROLOG-NEXT:     br i1 %cmp.7.not, label %exit2.loopexit.unr-lcssa, label %loop_header
+; 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:    %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ]
+; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ]
+; PROLOG-NEXT:    br i1 undef, label %loop_latch.prol, label %loop_exiting_bb1.prol
+; PROLOG:       loop_exiting_bb1.prol:
+; PROLOG-NEXT:    switch i64 %sum.prol, label %loop_latch.prol [
+; PROLOG-NEXT:    i64 24, label %exit1.loopexit1
+; PROLOG-NEXT:    i64 42, label %exit3.loopexit2
+; PROLOG-NEXT:    ]
+; PROLOG:       loop_latch.prol:
+; PROLOG-NEXT:    %iv_next.prol = add nuw nsw i64 %iv.prol, 1
+; PROLOG-NEXT:    %sum.next.prol = add i64 %sum.prol, %add
+; 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 !3
+; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
+; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
+; PROLOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.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:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
+; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
+; PROLOG-NEXT:    br i1 %1, label %exit2.loopexit, 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:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
+; PROLOG-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
+; PROLOG:       loop_exiting_bb1:
+; PROLOG-NEXT:    switch i64 %sum, label %loop_latch [
+; PROLOG-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-NEXT:    i64 42, label %exit3.loopexit
+; PROLOG-NEXT:    ]
+; PROLOG:       exit3.loopexit:
+; PROLOG-NEXT:    br label %exit3
+; PROLOG:       exit3.loopexit2:
+; PROLOG-NEXT:    br label %exit3
+; PROLOG:       exit3:
+; PROLOG-NEXT:    ret void
+; PROLOG:       loop_latch:
+; PROLOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
+; PROLOG-NEXT:    %sum.next = add i64 %sum, %add
+; PROLOG-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
+; PROLOG:       exit1.loopexit:
+; PROLOG-NEXT:    br label %exit1
+; PROLOG:       exit1.loopexit1:
+; PROLOG-NEXT:    br label %exit1
+; PROLOG:       exit1:
+; PROLOG-NEXT:    ret void
+; PROLOG:       exit2.loopexit.unr-lcssa:
+; PROLOG-NEXT:    br label %exit2.loopexit
+; PROLOG:       exit2.loopexit:
+; PROLOG-NEXT:    ret void
+; PROLOG:       loop_exiting_bb1.1:
+; PROLOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
+; PROLOG-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-NEXT:    i64 42, label %exit3.loopexit
+; PROLOG-NEXT:    ]
+; PROLOG:       loop_latch.1:
+; PROLOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
+; PROLOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
+; PROLOG-NEXT:    br i1 undef, label %loop_latch.2, label %loop_exiting_bb1.2
+; PROLOG:       loop_exiting_bb1.2:
+; PROLOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
+; PROLOG-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-NEXT:    i64 42, label %exit3.loopexit
+; PROLOG-NEXT:    ]
+; PROLOG:       loop_latch.2:
+; PROLOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
+; PROLOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
+; PROLOG-NEXT:    br i1 undef, label %loop_latch.3, label %loop_exiting_bb1.3
+; PROLOG:       loop_exiting_bb1.3:
+; PROLOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
+; PROLOG-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-NEXT:    i64 42, label %exit3.loopexit
+; PROLOG-NEXT:    ]
+; PROLOG:       loop_latch.3:
+; PROLOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
+; PROLOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
+; PROLOG-NEXT:    br i1 undef, label %loop_latch.4, label %loop_exiting_bb1.4
+; PROLOG:       loop_exiting_bb1.4:
+; PROLOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
+; PROLOG-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-NEXT:    i64 42, label %exit3.loopexit
+; PROLOG-NEXT:    ]
+; PROLOG:       loop_latch.4:
+; PROLOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
+; PROLOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
+; PROLOG-NEXT:    br i1 undef, label %loop_latch.5, label %loop_exiting_bb1.5
+; PROLOG:       loop_exiting_bb1.5:
+; PROLOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
+; PROLOG-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-NEXT:    i64 42, label %exit3.loopexit
+; PROLOG-NEXT:    ]
+; PROLOG:       loop_latch.5:
+; PROLOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
+; PROLOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
+; PROLOG-NEXT:    br i1 undef, label %loop_latch.6, label %loop_exiting_bb1.6
+; PROLOG:       loop_exiting_bb1.6:
+; PROLOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
+; PROLOG-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-NEXT:    i64 42, label %exit3.loopexit
+; PROLOG-NEXT:    ]
+; PROLOG:       loop_latch.6:
+; PROLOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
+; PROLOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
+; PROLOG-NEXT:    br i1 undef, label %loop_latch.7, label %loop_exiting_bb1.7
+; PROLOG:       loop_exiting_bb1.7:
+; PROLOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
+; PROLOG-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-NEXT:    i64 42, label %exit3.loopexit
+; PROLOG-NEXT:    ]
+; PROLOG:       loop_latch.7:
+; PROLOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
+; PROLOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
+; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
+; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %exit2.loopexit.unr-lcssa
+;
+; PROLOG-BLOCK-LABEL: @test3(
+; 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:    br i1 undef, label %loop_latch.prol, label %loop_exiting_bb1.prol
+; PROLOG-BLOCK:       loop_exiting_bb1.prol:
+; PROLOG-BLOCK-NEXT:    switch i64 0, label %loop_latch.prol [
+; PROLOG-BLOCK-NEXT:    i64 24, label %exit1
+; PROLOG-BLOCK-NEXT:    i64 42, label %exit3
+; PROLOG-BLOCK-NEXT:    ]
+; PROLOG-BLOCK:       loop_latch.prol:
+; PROLOG-BLOCK-NEXT:    %iv_next.prol = add nuw nsw i64 0, 1
+; PROLOG-BLOCK-NEXT:    %sum.next.prol = add i64 0, %add
+; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
+; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
+; PROLOG-BLOCK:       loop_header.prol.loopexit:
+; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv_next.prol, %loop_latch.prol ]
+; PROLOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.next.prol, %loop_latch.prol ]
+; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
+; PROLOG-BLOCK-NEXT:    br i1 %1, label %exit2.loopexit, 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:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
+; PROLOG-BLOCK-NEXT:    br i1 undef, label %loop_latch, label %loop_exiting_bb1
+; PROLOG-BLOCK:       loop_exiting_bb1:
+; PROLOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
+; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
+; PROLOG-BLOCK-NEXT:    ]
+; PROLOG-BLOCK:       exit3.loopexit:
+; PROLOG-BLOCK-NEXT:    br label %exit3
+; PROLOG-BLOCK:       exit3:
+; PROLOG-BLOCK-NEXT:    ret void
+; PROLOG-BLOCK:       loop_latch:
+; PROLOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
+; PROLOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
+; PROLOG-BLOCK-NEXT:    br i1 undef, label %loop_latch.1, label %loop_exiting_bb1.1
+; PROLOG-BLOCK:       exit1.loopexit:
+; PROLOG-BLOCK-NEXT:    br label %exit1
+; PROLOG-BLOCK:       exit1:
+; PROLOG-BLOCK-NEXT:    ret void
+; PROLOG-BLOCK:       exit2.loopexit.unr-lcssa:
+; PROLOG-BLOCK-NEXT:    br label %exit2.loopexit
+; PROLOG-BLOCK:       exit2.loopexit:
+; PROLOG-BLOCK-NEXT:    ret void
+; PROLOG-BLOCK:       loop_exiting_bb1.1:
+; PROLOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
+; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-BLOCK-NEXT:    i64 42, label %exit3.loopexit
+; PROLOG-BLOCK-NEXT:    ]
+; PROLOG-BLOCK:       loop_latch.1:
+; PROLOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
+; PROLOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
+; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
+; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %exit2.loopexit.unr-lcssa, !llvm.loop !3
+;
+
 entry:
   br label %loop_header
 
@@ -185,10 +1649,10 @@ loop_header:
   br i1 undef, label %loop_latch, label %loop_exiting_bb1
 
 loop_exiting_bb1:
-   switch i64 %sum, label %loop_latch [
-     i64 24, label %exit1
-     i64 42, label %exit3
-   ]
+  switch i64 %sum, label %loop_latch [
+  i64 24, label %exit1
+  i64 42, label %exit3
+  ]
 
 exit3:
   ret void
@@ -200,7 +1664,7 @@ loop_latch:
   br i1 %cmp, label %loop_header, label %exit2.loopexit
 
 exit1:
- ret void
+  ret void
 
 exit2.loopexit:
   ret void
@@ -209,13 +1673,146 @@ exit2.loopexit:
 ; FIXME: Support multiple exiting blocks to the same latch exit block.
 ; Three exiting blocks where header and latch exit to same LatchExit.
 define i32 @hdr_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) {
-; EPILOG: hdr_latch_same_exit(
-; EPILOG-NOT: .unr
-; EPILOG-NOT: .epil
+; EPILOG-NO-IC-LABEL: @hdr_latch_same_exit(
+; EPILOG-NO-IC-NEXT:  entry:
+; EPILOG-NO-IC-NEXT:    br label %header
+; EPILOG-NO-IC:       header:
+; EPILOG-NO-IC-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
+; EPILOG-NO-IC-NEXT:    %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %latchExit, label %for.exiting_block
+; EPILOG-NO-IC:       for.exiting_block:
+; EPILOG-NO-IC-NEXT:    %cmp = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp, label %for.exit2, label %latch
+; EPILOG-NO-IC:       latch:
+; EPILOG-NO-IC-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; EPILOG-NO-IC-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; EPILOG-NO-IC-NEXT:    %add = add nsw i32 %0, %sum.02
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
+; EPILOG-NO-IC-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; EPILOG-NO-IC-NEXT:    br i1 %exitcond, label %latchExit, label %header
+; EPILOG-NO-IC:       latchExit:
+; EPILOG-NO-IC-NEXT:    %result = phi i32 [ 0, %header ], [ %add, %latch ]
+; EPILOG-NO-IC-NEXT:    ret i32 %result
+; EPILOG-NO-IC:       for.exit2:
+; EPILOG-NO-IC-NEXT:    ret i32 42
+;
+; EPILOG-LABEL: @hdr_latch_same_exit(
+; EPILOG-NEXT:  entry:
+; EPILOG-NEXT:    br label %header
+; EPILOG:       header:
+; EPILOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
+; EPILOG-NEXT:    %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
+; EPILOG-NEXT:    br i1 %cond, label %latchExit, label %for.exiting_block
+; EPILOG:       for.exiting_block:
+; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp, label %for.exit2, label %latch
+; EPILOG:       latch:
+; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; EPILOG-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; EPILOG-NEXT:    %add = add nsw i32 %0, %sum.02
+; EPILOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
+; EPILOG-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; EPILOG-NEXT:    br i1 %exitcond, label %latchExit, label %header
+; EPILOG:       latchExit:
+; EPILOG-NEXT:    %result = phi i32 [ 0, %header ], [ %add, %latch ]
+; EPILOG-NEXT:    ret i32 %result
+; EPILOG:       for.exit2:
+; EPILOG-NEXT:    ret i32 42
+;
+; EPILOG-BLOCK-LABEL: @hdr_latch_same_exit(
+; EPILOG-BLOCK-NEXT:  entry:
+; EPILOG-BLOCK-NEXT:    br label %header
+; EPILOG-BLOCK:       header:
+; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit, label %for.exiting_block
+; EPILOG-BLOCK:       for.exiting_block:
+; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
+; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2, label %latch
+; EPILOG-BLOCK:       latch:
+; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; EPILOG-BLOCK-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %0, %sum.02
+; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+; EPILOG-BLOCK-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; EPILOG-BLOCK-NEXT:    br i1 %exitcond, label %latchExit, label %header.1
+; EPILOG-BLOCK:       latchExit:
+; EPILOG-BLOCK-NEXT:    %result = phi i32 [ 0, %header ], [ %add, %latch ], [ 0, %header.1 ], [ %add.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    ret i32 %result
+; EPILOG-BLOCK:       for.exit2:
+; EPILOG-BLOCK-NEXT:    ret i32 42
+; EPILOG-BLOCK:       header.1:
+; EPILOG-BLOCK-NEXT:    br i1 %cond, label %latchExit, label %for.exiting_block.1
+; EPILOG-BLOCK:       for.exiting_block.1:
+; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
+; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2, label %latch.1
+; EPILOG-BLOCK:       latch.1:
+; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
+; EPILOG-BLOCK-NEXT:    %1 = load i32, i32* %arrayidx.1, align 4
+; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %1, %add
+; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
+; EPILOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
+; EPILOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !4
+;
+; PROLOG-LABEL: @hdr_latch_same_exit(
+; PROLOG-NEXT:  entry:
+; PROLOG-NEXT:    br label %header
+; PROLOG:       header:
+; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
+; PROLOG-NEXT:    %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
+; PROLOG-NEXT:    br i1 %cond, label %latchExit, label %for.exiting_block
+; PROLOG:       for.exiting_block:
+; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp, label %for.exit2, label %latch
+; PROLOG:       latch:
+; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; PROLOG-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; PROLOG-NEXT:    %add = add nsw i32 %0, %sum.02
+; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
+; PROLOG-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; PROLOG-NEXT:    br i1 %exitcond, label %latchExit, label %header
+; PROLOG:       latchExit:
+; PROLOG-NEXT:    %result = phi i32 [ 0, %header ], [ %add, %latch ]
+; PROLOG-NEXT:    ret i32 %result
+; PROLOG:       for.exit2:
+; PROLOG-NEXT:    ret i32 42
+;
+; PROLOG-BLOCK-LABEL: @hdr_latch_same_exit(
+; PROLOG-BLOCK-NEXT:  entry:
+; PROLOG-BLOCK-NEXT:    br label %header
+; PROLOG-BLOCK:       header:
+; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ]
+; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ]
+; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit, label %for.exiting_block
+; PROLOG-BLOCK:       for.exiting_block:
+; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
+; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2, label %latch
+; PROLOG-BLOCK:       latch:
+; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; PROLOG-BLOCK-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %0, %sum.02
+; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+; PROLOG-BLOCK-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; PROLOG-BLOCK-NEXT:    br i1 %exitcond, label %latchExit, label %header.1
+; PROLOG-BLOCK:       latchExit:
+; PROLOG-BLOCK-NEXT:    %result = phi i32 [ 0, %header ], [ %add, %latch ], [ 0, %header.1 ], [ %add.1, %latch.1 ]
+; PROLOG-BLOCK-NEXT:    ret i32 %result
+; PROLOG-BLOCK:       for.exit2:
+; PROLOG-BLOCK-NEXT:    ret i32 42
+; PROLOG-BLOCK:       header.1:
+; PROLOG-BLOCK-NEXT:    br i1 %cond, label %latchExit, label %for.exiting_block.1
+; PROLOG-BLOCK:       for.exiting_block.1:
+; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
+; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2, label %latch.1
+; PROLOG-BLOCK:       latch.1:
+; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
+; PROLOG-BLOCK-NEXT:    %1 = load i32, i32* %arrayidx.1, align 4
+; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %1, %add
+; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
+; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
+; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !4
+;
 
-; PROLOG: hdr_latch_same_exit(
-; PROLOG-NOT: .unr
-; PROLOG-NOT: .prol
 entry:
   br label %header
 
@@ -225,8 +1822,8 @@ header:
   br i1 %cond, label %latchExit, label %for.exiting_block
 
 for.exiting_block:
- %cmp = icmp eq i64 %n, 42
- br i1 %cmp, label %for.exit2, label %latch
+  %cmp = icmp eq i64 %n, 42
+  br i1 %cmp, label %for.exit2, label %latch
 
 latch:                                         ; preds = %latch, %entry
   %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
@@ -248,13 +1845,146 @@ for.exit2:
 ; non-header
 ; FIXME: We should unroll this loop.
 define i32 @otherblock_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) {
-; EPILOG: otherblock_latch_same_exit(
-; EPILOG-NOT: .unr
-; EPILOG-NOT: .epil
+; EPILOG-NO-IC-LABEL: @otherblock_latch_same_exit(
+; EPILOG-NO-IC-NEXT:  entry:
+; EPILOG-NO-IC-NEXT:    br label %header
+; EPILOG-NO-IC:       header:
+; EPILOG-NO-IC-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
+; EPILOG-NO-IC-NEXT:    %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
+; EPILOG-NO-IC:       for.exiting_block:
+; EPILOG-NO-IC-NEXT:    %cmp = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp, label %latchExit, label %latch
+; EPILOG-NO-IC:       latch:
+; EPILOG-NO-IC-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; EPILOG-NO-IC-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; EPILOG-NO-IC-NEXT:    %add = add nsw i32 %0, %sum.02
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
+; EPILOG-NO-IC-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; EPILOG-NO-IC-NEXT:    br i1 %exitcond, label %latchExit, label %header
+; EPILOG-NO-IC:       latchExit:
+; EPILOG-NO-IC-NEXT:    %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ]
+; EPILOG-NO-IC-NEXT:    ret i32 %result
+; EPILOG-NO-IC:       for.exit2:
+; EPILOG-NO-IC-NEXT:    ret i32 42
+;
+; EPILOG-LABEL: @otherblock_latch_same_exit(
+; EPILOG-NEXT:  entry:
+; EPILOG-NEXT:    br label %header
+; EPILOG:       header:
+; EPILOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
+; EPILOG-NEXT:    %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
+; EPILOG-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
+; EPILOG:       for.exiting_block:
+; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp, label %latchExit, label %latch
+; EPILOG:       latch:
+; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; EPILOG-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; EPILOG-NEXT:    %add = add nsw i32 %0, %sum.02
+; EPILOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
+; EPILOG-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; EPILOG-NEXT:    br i1 %exitcond, label %latchExit, label %header
+; EPILOG:       latchExit:
+; EPILOG-NEXT:    %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ]
+; EPILOG-NEXT:    ret i32 %result
+; EPILOG:       for.exit2:
+; EPILOG-NEXT:    ret i32 42
+;
+; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit(
+; EPILOG-BLOCK-NEXT:  entry:
+; EPILOG-BLOCK-NEXT:    br label %header
+; EPILOG-BLOCK:       header:
+; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
+; EPILOG-BLOCK:       for.exiting_block:
+; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
+; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit, label %latch
+; EPILOG-BLOCK:       latch:
+; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; EPILOG-BLOCK-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %0, %sum.02
+; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+; EPILOG-BLOCK-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; EPILOG-BLOCK-NEXT:    br i1 %exitcond, label %latchExit, label %header.1
+; EPILOG-BLOCK:       latchExit:
+; EPILOG-BLOCK-NEXT:    %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ], [ 2, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    ret i32 %result
+; EPILOG-BLOCK:       for.exit2:
+; EPILOG-BLOCK-NEXT:    ret i32 42
+; EPILOG-BLOCK:       header.1:
+; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.1
+; EPILOG-BLOCK:       for.exiting_block.1:
+; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
+; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit, label %latch.1
+; EPILOG-BLOCK:       latch.1:
+; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
+; EPILOG-BLOCK-NEXT:    %1 = load i32, i32* %arrayidx.1, align 4
+; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %1, %add
+; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
+; EPILOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
+; EPILOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !5
+;
+; PROLOG-LABEL: @otherblock_latch_same_exit(
+; PROLOG-NEXT:  entry:
+; PROLOG-NEXT:    br label %header
+; PROLOG:       header:
+; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
+; PROLOG-NEXT:    %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
+; PROLOG-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
+; PROLOG:       for.exiting_block:
+; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp, label %latchExit, label %latch
+; PROLOG:       latch:
+; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; PROLOG-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; PROLOG-NEXT:    %add = add nsw i32 %0, %sum.02
+; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
+; PROLOG-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; PROLOG-NEXT:    br i1 %exitcond, label %latchExit, label %header
+; PROLOG:       latchExit:
+; PROLOG-NEXT:    %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ]
+; PROLOG-NEXT:    ret i32 %result
+; PROLOG:       for.exit2:
+; PROLOG-NEXT:    ret i32 42
+;
+; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit(
+; PROLOG-BLOCK-NEXT:  entry:
+; PROLOG-BLOCK-NEXT:    br label %header
+; PROLOG-BLOCK:       header:
+; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ]
+; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ]
+; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
+; PROLOG-BLOCK:       for.exiting_block:
+; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
+; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit, label %latch
+; PROLOG-BLOCK:       latch:
+; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; PROLOG-BLOCK-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %0, %sum.02
+; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+; PROLOG-BLOCK-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; PROLOG-BLOCK-NEXT:    br i1 %exitcond, label %latchExit, label %header.1
+; PROLOG-BLOCK:       latchExit:
+; PROLOG-BLOCK-NEXT:    %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ], [ 2, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
+; PROLOG-BLOCK-NEXT:    ret i32 %result
+; PROLOG-BLOCK:       for.exit2:
+; PROLOG-BLOCK-NEXT:    ret i32 42
+; PROLOG-BLOCK:       header.1:
+; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.1
+; PROLOG-BLOCK:       for.exiting_block.1:
+; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
+; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit, label %latch.1
+; PROLOG-BLOCK:       latch.1:
+; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
+; PROLOG-BLOCK-NEXT:    %1 = load i32, i32* %arrayidx.1, align 4
+; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %1, %add
+; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
+; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
+; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !5
+;
 
-; PROLOG: otherblock_latch_same_exit(
-; PROLOG-NOT: .unr
-; PROLOG-NOT: .prol
 entry:
   br label %header
 
@@ -264,8 +1994,8 @@ header:
   br i1 %cond, label %for.exit2, label %for.exiting_block
 
 for.exiting_block:
- %cmp = icmp eq i64 %n, 42
- br i1 %cmp, label %latchExit, label %latch
+  %cmp = icmp eq i64 %n, 42
+  br i1 %cmp, label %latchExit, label %latch
 
 latch:                                         ; preds = %latch, %entry
   %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
@@ -288,13 +2018,146 @@ for.exit2:
 ; Same as above test except the incoming value for latch Phi is from the header
 ; FIXME: We should be able to runtime unroll.
 define i32 @otherblock_latch_same_exit2(i32* nocapture %a, i64 %n, i1 %cond) {
-; EPILOG: otherblock_latch_same_exit2(
-; EPILOG-NOT: .unr
-; EPILOG-NOT: .epil
+; EPILOG-NO-IC-LABEL: @otherblock_latch_same_exit2(
+; EPILOG-NO-IC-NEXT:  entry:
+; EPILOG-NO-IC-NEXT:    br label %header
+; EPILOG-NO-IC:       header:
+; EPILOG-NO-IC-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
+; EPILOG-NO-IC-NEXT:    %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
+; EPILOG-NO-IC:       for.exiting_block:
+; EPILOG-NO-IC-NEXT:    %cmp = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp, label %latchExit, label %latch
+; EPILOG-NO-IC:       latch:
+; EPILOG-NO-IC-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; EPILOG-NO-IC-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; EPILOG-NO-IC-NEXT:    %add = add nsw i32 %0, %sum.02
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
+; EPILOG-NO-IC-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; EPILOG-NO-IC-NEXT:    br i1 %exitcond, label %latchExit, label %header
+; EPILOG-NO-IC:       latchExit:
+; EPILOG-NO-IC-NEXT:    %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
+; EPILOG-NO-IC-NEXT:    ret i32 %result
+; EPILOG-NO-IC:       for.exit2:
+; EPILOG-NO-IC-NEXT:    ret i32 42
+;
+; EPILOG-LABEL: @otherblock_latch_same_exit2(
+; EPILOG-NEXT:  entry:
+; EPILOG-NEXT:    br label %header
+; EPILOG:       header:
+; EPILOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
+; EPILOG-NEXT:    %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
+; EPILOG-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
+; EPILOG:       for.exiting_block:
+; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp, label %latchExit, label %latch
+; EPILOG:       latch:
+; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; EPILOG-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; EPILOG-NEXT:    %add = add nsw i32 %0, %sum.02
+; EPILOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
+; EPILOG-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; EPILOG-NEXT:    br i1 %exitcond, label %latchExit, label %header
+; EPILOG:       latchExit:
+; EPILOG-NEXT:    %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
+; EPILOG-NEXT:    ret i32 %result
+; EPILOG:       for.exit2:
+; EPILOG-NEXT:    ret i32 42
+;
+; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit2(
+; EPILOG-BLOCK-NEXT:  entry:
+; EPILOG-BLOCK-NEXT:    br label %header
+; EPILOG-BLOCK:       header:
+; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
+; EPILOG-BLOCK:       for.exiting_block:
+; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
+; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit, label %latch
+; EPILOG-BLOCK:       latch:
+; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; EPILOG-BLOCK-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %0, %sum.02
+; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+; EPILOG-BLOCK-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; EPILOG-BLOCK-NEXT:    br i1 %exitcond, label %latchExit, label %header.1
+; EPILOG-BLOCK:       latchExit:
+; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    ret i32 %result
+; EPILOG-BLOCK:       for.exit2:
+; EPILOG-BLOCK-NEXT:    ret i32 42
+; EPILOG-BLOCK:       header.1:
+; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.1
+; EPILOG-BLOCK:       for.exiting_block.1:
+; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
+; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit, label %latch.1
+; EPILOG-BLOCK:       latch.1:
+; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
+; EPILOG-BLOCK-NEXT:    %1 = load i32, i32* %arrayidx.1, align 4
+; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %1, %add
+; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
+; EPILOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
+; EPILOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !6
+;
+; PROLOG-LABEL: @otherblock_latch_same_exit2(
+; PROLOG-NEXT:  entry:
+; PROLOG-NEXT:    br label %header
+; PROLOG:       header:
+; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
+; PROLOG-NEXT:    %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
+; PROLOG-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
+; PROLOG:       for.exiting_block:
+; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp, label %latchExit, label %latch
+; PROLOG:       latch:
+; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; PROLOG-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; PROLOG-NEXT:    %add = add nsw i32 %0, %sum.02
+; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
+; PROLOG-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; PROLOG-NEXT:    br i1 %exitcond, label %latchExit, label %header
+; PROLOG:       latchExit:
+; PROLOG-NEXT:    %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
+; PROLOG-NEXT:    ret i32 %result
+; PROLOG:       for.exit2:
+; PROLOG-NEXT:    ret i32 42
+;
+; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit2(
+; PROLOG-BLOCK-NEXT:  entry:
+; PROLOG-BLOCK-NEXT:    br label %header
+; PROLOG-BLOCK:       header:
+; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ]
+; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ]
+; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
+; PROLOG-BLOCK:       for.exiting_block:
+; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
+; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit, label %latch
+; PROLOG-BLOCK:       latch:
+; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; PROLOG-BLOCK-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %0, %sum.02
+; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+; PROLOG-BLOCK-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; PROLOG-BLOCK-NEXT:    br i1 %exitcond, label %latchExit, label %header.1
+; PROLOG-BLOCK:       latchExit:
+; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
+; PROLOG-BLOCK-NEXT:    ret i32 %result
+; PROLOG-BLOCK:       for.exit2:
+; PROLOG-BLOCK-NEXT:    ret i32 42
+; PROLOG-BLOCK:       header.1:
+; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.1
+; PROLOG-BLOCK:       for.exiting_block.1:
+; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
+; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit, label %latch.1
+; PROLOG-BLOCK:       latch.1:
+; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
+; PROLOG-BLOCK-NEXT:    %1 = load i32, i32* %arrayidx.1, align 4
+; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %1, %add
+; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
+; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
+; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !6
+;
 
-; PROLOG: otherblock_latch_same_exit2(
-; PROLOG-NOT: .unr
-; PROLOG-NOT: .prol
 entry:
   br label %header
 
@@ -304,8 +2167,8 @@ header:
   br i1 %cond, label %for.exit2, label %for.exiting_block
 
 for.exiting_block:
- %cmp = icmp eq i64 %n, 42
- br i1 %cmp, label %latchExit, label %latch
+  %cmp = icmp eq i64 %n, 42
+  br i1 %cmp, label %latchExit, label %latch
 
 latch:                                         ; preds = %latch, %entry
   %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
@@ -329,13 +2192,146 @@ for.exit2:
 ; for.exiting_block.
 ; FIXME: We should be able to runtime unroll.
 define i32 @otherblock_latch_same_exit3(i32* nocapture %a, i64 %n, i1 %cond) {
-; EPILOG: otherblock_latch_same_exit3(
-; EPILOG-NOT: .unr
-; EPILOG-NOT: .epil
+; EPILOG-NO-IC-LABEL: @otherblock_latch_same_exit3(
+; EPILOG-NO-IC-NEXT:  entry:
+; EPILOG-NO-IC-NEXT:    br label %header
+; EPILOG-NO-IC:       header:
+; EPILOG-NO-IC-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
+; EPILOG-NO-IC-NEXT:    %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
+; EPILOG-NO-IC:       for.exiting_block:
+; EPILOG-NO-IC-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; EPILOG-NO-IC-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; EPILOG-NO-IC-NEXT:    %add = add nsw i32 %0, %sum.02
+; EPILOG-NO-IC-NEXT:    %cmp = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp, label %latchExit, label %latch
+; EPILOG-NO-IC:       latch:
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
+; EPILOG-NO-IC-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; EPILOG-NO-IC-NEXT:    br i1 %exitcond, label %latchExit, label %header
+; EPILOG-NO-IC:       latchExit:
+; EPILOG-NO-IC-NEXT:    %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
+; EPILOG-NO-IC-NEXT:    ret i32 %result
+; EPILOG-NO-IC:       for.exit2:
+; EPILOG-NO-IC-NEXT:    ret i32 42
+;
+; EPILOG-LABEL: @otherblock_latch_same_exit3(
+; EPILOG-NEXT:  entry:
+; EPILOG-NEXT:    br label %header
+; EPILOG:       header:
+; EPILOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
+; EPILOG-NEXT:    %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
+; EPILOG-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
+; EPILOG:       for.exiting_block:
+; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; EPILOG-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; EPILOG-NEXT:    %add = add nsw i32 %0, %sum.02
+; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp, label %latchExit, label %latch
+; EPILOG:       latch:
+; EPILOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
+; EPILOG-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; EPILOG-NEXT:    br i1 %exitcond, label %latchExit, label %header
+; EPILOG:       latchExit:
+; EPILOG-NEXT:    %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
+; EPILOG-NEXT:    ret i32 %result
+; EPILOG:       for.exit2:
+; EPILOG-NEXT:    ret i32 42
+;
+; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit3(
+; EPILOG-BLOCK-NEXT:  entry:
+; EPILOG-BLOCK-NEXT:    br label %header
+; EPILOG-BLOCK:       header:
+; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
+; EPILOG-BLOCK:       for.exiting_block:
+; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; EPILOG-BLOCK-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %0, %sum.02
+; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
+; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit, label %latch
+; EPILOG-BLOCK:       latch:
+; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+; EPILOG-BLOCK-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; EPILOG-BLOCK-NEXT:    br i1 %exitcond, label %latchExit, label %header.1
+; EPILOG-BLOCK:       latchExit:
+; EPILOG-BLOCK-NEXT:    %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    ret i32 %result
+; EPILOG-BLOCK:       for.exit2:
+; EPILOG-BLOCK-NEXT:    ret i32 42
+; EPILOG-BLOCK:       header.1:
+; EPILOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.1
+; EPILOG-BLOCK:       for.exiting_block.1:
+; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
+; EPILOG-BLOCK-NEXT:    %1 = load i32, i32* %arrayidx.1, align 4
+; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %1, %add
+; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
+; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit, label %latch.1
+; EPILOG-BLOCK:       latch.1:
+; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
+; EPILOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
+; EPILOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !7
+;
+; PROLOG-LABEL: @otherblock_latch_same_exit3(
+; PROLOG-NEXT:  entry:
+; PROLOG-NEXT:    br label %header
+; PROLOG:       header:
+; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
+; PROLOG-NEXT:    %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
+; PROLOG-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
+; PROLOG:       for.exiting_block:
+; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; PROLOG-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; PROLOG-NEXT:    %add = add nsw i32 %0, %sum.02
+; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp, label %latchExit, label %latch
+; PROLOG:       latch:
+; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
+; PROLOG-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; PROLOG-NEXT:    br i1 %exitcond, label %latchExit, label %header
+; PROLOG:       latchExit:
+; PROLOG-NEXT:    %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ]
+; PROLOG-NEXT:    ret i32 %result
+; PROLOG:       for.exit2:
+; PROLOG-NEXT:    ret i32 42
+;
+; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit3(
+; PROLOG-BLOCK-NEXT:  entry:
+; PROLOG-BLOCK-NEXT:    br label %header
+; PROLOG-BLOCK:       header:
+; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next.1, %latch.1 ]
+; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry ], [ %add.1, %latch.1 ]
+; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block
+; PROLOG-BLOCK:       for.exiting_block:
+; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; PROLOG-BLOCK-NEXT:    %0 = load i32, i32* %arrayidx, align 4
+; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %0, %sum.02
+; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
+; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %latchExit, label %latch
+; PROLOG-BLOCK:       latch:
+; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+; PROLOG-BLOCK-NEXT:    %exitcond = icmp eq i64 %indvars.iv.next, %n
+; PROLOG-BLOCK-NEXT:    br i1 %exitcond, label %latchExit, label %header.1
+; PROLOG-BLOCK:       latchExit:
+; PROLOG-BLOCK-NEXT:    %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ], [ %add, %for.exiting_block.1 ], [ %add.1, %latch.1 ]
+; PROLOG-BLOCK-NEXT:    ret i32 %result
+; PROLOG-BLOCK:       for.exit2:
+; PROLOG-BLOCK-NEXT:    ret i32 42
+; PROLOG-BLOCK:       header.1:
+; PROLOG-BLOCK-NEXT:    br i1 %cond, label %for.exit2, label %for.exiting_block.1
+; PROLOG-BLOCK:       for.exiting_block.1:
+; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
+; PROLOG-BLOCK-NEXT:    %1 = load i32, i32* %arrayidx.1, align 4
+; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %1, %add
+; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
+; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %latchExit, label %latch.1
+; PROLOG-BLOCK:       latch.1:
+; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
+; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
+; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latchExit, label %header, !llvm.loop !7
+;
 
-; PROLOG: otherblock_latch_same_exit3(
-; PROLOG-NOT: .unr
-; PROLOG-NOT: .prol
 entry:
   br label %header
 
@@ -345,11 +2341,11 @@ header:
   br i1 %cond, label %for.exit2, label %for.exiting_block
 
 for.exiting_block:
- %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
- %0 = load i32, i32* %arrayidx, align 4
- %add = add nsw i32 %0, %sum.02
- %cmp = icmp eq i64 %n, 42
- br i1 %cmp, label %latchExit, label %latch
+  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+  %0 = load i32, i32* %arrayidx, align 4
+  %add = add nsw i32 %0, %sum.02
+  %cmp = icmp eq i64 %n, 42
+  br i1 %cmp, label %latchExit, label %latch
 
 latch:                                         ; preds = %latch, %entry
   %indvars.iv.next = add i64 %indvars.iv, 1
@@ -367,13 +2363,24 @@ for.exit2:
 ; FIXME: Support multiple exiting blocks to the unique exit block (LatchExit).
 ; Only 2 blocks in loop: header and latch where both exit to same LatchExit.
 define void @unique_exit(i32 %arg) {
-; EPILOG: unique_exit(
-; EPILOG-NOT: .unr
-; EPILOG-NOT: .epil
+; CHECK-LABEL: @unique_exit(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    %i = icmp sgt i32 undef, %arg
+; CHECK-NEXT:    br i1 %i, label %preheader, label %returnblock
+; CHECK:       preheader:
+; CHECK-NEXT:    br label %header
+; CHECK:       header:
+; CHECK-NEXT:    br i1 true, label %latchExit, label %latch
+; CHECK:       latch:
+; CHECK-NEXT:    br label %latchExit
+; CHECK:       latchExit:
+; CHECK-NEXT:    %i2.ph = phi i32 [ %arg, %header ], [ -1, %latch ]
+; CHECK-NEXT:    br label %returnblock
+; CHECK:       returnblock:
+; CHECK-NEXT:    %i2 = phi i32 [ -1, %entry ], [ %i2.ph, %latchExit ]
+; CHECK-NEXT:    ret void
+;
 
-; PROLOG: unique_exit(
-; PROLOG-NOT: .unr
-; PROLOG-NOT: .prol
 entry:
   %i = icmp sgt i32 undef, %arg
   br i1 %i, label %preheader, label %returnblock
@@ -402,31 +2409,591 @@ returnblock:                                         ; preds = %latchExit, %entr
 ; two exiting and two exit blocks.
 ; the non-latch exiting block has duplicate edges to the non-latch exit block.
 define i64 @test5(i64 %trip, i64 %add, i1 %cond) {
-; EPILOG: test5(
-; EPILOG:   exit1.loopexit:
-; EPILOG-NEXT:      %iv.pn = phi i64 [ %iv, %loop_exiting ], [ %iv, %loop_exiting ], [ %iv_next, %loop_exiting.1 ], [ %iv_next, %loop_exiting.1 ], [ %iv_next.1, %loop_exiting.2 ], [ %iv_next.1, %loop_exiting.2 ], [ %iv_next.2, %loop_exiting.3 ], [ %iv_next.2, %loop_exiting.3 ], [ %iv_next.3, %loop_exiting.4 ], [ %iv_next.3, %loop_exiting.4 ], [ %iv_next.4, %loop_exiting.5 ], [ %iv_next.4, %loop_exiting.5 ], [ %iv_next.5, %loop_exiting.6 ], [ %iv_next.5, %loop_exiting.6 ], [ %iv_next.6, %loop_exiting.7 ], [ %iv_next.6, %loop_exiting.7 ]
-; EPILOG-NEXT:      br label %exit1
-; EPILOG:   exit1.loopexit2:
-; EPILOG-NEXT:      br label %exit1
-; EPILOG:   exit1:
-; EPILOG-NEXT:      %iv.pn.pn = phi i64 [ %iv.pn, %exit1.loopexit ], [ %iv.epil, %exit1.loopexit2 ]
-; EPILOG-NEXT:      %result = add i64 %iv.pn.pn, %add
-; EPILOG-NEXT:      ret i64 %result
-; EPILOG:   loop_latch.7:
-; EPILOG:      %niter.nsub.7 = add i64 %niter, -8
-
-; PROLOG: test5(
-; PROLOG:   exit1.loopexit:
-; PROLOG-NEXT:      %iv.pn = phi i64 [ %iv, %loop_exiting ], [ %iv, %loop_exiting ], [ %iv_next, %loop_exiting.1 ], [ %iv_next, %loop_exiting.1 ], [ %iv_next.1, %loop_exiting.2 ], [ %iv_next.1, %loop_exiting.2 ], [ %iv_next.2, %loop_exiting.3 ], [ %iv_next.2, %loop_exiting.3 ], [ %iv_next.3, %loop_exiting.4 ], [ %iv_next.3, %loop_exiting.4 ], [ %iv_next.4, %loop_exiting.5 ], [ %iv_next.4, %loop_exiting.5 ], [ %iv_next.5, %loop_exiting.6 ], [ %iv_next.5, %loop_exiting.6 ], [ %iv_next.6, %loop_exiting.7 ], [ %iv_next.6, %loop_exiting.7 ]
-; PROLOG-NEXT:      br label %exit1
-; PROLOG:   exit1.loopexit1:
-; PROLOG-NEXT:      br label %exit1
-; PROLOG:   exit1:
-; PROLOG-NEXT:      %iv.pn.pn = phi i64 [ %iv.pn, %exit1.loopexit ], [ %iv.prol, %exit1.loopexit1 ]
-; PROLOG-NEXT:      %result = add i64 %iv.pn.pn, %add
-; PROLOG-NEXT:      ret i64 %result
-; PROLOG:   loop_latch.7:
-; PROLOG:      %iv_next.7 = add nuw nsw i64 %iv, 8
+; EPILOG-NO-IC-LABEL: @test5(
+; EPILOG-NO-IC-NEXT:  entry:
+; EPILOG-NO-IC-NEXT:    %0 = add i64 %trip, -1
+; EPILOG-NO-IC-NEXT:    %xtraiter = and i64 %trip, 7
+; EPILOG-NO-IC-NEXT:    %1 = icmp ult i64 %0, 7
+; EPILOG-NO-IC-NEXT:    br i1 %1, label %latchexit.unr-lcssa, label %entry.new
+; EPILOG-NO-IC:       entry.new:
+; EPILOG-NO-IC-NEXT:    %unroll_iter = sub i64 %trip, %xtraiter
+; EPILOG-NO-IC-NEXT:    br label %loop_header
+; EPILOG-NO-IC:       loop_header:
+; EPILOG-NO-IC-NEXT:    %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ]
+; EPILOG-NO-IC-NEXT:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
+; EPILOG-NO-IC-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ]
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
+; EPILOG-NO-IC:       loop_exiting:
+; EPILOG-NO-IC-NEXT:    %ivy = add i64 %iv, %add
+; EPILOG-NO-IC-NEXT:    switch i64 %sum, label %loop_latch [
+; EPILOG-NO-IC-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    i64 42, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    ]
+; EPILOG-NO-IC:       loop_latch:
+; EPILOG-NO-IC-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
+; EPILOG-NO-IC-NEXT:    %sum.next = add i64 %sum, %add
+; EPILOG-NO-IC-NEXT:    %niter.nsub = sub i64 %niter, 1
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
+; EPILOG-NO-IC:       exit1.loopexit:
+; EPILOG-NO-IC-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.2, %loop_exiting.2 ], [ %ivy.2, %loop_exiting.2 ], [ %ivy.3, %loop_exiting.3 ], [ %ivy.3, %loop_exiting.3 ], [ %ivy.4, %loop_exiting.4 ], [ %ivy.4, %loop_exiting.4 ], [ %ivy.5, %loop_exiting.5 ], [ %ivy.5, %loop_exiting.5 ], [ %ivy.6, %loop_exiting.6 ], [ %ivy.6, %loop_exiting.6 ], [ %ivy.7, %loop_exiting.7 ], [ %ivy.7, %loop_exiting.7 ]
+; EPILOG-NO-IC-NEXT:    br label %exit1
+; EPILOG-NO-IC:       exit1.loopexit2:
+; EPILOG-NO-IC-NEXT:    %result.ph3 = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ]
+; EPILOG-NO-IC-NEXT:    br label %exit1
+; EPILOG-NO-IC:       exit1:
+; EPILOG-NO-IC-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph3, %exit1.loopexit2 ]
+; EPILOG-NO-IC-NEXT:    ret i64 %result
+; EPILOG-NO-IC:       latchexit.unr-lcssa.loopexit:
+; EPILOG-NO-IC-NEXT:    %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
+; EPILOG-NO-IC-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
+; EPILOG-NO-IC-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
+; EPILOG-NO-IC-NEXT:    br label %latchexit.unr-lcssa
+; EPILOG-NO-IC:       latchexit.unr-lcssa:
+; EPILOG-NO-IC-NEXT:    %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ]
+; EPILOG-NO-IC-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ]
+; EPILOG-NO-IC-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ]
+; EPILOG-NO-IC-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-NO-IC-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit
+; EPILOG-NO-IC:       loop_header.epil.preheader:
+; EPILOG-NO-IC-NEXT:    br label %loop_header.epil
+; EPILOG-NO-IC:       loop_header.epil:
+; EPILOG-NO-IC-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ], [ %iv_next.epil, %loop_latch.epil ]
+; EPILOG-NO-IC-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]
+; EPILOG-NO-IC-NEXT:    %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ]
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil
+; EPILOG-NO-IC:       loop_exiting.epil:
+; EPILOG-NO-IC-NEXT:    %ivy.epil = add i64 %iv.epil, %add
+; EPILOG-NO-IC-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
+; EPILOG-NO-IC-NEXT:    i64 24, label %exit1.loopexit2
+; EPILOG-NO-IC-NEXT:    i64 42, label %exit1.loopexit2
+; EPILOG-NO-IC-NEXT:    ]
+; EPILOG-NO-IC:       loop_latch.epil:
+; EPILOG-NO-IC-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
+; EPILOG-NO-IC-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
+; EPILOG-NO-IC-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
+; EPILOG-NO-IC-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
+; EPILOG-NO-IC-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
+; EPILOG-NO-IC-NEXT:    br i1 %epil.iter.cmp, label %loop_header.epil, label %latchexit.epilog-lcssa, !llvm.loop !4
+; EPILOG-NO-IC:       latchexit.epilog-lcssa:
+; EPILOG-NO-IC-NEXT:    %sum.next.lcssa.ph1 = phi i64 [ %sum.next.epil, %loop_latch.epil ]
+; EPILOG-NO-IC-NEXT:    br label %latchexit
+; EPILOG-NO-IC:       latchexit:
+; EPILOG-NO-IC-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.lcssa.ph1, %latchexit.epilog-lcssa ]
+; EPILOG-NO-IC-NEXT:    ret i64 %sum.next.lcssa
+; EPILOG-NO-IC:       loop_exiting.1:
+; EPILOG-NO-IC-NEXT:    %ivy.1 = add i64 %iv_next, %add
+; EPILOG-NO-IC-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
+; EPILOG-NO-IC-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    i64 42, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    ]
+; EPILOG-NO-IC:       loop_latch.1:
+; EPILOG-NO-IC-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
+; EPILOG-NO-IC-NEXT:    %sum.next.1 = add i64 %sum.next, %add
+; EPILOG-NO-IC-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.2
+; EPILOG-NO-IC:       loop_exiting.2:
+; EPILOG-NO-IC-NEXT:    %ivy.2 = add i64 %iv_next.1, %add
+; EPILOG-NO-IC-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
+; EPILOG-NO-IC-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    i64 42, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    ]
+; EPILOG-NO-IC:       loop_latch.2:
+; EPILOG-NO-IC-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
+; EPILOG-NO-IC-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
+; EPILOG-NO-IC-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.3
+; EPILOG-NO-IC:       loop_exiting.3:
+; EPILOG-NO-IC-NEXT:    %ivy.3 = add i64 %iv_next.2, %add
+; EPILOG-NO-IC-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
+; EPILOG-NO-IC-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    i64 42, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    ]
+; EPILOG-NO-IC:       loop_latch.3:
+; EPILOG-NO-IC-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
+; EPILOG-NO-IC-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
+; EPILOG-NO-IC-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.4
+; EPILOG-NO-IC:       loop_exiting.4:
+; EPILOG-NO-IC-NEXT:    %ivy.4 = add i64 %iv_next.3, %add
+; EPILOG-NO-IC-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
+; EPILOG-NO-IC-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    i64 42, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    ]
+; EPILOG-NO-IC:       loop_latch.4:
+; EPILOG-NO-IC-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
+; EPILOG-NO-IC-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
+; EPILOG-NO-IC-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.5
+; EPILOG-NO-IC:       loop_exiting.5:
+; EPILOG-NO-IC-NEXT:    %ivy.5 = add i64 %iv_next.4, %add
+; EPILOG-NO-IC-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
+; EPILOG-NO-IC-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    i64 42, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    ]
+; EPILOG-NO-IC:       loop_latch.5:
+; EPILOG-NO-IC-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
+; EPILOG-NO-IC-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
+; EPILOG-NO-IC-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.6
+; EPILOG-NO-IC:       loop_exiting.6:
+; EPILOG-NO-IC-NEXT:    %ivy.6 = add i64 %iv_next.5, %add
+; EPILOG-NO-IC-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
+; EPILOG-NO-IC-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    i64 42, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    ]
+; EPILOG-NO-IC:       loop_latch.6:
+; EPILOG-NO-IC-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
+; EPILOG-NO-IC-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
+; EPILOG-NO-IC-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.7
+; EPILOG-NO-IC:       loop_exiting.7:
+; EPILOG-NO-IC-NEXT:    %ivy.7 = add i64 %iv_next.6, %add
+; EPILOG-NO-IC-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
+; EPILOG-NO-IC-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    i64 42, label %exit1.loopexit
+; EPILOG-NO-IC-NEXT:    ]
+; EPILOG-NO-IC:       loop_latch.7:
+; EPILOG-NO-IC-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
+; EPILOG-NO-IC-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
+; EPILOG-NO-IC-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
+; EPILOG-NO-IC-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0
+; EPILOG-NO-IC-NEXT:    br i1 %niter.ncmp.7, label %loop_header, label %latchexit.unr-lcssa.loopexit
+;
+; EPILOG-LABEL: @test5(
+; 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 %latchexit.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:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
+; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %loop_latch.7 ]
+; EPILOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
+; EPILOG:       loop_exiting:
+; EPILOG-NEXT:    %ivy = add i64 %iv, %add
+; EPILOG-NEXT:    switch i64 %sum, label %loop_latch [
+; EPILOG-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NEXT:    i64 42, label %exit1.loopexit
+; EPILOG-NEXT:    ]
+; EPILOG:       loop_latch:
+; EPILOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
+; EPILOG-NEXT:    %sum.next = add i64 %sum, %add
+; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
+; EPILOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
+; EPILOG:       exit1.loopexit:
+; 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 ]
+; EPILOG-NEXT:    br label %exit1
+; EPILOG:       exit1.loopexit2:
+; EPILOG-NEXT:    %result.ph3 = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ]
+; EPILOG-NEXT:    br label %exit1
+; EPILOG:       exit1:
+; EPILOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph3, %exit1.loopexit2 ]
+; EPILOG-NEXT:    ret i64 %result
+; EPILOG:       latchexit.unr-lcssa.loopexit:
+; EPILOG-NEXT:    %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
+; EPILOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.7, %loop_latch.7 ]
+; EPILOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
+; EPILOG-NEXT:    br label %latchexit.unr-lcssa
+; EPILOG:       latchexit.unr-lcssa:
+; EPILOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ]
+; EPILOG-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ]
+; EPILOG-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.unr-lcssa.loopexit ]
+; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-NEXT:    br i1 %lcmp.mod, label %loop_header.epil.preheader, label %latchexit
+; 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:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ], [ %sum.next.epil, %loop_latch.epil ]
+; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %loop_header.epil.preheader ], [ %epil.iter.sub, %loop_latch.epil ]
+; EPILOG-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil
+; EPILOG:       loop_exiting.epil:
+; EPILOG-NEXT:    %ivy.epil = add i64 %iv.epil, %add
+; EPILOG-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
+; EPILOG-NEXT:    i64 24, label %exit1.loopexit2
+; EPILOG-NEXT:    i64 42, label %exit1.loopexit2
+; EPILOG-NEXT:    ]
+; EPILOG:       loop_latch.epil:
+; EPILOG-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
+; EPILOG-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
+; 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 %latchexit.epilog-lcssa, !llvm.loop !4
+; EPILOG:       latchexit.epilog-lcssa:
+; EPILOG-NEXT:    %sum.next.lcssa.ph1 = phi i64 [ %sum.next.epil, %loop_latch.epil ]
+; EPILOG-NEXT:    br label %latchexit
+; EPILOG:       latchexit:
+; EPILOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.lcssa.ph1, %latchexit.epilog-lcssa ]
+; EPILOG-NEXT:    ret i64 %sum.next.lcssa
+; EPILOG:       loop_exiting.1:
+; EPILOG-NEXT:    %ivy.1 = add i64 %iv_next, %add
+; EPILOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
+; EPILOG-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NEXT:    i64 42, label %exit1.loopexit
+; EPILOG-NEXT:    ]
+; EPILOG:       loop_latch.1:
+; EPILOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
+; EPILOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
+; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.2
+; EPILOG:       loop_exiting.2:
+; EPILOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add
+; EPILOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
+; EPILOG-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NEXT:    i64 42, label %exit1.loopexit
+; EPILOG-NEXT:    ]
+; EPILOG:       loop_latch.2:
+; EPILOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
+; EPILOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
+; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
+; EPILOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.3
+; EPILOG:       loop_exiting.3:
+; EPILOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add
+; EPILOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
+; EPILOG-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NEXT:    i64 42, label %exit1.loopexit
+; EPILOG-NEXT:    ]
+; EPILOG:       loop_latch.3:
+; EPILOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
+; EPILOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
+; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
+; EPILOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.4
+; EPILOG:       loop_exiting.4:
+; EPILOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add
+; EPILOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
+; EPILOG-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NEXT:    i64 42, label %exit1.loopexit
+; EPILOG-NEXT:    ]
+; EPILOG:       loop_latch.4:
+; EPILOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
+; EPILOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
+; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
+; EPILOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.5
+; EPILOG:       loop_exiting.5:
+; EPILOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add
+; EPILOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
+; EPILOG-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NEXT:    i64 42, label %exit1.loopexit
+; EPILOG-NEXT:    ]
+; EPILOG:       loop_latch.5:
+; EPILOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
+; EPILOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
+; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
+; EPILOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.6
+; EPILOG:       loop_exiting.6:
+; EPILOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add
+; EPILOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
+; EPILOG-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NEXT:    i64 42, label %exit1.loopexit
+; EPILOG-NEXT:    ]
+; EPILOG:       loop_latch.6:
+; EPILOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
+; EPILOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
+; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
+; EPILOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.7
+; EPILOG:       loop_exiting.7:
+; EPILOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add
+; EPILOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
+; EPILOG-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-NEXT:    i64 42, label %exit1.loopexit
+; EPILOG-NEXT:    ]
+; EPILOG:       loop_latch.7:
+; EPILOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
+; EPILOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
+; 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 %latchexit.unr-lcssa.loopexit
+;
+; EPILOG-BLOCK-LABEL: @test5(
+; 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 %latchexit.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:    %sum = phi i64 [ 0, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
+; EPILOG-BLOCK:       loop_exiting:
+; EPILOG-BLOCK-NEXT:    %ivy = add i64 %iv, %add
+; EPILOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
+; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
+; EPILOG-BLOCK-NEXT:    ]
+; EPILOG-BLOCK:       loop_latch:
+; EPILOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
+; EPILOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
+; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
+; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
+; EPILOG-BLOCK:       exit1.loopexit:
+; EPILOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]
+; EPILOG-BLOCK-NEXT:    br label %exit1
+; EPILOG-BLOCK:       exit1:
+; EPILOG-BLOCK-NEXT:    %result = phi i64 [ %ivy.epil, %loop_exiting.epil ], [ %ivy.epil, %loop_exiting.epil ], [ %result.ph, %exit1.loopexit ]
+; EPILOG-BLOCK-NEXT:    ret i64 %result
+; EPILOG-BLOCK:       latchexit.unr-lcssa.loopexit:
+; EPILOG-BLOCK-NEXT:    %sum.next.lcssa.ph.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
+; EPILOG-BLOCK-NEXT:    br label %latchexit.unr-lcssa
+; EPILOG-BLOCK:       latchexit.unr-lcssa:
+; EPILOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ undef, %entry ], [ %sum.next.lcssa.ph.ph, %latchexit.unr-lcssa.loopexit ]
+; EPILOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv.unr.ph, %latchexit.unr-lcssa.loopexit ]
+; EPILOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %latchexit.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 %latchexit
+; EPILOG-BLOCK:       loop_header.epil.preheader:
+; EPILOG-BLOCK-NEXT:    br label %loop_header.epil
+; EPILOG-BLOCK:       loop_header.epil:
+; EPILOG-BLOCK-NEXT:    %iv.epil = phi i64 [ %iv.unr, %loop_header.epil.preheader ]
+; EPILOG-BLOCK-NEXT:    %sum.epil = phi i64 [ %sum.unr, %loop_header.epil.preheader ]
+; EPILOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.epil, label %loop_exiting.epil
+; EPILOG-BLOCK:       loop_exiting.epil:
+; EPILOG-BLOCK-NEXT:    %ivy.epil = add i64 %iv.epil, %add
+; EPILOG-BLOCK-NEXT:    switch i64 %sum.epil, label %loop_latch.epil [
+; EPILOG-BLOCK-NEXT:    i64 24, label %exit1
+; EPILOG-BLOCK-NEXT:    i64 42, label %exit1
+; EPILOG-BLOCK-NEXT:    ]
+; EPILOG-BLOCK:       loop_latch.epil:
+; EPILOG-BLOCK-NEXT:    %iv_next.epil = add nuw nsw i64 %iv.epil, 1
+; EPILOG-BLOCK-NEXT:    %sum.next.epil = add i64 %sum.epil, %add
+; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp ne i64 %iv_next.epil, %trip
+; EPILOG-BLOCK-NEXT:    br label %latchexit.epilog-lcssa
+; EPILOG-BLOCK:       latchexit.epilog-lcssa:
+; EPILOG-BLOCK-NEXT:    br label %latchexit
+; EPILOG-BLOCK:       latchexit:
+; EPILOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ], [ %sum.next.epil, %latchexit.epilog-lcssa ]
+; EPILOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa
+; EPILOG-BLOCK:       loop_exiting.1:
+; EPILOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add
+; EPILOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
+; EPILOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
+; EPILOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
+; EPILOG-BLOCK-NEXT:    ]
+; EPILOG-BLOCK:       loop_latch.1:
+; EPILOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
+; EPILOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
+; 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 %latchexit.unr-lcssa.loopexit, !llvm.loop !8
+;
+; PROLOG-LABEL: @test5(
+; 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:    %sum.prol = phi i64 [ 0, %loop_header.prol.preheader ], [ %sum.next.prol, %loop_latch.prol ]
+; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %loop_header.prol.preheader ], [ %prol.iter.sub, %loop_latch.prol ]
+; PROLOG-NEXT:    br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol
+; PROLOG:       loop_exiting.prol:
+; PROLOG-NEXT:    %ivy.prol = add i64 %iv.prol, %add
+; PROLOG-NEXT:    switch i64 %sum.prol, label %loop_latch.prol [
+; PROLOG-NEXT:    i64 24, label %exit1.loopexit1
+; PROLOG-NEXT:    i64 42, label %exit1.loopexit1
+; PROLOG-NEXT:    ]
+; PROLOG:       loop_latch.prol:
+; PROLOG-NEXT:    %iv_next.prol = add nuw nsw i64 %iv.prol, 1
+; PROLOG-NEXT:    %sum.next.prol = add i64 %sum.prol, %add
+; 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 !4
+; PROLOG:       loop_header.prol.loopexit.unr-lcssa:
+; PROLOG-NEXT:    %iv.unr.ph = phi i64 [ %iv_next.prol, %loop_latch.prol ]
+; PROLOG-NEXT:    %sum.unr.ph = phi i64 [ %sum.next.prol, %loop_latch.prol ]
+; PROLOG-NEXT:    %sum.next.lcssa.unr.ph = phi i64 [ %sum.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:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
+; PROLOG-NEXT:    %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %sum.next.lcssa.unr.ph, %loop_header.prol.loopexit.unr-lcssa ]
+; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
+; PROLOG-NEXT:    br i1 %1, label %latchexit, 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:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.7, %loop_latch.7 ]
+; PROLOG-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
+; PROLOG:       loop_exiting:
+; PROLOG-NEXT:    %ivy = add i64 %iv, %add
+; PROLOG-NEXT:    switch i64 %sum, label %loop_latch [
+; PROLOG-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-NEXT:    i64 42, label %exit1.loopexit
+; PROLOG-NEXT:    ]
+; PROLOG:       loop_latch:
+; PROLOG-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
+; PROLOG-NEXT:    %sum.next = add i64 %sum, %add
+; PROLOG-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
+; PROLOG:       exit1.loopexit:
+; 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 ]
+; PROLOG-NEXT:    br label %exit1
+; PROLOG:       exit1.loopexit1:
+; PROLOG-NEXT:    %result.ph2 = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ]
+; PROLOG-NEXT:    br label %exit1
+; PROLOG:       exit1:
+; PROLOG-NEXT:    %result = phi i64 [ %result.ph, %exit1.loopexit ], [ %result.ph2, %exit1.loopexit1 ]
+; PROLOG-NEXT:    ret i64 %result
+; PROLOG:       latchexit.unr-lcssa:
+; PROLOG-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.7, %loop_latch.7 ]
+; PROLOG-NEXT:    br label %latchexit
+; PROLOG:       latchexit:
+; PROLOG-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]
+; PROLOG-NEXT:    ret i64 %sum.next.lcssa
+; PROLOG:       loop_exiting.1:
+; PROLOG-NEXT:    %ivy.1 = add i64 %iv_next, %add
+; PROLOG-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
+; PROLOG-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-NEXT:    i64 42, label %exit1.loopexit
+; PROLOG-NEXT:    ]
+; PROLOG:       loop_latch.1:
+; PROLOG-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
+; PROLOG-NEXT:    %sum.next.1 = add i64 %sum.next, %add
+; PROLOG-NEXT:    br i1 %cond, label %loop_latch.2, label %loop_exiting.2
+; PROLOG:       loop_exiting.2:
+; PROLOG-NEXT:    %ivy.2 = add i64 %iv_next.1, %add
+; PROLOG-NEXT:    switch i64 %sum.next.1, label %loop_latch.2 [
+; PROLOG-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-NEXT:    i64 42, label %exit1.loopexit
+; PROLOG-NEXT:    ]
+; PROLOG:       loop_latch.2:
+; PROLOG-NEXT:    %iv_next.2 = add nuw nsw i64 %iv_next.1, 1
+; PROLOG-NEXT:    %sum.next.2 = add i64 %sum.next.1, %add
+; PROLOG-NEXT:    br i1 %cond, label %loop_latch.3, label %loop_exiting.3
+; PROLOG:       loop_exiting.3:
+; PROLOG-NEXT:    %ivy.3 = add i64 %iv_next.2, %add
+; PROLOG-NEXT:    switch i64 %sum.next.2, label %loop_latch.3 [
+; PROLOG-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-NEXT:    i64 42, label %exit1.loopexit
+; PROLOG-NEXT:    ]
+; PROLOG:       loop_latch.3:
+; PROLOG-NEXT:    %iv_next.3 = add nuw nsw i64 %iv_next.2, 1
+; PROLOG-NEXT:    %sum.next.3 = add i64 %sum.next.2, %add
+; PROLOG-NEXT:    br i1 %cond, label %loop_latch.4, label %loop_exiting.4
+; PROLOG:       loop_exiting.4:
+; PROLOG-NEXT:    %ivy.4 = add i64 %iv_next.3, %add
+; PROLOG-NEXT:    switch i64 %sum.next.3, label %loop_latch.4 [
+; PROLOG-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-NEXT:    i64 42, label %exit1.loopexit
+; PROLOG-NEXT:    ]
+; PROLOG:       loop_latch.4:
+; PROLOG-NEXT:    %iv_next.4 = add nuw nsw i64 %iv_next.3, 1
+; PROLOG-NEXT:    %sum.next.4 = add i64 %sum.next.3, %add
+; PROLOG-NEXT:    br i1 %cond, label %loop_latch.5, label %loop_exiting.5
+; PROLOG:       loop_exiting.5:
+; PROLOG-NEXT:    %ivy.5 = add i64 %iv_next.4, %add
+; PROLOG-NEXT:    switch i64 %sum.next.4, label %loop_latch.5 [
+; PROLOG-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-NEXT:    i64 42, label %exit1.loopexit
+; PROLOG-NEXT:    ]
+; PROLOG:       loop_latch.5:
+; PROLOG-NEXT:    %iv_next.5 = add nuw nsw i64 %iv_next.4, 1
+; PROLOG-NEXT:    %sum.next.5 = add i64 %sum.next.4, %add
+; PROLOG-NEXT:    br i1 %cond, label %loop_latch.6, label %loop_exiting.6
+; PROLOG:       loop_exiting.6:
+; PROLOG-NEXT:    %ivy.6 = add i64 %iv_next.5, %add
+; PROLOG-NEXT:    switch i64 %sum.next.5, label %loop_latch.6 [
+; PROLOG-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-NEXT:    i64 42, label %exit1.loopexit
+; PROLOG-NEXT:    ]
+; PROLOG:       loop_latch.6:
+; PROLOG-NEXT:    %iv_next.6 = add nuw nsw i64 %iv_next.5, 1
+; PROLOG-NEXT:    %sum.next.6 = add i64 %sum.next.5, %add
+; PROLOG-NEXT:    br i1 %cond, label %loop_latch.7, label %loop_exiting.7
+; PROLOG:       loop_exiting.7:
+; PROLOG-NEXT:    %ivy.7 = add i64 %iv_next.6, %add
+; PROLOG-NEXT:    switch i64 %sum.next.6, label %loop_latch.7 [
+; PROLOG-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-NEXT:    i64 42, label %exit1.loopexit
+; PROLOG-NEXT:    ]
+; PROLOG:       loop_latch.7:
+; PROLOG-NEXT:    %iv_next.7 = add nuw nsw i64 %iv_next.6, 1
+; PROLOG-NEXT:    %sum.next.7 = add i64 %sum.next.6, %add
+; PROLOG-NEXT:    %cmp.7 = icmp ne i64 %iv_next.7, %trip
+; PROLOG-NEXT:    br i1 %cmp.7, label %loop_header, label %latchexit.unr-lcssa
+;
+; PROLOG-BLOCK-LABEL: @test5(
+; 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:    br i1 %cond, label %loop_latch.prol, label %loop_exiting.prol
+; PROLOG-BLOCK:       loop_exiting.prol:
+; PROLOG-BLOCK-NEXT:    %ivy.prol = add i64 0, %add
+; PROLOG-BLOCK-NEXT:    switch i64 0, label %loop_latch.prol [
+; PROLOG-BLOCK-NEXT:    i64 24, label %exit1
+; PROLOG-BLOCK-NEXT:    i64 42, label %exit1
+; PROLOG-BLOCK-NEXT:    ]
+; PROLOG-BLOCK:       loop_latch.prol:
+; PROLOG-BLOCK-NEXT:    %iv_next.prol = add nuw nsw i64 0, 1
+; PROLOG-BLOCK-NEXT:    %sum.next.prol = add i64 0, %add
+; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp ne i64 %iv_next.prol, %trip
+; PROLOG-BLOCK-NEXT:    br label %loop_header.prol.loopexit
+; PROLOG-BLOCK:       loop_header.prol.loopexit:
+; PROLOG-BLOCK-NEXT:    %iv.unr = phi i64 [ 0, %entry ], [ %iv_next.prol, %loop_latch.prol ]
+; PROLOG-BLOCK-NEXT:    %sum.unr = phi i64 [ 0, %entry ], [ %sum.next.prol, %loop_latch.prol ]
+; PROLOG-BLOCK-NEXT:    %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %sum.next.prol, %loop_latch.prol ]
+; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
+; PROLOG-BLOCK-NEXT:    br i1 %1, label %latchexit, 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:    %sum = phi i64 [ %sum.unr, %entry.new ], [ %sum.next.1, %loop_latch.1 ]
+; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch, label %loop_exiting
+; PROLOG-BLOCK:       loop_exiting:
+; PROLOG-BLOCK-NEXT:    %ivy = add i64 %iv, %add
+; PROLOG-BLOCK-NEXT:    switch i64 %sum, label %loop_latch [
+; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
+; PROLOG-BLOCK-NEXT:    ]
+; PROLOG-BLOCK:       loop_latch:
+; PROLOG-BLOCK-NEXT:    %iv_next = add nuw nsw i64 %iv, 1
+; PROLOG-BLOCK-NEXT:    %sum.next = add i64 %sum, %add
+; PROLOG-BLOCK-NEXT:    br i1 %cond, label %loop_latch.1, label %loop_exiting.1
+; PROLOG-BLOCK:       exit1.loopexit:
+; PROLOG-BLOCK-NEXT:    %result.ph = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ], [ %ivy.1, %loop_exiting.1 ], [ %ivy.1, %loop_exiting.1 ]
+; PROLOG-BLOCK-NEXT:    br label %exit1
+; PROLOG-BLOCK:       exit1:
+; PROLOG-BLOCK-NEXT:    %result = phi i64 [ %ivy.prol, %loop_exiting.prol ], [ %ivy.prol, %loop_exiting.prol ], [ %result.ph, %exit1.loopexit ]
+; PROLOG-BLOCK-NEXT:    ret i64 %result
+; PROLOG-BLOCK:       latchexit.unr-lcssa:
+; PROLOG-BLOCK-NEXT:    %sum.next.lcssa.ph = phi i64 [ %sum.next.1, %loop_latch.1 ]
+; PROLOG-BLOCK-NEXT:    br label %latchexit
+; PROLOG-BLOCK:       latchexit:
+; PROLOG-BLOCK-NEXT:    %sum.next.lcssa = phi i64 [ %sum.next.lcssa.unr, %loop_header.prol.loopexit ], [ %sum.next.lcssa.ph, %latchexit.unr-lcssa ]
+; PROLOG-BLOCK-NEXT:    ret i64 %sum.next.lcssa
+; PROLOG-BLOCK:       loop_exiting.1:
+; PROLOG-BLOCK-NEXT:    %ivy.1 = add i64 %iv_next, %add
+; PROLOG-BLOCK-NEXT:    switch i64 %sum.next, label %loop_latch.1 [
+; PROLOG-BLOCK-NEXT:    i64 24, label %exit1.loopexit
+; PROLOG-BLOCK-NEXT:    i64 42, label %exit1.loopexit
+; PROLOG-BLOCK-NEXT:    ]
+; PROLOG-BLOCK:       loop_latch.1:
+; PROLOG-BLOCK-NEXT:    %iv_next.1 = add nuw nsw i64 %iv_next, 1
+; PROLOG-BLOCK-NEXT:    %sum.next.1 = add i64 %sum.next, %add
+; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp ne i64 %iv_next.1, %trip
+; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %loop_header, label %latchexit.unr-lcssa, !llvm.loop !8
+;
+
 entry:
   br label %loop_header
 
@@ -436,11 +3003,11 @@ loop_header:
   br i1 %cond, label %loop_latch, label %loop_exiting
 
 loop_exiting:
-   %ivy = add i64 %iv, %add
-   switch i64 %sum, label %loop_latch [
-     i64 24, label %exit1
-     i64 42, label %exit1
-   ]
+  %ivy = add i64 %iv, %add
+  switch i64 %sum, label %loop_latch [
+  i64 24, label %exit1
+  i64 42, label %exit1
+  ]
 
 loop_latch:
   %iv_next = add nuw nsw i64 %iv, 1
@@ -449,8 +3016,8 @@ loop_latch:
   br i1 %cmp, label %loop_header, label %latchexit
 
 exit1:
- %result = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ]
- ret i64 %result
+  %result = phi i64 [ %ivy, %loop_exiting ], [ %ivy, %loop_exiting ]
+  ret i64 %result
 
 latchexit:
   ret i64 %sum.next
@@ -458,31 +3025,583 @@ latchexit:
 
 ; test when exit blocks have successors.
 define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) {
-; EPILOG: test6(
-; EPILOG:   for.exit2.loopexit:
-; 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 ],
-; EPILOG-NEXT:      br label %for.exit2
-; EPILOG:   for.exit2.loopexit2:
-; EPILOG-NEXT:      %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
-; EPILOG-NEXT:      br label %for.exit2
-; EPILOG:   for.exit2:
-; EPILOG-NEXT:      %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
-; EPILOG-NEXT:      br i1 %cond, label %exit_true, label %exit_false
-; EPILOG:   latch.7:
-; EPILOG:           %niter.nsub.7 = add i64 %niter, -8
-
-; PROLOG: test6(
-; PROLOG:   for.exit2.loopexit:
-; 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 ],
-; PROLOG-NEXT:      br label %for.exit2
-; PROLOG:   for.exit2.loopexit1:
-; PROLOG-NEXT:      %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
-; PROLOG-NEXT:      br label %for.exit2
-; PROLOG:   for.exit2:
-; PROLOG-NEXT:      %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
-; PROLOG-NEXT:      br i1 %cond, label %exit_true, label %exit_false
-; PROLOG: latch.7:
-; PROLOG:   %indvars.iv.next.7 = add i64 %indvars.iv, 8
+; EPILOG-NO-IC-LABEL: @test6(
+; EPILOG-NO-IC-NEXT:  entry:
+; EPILOG-NO-IC-NEXT:    %0 = add i64 %n, -1
+; EPILOG-NO-IC-NEXT:    %xtraiter = and i64 %n, 7
+; EPILOG-NO-IC-NEXT:    %1 = icmp ult i64 %0, 7
+; EPILOG-NO-IC-NEXT:    br i1 %1, label %latch_exit.unr-lcssa, label %entry.new
+; EPILOG-NO-IC:       entry.new:
+; EPILOG-NO-IC-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
+; EPILOG-NO-IC-NEXT:    br label %header
+; EPILOG-NO-IC:       header:
+; EPILOG-NO-IC-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
+; EPILOG-NO-IC-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
+; EPILOG-NO-IC-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %latch.7 ]
+; EPILOG-NO-IC-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
+; EPILOG-NO-IC:       for.exiting_block:
+; EPILOG-NO-IC-NEXT:    %cmp = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
+; EPILOG-NO-IC:       latch:
+; EPILOG-NO-IC-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; EPILOG-NO-IC-NEXT:    %load = load i32, i32* %arrayidx, align 4
+; EPILOG-NO-IC-NEXT:    %add = add nsw i32 %load, %sum.02
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub = sub i64 %niter, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
+; EPILOG-NO-IC:       latch_exit.unr-lcssa.loopexit:
+; EPILOG-NO-IC-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %latch.7 ]
+; EPILOG-NO-IC-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
+; EPILOG-NO-IC-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
+; EPILOG-NO-IC-NEXT:    br label %latch_exit.unr-lcssa
+; EPILOG-NO-IC:       latch_exit.unr-lcssa:
+; EPILOG-NO-IC-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ]
+; EPILOG-NO-IC-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ]
+; EPILOG-NO-IC-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ]
+; EPILOG-NO-IC-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-NO-IC-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit
+; EPILOG-NO-IC:       header.epil.preheader:
+; EPILOG-NO-IC-NEXT:    br label %header.epil
+; EPILOG-NO-IC:       header.epil:
+; EPILOG-NO-IC-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
+; EPILOG-NO-IC-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
+; EPILOG-NO-IC-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
+; EPILOG-NO-IC-NEXT:    br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil
+; EPILOG-NO-IC:       for.exiting_block.epil:
+; EPILOG-NO-IC-NEXT:    %cmp.epil = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit2, label %latch.epil
+; EPILOG-NO-IC:       latch.epil:
+; EPILOG-NO-IC-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
+; EPILOG-NO-IC-NEXT:    %load.epil = load i32, i32* %arrayidx.epil, align 4
+; EPILOG-NO-IC-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.epil
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
+; EPILOG-NO-IC-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
+; EPILOG-NO-IC-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
+; EPILOG-NO-IC-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
+; EPILOG-NO-IC-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latch_exit.epilog-lcssa, !llvm.loop !5
+; EPILOG-NO-IC:       latch_exit.epilog-lcssa:
+; EPILOG-NO-IC-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %latch.epil ]
+; EPILOG-NO-IC-NEXT:    br label %latch_exit
+; EPILOG-NO-IC:       latch_exit:
+; EPILOG-NO-IC-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %sum.0.lcssa.ph1, %latch_exit.epilog-lcssa ]
+; EPILOG-NO-IC-NEXT:    ret i32 %sum.0.lcssa
+; EPILOG-NO-IC:       for.exit2.loopexit:
+; EPILOG-NO-IC-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ], [ %add.1, %latch.1 ], [ 42, %for.exiting_block.2 ], [ %add.2, %latch.2 ], [ 42, %for.exiting_block.3 ], [ %add.3, %latch.3 ], [ 42, %for.exiting_block.4 ], [ %add.4, %latch.4 ], [ 42, %for.exiting_block.5 ], [ %add.5, %latch.5 ], [ 42, %for.exiting_block.6 ], [ %add.6, %latch.6 ], [ 42, %for.exiting_block.7 ]
+; EPILOG-NO-IC-NEXT:    br label %for.exit2
+; EPILOG-NO-IC:       for.exit2.loopexit2:
+; EPILOG-NO-IC-NEXT:    %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
+; EPILOG-NO-IC-NEXT:    br label %for.exit2
+; EPILOG-NO-IC:       for.exit2:
+; EPILOG-NO-IC-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
+; EPILOG-NO-IC-NEXT:    %addx = add i32 %retval, %x
+; EPILOG-NO-IC-NEXT:    br i1 %cond, label %exit_true, label %exit_false
+; EPILOG-NO-IC:       exit_true:
+; EPILOG-NO-IC-NEXT:    ret i32 %retval
+; EPILOG-NO-IC:       exit_false:
+; EPILOG-NO-IC-NEXT:    ret i32 %addx
+; EPILOG-NO-IC:       for.exiting_block.1:
+; EPILOG-NO-IC-NEXT:    %cmp.1 = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
+; EPILOG-NO-IC:       latch.1:
+; EPILOG-NO-IC-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
+; EPILOG-NO-IC-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
+; EPILOG-NO-IC-NEXT:    %add.1 = add nsw i32 %load.1, %add
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
+; EPILOG-NO-IC:       for.exiting_block.2:
+; EPILOG-NO-IC-NEXT:    %cmp.2 = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
+; EPILOG-NO-IC:       latch.2:
+; EPILOG-NO-IC-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
+; EPILOG-NO-IC-NEXT:    %load.2 = load i32, i32* %arrayidx.2, align 4
+; EPILOG-NO-IC-NEXT:    %add.2 = add nsw i32 %load.2, %add.1
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
+; EPILOG-NO-IC:       for.exiting_block.3:
+; EPILOG-NO-IC-NEXT:    %cmp.3 = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
+; EPILOG-NO-IC:       latch.3:
+; EPILOG-NO-IC-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
+; EPILOG-NO-IC-NEXT:    %load.3 = load i32, i32* %arrayidx.3, align 4
+; EPILOG-NO-IC-NEXT:    %add.3 = add nsw i32 %load.3, %add.2
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
+; EPILOG-NO-IC:       for.exiting_block.4:
+; EPILOG-NO-IC-NEXT:    %cmp.4 = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
+; EPILOG-NO-IC:       latch.4:
+; EPILOG-NO-IC-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
+; EPILOG-NO-IC-NEXT:    %load.4 = load i32, i32* %arrayidx.4, align 4
+; EPILOG-NO-IC-NEXT:    %add.4 = add nsw i32 %load.4, %add.3
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
+; EPILOG-NO-IC:       for.exiting_block.5:
+; EPILOG-NO-IC-NEXT:    %cmp.5 = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
+; EPILOG-NO-IC:       latch.5:
+; EPILOG-NO-IC-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
+; EPILOG-NO-IC-NEXT:    %load.5 = load i32, i32* %arrayidx.5, align 4
+; EPILOG-NO-IC-NEXT:    %add.5 = add nsw i32 %load.5, %add.4
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
+; EPILOG-NO-IC:       for.exiting_block.6:
+; EPILOG-NO-IC-NEXT:    %cmp.6 = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
+; EPILOG-NO-IC:       latch.6:
+; EPILOG-NO-IC-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
+; EPILOG-NO-IC-NEXT:    %load.6 = load i32, i32* %arrayidx.6, align 4
+; EPILOG-NO-IC-NEXT:    %add.6 = add nsw i32 %load.6, %add.5
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
+; EPILOG-NO-IC:       for.exiting_block.7:
+; EPILOG-NO-IC-NEXT:    %cmp.7 = icmp eq i64 %n, 42
+; EPILOG-NO-IC-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
+; EPILOG-NO-IC:       latch.7:
+; EPILOG-NO-IC-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
+; EPILOG-NO-IC-NEXT:    %load.7 = load i32, i32* %arrayidx.7, align 4
+; EPILOG-NO-IC-NEXT:    %add.7 = add nsw i32 %load.7, %add.6
+; EPILOG-NO-IC-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
+; EPILOG-NO-IC-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
+; EPILOG-NO-IC-NEXT:    br i1 %niter.ncmp.7, label %latch_exit.unr-lcssa.loopexit, label %header
+;
+; EPILOG-LABEL: @test6(
+; EPILOG-NEXT:  entry:
+; EPILOG-NEXT:    %0 = add i64 %n, -1
+; EPILOG-NEXT:    %xtraiter = and i64 %n, 7
+; EPILOG-NEXT:    %1 = icmp ult i64 %0, 7
+; EPILOG-NEXT:    br i1 %1, label %latch_exit.unr-lcssa, label %entry.new
+; EPILOG:       entry.new:
+; EPILOG-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
+; EPILOG-NEXT:    br label %header
+; EPILOG:       header:
+; EPILOG-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
+; EPILOG-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.7, %latch.7 ]
+; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.7, %latch.7 ]
+; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
+; EPILOG:       for.exiting_block:
+; EPILOG-NEXT:    %cmp = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
+; EPILOG:       latch:
+; EPILOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; EPILOG-NEXT:    %load = load i32, i32* %arrayidx, align 4
+; EPILOG-NEXT:    %add = add nsw i32 %load, %sum.02
+; EPILOG-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
+; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
+; EPILOG:       latch_exit.unr-lcssa.loopexit:
+; EPILOG-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.7, %latch.7 ]
+; EPILOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.7, %latch.7 ]
+; EPILOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.7, %latch.7 ]
+; EPILOG-NEXT:    br label %latch_exit.unr-lcssa
+; EPILOG:       latch_exit.unr-lcssa:
+; EPILOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ]
+; EPILOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ]
+; EPILOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ]
+; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit
+; EPILOG:       header.epil.preheader:
+; EPILOG-NEXT:    br label %header.epil
+; EPILOG:       header.epil:
+; EPILOG-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %latch.epil ], [ %indvars.iv.unr, %header.epil.preheader ]
+; EPILOG-NEXT:    %sum.02.epil = phi i32 [ %add.epil, %latch.epil ], [ %sum.02.unr, %header.epil.preheader ]
+; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
+; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit2, label %for.exiting_block.epil
+; EPILOG:       for.exiting_block.epil:
+; EPILOG-NEXT:    %cmp.epil = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp.epil, label %for.exit2.loopexit2, label %latch.epil
+; EPILOG:       latch.epil:
+; EPILOG-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
+; EPILOG-NEXT:    %load.epil = load i32, i32* %arrayidx.epil, align 4
+; EPILOG-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.epil
+; EPILOG-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
+; EPILOG-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
+; 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 %header.epil, label %latch_exit.epilog-lcssa, !llvm.loop !5
+; EPILOG:       latch_exit.epilog-lcssa:
+; EPILOG-NEXT:    %sum.0.lcssa.ph1 = phi i32 [ %add.epil, %latch.epil ]
+; EPILOG-NEXT:    br label %latch_exit
+; EPILOG:       latch_exit:
+; EPILOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %sum.0.lcssa.ph1, %latch_exit.epilog-lcssa ]
+; EPILOG-NEXT:    ret i32 %sum.0.lcssa
+; EPILOG:       for.exit2.loopexit:
+; 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 ]
+; EPILOG-NEXT:    br label %for.exit2
+; EPILOG:       for.exit2.loopexit2:
+; EPILOG-NEXT:    %retval.ph3 = phi i32 [ 42, %for.exiting_block.epil ], [ %sum.02.epil, %header.epil ]
+; EPILOG-NEXT:    br label %for.exit2
+; EPILOG:       for.exit2:
+; EPILOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph3, %for.exit2.loopexit2 ]
+; EPILOG-NEXT:    %addx = add i32 %retval, %x
+; EPILOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false
+; EPILOG:       exit_true:
+; EPILOG-NEXT:    ret i32 %retval
+; EPILOG:       exit_false:
+; EPILOG-NEXT:    ret i32 %addx
+; EPILOG:       for.exiting_block.1:
+; EPILOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
+; EPILOG:       latch.1:
+; EPILOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
+; EPILOG-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
+; EPILOG-NEXT:    %add.1 = add nsw i32 %load.1, %add
+; EPILOG-NEXT:    %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv.next, 1
+; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
+; EPILOG:       for.exiting_block.2:
+; EPILOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
+; EPILOG:       latch.2:
+; EPILOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
+; EPILOG-NEXT:    %load.2 = load i32, i32* %arrayidx.2, align 4
+; EPILOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.1
+; EPILOG-NEXT:    %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv.next.1, 1
+; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
+; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
+; EPILOG:       for.exiting_block.3:
+; EPILOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
+; EPILOG:       latch.3:
+; EPILOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
+; EPILOG-NEXT:    %load.3 = load i32, i32* %arrayidx.3, align 4
+; EPILOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.2
+; EPILOG-NEXT:    %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv.next.2, 1
+; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
+; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
+; EPILOG:       for.exiting_block.4:
+; EPILOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
+; EPILOG:       latch.4:
+; EPILOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
+; EPILOG-NEXT:    %load.4 = load i32, i32* %arrayidx.4, align 4
+; EPILOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.3
+; EPILOG-NEXT:    %indvars.iv.next.4 = add nuw nsw i64 %indvars.iv.next.3, 1
+; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
+; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
+; EPILOG:       for.exiting_block.5:
+; EPILOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
+; EPILOG:       latch.5:
+; EPILOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
+; EPILOG-NEXT:    %load.5 = load i32, i32* %arrayidx.5, align 4
+; EPILOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.4
+; EPILOG-NEXT:    %indvars.iv.next.5 = add nuw nsw i64 %indvars.iv.next.4, 1
+; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
+; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
+; EPILOG:       for.exiting_block.6:
+; EPILOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
+; EPILOG:       latch.6:
+; EPILOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
+; EPILOG-NEXT:    %load.6 = load i32, i32* %arrayidx.6, align 4
+; EPILOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.5
+; EPILOG-NEXT:    %indvars.iv.next.6 = add nuw nsw i64 %indvars.iv.next.5, 1
+; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
+; EPILOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
+; EPILOG:       for.exiting_block.7:
+; EPILOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
+; EPILOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
+; EPILOG:       latch.7:
+; EPILOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
+; EPILOG-NEXT:    %load.7 = load i32, i32* %arrayidx.7, align 4
+; EPILOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.6
+; EPILOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
+; EPILOG-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
+; EPILOG-NEXT:    %niter.ncmp.7 = icmp eq i64 %niter.nsub.7, 0
+; EPILOG-NEXT:    br i1 %niter.ncmp.7, label %latch_exit.unr-lcssa.loopexit, label %header
+;
+; EPILOG-BLOCK-LABEL: @test6(
+; EPILOG-BLOCK-NEXT:  entry:
+; EPILOG-BLOCK-NEXT:    %0 = add i64 %n, -1
+; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
+; EPILOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
+; EPILOG-BLOCK-NEXT:    br i1 %1, label %latch_exit.unr-lcssa, label %entry.new
+; EPILOG-BLOCK:       entry.new:
+; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %n, %xtraiter
+; EPILOG-BLOCK-NEXT:    br label %header
+; EPILOG-BLOCK:       header:
+; EPILOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    %sum.02 = phi i32 [ 0, %entry.new ], [ %add.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %entry.new ], [ %niter.nsub.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
+; EPILOG-BLOCK:       for.exiting_block:
+; EPILOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
+; EPILOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
+; EPILOG-BLOCK:       latch:
+; EPILOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; EPILOG-BLOCK-NEXT:    %load = load i32, i32* %arrayidx, align 4
+; EPILOG-BLOCK-NEXT:    %add = add nsw i32 %load, %sum.02
+; EPILOG-BLOCK-NEXT:    %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
+; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
+; EPILOG-BLOCK:       latch_exit.unr-lcssa.loopexit:
+; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph.ph = phi i32 [ %add.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    %sum.02.unr.ph = phi i32 [ %add.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    br label %latch_exit.unr-lcssa
+; EPILOG-BLOCK:       latch_exit.unr-lcssa:
+; EPILOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ undef, %entry ], [ %sum.0.lcssa.ph.ph, %latch_exit.unr-lcssa.loopexit ]
+; EPILOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %latch_exit.unr-lcssa.loopexit ]
+; EPILOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %latch_exit.unr-lcssa.loopexit ]
+; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latch_exit
+; EPILOG-BLOCK:       header.epil.preheader:
+; EPILOG-BLOCK-NEXT:    br label %header.epil
+; EPILOG-BLOCK:       header.epil:
+; EPILOG-BLOCK-NEXT:    %indvars.iv.epil = phi i64 [ %indvars.iv.unr, %header.epil.preheader ]
+; EPILOG-BLOCK-NEXT:    %sum.02.epil = phi i32 [ %sum.02.unr, %header.epil.preheader ]
+; EPILOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.epil
+; EPILOG-BLOCK:       for.exiting_block.epil:
+; EPILOG-BLOCK-NEXT:    %cmp.epil = icmp eq i64 %n, 42
+; EPILOG-BLOCK-NEXT:    br i1 %cmp.epil, label %for.exit2, label %latch.epil
+; EPILOG-BLOCK:       latch.epil:
+; EPILOG-BLOCK-NEXT:    %arrayidx.epil = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.epil
+; EPILOG-BLOCK-NEXT:    %load.epil = load i32, i32* %arrayidx.epil, align 4
+; EPILOG-BLOCK-NEXT:    %add.epil = add nsw i32 %load.epil, %sum.02.epil
+; EPILOG-BLOCK-NEXT:    %indvars.iv.next.epil = add i64 %indvars.iv.epil, 1
+; EPILOG-BLOCK-NEXT:    %exitcond.epil = icmp eq i64 %indvars.iv.next.epil, %n
+; EPILOG-BLOCK-NEXT:    br label %latch_exit.epilog-lcssa
+; EPILOG-BLOCK:       latch_exit.epilog-lcssa:
+; EPILOG-BLOCK-NEXT:    br label %latch_exit
+; EPILOG-BLOCK:       latch_exit:
+; EPILOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ], [ %add.epil, %latch_exit.epilog-lcssa ]
+; EPILOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
+; EPILOG-BLOCK:       for.exit2.loopexit:
+; EPILOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]
+; EPILOG-BLOCK-NEXT:    br label %for.exit2
+; EPILOG-BLOCK:       for.exit2:
+; EPILOG-BLOCK-NEXT:    %retval = phi i32 [ %sum.02.epil, %header.epil ], [ 42, %for.exiting_block.epil ], [ %retval.ph, %for.exit2.loopexit ]
+; EPILOG-BLOCK-NEXT:    %addx = add i32 %retval, %x
+; EPILOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false
+; EPILOG-BLOCK:       exit_true:
+; EPILOG-BLOCK-NEXT:    ret i32 %retval
+; EPILOG-BLOCK:       exit_false:
+; EPILOG-BLOCK-NEXT:    ret i32 %addx
+; EPILOG-BLOCK:       for.exiting_block.1:
+; EPILOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
+; EPILOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
+; EPILOG-BLOCK:       latch.1:
+; EPILOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
+; EPILOG-BLOCK-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
+; EPILOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add
+; EPILOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
+; EPILOG-BLOCK-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-BLOCK-NEXT:    %niter.ncmp.1 = icmp eq i64 %niter.nsub.1, 0
+; EPILOG-BLOCK-NEXT:    br i1 %niter.ncmp.1, label %latch_exit.unr-lcssa.loopexit, label %header, !llvm.loop !9
+;
+; PROLOG-LABEL: @test6(
+; PROLOG-NEXT:  entry:
+; PROLOG-NEXT:    %0 = add i64 %n, -1
+; PROLOG-NEXT:    %xtraiter = and i64 %n, 7
+; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
+; PROLOG:       header.prol.preheader:
+; PROLOG-NEXT:    br label %header.prol
+; PROLOG:       header.prol:
+; PROLOG-NEXT:    %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %latch.prol ], [ 0, %header.prol.preheader ]
+; PROLOG-NEXT:    %sum.02.prol = phi i32 [ %add.prol, %latch.prol ], [ 0, %header.prol.preheader ]
+; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ]
+; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit1, label %for.exiting_block.prol
+; PROLOG:       for.exiting_block.prol:
+; PROLOG-NEXT:    %cmp.prol = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp.prol, label %for.exit2.loopexit1, label %latch.prol
+; PROLOG:       latch.prol:
+; PROLOG-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.prol
+; PROLOG-NEXT:    %load.prol = load i32, i32* %arrayidx.prol, align 4
+; PROLOG-NEXT:    %add.prol = add nsw i32 %load.prol, %sum.02.prol
+; PROLOG-NEXT:    %indvars.iv.next.prol = add i64 %indvars.iv.prol, 1
+; PROLOG-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
+; 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 %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !5
+; PROLOG:       header.prol.loopexit.unr-lcssa:
+; PROLOG-NEXT:    %sum.0.lcssa.unr.ph = phi i32 [ %add.prol, %latch.prol ]
+; PROLOG-NEXT:    %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
+; PROLOG-NEXT:    %sum.02.unr.ph = phi i32 [ %add.prol, %latch.prol ]
+; PROLOG-NEXT:    br label %header.prol.loopexit
+; PROLOG:       header.prol.loopexit:
+; PROLOG-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %sum.0.lcssa.unr.ph, %header.prol.loopexit.unr-lcssa ]
+; PROLOG-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
+; PROLOG-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %sum.02.unr.ph, %header.prol.loopexit.unr-lcssa ]
+; PROLOG-NEXT:    %1 = icmp ult i64 %0, 7
+; PROLOG-NEXT:    br i1 %1, label %latch_exit, label %entry.new
+; PROLOG:       entry.new:
+; PROLOG-NEXT:    br label %header
+; PROLOG:       header:
+; PROLOG-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.7, %latch.7 ]
+; PROLOG-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.7, %latch.7 ]
+; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
+; PROLOG:       for.exiting_block:
+; PROLOG-NEXT:    %cmp = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
+; PROLOG:       latch:
+; PROLOG-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; PROLOG-NEXT:    %load = load i32, i32* %arrayidx, align 4
+; PROLOG-NEXT:    %add = add nsw i32 %load, %sum.02
+; PROLOG-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
+; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
+; PROLOG:       latch_exit.unr-lcssa:
+; PROLOG-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.7, %latch.7 ]
+; PROLOG-NEXT:    br label %latch_exit
+; PROLOG:       latch_exit:
+; PROLOG-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]
+; PROLOG-NEXT:    ret i32 %sum.0.lcssa
+; PROLOG:       for.exit2.loopexit:
+; 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 ]
+; PROLOG-NEXT:    br label %for.exit2
+; PROLOG:       for.exit2.loopexit1:
+; PROLOG-NEXT:    %retval.ph2 = phi i32 [ 42, %for.exiting_block.prol ], [ %sum.02.prol, %header.prol ]
+; PROLOG-NEXT:    br label %for.exit2
+; PROLOG:       for.exit2:
+; PROLOG-NEXT:    %retval = phi i32 [ %retval.ph, %for.exit2.loopexit ], [ %retval.ph2, %for.exit2.loopexit1 ]
+; PROLOG-NEXT:    %addx = add i32 %retval, %x
+; PROLOG-NEXT:    br i1 %cond, label %exit_true, label %exit_false
+; PROLOG:       exit_true:
+; PROLOG-NEXT:    ret i32 %retval
+; PROLOG:       exit_false:
+; PROLOG-NEXT:    ret i32 %addx
+; PROLOG:       for.exiting_block.1:
+; PROLOG-NEXT:    %cmp.1 = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
+; PROLOG:       latch.1:
+; PROLOG-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
+; PROLOG-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
+; PROLOG-NEXT:    %add.1 = add nsw i32 %load.1, %add
+; PROLOG-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
+; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.2
+; PROLOG:       for.exiting_block.2:
+; PROLOG-NEXT:    %cmp.2 = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp.2, label %for.exit2.loopexit, label %latch.2
+; PROLOG:       latch.2:
+; PROLOG-NEXT:    %arrayidx.2 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.1
+; PROLOG-NEXT:    %load.2 = load i32, i32* %arrayidx.2, align 4
+; PROLOG-NEXT:    %add.2 = add nsw i32 %load.2, %add.1
+; PROLOG-NEXT:    %indvars.iv.next.2 = add i64 %indvars.iv.next.1, 1
+; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.3
+; PROLOG:       for.exiting_block.3:
+; PROLOG-NEXT:    %cmp.3 = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp.3, label %for.exit2.loopexit, label %latch.3
+; PROLOG:       latch.3:
+; PROLOG-NEXT:    %arrayidx.3 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.2
+; PROLOG-NEXT:    %load.3 = load i32, i32* %arrayidx.3, align 4
+; PROLOG-NEXT:    %add.3 = add nsw i32 %load.3, %add.2
+; PROLOG-NEXT:    %indvars.iv.next.3 = add i64 %indvars.iv.next.2, 1
+; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.4
+; PROLOG:       for.exiting_block.4:
+; PROLOG-NEXT:    %cmp.4 = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp.4, label %for.exit2.loopexit, label %latch.4
+; PROLOG:       latch.4:
+; PROLOG-NEXT:    %arrayidx.4 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.3
+; PROLOG-NEXT:    %load.4 = load i32, i32* %arrayidx.4, align 4
+; PROLOG-NEXT:    %add.4 = add nsw i32 %load.4, %add.3
+; PROLOG-NEXT:    %indvars.iv.next.4 = add i64 %indvars.iv.next.3, 1
+; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.5
+; PROLOG:       for.exiting_block.5:
+; PROLOG-NEXT:    %cmp.5 = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp.5, label %for.exit2.loopexit, label %latch.5
+; PROLOG:       latch.5:
+; PROLOG-NEXT:    %arrayidx.5 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.4
+; PROLOG-NEXT:    %load.5 = load i32, i32* %arrayidx.5, align 4
+; PROLOG-NEXT:    %add.5 = add nsw i32 %load.5, %add.4
+; PROLOG-NEXT:    %indvars.iv.next.5 = add i64 %indvars.iv.next.4, 1
+; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.6
+; PROLOG:       for.exiting_block.6:
+; PROLOG-NEXT:    %cmp.6 = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp.6, label %for.exit2.loopexit, label %latch.6
+; PROLOG:       latch.6:
+; PROLOG-NEXT:    %arrayidx.6 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.5
+; PROLOG-NEXT:    %load.6 = load i32, i32* %arrayidx.6, align 4
+; PROLOG-NEXT:    %add.6 = add nsw i32 %load.6, %add.5
+; PROLOG-NEXT:    %indvars.iv.next.6 = add i64 %indvars.iv.next.5, 1
+; PROLOG-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.7
+; PROLOG:       for.exiting_block.7:
+; PROLOG-NEXT:    %cmp.7 = icmp eq i64 %n, 42
+; PROLOG-NEXT:    br i1 %cmp.7, label %for.exit2.loopexit, label %latch.7
+; PROLOG:       latch.7:
+; PROLOG-NEXT:    %arrayidx.7 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next.6
+; PROLOG-NEXT:    %load.7 = load i32, i32* %arrayidx.7, align 4
+; PROLOG-NEXT:    %add.7 = add nsw i32 %load.7, %add.6
+; PROLOG-NEXT:    %indvars.iv.next.7 = add i64 %indvars.iv.next.6, 1
+; PROLOG-NEXT:    %exitcond.7 = icmp eq i64 %indvars.iv.next.7, %n
+; PROLOG-NEXT:    br i1 %exitcond.7, label %latch_exit.unr-lcssa, label %header
+;
+; PROLOG-BLOCK-LABEL: @test6(
+; PROLOG-BLOCK-NEXT:  entry:
+; PROLOG-BLOCK-NEXT:    %0 = add i64 %n, -1
+; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %n, 1
+; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
+; PROLOG-BLOCK:       header.prol.preheader:
+; PROLOG-BLOCK-NEXT:    br label %header.prol
+; PROLOG-BLOCK:       header.prol:
+; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2, label %for.exiting_block.prol
+; PROLOG-BLOCK:       for.exiting_block.prol:
+; PROLOG-BLOCK-NEXT:    %cmp.prol = icmp eq i64 %n, 42
+; PROLOG-BLOCK-NEXT:    br i1 %cmp.prol, label %for.exit2, label %latch.prol
+; PROLOG-BLOCK:       latch.prol:
+; PROLOG-BLOCK-NEXT:    %arrayidx.prol = getelementptr inbounds i32, i32* %a, i64 0
+; PROLOG-BLOCK-NEXT:    %load.prol = load i32, i32* %arrayidx.prol, align 4
+; PROLOG-BLOCK-NEXT:    %add.prol = add nsw i32 %load.prol, 0
+; PROLOG-BLOCK-NEXT:    %indvars.iv.next.prol = add i64 0, 1
+; PROLOG-BLOCK-NEXT:    %exitcond.prol = icmp eq i64 %indvars.iv.next.prol, %n
+; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
+; PROLOG-BLOCK:       header.prol.loopexit:
+; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %add.prol, %latch.prol ]
+; PROLOG-BLOCK-NEXT:    %indvars.iv.unr = phi i64 [ 0, %entry ], [ %indvars.iv.next.prol, %latch.prol ]
+; PROLOG-BLOCK-NEXT:    %sum.02.unr = phi i32 [ 0, %entry ], [ %add.prol, %latch.prol ]
+; PROLOG-BLOCK-NEXT:    %1 = icmp ult i64 %0, 1
+; PROLOG-BLOCK-NEXT:    br i1 %1, label %latch_exit, label %entry.new
+; PROLOG-BLOCK:       entry.new:
+; PROLOG-BLOCK-NEXT:    br label %header
+; PROLOG-BLOCK:       header:
+; PROLOG-BLOCK-NEXT:    %indvars.iv = phi i64 [ %indvars.iv.unr, %entry.new ], [ %indvars.iv.next.1, %latch.1 ]
+; PROLOG-BLOCK-NEXT:    %sum.02 = phi i32 [ %sum.02.unr, %entry.new ], [ %add.1, %latch.1 ]
+; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block
+; PROLOG-BLOCK:       for.exiting_block:
+; PROLOG-BLOCK-NEXT:    %cmp = icmp eq i64 %n, 42
+; PROLOG-BLOCK-NEXT:    br i1 %cmp, label %for.exit2.loopexit, label %latch
+; PROLOG-BLOCK:       latch:
+; PROLOG-BLOCK-NEXT:    %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
+; PROLOG-BLOCK-NEXT:    %load = load i32, i32* %arrayidx, align 4
+; PROLOG-BLOCK-NEXT:    %add = add nsw i32 %load, %sum.02
+; PROLOG-BLOCK-NEXT:    %indvars.iv.next = add i64 %indvars.iv, 1
+; PROLOG-BLOCK-NEXT:    br i1 false, label %for.exit2.loopexit, label %for.exiting_block.1
+; PROLOG-BLOCK:       latch_exit.unr-lcssa:
+; PROLOG-BLOCK-NEXT:    %sum.0.lcssa.ph = phi i32 [ %add.1, %latch.1 ]
+; PROLOG-BLOCK-NEXT:    br label %latch_exit
+; PROLOG-BLOCK:       latch_exit:
+; PROLOG-BLOCK-NEXT:    %sum.0.lcssa = phi i32 [ %sum.0.lcssa.unr, %header.prol.loopexit ], [ %sum.0.lcssa.ph, %latch_exit.unr-lcssa ]
+; PROLOG-BLOCK-NEXT:    ret i32 %sum.0.lcssa
+; PROLOG-BLOCK:       for.exit2.loopexit:
+; PROLOG-BLOCK-NEXT:    %retval.ph = phi i32 [ 42, %for.exiting_block ], [ %sum.02, %header ], [ %add, %latch ], [ 42, %for.exiting_block.1 ]
+; PROLOG-BLOCK-NEXT:    br label %for.exit2
+; PROLOG-BLOCK:       for.exit2:
+; PROLOG-BLOCK-NEXT:    %retval = phi i32 [ 0, %header.prol ], [ 42, %for.exiting_block.prol ], [ %retval.ph, %for.exit2.loopexit ]
+; PROLOG-BLOCK-NEXT:    %addx = add i32 %retval, %x
+; PROLOG-BLOCK-NEXT:    br i1 %cond, label %exit_true, label %exit_false
+; PROLOG-BLOCK:       exit_true:
+; PROLOG-BLOCK-NEXT:    ret i32 %retval
+; PROLOG-BLOCK:       exit_false:
+; PROLOG-BLOCK-NEXT:    ret i32 %addx
+; PROLOG-BLOCK:       for.exiting_block.1:
+; PROLOG-BLOCK-NEXT:    %cmp.1 = icmp eq i64 %n, 42
+; PROLOG-BLOCK-NEXT:    br i1 %cmp.1, label %for.exit2.loopexit, label %latch.1
+; PROLOG-BLOCK:       latch.1:
+; PROLOG-BLOCK-NEXT:    %arrayidx.1 = getelementptr inbounds i32, i32* %a, i64 %indvars.iv.next
+; PROLOG-BLOCK-NEXT:    %load.1 = load i32, i32* %arrayidx.1, align 4
+; PROLOG-BLOCK-NEXT:    %add.1 = add nsw i32 %load.1, %add
+; PROLOG-BLOCK-NEXT:    %indvars.iv.next.1 = add i64 %indvars.iv.next, 1
+; PROLOG-BLOCK-NEXT:    %exitcond.1 = icmp eq i64 %indvars.iv.next.1, %n
+; PROLOG-BLOCK-NEXT:    br i1 %exitcond.1, label %latch_exit.unr-lcssa, label %header, !llvm.loop !9
+;
+
 entry:
   br label %header
 
@@ -492,8 +3611,8 @@ header:
   br i1 false, label %for.exit2, label %for.exiting_block
 
 for.exiting_block:
- %cmp = icmp eq i64 %n, 42
- br i1 %cmp, label %for.exit2, label %latch
+  %cmp = icmp eq i64 %n, 42
+  br i1 %cmp, label %for.exit2, label %latch
 
 latch:
   %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
@@ -521,15 +3640,363 @@ exit_false:
 
 ; test when value in exit block does not have VMap.
 define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) {
-; EPILOG-NO-IC: test7(
-; EPILOG-NO-IC: loopexit1.loopexit:
-; EPILOG-NO-IC-NEXT:  %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ], [ %shft, %latch.1 ], [ %shft, %latch.2 ], [ %shft, %latch.3 ], [ %shft, %latch.4 ], [ %shft, %latch.5 ], [ %shft, %latch.6 ]
-; EPILOG-NO-IC-NEXT:  br label %loopexit1
-; EPILOG-NO-IC: loopexit1.loopexit1:
-; EPILOG-NO-IC-NEXT:  %sext3.ph2 = phi i32 [ %shft, %header.epil ]
-; EPILOG-NO-IC-NEXT:  br label %loopexit1
-; EPILOG-NO-IC: loopexit1:
-; EPILOG-NO-IC-NEXT:   %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
+; EPILOG-NO-IC-LABEL: @test7(
+; EPILOG-NO-IC-NEXT:  bb:
+; EPILOG-NO-IC-NEXT:    %i = icmp slt i32 undef, 2
+; EPILOG-NO-IC-NEXT:    %sext = sext i32 undef to i64
+; EPILOG-NO-IC-NEXT:    %shft = ashr exact i32 %arg, 16
+; EPILOG-NO-IC-NEXT:    br i1 %i, label %loopexit2, label %preheader
+; EPILOG-NO-IC:       preheader:
+; EPILOG-NO-IC-NEXT:    %0 = add nsw i64 %sext, -1
+; EPILOG-NO-IC-NEXT:    %1 = add nsw i64 %sext, -2
+; EPILOG-NO-IC-NEXT:    %xtraiter = and i64 %0, 7
+; EPILOG-NO-IC-NEXT:    %2 = icmp ult i64 %1, 7
+; EPILOG-NO-IC-NEXT:    br i1 %2, label %latchexit.unr-lcssa, label %preheader.new
+; EPILOG-NO-IC:       preheader.new:
+; EPILOG-NO-IC-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
+; EPILOG-NO-IC-NEXT:    br label %header
+; EPILOG-NO-IC:       header:
+; EPILOG-NO-IC-NEXT:    %i6 = phi i64 [ 1, %preheader.new ], [ %add.7, %latch.7 ]
+; EPILOG-NO-IC-NEXT:    %niter = phi i64 [ %unroll_iter, %preheader.new ], [ %niter.nsub.7, %latch.7 ]
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
+; EPILOG-NO-IC:       latch:
+; EPILOG-NO-IC-NEXT:    %add = add nuw nsw i64 %i6, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub = sub i64 %niter, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
+; EPILOG-NO-IC:       latchexit.unr-lcssa.loopexit:
+; EPILOG-NO-IC-NEXT:    %i6.unr.ph = phi i64 [ %add.7, %latch.7 ]
+; EPILOG-NO-IC-NEXT:    br label %latchexit.unr-lcssa
+; EPILOG-NO-IC:       latchexit.unr-lcssa:
+; EPILOG-NO-IC-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ]
+; EPILOG-NO-IC-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-NO-IC-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit
+; EPILOG-NO-IC:       header.epil.preheader:
+; EPILOG-NO-IC-NEXT:    br label %header.epil
+; EPILOG-NO-IC:       header.epil:
+; EPILOG-NO-IC-NEXT:    %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ], [ %add.epil, %latch.epil ]
+; EPILOG-NO-IC-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loopexit1.loopexit1, label %latch.epil
+; EPILOG-NO-IC:       latch.epil:
+; EPILOG-NO-IC-NEXT:    %add.epil = add nuw nsw i64 %i6.epil, 1
+; EPILOG-NO-IC-NEXT:    %i9.epil = icmp slt i64 %add.epil, %sext
+; EPILOG-NO-IC-NEXT:    %epil.iter.sub = sub i64 %epil.iter, 1
+; EPILOG-NO-IC-NEXT:    %epil.iter.cmp = icmp ne i64 %epil.iter.sub, 0
+; EPILOG-NO-IC-NEXT:    br i1 %epil.iter.cmp, label %header.epil, label %latchexit.epilog-lcssa, !llvm.loop !6
+; EPILOG-NO-IC:       latchexit.epilog-lcssa:
+; EPILOG-NO-IC-NEXT:    br label %latchexit
+; EPILOG-NO-IC:       latchexit:
+; EPILOG-NO-IC-NEXT:    unreachable
+; EPILOG-NO-IC:       loopexit2:
+; EPILOG-NO-IC-NEXT:    ret i32 %shft
+; EPILOG-NO-IC:       loopexit1.loopexit:
+; EPILOG-NO-IC-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ], [ %shft, %latch.1 ], [ %shft, %latch.2 ], [ %shft, %latch.3 ], [ %shft, %latch.4 ], [ %shft, %latch.5 ], [ %shft, %latch.6 ]
+; EPILOG-NO-IC-NEXT:    br label %loopexit1
+; EPILOG-NO-IC:       loopexit1.loopexit1:
+; EPILOG-NO-IC-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.epil ]
+; EPILOG-NO-IC-NEXT:    br label %loopexit1
+; EPILOG-NO-IC:       loopexit1:
+; EPILOG-NO-IC-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
+; EPILOG-NO-IC-NEXT:    ret i32 %sext3
+; EPILOG-NO-IC:       latch.1:
+; EPILOG-NO-IC-NEXT:    %add.1 = add nuw nsw i64 %add, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.2
+; EPILOG-NO-IC:       latch.2:
+; EPILOG-NO-IC-NEXT:    %add.2 = add nuw nsw i64 %add.1, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.3
+; EPILOG-NO-IC:       latch.3:
+; EPILOG-NO-IC-NEXT:    %add.3 = add nuw nsw i64 %add.2, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.4
+; EPILOG-NO-IC:       latch.4:
+; EPILOG-NO-IC-NEXT:    %add.4 = add nuw nsw i64 %add.3, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.5
+; EPILOG-NO-IC:       latch.5:
+; EPILOG-NO-IC-NEXT:    %add.5 = add nuw nsw i64 %add.4, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.6
+; EPILOG-NO-IC:       latch.6:
+; EPILOG-NO-IC-NEXT:    %add.6 = add nuw nsw i64 %add.5, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.7
+; EPILOG-NO-IC:       latch.7:
+; EPILOG-NO-IC-NEXT:    %add.7 = add nuw nsw i64 %add.6, 1
+; EPILOG-NO-IC-NEXT:    %niter.nsub.7 = sub i64 %niter.nsub.6, 1
+; EPILOG-NO-IC-NEXT:    %niter.ncmp.7 = icmp ne i64 %niter.nsub.7, 0
+; EPILOG-NO-IC-NEXT:    br i1 %niter.ncmp.7, label %header, label %latchexit.unr-lcssa.loopexit
+;
+; EPILOG-LABEL: @test7(
+; EPILOG-NEXT:  bb:
+; EPILOG-NEXT:    %i = icmp slt i32 undef, 2
+; EPILOG-NEXT:    %sext = sext i32 undef to i64
+; EPILOG-NEXT:    %shft = ashr exact i32 %arg, 16
+; EPILOG-NEXT:    br i1 %i, label %loopexit2, label %preheader
+; EPILOG:       preheader:
+; EPILOG-NEXT:    %0 = add nsw i64 %sext, -1
+; EPILOG-NEXT:    %1 = add nsw i64 %sext, -2
+; EPILOG-NEXT:    %xtraiter = and i64 %0, 7
+; EPILOG-NEXT:    %2 = icmp ult i64 %1, 7
+; EPILOG-NEXT:    br i1 %2, label %latchexit.unr-lcssa, label %preheader.new
+; EPILOG:       preheader.new:
+; EPILOG-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
+; EPILOG-NEXT:    br label %header
+; EPILOG:       header:
+; EPILOG-NEXT:    %i6 = phi i64 [ 1, %preheader.new ], [ %add.7, %latch.7 ]
+; EPILOG-NEXT:    %niter = phi i64 [ %unroll_iter, %preheader.new ], [ %niter.nsub.7, %latch.7 ]
+; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
+; EPILOG:       latch:
+; EPILOG-NEXT:    %add = add nuw nsw i64 %i6, 1
+; EPILOG-NEXT:    %niter.nsub = sub i64 %niter, 1
+; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
+; EPILOG:       latchexit.unr-lcssa.loopexit:
+; EPILOG-NEXT:    %i6.unr.ph = phi i64 [ %add.7, %latch.7 ]
+; EPILOG-NEXT:    br label %latchexit.unr-lcssa
+; EPILOG:       latchexit.unr-lcssa:
+; EPILOG-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ]
+; EPILOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit
+; EPILOG:       header.epil.preheader:
+; EPILOG-NEXT:    br label %header.epil
+; EPILOG:       header.epil:
+; EPILOG-NEXT:    %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ], [ %add.epil, %latch.epil ]
+; EPILOG-NEXT:    %epil.iter = phi i64 [ %xtraiter, %header.epil.preheader ], [ %epil.iter.sub, %latch.epil ]
+; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit1, label %latch.epil
+; EPILOG:       latch.epil:
+; EPILOG-NEXT:    %add.epil = add nuw nsw i64 %i6.epil, 1
+; EPILOG-NEXT:    %i9.epil = icmp slt i64 %add.epil, %sext
+; 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 %header.epil, label %latchexit.epilog-lcssa, !llvm.loop !6
+; EPILOG:       latchexit.epilog-lcssa:
+; EPILOG-NEXT:    br label %latchexit
+; EPILOG:       latchexit:
+; EPILOG-NEXT:    unreachable
+; EPILOG:       loopexit2:
+; EPILOG-NEXT:    ret i32 %shft
+; EPILOG:       loopexit1.loopexit:
+; 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 ]
+; EPILOG-NEXT:    br label %loopexit1
+; EPILOG:       loopexit1.loopexit1:
+; EPILOG-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.epil ]
+; EPILOG-NEXT:    br label %loopexit1
+; EPILOG:       loopexit1:
+; EPILOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
+; EPILOG-NEXT:    ret i32 %sext3
+; EPILOG:       latch.1:
+; EPILOG-NEXT:    %add.1 = add nuw nsw i64 %add, 1
+; EPILOG-NEXT:    %niter.nsub.1 = sub i64 %niter.nsub, 1
+; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.2
+; EPILOG:       latch.2:
+; EPILOG-NEXT:    %add.2 = add nuw nsw i64 %add.1, 1
+; EPILOG-NEXT:    %niter.nsub.2 = sub i64 %niter.nsub.1, 1
+; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.3
+; EPILOG:       latch.3:
+; EPILOG-NEXT:    %add.3 = add nuw nsw i64 %add.2, 1
+; EPILOG-NEXT:    %niter.nsub.3 = sub i64 %niter.nsub.2, 1
+; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.4
+; EPILOG:       latch.4:
+; EPILOG-NEXT:    %add.4 = add nuw nsw i64 %add.3, 1
+; EPILOG-NEXT:    %niter.nsub.4 = sub i64 %niter.nsub.3, 1
+; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.5
+; EPILOG:       latch.5:
+; EPILOG-NEXT:    %add.5 = add nuw nsw i64 %add.4, 1
+; EPILOG-NEXT:    %niter.nsub.5 = sub i64 %niter.nsub.4, 1
+; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.6
+; EPILOG:       latch.6:
+; EPILOG-NEXT:    %add.6 = add nuw nsw i64 %add.5, 1
+; EPILOG-NEXT:    %niter.nsub.6 = sub i64 %niter.nsub.5, 1
+; EPILOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.7
+; EPILOG:       latch.7:
+; EPILOG-NEXT:    %add.7 = add nuw nsw i64 %add.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 %header, label %latchexit.unr-lcssa.loopexit
+;
+; EPILOG-BLOCK-LABEL: @test7(
+; EPILOG-BLOCK-NEXT:  bb:
+; EPILOG-BLOCK-NEXT:    %i = icmp slt i32 undef, 2
+; EPILOG-BLOCK-NEXT:    %sext = sext i32 undef to i64
+; EPILOG-BLOCK-NEXT:    %shft = ashr exact i32 %arg, 16
+; EPILOG-BLOCK-NEXT:    br i1 %i, label %loopexit2, label %preheader
+; EPILOG-BLOCK:       preheader:
+; EPILOG-BLOCK-NEXT:    %0 = add nsw i64 %sext, -1
+; EPILOG-BLOCK-NEXT:    %1 = add nsw i64 %sext, -2
+; EPILOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
+; EPILOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
+; EPILOG-BLOCK-NEXT:    br i1 %2, label %latchexit.unr-lcssa, label %preheader.new
+; EPILOG-BLOCK:       preheader.new:
+; EPILOG-BLOCK-NEXT:    %unroll_iter = sub i64 %0, %xtraiter
+; EPILOG-BLOCK-NEXT:    br label %header
+; EPILOG-BLOCK:       header:
+; EPILOG-BLOCK-NEXT:    %i6 = phi i64 [ 1, %preheader.new ], [ %add.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    %niter = phi i64 [ %unroll_iter, %preheader.new ], [ %niter.nsub.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
+; EPILOG-BLOCK:       latch:
+; EPILOG-BLOCK-NEXT:    %add = add nuw nsw i64 %i6, 1
+; EPILOG-BLOCK-NEXT:    %niter.nsub = sub i64 %niter, 1
+; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
+; EPILOG-BLOCK:       latchexit.unr-lcssa.loopexit:
+; EPILOG-BLOCK-NEXT:    %i6.unr.ph = phi i64 [ %add.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    br label %latchexit.unr-lcssa
+; EPILOG-BLOCK:       latchexit.unr-lcssa:
+; EPILOG-BLOCK-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %latchexit.unr-lcssa.loopexit ]
+; EPILOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; EPILOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.epil.preheader, label %latchexit
+; EPILOG-BLOCK:       header.epil.preheader:
+; EPILOG-BLOCK-NEXT:    br label %header.epil
+; EPILOG-BLOCK:       header.epil:
+; EPILOG-BLOCK-NEXT:    %i6.epil = phi i64 [ %i6.unr, %header.epil.preheader ]
+; EPILOG-BLOCK-NEXT:    br i1 false, label %loopexit1, label %latch.epil
+; EPILOG-BLOCK:       latch.epil:
+; EPILOG-BLOCK-NEXT:    %add.epil = add nuw nsw i64 %i6.epil, 1
+; EPILOG-BLOCK-NEXT:    %i9.epil = icmp slt i64 %add.epil, %sext
+; EPILOG-BLOCK-NEXT:    br label %latchexit.epilog-lcssa
+; EPILOG-BLOCK:       latchexit.epilog-lcssa:
+; EPILOG-BLOCK-NEXT:    br label %latchexit
+; EPILOG-BLOCK:       latchexit:
+; EPILOG-BLOCK-NEXT:    unreachable
+; EPILOG-BLOCK:       loopexit2:
+; EPILOG-BLOCK-NEXT:    ret i32 %shft
+; EPILOG-BLOCK:       loopexit1.loopexit:
+; EPILOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]
+; EPILOG-BLOCK-NEXT:    br label %loopexit1
+; EPILOG-BLOCK:       loopexit1:
+; EPILOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.epil ], [ %sext3.ph, %loopexit1.loopexit ]
+; EPILOG-BLOCK-NEXT:    ret i32 %sext3
+; EPILOG-BLOCK:       latch.1:
+; EPILOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %add, 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 %header, label %latchexit.unr-lcssa.loopexit, !llvm.loop !10
+;
+; PROLOG-LABEL: @test7(
+; PROLOG-NEXT:  bb:
+; PROLOG-NEXT:    %i = icmp slt i32 undef, 2
+; PROLOG-NEXT:    %sext = sext i32 undef to i64
+; PROLOG-NEXT:    %shft = ashr exact i32 %arg, 16
+; PROLOG-NEXT:    br i1 %i, label %loopexit2, label %preheader
+; PROLOG:       preheader:
+; PROLOG-NEXT:    %0 = add nsw i64 %sext, -1
+; PROLOG-NEXT:    %1 = add nsw i64 %sext, -2
+; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
+; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
+; PROLOG:       header.prol.preheader:
+; PROLOG-NEXT:    br label %header.prol
+; PROLOG:       header.prol:
+; PROLOG-NEXT:    %i6.prol = phi i64 [ 1, %header.prol.preheader ], [ %add.prol, %latch.prol ]
+; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ]
+; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit1, label %latch.prol
+; PROLOG:       latch.prol:
+; PROLOG-NEXT:    %add.prol = add nuw nsw i64 %i6.prol, 1
+; PROLOG-NEXT:    %i9.prol = icmp slt i64 %add.prol, %sext
+; 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 %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !6
+; PROLOG:       header.prol.loopexit.unr-lcssa:
+; PROLOG-NEXT:    %i6.unr.ph = phi i64 [ %add.prol, %latch.prol ]
+; PROLOG-NEXT:    br label %header.prol.loopexit
+; PROLOG:       header.prol.loopexit:
+; PROLOG-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %i6.unr.ph, %header.prol.loopexit.unr-lcssa ]
+; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
+; PROLOG-NEXT:    br i1 %2, label %latchexit, label %preheader.new
+; PROLOG:       preheader.new:
+; PROLOG-NEXT:    br label %header
+; PROLOG:       header:
+; PROLOG-NEXT:    %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.7, %latch.7 ]
+; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
+; PROLOG:       latch:
+; PROLOG-NEXT:    %add = add nuw nsw i64 %i6, 1
+; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
+; PROLOG:       latchexit.unr-lcssa:
+; PROLOG-NEXT:    br label %latchexit
+; PROLOG:       latchexit:
+; PROLOG-NEXT:    unreachable
+; PROLOG:       loopexit2:
+; PROLOG-NEXT:    ret i32 %shft
+; PROLOG:       loopexit1.loopexit:
+; 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 ]
+; PROLOG-NEXT:    br label %loopexit1
+; PROLOG:       loopexit1.loopexit1:
+; PROLOG-NEXT:    %sext3.ph2 = phi i32 [ %shft, %header.prol ]
+; PROLOG-NEXT:    br label %loopexit1
+; PROLOG:       loopexit1:
+; PROLOG-NEXT:    %sext3 = phi i32 [ %sext3.ph, %loopexit1.loopexit ], [ %sext3.ph2, %loopexit1.loopexit1 ]
+; PROLOG-NEXT:    ret i32 %sext3
+; PROLOG:       latch.1:
+; PROLOG-NEXT:    %add.1 = add nuw nsw i64 %add, 1
+; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.2
+; PROLOG:       latch.2:
+; PROLOG-NEXT:    %add.2 = add nuw nsw i64 %add.1, 1
+; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.3
+; PROLOG:       latch.3:
+; PROLOG-NEXT:    %add.3 = add nuw nsw i64 %add.2, 1
+; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.4
+; PROLOG:       latch.4:
+; PROLOG-NEXT:    %add.4 = add nuw nsw i64 %add.3, 1
+; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.5
+; PROLOG:       latch.5:
+; PROLOG-NEXT:    %add.5 = add nuw nsw i64 %add.4, 1
+; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.6
+; PROLOG:       latch.6:
+; PROLOG-NEXT:    %add.6 = add nuw nsw i64 %add.5, 1
+; PROLOG-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.7
+; PROLOG:       latch.7:
+; PROLOG-NEXT:    %add.7 = add nuw nsw i64 %add.6, 1
+; PROLOG-NEXT:    %i9.7 = icmp slt i64 %add.7, %sext
+; PROLOG-NEXT:    br i1 %i9.7, label %header, label %latchexit.unr-lcssa
+;
+; PROLOG-BLOCK-LABEL: @test7(
+; PROLOG-BLOCK-NEXT:  bb:
+; PROLOG-BLOCK-NEXT:    %i = icmp slt i32 undef, 2
+; PROLOG-BLOCK-NEXT:    %sext = sext i32 undef to i64
+; PROLOG-BLOCK-NEXT:    %shft = ashr exact i32 %arg, 16
+; PROLOG-BLOCK-NEXT:    br i1 %i, label %loopexit2, label %preheader
+; PROLOG-BLOCK:       preheader:
+; PROLOG-BLOCK-NEXT:    %0 = add nsw i64 %sext, -1
+; PROLOG-BLOCK-NEXT:    %1 = add nsw i64 %sext, -2
+; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
+; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
+; PROLOG-BLOCK:       header.prol.preheader:
+; PROLOG-BLOCK-NEXT:    br label %header.prol
+; PROLOG-BLOCK:       header.prol:
+; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1, label %latch.prol
+; PROLOG-BLOCK:       latch.prol:
+; PROLOG-BLOCK-NEXT:    %add.prol = add nuw nsw i64 1, 1
+; PROLOG-BLOCK-NEXT:    %i9.prol = icmp slt i64 %add.prol, %sext
+; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
+; PROLOG-BLOCK:       header.prol.loopexit:
+; PROLOG-BLOCK-NEXT:    %i6.unr = phi i64 [ 1, %preheader ], [ %add.prol, %latch.prol ]
+; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
+; PROLOG-BLOCK-NEXT:    br i1 %2, label %latchexit, label %preheader.new
+; PROLOG-BLOCK:       preheader.new:
+; PROLOG-BLOCK-NEXT:    br label %header
+; PROLOG-BLOCK:       header:
+; PROLOG-BLOCK-NEXT:    %i6 = phi i64 [ %i6.unr, %preheader.new ], [ %add.1, %latch.1 ]
+; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch
+; PROLOG-BLOCK:       latch:
+; PROLOG-BLOCK-NEXT:    %add = add nuw nsw i64 %i6, 1
+; PROLOG-BLOCK-NEXT:    br i1 false, label %loopexit1.loopexit, label %latch.1
+; PROLOG-BLOCK:       latchexit.unr-lcssa:
+; PROLOG-BLOCK-NEXT:    br label %latchexit
+; PROLOG-BLOCK:       latchexit:
+; PROLOG-BLOCK-NEXT:    unreachable
+; PROLOG-BLOCK:       loopexit2:
+; PROLOG-BLOCK-NEXT:    ret i32 %shft
+; PROLOG-BLOCK:       loopexit1.loopexit:
+; PROLOG-BLOCK-NEXT:    %sext3.ph = phi i32 [ %shft, %header ], [ %shft, %latch ]
+; PROLOG-BLOCK-NEXT:    br label %loopexit1
+; PROLOG-BLOCK:       loopexit1:
+; PROLOG-BLOCK-NEXT:    %sext3 = phi i32 [ %shft, %header.prol ], [ %sext3.ph, %loopexit1.loopexit ]
+; PROLOG-BLOCK-NEXT:    ret i32 %sext3
+; PROLOG-BLOCK:       latch.1:
+; PROLOG-BLOCK-NEXT:    %add.1 = add nuw nsw i64 %add, 1
+; PROLOG-BLOCK-NEXT:    %i9.1 = icmp slt i64 %add.1, %sext
+; PROLOG-BLOCK-NEXT:    br i1 %i9.1, label %header, label %latchexit.unr-lcssa, !llvm.loop !10
+;
 bb:
   %i = icmp slt i32 undef, 2
   %sext = sext i32 undef to i64
@@ -552,7 +4019,7 @@ latchexit:                                             ; preds = %latch
   unreachable
 
 loopexit2:                                             ; preds = %bb2
- ret i32 %shft
+  ret i32 %shft
 
 loopexit1:                                             ; preds = %header
   %sext3 = phi i32 [ %shft, %header ]
@@ -569,20 +4036,235 @@ loopexit1:                                             ; preds = %header
 ; The outer loop header is the preheader for the inner loop and the inner header
 ; branches back to the outer loop.
 define void @test8() {
-; EPILOG: test8(
-; EPILOG-NOT: niter
-
-; PROLOG: test8(
-; PROLOG: outerloop:
-; PROLOG-NEXT: phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]
-; PROLOG:      %lcmp.mod.not = icmp eq i64
-; PROLOG-NEXT: br i1 %lcmp.mod.not, label %innerH.prol.loopexit, label %innerH.prol.preheader
-; PROLOG: latch.6:
-; PROLOG-NEXT: br i1 false, label %outerloop.loopexit.loopexit, label %latch.7
-; PROLOG: latch.7:
-; PROLOG-NEXT: %i4.7 = add nuw nsw i64 %i3, 8
-; PROLOG-NEXT: %i6.7 = icmp ult i64 %i3, 92
-; PROLOG-NEXT: br i1 %i6.7, label %innerH, label %exit.unr-lcssa
+; EPILOG-NO-IC-LABEL: @test8(
+; EPILOG-NO-IC-NEXT:  bb:
+; EPILOG-NO-IC-NEXT:    br label %outerloop
+; EPILOG-NO-IC:       outerloop.loopexit:
+; EPILOG-NO-IC-NEXT:    br label %outerloop
+; EPILOG-NO-IC:       outerloop:
+; EPILOG-NO-IC-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]
+; EPILOG-NO-IC-NEXT:    br label %innerH
+; EPILOG-NO-IC:       innerH:
+; EPILOG-NO-IC-NEXT:    %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ]
+; EPILOG-NO-IC-NEXT:    %i4 = add nuw nsw i64 %i3, 1
+; EPILOG-NO-IC-NEXT:    br i1 false, label %outerloop.loopexit, label %latch
+; EPILOG-NO-IC:       latch:
+; EPILOG-NO-IC-NEXT:    %i6 = icmp ult i64 %i4, 100
+; EPILOG-NO-IC-NEXT:    br i1 %i6, label %innerH, label %exit
+; EPILOG-NO-IC:       exit:
+; EPILOG-NO-IC-NEXT:    ret void
+;
+; EPILOG-LABEL: @test8(
+; EPILOG-NEXT:  bb:
+; EPILOG-NEXT:    br label %outerloop
+; EPILOG:       outerloop.loopexit:
+; EPILOG-NEXT:    br label %outerloop
+; EPILOG:       outerloop:
+; EPILOG-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]
+; EPILOG-NEXT:    br label %innerH
+; EPILOG:       innerH:
+; EPILOG-NEXT:    %i3 = phi i64 [ %i4, %latch ], [ %i, %outerloop ]
+; EPILOG-NEXT:    %i4 = add nuw nsw i64 %i3, 1
+; EPILOG-NEXT:    br i1 false, label %outerloop.loopexit, label %latch
+; EPILOG:       latch:
+; EPILOG-NEXT:    %i6 = icmp ult i64 %i4, 100
+; EPILOG-NEXT:    br i1 %i6, label %innerH, label %exit
+; EPILOG:       exit:
+; EPILOG-NEXT:    ret void
+;
+; EPILOG-BLOCK-LABEL: @test8(
+; EPILOG-BLOCK-NEXT:  bb:
+; EPILOG-BLOCK-NEXT:    br label %outerloop
+; EPILOG-BLOCK:       outerloop.loopexit:
+; EPILOG-BLOCK-NEXT:    br label %innerH.12
+; EPILOG-BLOCK:       outerloop:
+; EPILOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]
+; EPILOG-BLOCK-NEXT:    br label %innerH
+; EPILOG-BLOCK:       innerH:
+; EPILOG-BLOCK-NEXT:    %i3 = phi i64 [ %i, %outerloop ], [ %i4.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    %i4 = add nuw nsw i64 %i3, 1
+; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch
+; EPILOG-BLOCK:       latch:
+; EPILOG-BLOCK-NEXT:    %i6 = icmp ult i64 %i4, 100
+; EPILOG-BLOCK-NEXT:    br i1 %i6, label %innerH.1, label %exit.loopexit
+; EPILOG-BLOCK:       exit.loopexit:
+; EPILOG-BLOCK-NEXT:    br label %exit
+; EPILOG-BLOCK:       exit.loopexit5:
+; EPILOG-BLOCK-NEXT:    br label %exit
+; EPILOG-BLOCK:       exit:
+; EPILOG-BLOCK-NEXT:    ret void
+; EPILOG-BLOCK:       innerH.1:
+; EPILOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
+; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.1
+; EPILOG-BLOCK:       latch.1:
+; EPILOG-BLOCK-NEXT:    %i6.1 = icmp ult i64 %i4.1, 100
+; EPILOG-BLOCK-NEXT:    br i1 %i6.1, label %innerH, label %exit.loopexit, !llvm.loop !11
+; EPILOG-BLOCK:       innerH.12:
+; EPILOG-BLOCK-NEXT:    %i3.1 = phi i64 [ 0, %outerloop.loopexit ], [ %i4.1.1, %latch.1.1 ]
+; EPILOG-BLOCK-NEXT:    %i4.11 = add nuw nsw i64 %i3.1, 1
+; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.14
+; EPILOG-BLOCK:       latch.14:
+; EPILOG-BLOCK-NEXT:    %i6.13 = icmp ult i64 %i4.11, 100
+; EPILOG-BLOCK-NEXT:    br i1 %i6.13, label %innerH.1.1, label %exit.loopexit5
+; EPILOG-BLOCK:       innerH.1.1:
+; EPILOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i4.11, 1
+; EPILOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.1.1
+; EPILOG-BLOCK:       latch.1.1:
+; EPILOG-BLOCK-NEXT:    %i6.1.1 = icmp ult i64 %i4.1.1, 100
+; EPILOG-BLOCK-NEXT:    br i1 %i6.1.1, label %innerH.12, label %exit.loopexit5, !llvm.loop !11
+; EPILOG-BLOCK:       outerloop.loopexit.1:
+; EPILOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !12
+;
+; PROLOG-LABEL: @test8(
+; PROLOG-NEXT:  bb:
+; PROLOG-NEXT:    br label %outerloop
+; PROLOG:       outerloop.loopexit.loopexit:
+; PROLOG-NEXT:    br label %outerloop.loopexit
+; PROLOG:       outerloop.loopexit.loopexit1:
+; PROLOG-NEXT:    br label %outerloop.loopexit
+; PROLOG:       outerloop.loopexit:
+; PROLOG-NEXT:    br label %outerloop
+; PROLOG:       outerloop:
+; PROLOG-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit ]
+; PROLOG-NEXT:    %0 = sub i64 100, %i
+; PROLOG-NEXT:    %1 = sub i64 99, %i
+; PROLOG-NEXT:    %xtraiter = and i64 %0, 7
+; PROLOG-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; PROLOG-NEXT:    br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit
+; PROLOG:       innerH.prol.preheader:
+; PROLOG-NEXT:    br label %innerH.prol
+; PROLOG:       innerH.prol:
+; PROLOG-NEXT:    %i3.prol = phi i64 [ %i4.prol, %latch.prol ], [ %i, %innerH.prol.preheader ]
+; PROLOG-NEXT:    %prol.iter = phi i64 [ %xtraiter, %innerH.prol.preheader ], [ %prol.iter.sub, %latch.prol ]
+; PROLOG-NEXT:    %i4.prol = add nuw nsw i64 %i3.prol, 1
+; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit1, label %latch.prol
+; PROLOG:       latch.prol:
+; PROLOG-NEXT:    %i6.prol = icmp ult i64 %i4.prol, 100
+; 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 %innerH.prol, label %innerH.prol.loopexit.unr-lcssa, !llvm.loop !7
+; PROLOG:       innerH.prol.loopexit.unr-lcssa:
+; PROLOG-NEXT:    %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ]
+; PROLOG-NEXT:    br label %innerH.prol.loopexit
+; PROLOG:       innerH.prol.loopexit:
+; PROLOG-NEXT:    %i3.unr = phi i64 [ %i, %outerloop ], [ %i3.unr.ph, %innerH.prol.loopexit.unr-lcssa ]
+; PROLOG-NEXT:    %2 = icmp ult i64 %1, 7
+; PROLOG-NEXT:    br i1 %2, label %exit.loopexit, label %outerloop.new
+; PROLOG:       outerloop.new:
+; PROLOG-NEXT:    br label %innerH
+; PROLOG:       innerH:
+; PROLOG-NEXT:    %i3 = phi i64 [ %i3.unr, %outerloop.new ], [ %i4.7, %latch.7 ]
+; PROLOG-NEXT:    %i4 = add nuw nsw i64 %i3, 1
+; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
+; PROLOG:       latch:
+; PROLOG-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
+; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
+; PROLOG:       exit.unr-lcssa:
+; PROLOG-NEXT:    br label %exit
+; PROLOG:       exit.loopexit:
+; PROLOG-NEXT:    br label %exit
+; PROLOG:       exit:
+; PROLOG-NEXT:    ret void
+; PROLOG:       latch.1:
+; PROLOG-NEXT:    %i4.2 = add nuw nsw i64 %i4.1, 1
+; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.2
+; PROLOG:       latch.2:
+; PROLOG-NEXT:    %i4.3 = add nuw nsw i64 %i4.2, 1
+; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.3
+; PROLOG:       latch.3:
+; PROLOG-NEXT:    %i4.4 = add nuw nsw i64 %i4.3, 1
+; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.4
+; PROLOG:       latch.4:
+; PROLOG-NEXT:    %i4.5 = add nuw nsw i64 %i4.4, 1
+; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.5
+; PROLOG:       latch.5:
+; PROLOG-NEXT:    %i4.6 = add nuw nsw i64 %i4.5, 1
+; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.6
+; PROLOG:       latch.6:
+; PROLOG-NEXT:    %i4.7 = add nuw nsw i64 %i4.6, 1
+; PROLOG-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.7
+; PROLOG:       latch.7:
+; PROLOG-NEXT:    %i6.7 = icmp ult i64 %i4.7, 100
+; PROLOG-NEXT:    br i1 %i6.7, label %innerH, label %exit.unr-lcssa
+;
+; PROLOG-BLOCK-LABEL: @test8(
+; PROLOG-BLOCK-NEXT:  bb:
+; PROLOG-BLOCK-NEXT:    br label %outerloop
+; PROLOG-BLOCK:       outerloop.loopexit.loopexit:
+; PROLOG-BLOCK-NEXT:    br label %outerloop.loopexit
+; PROLOG-BLOCK:       outerloop.loopexit:
+; PROLOG-BLOCK-NEXT:    br i1 false, label %innerH.prol.preheader.1, label %innerH.prol.loopexit.unr-lcssa.1
+; PROLOG-BLOCK:       outerloop:
+; PROLOG-BLOCK-NEXT:    %i = phi i64 [ 3, %bb ], [ 0, %outerloop.loopexit.1 ]
+; PROLOG-BLOCK-NEXT:    %0 = sub i64 100, %i
+; PROLOG-BLOCK-NEXT:    %1 = sub i64 99, %i
+; PROLOG-BLOCK-NEXT:    %xtraiter = and i64 %0, 1
+; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i64 %xtraiter, 0
+; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %innerH.prol.preheader, label %innerH.prol.loopexit.unr-lcssa
+; PROLOG-BLOCK:       innerH.prol.preheader:
+; PROLOG-BLOCK-NEXT:    br label %innerH.prol
+; PROLOG-BLOCK:       innerH.prol:
+; PROLOG-BLOCK-NEXT:    %i4.prol = add nuw nsw i64 %i, 1
+; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit, label %latch.prol
+; PROLOG-BLOCK:       latch.prol:
+; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit.unr-lcssa
+; PROLOG-BLOCK:       innerH.prol.loopexit.unr-lcssa:
+; PROLOG-BLOCK-NEXT:    %i3.unr.ph = phi i64 [ %i4.prol, %latch.prol ], [ %i, %outerloop ]
+; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit
+; PROLOG-BLOCK:       innerH.prol.loopexit:
+; PROLOG-BLOCK-NEXT:    %2 = icmp ult i64 %1, 1
+; PROLOG-BLOCK-NEXT:    br i1 %2, label %exit.loopexit, label %outerloop.new
+; PROLOG-BLOCK:       outerloop.new:
+; PROLOG-BLOCK-NEXT:    br label %innerH
+; PROLOG-BLOCK:       innerH:
+; PROLOG-BLOCK-NEXT:    %i3 = phi i64 [ %i3.unr.ph, %outerloop.new ], [ %i4.1, %latch.1 ]
+; PROLOG-BLOCK-NEXT:    %i4 = add nuw nsw i64 %i3, 1
+; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch
+; PROLOG-BLOCK:       latch:
+; PROLOG-BLOCK-NEXT:    %i4.1 = add nuw nsw i64 %i4, 1
+; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit, label %latch.1
+; PROLOG-BLOCK:       exit.unr-lcssa.loopexit:
+; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa
+; PROLOG-BLOCK:       exit.unr-lcssa.loopexit3:
+; PROLOG-BLOCK-NEXT:    br label %exit.unr-lcssa
+; PROLOG-BLOCK:       exit.unr-lcssa:
+; PROLOG-BLOCK-NEXT:    br label %exit
+; PROLOG-BLOCK:       exit.loopexit:
+; PROLOG-BLOCK-NEXT:    br label %exit
+; PROLOG-BLOCK:       exit:
+; PROLOG-BLOCK-NEXT:    ret void
+; PROLOG-BLOCK:       latch.1:
+; PROLOG-BLOCK-NEXT:    %i6.1 = icmp ult i64 %i4.1, 100
+; PROLOG-BLOCK-NEXT:    br i1 %i6.1, label %innerH, label %exit.unr-lcssa.loopexit, !llvm.loop !11
+; PROLOG-BLOCK:       innerH.prol.preheader.1:
+; PROLOG-BLOCK-NEXT:    br label %innerH.prol.1
+; PROLOG-BLOCK:       innerH.prol.1:
+; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.1, label %latch.prol.1
+; PROLOG-BLOCK:       latch.prol.1:
+; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit.unr-lcssa.1
+; PROLOG-BLOCK:       innerH.prol.loopexit.unr-lcssa.1:
+; PROLOG-BLOCK-NEXT:    %i3.unr.ph.1 = phi i64 [ 1, %latch.prol.1 ], [ 0, %outerloop.loopexit ]
+; PROLOG-BLOCK-NEXT:    br label %innerH.prol.loopexit.1
+; PROLOG-BLOCK:       innerH.prol.loopexit.1:
+; PROLOG-BLOCK-NEXT:    br i1 false, label %exit.loopexit, label %outerloop.new.1
+; PROLOG-BLOCK:       outerloop.new.1:
+; PROLOG-BLOCK-NEXT:    br label %innerH.1
+; PROLOG-BLOCK:       innerH.1:
+; PROLOG-BLOCK-NEXT:    %i3.1 = phi i64 [ %i3.unr.ph.1, %outerloop.new.1 ], [ %i4.1.1, %latch.1.1 ]
+; PROLOG-BLOCK-NEXT:    %i4.11 = add nuw nsw i64 %i3.1, 1
+; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.12
+; PROLOG-BLOCK:       latch.12:
+; PROLOG-BLOCK-NEXT:    %i4.1.1 = add nuw nsw i64 %i4.11, 1
+; PROLOG-BLOCK-NEXT:    br i1 false, label %outerloop.loopexit.loopexit.1, label %latch.1.1
+; PROLOG-BLOCK:       latch.1.1:
+; PROLOG-BLOCK-NEXT:    %i6.1.1 = icmp ult i64 %i4.1.1, 100
+; PROLOG-BLOCK-NEXT:    br i1 %i6.1.1, label %innerH.1, label %exit.unr-lcssa.loopexit3, !llvm.loop !11
+; PROLOG-BLOCK:       outerloop.loopexit.loopexit.1:
+; PROLOG-BLOCK-NEXT:    br label %outerloop.loopexit.1
+; PROLOG-BLOCK:       outerloop.loopexit.1:
+; PROLOG-BLOCK-NEXT:    br label %outerloop, !llvm.loop !12
+;
+
 bb:
   br label %outerloop
 
@@ -608,12 +4290,312 @@ declare i8 addrspace(1)* @foo(i32)
 ; a value from outer loop is used in exit block of inner loop.
 ; Don't create VMap entries for such values (%trip).
 define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) {
-; PROLOG: test9(
-; PROLOG: header.prol:
-; PROLOG-NEXT: %phi.prol = phi i64 [ 0, %header.prol.preheader ], [ %iv.next.prol, %latch.prol ]
-; PROLOG: latch.prol:
-; PROLOG-NOT: trip
-; PROLOG:     br i1 %prol.iter.cmp.not, label %header.prol.loopexit.unr-lcssa, label %header.prol
+; EPILOG-NO-IC-LABEL: @test9(
+; EPILOG-NO-IC-NEXT:  bb:
+; EPILOG-NO-IC-NEXT:    br label %outerloopHdr
+; EPILOG-NO-IC:       outerloopHdr:
+; EPILOG-NO-IC-NEXT:    %trip = add i32 %n, -1
+; EPILOG-NO-IC-NEXT:    %outercnd = icmp slt i32 0, %trip
+; EPILOG-NO-IC-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
+; EPILOG-NO-IC:       preheader:
+; EPILOG-NO-IC-NEXT:    %i4 = zext i32 0 to i64
+; EPILOG-NO-IC-NEXT:    br label %header
+; EPILOG-NO-IC:       header:
+; EPILOG-NO-IC-NEXT:    %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ]
+; EPILOG-NO-IC-NEXT:    %i7 = trunc i64 %phi to i32
+; EPILOG-NO-IC-NEXT:    br i1 true, label %latch, label %innerexit
+; EPILOG-NO-IC:       innerexit:
+; EPILOG-NO-IC-NEXT:    %trip.lcssa = phi i32 [ %trip, %header ]
+; EPILOG-NO-IC-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
+; EPILOG-NO-IC-NEXT:    ret i8 addrspace(1)* %i9
+; EPILOG-NO-IC:       latch:
+; EPILOG-NO-IC-NEXT:    %i11 = add nsw i32 %i7, 1
+; EPILOG-NO-IC-NEXT:    %innercnd = icmp slt i32 %i11, %trip
+; EPILOG-NO-IC-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
+; EPILOG-NO-IC-NEXT:    br i1 %innercnd, label %header, label %outerLatch.loopexit
+; EPILOG-NO-IC:       outerLatch.loopexit:
+; EPILOG-NO-IC-NEXT:    br label %outerLatch
+; EPILOG-NO-IC:       outerLatch:
+; EPILOG-NO-IC-NEXT:    br label %outerloopHdr
+;
+; EPILOG-LABEL: @test9(
+; EPILOG-NEXT:  bb:
+; EPILOG-NEXT:    br label %outerloopHdr
+; EPILOG:       outerloopHdr:
+; EPILOG-NEXT:    %trip = add i32 %n, -1
+; EPILOG-NEXT:    %outercnd = icmp slt i32 0, %trip
+; EPILOG-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
+; EPILOG:       preheader:
+; EPILOG-NEXT:    %i4 = zext i32 0 to i64
+; EPILOG-NEXT:    br label %header
+; EPILOG:       header:
+; EPILOG-NEXT:    %phi = phi i64 [ %i4, %preheader ], [ %iv.next, %latch ]
+; EPILOG-NEXT:    %i7 = trunc i64 %phi to i32
+; EPILOG-NEXT:    br i1 true, label %latch, label %innerexit
+; EPILOG:       innerexit:
+; EPILOG-NEXT:    %trip.lcssa = phi i32 [ %trip, %header ]
+; EPILOG-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
+; EPILOG-NEXT:    ret i8 addrspace(1)* %i9
+; EPILOG:       latch:
+; EPILOG-NEXT:    %i11 = add nsw i32 %i7, 1
+; EPILOG-NEXT:    %innercnd = icmp slt i32 %i11, %trip
+; EPILOG-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
+; EPILOG-NEXT:    br i1 %innercnd, label %header, label %outerLatch.loopexit
+; EPILOG:       outerLatch.loopexit:
+; EPILOG-NEXT:    br label %outerLatch
+; EPILOG:       outerLatch:
+; EPILOG-NEXT:    br label %outerloopHdr
+;
+; EPILOG-BLOCK-LABEL: @test9(
+; EPILOG-BLOCK-NEXT:  bb:
+; EPILOG-BLOCK-NEXT:    br label %outerloopHdr
+; EPILOG-BLOCK:       outerloopHdr:
+; EPILOG-BLOCK-NEXT:    %trip = add i32 %n, -1
+; EPILOG-BLOCK-NEXT:    %outercnd = icmp slt i32 0, %trip
+; EPILOG-BLOCK-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
+; EPILOG-BLOCK:       preheader:
+; EPILOG-BLOCK-NEXT:    br label %header
+; EPILOG-BLOCK:       header:
+; EPILOG-BLOCK-NEXT:    %phi = phi i64 [ 0, %preheader ], [ %iv.next.1, %latch.1 ]
+; EPILOG-BLOCK-NEXT:    %i7 = trunc i64 %phi to i32
+; EPILOG-BLOCK-NEXT:    br i1 true, label %latch, label %innerexit.loopexit
+; EPILOG-BLOCK:       innerexit.loopexit:
+; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph = phi i32 [ %trip, %header.1 ], [ %trip, %header ]
+; EPILOG-BLOCK-NEXT:    br label %innerexit
+; EPILOG-BLOCK:       innerexit.loopexit7:
+; EPILOG-BLOCK-NEXT:    %trip.lcssa.ph8 = phi i32 [ %trip.1, %header.1.1 ], [ %trip.1, %header.12 ]
+; EPILOG-BLOCK-NEXT:    br label %innerexit
+; EPILOG-BLOCK:       innerexit:
+; EPILOG-BLOCK-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph8, %innerexit.loopexit7 ]
+; EPILOG-BLOCK-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
+; EPILOG-BLOCK-NEXT:    ret i8 addrspace(1)* %i9
+; EPILOG-BLOCK:       latch:
+; EPILOG-BLOCK-NEXT:    %i11 = add nuw nsw i32 %i7, 1
+; EPILOG-BLOCK-NEXT:    %innercnd = icmp slt i32 %i11, %trip
+; EPILOG-BLOCK-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
+; EPILOG-BLOCK-NEXT:    br i1 %innercnd, label %header.1, label %outerLatch.loopexit
+; EPILOG-BLOCK:       outerLatch.loopexit:
+; EPILOG-BLOCK-NEXT:    br label %outerLatch
+; EPILOG-BLOCK:       outerLatch:
+; EPILOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -1
+; EPILOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.1
+; EPILOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.1
+; EPILOG-BLOCK:       header.1:
+; EPILOG-BLOCK-NEXT:    %i7.1 = trunc i64 %iv.next to i32
+; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit
+; EPILOG-BLOCK:       latch.1:
+; EPILOG-BLOCK-NEXT:    %i11.1 = add nsw i32 %i7.1, 1
+; EPILOG-BLOCK-NEXT:    %innercnd.1 = icmp slt i32 %i11.1, %trip
+; EPILOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
+; EPILOG-BLOCK-NEXT:    br i1 %innercnd.1, label %header, label %outerLatch.loopexit, !llvm.loop !13
+; EPILOG-BLOCK:       preheader.1:
+; EPILOG-BLOCK-NEXT:    br label %header.12
+; EPILOG-BLOCK:       header.12:
+; EPILOG-BLOCK-NEXT:    %phi.1 = phi i64 [ 0, %preheader.1 ], [ %iv.next.1.1, %latch.1.1 ]
+; EPILOG-BLOCK-NEXT:    %i7.11 = trunc i64 %phi.1 to i32
+; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.16, label %innerexit.loopexit7
+; EPILOG-BLOCK:       latch.16:
+; EPILOG-BLOCK-NEXT:    %i11.13 = add nuw nsw i32 %i7.11, 1
+; EPILOG-BLOCK-NEXT:    %innercnd.14 = icmp slt i32 %i11.13, %trip.1
+; EPILOG-BLOCK-NEXT:    %iv.next.15 = add nuw nsw i64 %phi.1, 1
+; EPILOG-BLOCK-NEXT:    br i1 %innercnd.14, label %header.1.1, label %outerLatch.loopexit.1
+; EPILOG-BLOCK:       header.1.1:
+; EPILOG-BLOCK-NEXT:    %i7.1.1 = trunc i64 %iv.next.15 to i32
+; EPILOG-BLOCK-NEXT:    br i1 true, label %latch.1.1, label %innerexit.loopexit7
+; EPILOG-BLOCK:       latch.1.1:
+; EPILOG-BLOCK-NEXT:    %i11.1.1 = add nsw i32 %i7.1.1, 1
+; EPILOG-BLOCK-NEXT:    %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.1
+; EPILOG-BLOCK-NEXT:    %iv.next.1.1 = add nuw nsw i64 %iv.next.15, 1
+; EPILOG-BLOCK-NEXT:    br i1 %innercnd.1.1, label %header.12, label %outerLatch.loopexit.1, !llvm.loop !13
+; EPILOG-BLOCK:       outerLatch.loopexit.1:
+; EPILOG-BLOCK-NEXT:    br label %outerLatch.1
+; EPILOG-BLOCK:       outerLatch.1:
+; EPILOG-BLOCK-NEXT:    br label %outerloopHdr, !llvm.loop !14
+;
+; PROLOG-LABEL: @test9(
+; PROLOG-NEXT:  bb:
+; PROLOG-NEXT:    %0 = add i32 %n, -1
+; PROLOG-NEXT:    %1 = add i32 %n, -2
+; PROLOG-NEXT:    br label %outerloopHdr
+; PROLOG:       outerloopHdr:
+; PROLOG-NEXT:    %trip = add i32 %n, -1
+; PROLOG-NEXT:    %outercnd = icmp slt i32 0, %trip
+; PROLOG-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
+; PROLOG:       preheader:
+; PROLOG-NEXT:    %i4 = zext i32 0 to i64
+; PROLOG-NEXT:    %xtraiter = and i32 %0, 7
+; PROLOG-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
+; PROLOG-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit
+; PROLOG:       header.prol.preheader:
+; PROLOG-NEXT:    br label %header.prol
+; PROLOG:       header.prol:
+; PROLOG-NEXT:    %phi.prol = phi i64 [ %i4, %header.prol.preheader ], [ %iv.next.prol, %latch.prol ]
+; PROLOG-NEXT:    %prol.iter = phi i32 [ %xtraiter, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ]
+; PROLOG-NEXT:    %i7.prol = trunc i64 %phi.prol to i32
+; PROLOG-NEXT:    br i1 true, label %latch.prol, label %innerexit.loopexit1
+; PROLOG:       latch.prol:
+; PROLOG-NEXT:    %i11.prol = add nsw i32 %i7.prol, 1
+; PROLOG-NEXT:    %innercnd.prol = icmp slt i32 %i11.prol, %trip
+; PROLOG-NEXT:    %iv.next.prol = add nuw nsw i64 %phi.prol, 1
+; PROLOG-NEXT:    %prol.iter.sub = sub i32 %prol.iter, 1
+; PROLOG-NEXT:    %prol.iter.cmp = icmp ne i32 %prol.iter.sub, 0
+; PROLOG-NEXT:    br i1 %prol.iter.cmp, label %header.prol, label %header.prol.loopexit.unr-lcssa, !llvm.loop !8
+; PROLOG:       header.prol.loopexit.unr-lcssa:
+; PROLOG-NEXT:    %phi.unr.ph = phi i64 [ %iv.next.prol, %latch.prol ]
+; PROLOG-NEXT:    br label %header.prol.loopexit
+; PROLOG:       header.prol.loopexit:
+; PROLOG-NEXT:    %phi.unr = phi i64 [ %i4, %preheader ], [ %phi.unr.ph, %header.prol.loopexit.unr-lcssa ]
+; PROLOG-NEXT:    %2 = icmp ult i32 %1, 7
+; PROLOG-NEXT:    br i1 %2, label %outerLatch.loopexit, label %preheader.new
+; PROLOG:       preheader.new:
+; PROLOG-NEXT:    br label %header
+; PROLOG:       header:
+; PROLOG-NEXT:    %phi = phi i64 [ %phi.unr, %preheader.new ], [ %iv.next.7, %latch.7 ]
+; PROLOG-NEXT:    br i1 true, label %latch, label %innerexit.loopexit
+; PROLOG:       innerexit.loopexit:
+; 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 ]
+; PROLOG-NEXT:    br label %innerexit
+; PROLOG:       innerexit.loopexit1:
+; PROLOG-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ]
+; PROLOG-NEXT:    br label %innerexit
+; PROLOG:       innerexit:
+; PROLOG-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
+; PROLOG-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
+; PROLOG-NEXT:    ret i8 addrspace(1)* %i9
+; PROLOG:       latch:
+; PROLOG-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
+; PROLOG-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit
+; PROLOG:       outerLatch.loopexit.unr-lcssa:
+; PROLOG-NEXT:    br label %outerLatch.loopexit
+; PROLOG:       outerLatch.loopexit:
+; PROLOG-NEXT:    br label %outerLatch
+; PROLOG:       outerLatch:
+; PROLOG-NEXT:    br label %outerloopHdr
+; PROLOG:       latch.1:
+; PROLOG-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
+; PROLOG-NEXT:    br i1 true, label %latch.2, label %innerexit.loopexit
+; PROLOG:       latch.2:
+; PROLOG-NEXT:    %iv.next.2 = add nuw nsw i64 %iv.next.1, 1
+; PROLOG-NEXT:    br i1 true, label %latch.3, label %innerexit.loopexit
+; PROLOG:       latch.3:
+; PROLOG-NEXT:    %iv.next.3 = add nuw nsw i64 %iv.next.2, 1
+; PROLOG-NEXT:    br i1 true, label %latch.4, label %innerexit.loopexit
+; PROLOG:       latch.4:
+; PROLOG-NEXT:    %iv.next.4 = add nuw nsw i64 %iv.next.3, 1
+; PROLOG-NEXT:    br i1 true, label %latch.5, label %innerexit.loopexit
+; PROLOG:       latch.5:
+; PROLOG-NEXT:    %iv.next.5 = add nuw nsw i64 %iv.next.4, 1
+; PROLOG-NEXT:    br i1 true, label %latch.6, label %innerexit.loopexit
+; PROLOG:       latch.6:
+; PROLOG-NEXT:    %iv.next.6 = add nuw nsw i64 %iv.next.5, 1
+; PROLOG-NEXT:    %i7.7 = trunc i64 %iv.next.6 to i32
+; PROLOG-NEXT:    br i1 true, label %latch.7, label %innerexit.loopexit
+; PROLOG:       latch.7:
+; PROLOG-NEXT:    %i11.7 = add nsw i32 %i7.7, 1
+; PROLOG-NEXT:    %innercnd.7 = icmp slt i32 %i11.7, %trip
+; PROLOG-NEXT:    %iv.next.7 = add nuw nsw i64 %iv.next.6, 1
+; PROLOG-NEXT:    br i1 %innercnd.7, label %header, label %outerLatch.loopexit.unr-lcssa
+;
+; PROLOG-BLOCK-LABEL: @test9(
+; PROLOG-BLOCK-NEXT:  bb:
+; PROLOG-BLOCK-NEXT:    %0 = add i32 %n, -1
+; PROLOG-BLOCK-NEXT:    %1 = add i32 %n, -2
+; PROLOG-BLOCK-NEXT:    br label %outerloopHdr
+; PROLOG-BLOCK:       outerloopHdr:
+; PROLOG-BLOCK-NEXT:    %trip = add i32 %n, -1
+; PROLOG-BLOCK-NEXT:    %outercnd = icmp slt i32 0, %trip
+; PROLOG-BLOCK-NEXT:    br i1 %outercnd, label %preheader, label %outerLatch
+; PROLOG-BLOCK:       preheader:
+; PROLOG-BLOCK-NEXT:    %xtraiter = and i32 %0, 1
+; PROLOG-BLOCK-NEXT:    %lcmp.mod = icmp ne i32 %xtraiter, 0
+; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod, label %header.prol.preheader, label %header.prol.loopexit.unr-lcssa
+; PROLOG-BLOCK:       header.prol.preheader:
+; PROLOG-BLOCK-NEXT:    br label %header.prol
+; PROLOG-BLOCK:       header.prol:
+; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.prol, label %innerexit.loopexit1
+; PROLOG-BLOCK:       latch.prol:
+; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit.unr-lcssa
+; PROLOG-BLOCK:       header.prol.loopexit.unr-lcssa:
+; PROLOG-BLOCK-NEXT:    %phi.unr.ph = phi i64 [ 1, %latch.prol ], [ 0, %preheader ]
+; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit
+; PROLOG-BLOCK:       header.prol.loopexit:
+; PROLOG-BLOCK-NEXT:    %2 = icmp ult i32 %1, 1
+; PROLOG-BLOCK-NEXT:    br i1 %2, label %outerLatch.loopexit, label %preheader.new
+; PROLOG-BLOCK:       preheader.new:
+; PROLOG-BLOCK-NEXT:    br label %header
+; PROLOG-BLOCK:       header:
+; PROLOG-BLOCK-NEXT:    %phi = phi i64 [ %phi.unr.ph, %preheader.new ], [ %iv.next.1, %latch.1 ]
+; PROLOG-BLOCK-NEXT:    br i1 true, label %latch, label %innerexit.loopexit.loopexit
+; PROLOG-BLOCK:       innerexit.loopexit.loopexit:
+; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph.ph = phi i32 [ %trip, %latch ], [ %trip, %header ]
+; PROLOG-BLOCK-NEXT:    br label %innerexit.loopexit
+; PROLOG-BLOCK:       innerexit.loopexit.loopexit5:
+; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph.ph6 = phi i32 [ %trip.1, %latch.14 ], [ %trip.1, %header.1 ]
+; PROLOG-BLOCK-NEXT:    br label %innerexit.loopexit
+; PROLOG-BLOCK:       innerexit.loopexit:
+; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph = phi i32 [ %trip.lcssa.ph.ph, %innerexit.loopexit.loopexit ], [ %trip.lcssa.ph.ph6, %innerexit.loopexit.loopexit5 ]
+; PROLOG-BLOCK-NEXT:    br label %innerexit
+; PROLOG-BLOCK:       innerexit.loopexit1:
+; PROLOG-BLOCK-NEXT:    %trip.lcssa.ph2 = phi i32 [ %trip, %header.prol ], [ %trip.1, %header.prol.1 ]
+; PROLOG-BLOCK-NEXT:    br label %innerexit
+; PROLOG-BLOCK:       innerexit:
+; PROLOG-BLOCK-NEXT:    %trip.lcssa = phi i32 [ %trip.lcssa.ph, %innerexit.loopexit ], [ %trip.lcssa.ph2, %innerexit.loopexit1 ]
+; PROLOG-BLOCK-NEXT:    %i9 = call i8 addrspace(1)* @foo(i32 %trip.lcssa)
+; PROLOG-BLOCK-NEXT:    ret i8 addrspace(1)* %i9
+; PROLOG-BLOCK:       latch:
+; PROLOG-BLOCK-NEXT:    %iv.next = add nuw nsw i64 %phi, 1
+; PROLOG-BLOCK-NEXT:    %i7.1 = trunc i64 %iv.next to i32
+; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.1, label %innerexit.loopexit.loopexit
+; PROLOG-BLOCK:       outerLatch.loopexit.unr-lcssa:
+; PROLOG-BLOCK-NEXT:    br label %outerLatch.loopexit
+; PROLOG-BLOCK:       outerLatch.loopexit:
+; PROLOG-BLOCK-NEXT:    br label %outerLatch
+; PROLOG-BLOCK:       outerLatch:
+; PROLOG-BLOCK-NEXT:    %trip.1 = add i32 %n, -1
+; PROLOG-BLOCK-NEXT:    %outercnd.1 = icmp slt i32 0, %trip.1
+; PROLOG-BLOCK-NEXT:    br i1 %outercnd.1, label %preheader.1, label %outerLatch.1
+; PROLOG-BLOCK:       latch.1:
+; PROLOG-BLOCK-NEXT:    %i11.1 = add nsw i32 %i7.1, 1
+; PROLOG-BLOCK-NEXT:    %innercnd.1 = icmp slt i32 %i11.1, %trip
+; PROLOG-BLOCK-NEXT:    %iv.next.1 = add nuw nsw i64 %iv.next, 1
+; PROLOG-BLOCK-NEXT:    br i1 %innercnd.1, label %header, label %outerLatch.loopexit.unr-lcssa, !llvm.loop !13
+; PROLOG-BLOCK:       preheader.1:
+; PROLOG-BLOCK-NEXT:    %xtraiter.1 = and i32 %0, 1
+; PROLOG-BLOCK-NEXT:    %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0
+; PROLOG-BLOCK-NEXT:    br i1 %lcmp.mod.1, label %header.prol.preheader.1, label %header.prol.loopexit.unr-lcssa.1
+; PROLOG-BLOCK:       header.prol.preheader.1:
+; PROLOG-BLOCK-NEXT:    br label %header.prol.1
+; PROLOG-BLOCK:       header.prol.1:
+; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.prol.1, label %innerexit.loopexit1
+; PROLOG-BLOCK:       latch.prol.1:
+; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit.unr-lcssa.1
+; PROLOG-BLOCK:       header.prol.loopexit.unr-lcssa.1:
+; PROLOG-BLOCK-NEXT:    %phi.unr.ph.1 = phi i64 [ 1, %latch.prol.1 ], [ 0, %preheader.1 ]
+; PROLOG-BLOCK-NEXT:    br label %header.prol.loopexit.1
+; PROLOG-BLOCK:       header.prol.loopexit.1:
+; PROLOG-BLOCK-NEXT:    %3 = icmp ult i32 %1, 1
+; PROLOG-BLOCK-NEXT:    br i1 %3, label %outerLatch.loopexit.1, label %preheader.new.1
+; PROLOG-BLOCK:       preheader.new.1:
+; PROLOG-BLOCK-NEXT:    br label %header.1
+; PROLOG-BLOCK:       header.1:
+; PROLOG-BLOCK-NEXT:    %phi.1 = phi i64 [ %phi.unr.ph.1, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ]
+; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.14, label %innerexit.loopexit.loopexit5
+; PROLOG-BLOCK:       latch.14:
+; PROLOG-BLOCK-NEXT:    %iv.next.13 = add nuw nsw i64 %phi.1, 1
+; PROLOG-BLOCK-NEXT:    %i7.1.1 = trunc i64 %iv.next.13 to i32
+; PROLOG-BLOCK-NEXT:    br i1 true, label %latch.1.1, label %innerexit.loopexit.loopexit5
+; PROLOG-BLOCK:       latch.1.1:
+; PROLOG-BLOCK-NEXT:    %i11.1.1 = add nsw i32 %i7.1.1, 1
+; PROLOG-BLOCK-NEXT:    %innercnd.1.1 = icmp slt i32 %i11.1.1, %trip.1
+; PROLOG-BLOCK-NEXT:    %iv.next.1.1 = add nuw nsw i64 %iv.next.13, 1
+; PROLOG-BLOCK-NEXT:    br i1 %innercnd.1.1, label %header.1, label %outerLatch.loopexit.unr-lcssa.1, !llvm.loop !13
+; PROLOG-BLOCK:       outerLatch.loopexit.unr-lcssa.1:
+; PROLOG-BLOCK-NEXT:    br label %outerLatch.loopexit.1
+; PROLOG-BLOCK:       outerLatch.loopexit.1:
+; PROLOG-BLOCK-NEXT:    br label %outerLatch.1
+; PROLOG-BLOCK:       outerLatch.1:
+; PROLOG-BLOCK-NEXT:    br label %outerloopHdr, !llvm.loop !14
+;
 bb:
   br label %outerloopHdr
 


        


More information about the llvm-commits mailing list