From 81c648a3d909cf0c1c1c635309f35b93d07307d1 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 18 May 2022 17:09:36 +0200 Subject: [PATCH] [LoopUnroll] Freeze tripcount rather than condition This is a followup to D125754. We introduce two branches, one before the unrolled loop and one before the epilogue (and similar for the prologue case). The previous patch only froze the condition on the first branch. Rather than independently freezing the second condition, this patch instead freezes TripCount and bases BECount on it. These are the two quantities involved in the conditions, and this ensures that both work on a consistent, non-poisonous trip count. Differential Revision: https://reviews.llvm.org/D125896 --- llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp | 28 +- .../LoopUnroll/runtime-loop-at-most-two-exits.ll | 10 +- .../runtime-loop-multiexit-dom-verify.ll | 38 +- .../LoopUnroll/runtime-loop-multiple-exits.ll | 702 +++++++++++---------- .../LoopUnroll/runtime-multiexit-heuristic.ll | 86 +-- 5 files changed, 442 insertions(+), 422 deletions(-) diff --git a/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp b/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp index 71c15f9..37a013c 100644 --- a/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp +++ b/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp @@ -738,11 +738,28 @@ bool llvm::UnrollRuntimeLoopRemainder( // Compute the number of extra iterations required, which is: // extra iterations = run-time trip count % loop unroll factor PreHeaderBR = cast(PreHeader->getTerminator()); + IRBuilder<> B(PreHeaderBR); Value *TripCount = Expander.expandCodeFor(TripCountSC, TripCountSC->getType(), PreHeaderBR); - Value *BECount = Expander.expandCodeFor(BECountSC, BECountSC->getType(), - PreHeaderBR); - IRBuilder<> B(PreHeaderBR); + Value *BECount; + // If there are other exits before the latch, that may cause the latch exit + // branch to never be executed, and the latch exit count may be poison. + // In this case, freeze the TripCount and base BECount on the frozen + // TripCount. We will introduce two branches using these values, and it's + // important that they see a consistent value (which would not be guaranteed + // if were frozen independently.) + if ((!OtherExits.empty() || !SE->loopHasNoAbnormalExits(L)) && + !isGuaranteedNotToBeUndefOrPoison(TripCount, AC, PreHeaderBR, DT)) { + TripCount = B.CreateFreeze(TripCount); + BECount = + B.CreateAdd(TripCount, ConstantInt::get(TripCount->getType(), -1)); + } else { + // If we don't need to freeze, use SCEVExpander for BECount as well, to + // allow slightly better value reuse. + BECount = + Expander.expandCodeFor(BECountSC, BECountSC->getType(), PreHeaderBR); + } + Value * const ModVal = CreateTripRemainder(B, BECount, TripCount, Count); Value *BranchVal = @@ -752,11 +769,6 @@ bool llvm::UnrollRuntimeLoopRemainder( B.CreateIsNotNull(ModVal, "lcmp.mod"); BasicBlock *RemainderLoop = UseEpilogRemainder ? NewExit : PrologPreHeader; BasicBlock *UnrollingLoop = UseEpilogRemainder ? NewPreHeader : PrologExit; - // Freeze the condition if there are other exits before the latch that may - // cause the latch exit branch to never be executed. - if ((!OtherExits.empty() || !SE->loopHasNoAbnormalExits(L)) && - !isGuaranteedNotToBeUndefOrPoison(BranchVal, AC, PreHeaderBR, DT)) - BranchVal = B.CreateFreeze(BranchVal); // Branch to either remainder (extra iterations) loop or unrolling loop. B.CreateCondBr(BranchVal, RemainderLoop, UnrollingLoop); PreHeaderBR->eraseFromParent(); diff --git a/llvm/test/Transforms/LoopUnroll/runtime-loop-at-most-two-exits.ll b/llvm/test/Transforms/LoopUnroll/runtime-loop-at-most-two-exits.ll index 8bf36c8..2a30167 100644 --- a/llvm/test/Transforms/LoopUnroll/runtime-loop-at-most-two-exits.ll +++ b/llvm/test/Transforms/LoopUnroll/runtime-loop-at-most-two-exits.ll @@ -5,13 +5,13 @@ define i32 @test(i32* nocapture %a, i64 %n) { ; ENABLED-LABEL: @test( ; ENABLED-NEXT: entry: -; ENABLED-NEXT: [[TMP0:%.*]] = add i64 [[N:%.*]], -1 -; ENABLED-NEXT: [[XTRAITER:%.*]] = and i64 [[N]], 7 -; ENABLED-NEXT: [[TMP1:%.*]] = icmp ult i64 [[TMP0]], 7 -; ENABLED-NEXT: [[TMP2:%.*]] = freeze i1 [[TMP1]] +; ENABLED-NEXT: [[TMP0:%.*]] = freeze i64 [[N:%.*]] +; ENABLED-NEXT: [[TMP1:%.*]] = add i64 [[TMP0]], -1 +; ENABLED-NEXT: [[XTRAITER:%.*]] = and i64 [[TMP0]], 7 +; ENABLED-NEXT: [[TMP2:%.*]] = icmp ult i64 [[TMP1]], 7 ; ENABLED-NEXT: br i1 [[TMP2]], label [[FOR_END_UNR_LCSSA:%.*]], label [[ENTRY_NEW:%.*]] ; ENABLED: entry.new: -; ENABLED-NEXT: [[UNROLL_ITER:%.*]] = sub i64 [[N]], [[XTRAITER]] +; ENABLED-NEXT: [[UNROLL_ITER:%.*]] = sub i64 [[TMP0]], [[XTRAITER]] ; ENABLED-NEXT: br label [[HEADER:%.*]] ; ENABLED: header: ; ENABLED-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY_NEW]] ], [ [[INDVARS_IV_NEXT_7:%.*]], [[FOR_BODY_7:%.*]] ] diff --git a/llvm/test/Transforms/LoopUnroll/runtime-loop-multiexit-dom-verify.ll b/llvm/test/Transforms/LoopUnroll/runtime-loop-multiexit-dom-verify.ll index ecd01a5..99e2c15 100644 --- a/llvm/test/Transforms/LoopUnroll/runtime-loop-multiexit-dom-verify.ll +++ b/llvm/test/Transforms/LoopUnroll/runtime-loop-multiexit-dom-verify.ll @@ -252,11 +252,11 @@ define void @test4(i16 %c3) { ; CHECK-NEXT: preheader: ; CHECK-NEXT: [[C1:%.*]] = zext i32 undef to i64 ; CHECK-NEXT: [[UMAX:%.*]] = call i64 @llvm.umax.i64(i64 [[C1]], i64 1) -; CHECK-NEXT: [[TMP0:%.*]] = add nsw i64 [[UMAX]], -1 -; CHECK-NEXT: [[XTRAITER:%.*]] = and i64 [[UMAX]], 3 +; CHECK-NEXT: [[TMP0:%.*]] = freeze i64 [[UMAX]] +; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[TMP0]], -1 +; CHECK-NEXT: [[XTRAITER:%.*]] = and i64 [[TMP0]], 3 ; CHECK-NEXT: [[LCMP_MOD:%.*]] = icmp ne i64 [[XTRAITER]], 0 -; CHECK-NEXT: [[TMP1:%.*]] = freeze i1 [[LCMP_MOD]] -; CHECK-NEXT: br i1 [[TMP1]], label [[HEADER_PROL_PREHEADER:%.*]], label [[HEADER_PROL_LOOPEXIT:%.*]] +; CHECK-NEXT: br i1 [[LCMP_MOD]], label [[HEADER_PROL_PREHEADER:%.*]], label [[HEADER_PROL_LOOPEXIT:%.*]] ; CHECK: header.prol.preheader: ; CHECK-NEXT: br label [[HEADER_PROL:%.*]] ; CHECK: header.prol: @@ -279,7 +279,7 @@ define void @test4(i16 %c3) { ; CHECK-NEXT: br label [[HEADER_PROL_LOOPEXIT]] ; CHECK: header.prol.loopexit: ; CHECK-NEXT: [[INDVARS_IV_UNR:%.*]] = phi i64 [ 0, [[PREHEADER:%.*]] ], [ [[INDVARS_IV_UNR_PH]], [[HEADER_PROL_LOOPEXIT_UNR_LCSSA]] ] -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i64 [[TMP0]], 3 +; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i64 [[TMP1]], 3 ; CHECK-NEXT: br i1 [[TMP2]], label [[LATCHEXIT:%.*]], label [[PREHEADER_NEW:%.*]] ; CHECK: preheader.new: ; CHECK-NEXT: br label [[HEADER:%.*]] @@ -375,7 +375,11 @@ define void @test5() { ; CHECK-NEXT: [[TMP:%.*]] = icmp sgt i32 undef, 79 ; CHECK-NEXT: br i1 [[TMP]], label [[OUTERLATCHEXIT:%.*]], label [[BB1:%.*]] ; CHECK: bb1: -; CHECK-NEXT: br i1 false, label [[OUTERH_PROL_PREHEADER:%.*]], label [[OUTERH_PROL_LOOPEXIT:%.*]] +; CHECK-NEXT: [[TMP0:%.*]] = freeze i32 undef +; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[TMP0]], -1 +; CHECK-NEXT: [[XTRAITER:%.*]] = and i32 [[TMP0]], 3 +; CHECK-NEXT: [[LCMP_MOD:%.*]] = icmp ne i32 [[XTRAITER]], 0 +; CHECK-NEXT: br i1 [[LCMP_MOD]], label [[OUTERH_PROL_PREHEADER:%.*]], label [[OUTERH_PROL_LOOPEXIT:%.*]] ; CHECK: outerH.prol.preheader: ; CHECK-NEXT: br label [[OUTERH_PROL:%.*]] ; CHECK: outerH.prol: @@ -418,14 +422,15 @@ define void @test5() { ; CHECK-NEXT: [[TMP6_PROL]] = add i32 [[TMP4_PROL]], 1 ; CHECK-NEXT: [[TMP7_PROL:%.*]] = icmp sgt i32 [[TMP6_PROL]], 79 ; CHECK-NEXT: [[PROL_ITER_NEXT]] = add i32 [[PROL_ITER]], 1 -; CHECK-NEXT: [[PROL_ITER_CMP:%.*]] = icmp ne i32 [[PROL_ITER_NEXT]], 0 +; CHECK-NEXT: [[PROL_ITER_CMP:%.*]] = icmp ne i32 [[PROL_ITER_NEXT]], [[XTRAITER]] ; CHECK-NEXT: br i1 [[PROL_ITER_CMP]], label [[OUTERH_PROL]], label [[OUTERH_PROL_LOOPEXIT_UNR_LCSSA:%.*]], !llvm.loop [[LOOP7:![0-9]+]] ; CHECK: outerH.prol.loopexit.unr-lcssa: ; CHECK-NEXT: [[TMP4_UNR_PH:%.*]] = phi i32 [ [[TMP6_PROL]], [[OUTERLATCH_PROL]] ] ; CHECK-NEXT: br label [[OUTERH_PROL_LOOPEXIT]] ; CHECK: outerH.prol.loopexit: ; CHECK-NEXT: [[TMP4_UNR:%.*]] = phi i32 [ undef, [[BB1]] ], [ [[TMP4_UNR_PH]], [[OUTERH_PROL_LOOPEXIT_UNR_LCSSA]] ] -; CHECK-NEXT: br i1 false, label [[OUTERLATCHEXIT_LOOPEXIT:%.*]], label [[BB1_NEW:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], 3 +; CHECK-NEXT: br i1 [[TMP2]], label [[OUTERLATCHEXIT_LOOPEXIT:%.*]], label [[BB1_NEW:%.*]] ; CHECK: bb1.new: ; CHECK-NEXT: br label [[OUTERH:%.*]] ; CHECK: outerH: @@ -659,10 +664,11 @@ define void @test6(i64 %start) { ; CHECK-NEXT: [[TMP2:%.*]] = sub i64 [[TMP1]], [[START]] ; CHECK-NEXT: [[TMP3:%.*]] = lshr i64 [[TMP2]], 1 ; CHECK-NEXT: [[TMP4:%.*]] = add nuw i64 [[TMP3]], 1 -; CHECK-NEXT: [[XTRAITER:%.*]] = and i64 [[TMP4]], 3 +; CHECK-NEXT: [[TMP5:%.*]] = freeze i64 [[TMP4]] +; CHECK-NEXT: [[TMP6:%.*]] = add i64 [[TMP5]], -1 +; CHECK-NEXT: [[XTRAITER:%.*]] = and i64 [[TMP5]], 3 ; CHECK-NEXT: [[LCMP_MOD:%.*]] = icmp ne i64 [[XTRAITER]], 0 -; CHECK-NEXT: [[TMP5:%.*]] = freeze i1 [[LCMP_MOD]] -; CHECK-NEXT: br i1 [[TMP5]], label [[HEADER_PROL_PREHEADER:%.*]], label [[HEADER_PROL_LOOPEXIT:%.*]] +; CHECK-NEXT: br i1 [[LCMP_MOD]], label [[HEADER_PROL_PREHEADER:%.*]], label [[HEADER_PROL_LOOPEXIT:%.*]] ; CHECK: header.prol.preheader: ; CHECK-NEXT: br label [[HEADER_PROL:%.*]] ; CHECK: header.prol: @@ -673,7 +679,7 @@ define void @test6(i64 %start) { ; CHECK-NEXT: br i1 [[C1_PROL]], label [[LATCH_PROL]], label [[OTHEREXIT_LOOPEXIT1:%.*]] ; CHECK: latch.prol: ; CHECK-NEXT: [[INDVARS_IV_NEXT_PROL]] = add nsw i64 [[INDVARS_IV_PROL]], 2 -; CHECK-NEXT: [[TMP6:%.*]] = icmp slt i64 [[INDVARS_IV_NEXT_PROL]], 616 +; CHECK-NEXT: [[TMP7:%.*]] = icmp slt i64 [[INDVARS_IV_NEXT_PROL]], 616 ; CHECK-NEXT: [[PROL_ITER_NEXT]] = add i64 [[PROL_ITER]], 1 ; CHECK-NEXT: [[PROL_ITER_CMP:%.*]] = icmp ne i64 [[PROL_ITER_NEXT]], [[XTRAITER]] ; CHECK-NEXT: br i1 [[PROL_ITER_CMP]], label [[HEADER_PROL]], label [[HEADER_PROL_LOOPEXIT_UNR_LCSSA:%.*]], !llvm.loop [[LOOP9:![0-9]+]] @@ -682,8 +688,8 @@ define void @test6(i64 %start) { ; CHECK-NEXT: br label [[HEADER_PROL_LOOPEXIT]] ; CHECK: header.prol.loopexit: ; CHECK-NEXT: [[INDVARS_IV_UNR:%.*]] = phi i64 [ [[START]], [[ENTRY:%.*]] ], [ [[INDVARS_IV_UNR_PH]], [[HEADER_PROL_LOOPEXIT_UNR_LCSSA]] ] -; CHECK-NEXT: [[TMP7:%.*]] = icmp ult i64 [[TMP3]], 3 -; CHECK-NEXT: br i1 [[TMP7]], label [[LATCHEXIT:%.*]], label [[ENTRY_NEW:%.*]] +; CHECK-NEXT: [[TMP8:%.*]] = icmp ult i64 [[TMP6]], 3 +; CHECK-NEXT: br i1 [[TMP8]], label [[LATCHEXIT:%.*]], label [[ENTRY_NEW:%.*]] ; CHECK: entry.new: ; CHECK-NEXT: br label [[HEADER:%.*]] ; CHECK: header: @@ -708,8 +714,8 @@ define void @test6(i64 %start) { ; CHECK-NEXT: br i1 [[C1_3]], label [[LATCH_3]], label [[OTHEREXIT_LOOPEXIT]] ; CHECK: latch.3: ; CHECK-NEXT: [[INDVARS_IV_NEXT_3]] = add nsw i64 [[INDVARS_IV_NEXT_2]], 2 -; CHECK-NEXT: [[TMP8:%.*]] = icmp slt i64 [[INDVARS_IV_NEXT_3]], 616 -; CHECK-NEXT: br i1 [[TMP8]], label [[HEADER]], label [[LATCHEXIT_UNR_LCSSA:%.*]], !llvm.loop [[LOOP10:![0-9]+]] +; CHECK-NEXT: [[TMP9:%.*]] = icmp slt i64 [[INDVARS_IV_NEXT_3]], 616 +; CHECK-NEXT: br i1 [[TMP9]], label [[HEADER]], label [[LATCHEXIT_UNR_LCSSA:%.*]], !llvm.loop [[LOOP10:![0-9]+]] ; CHECK: latchexit.unr-lcssa: ; CHECK-NEXT: br label [[LATCHEXIT]] ; CHECK: latchexit: diff --git a/llvm/test/Transforms/LoopUnroll/runtime-loop-multiple-exits.ll b/llvm/test/Transforms/LoopUnroll/runtime-loop-multiple-exits.ll index c16cf14..0750b3c 100644 --- a/llvm/test/Transforms/LoopUnroll/runtime-loop-multiple-exits.ll +++ b/llvm/test/Transforms/LoopUnroll/runtime-loop-multiple-exits.ll @@ -11,13 +11,13 @@ define void @test1(i64 %trip, i1 %cond) { ; EPILOG-LABEL: @test1( ; 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: %2 = freeze i1 %1 +; EPILOG-NEXT: %0 = freeze i64 %trip +; EPILOG-NEXT: %1 = add i64 %0, -1 +; EPILOG-NEXT: %xtraiter = and i64 %0, 7 +; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 ; EPILOG-NEXT: br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new ; EPILOG: entry.new: -; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter +; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter ; EPILOG-NEXT: br label %loop_header ; EPILOG: loop_header: ; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] @@ -130,13 +130,13 @@ define void @test1(i64 %trip, i1 %cond) { ; ; 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: %2 = freeze i1 %1 +; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip +; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 +; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 ; EPILOG-BLOCK-NEXT: br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new ; EPILOG-BLOCK: entry.new: -; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter +; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %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 ] @@ -187,11 +187,11 @@ define void @test1(i64 %trip, i1 %cond) { ; ; PROLOG-LABEL: @test1( ; PROLOG-NEXT: entry: -; PROLOG-NEXT: %0 = add i64 %trip, -1 -; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 +; PROLOG-NEXT: %0 = freeze i64 %trip +; PROLOG-NEXT: %1 = add i64 %0, -1 +; PROLOG-NEXT: %xtraiter = and i64 %0, 7 ; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-NEXT: br i1 %1, label %loop_header.prol.preheader, label %loop_header.prol.loopexit +; 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: @@ -213,7 +213,7 @@ define void @test1(i64 %trip, i1 %cond) { ; 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: %2 = icmp ult i64 %0, 7 +; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 ; PROLOG-NEXT: br i1 %2, label %exit2.loopexit, label %entry.new ; PROLOG: entry.new: ; PROLOG-NEXT: br label %loop_header @@ -296,11 +296,11 @@ define void @test1(i64 %trip, i1 %cond) { ; ; 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: %0 = freeze i64 %trip +; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 ; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-BLOCK-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-BLOCK-NEXT: br i1 %1, label %loop_header.prol.preheader, label %loop_header.prol.loopexit +; 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: @@ -313,7 +313,7 @@ define void @test1(i64 %trip, i1 %cond) { ; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit ; PROLOG-BLOCK: loop_header.prol.loopexit: ; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] -; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %0, 1 +; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 ; PROLOG-BLOCK-NEXT: br i1 %2, label %exit2.loopexit, label %entry.new ; PROLOG-BLOCK: entry.new: ; PROLOG-BLOCK-NEXT: br label %loop_header @@ -386,13 +386,13 @@ exit2.loopexit: define i32 @test2(i32* nocapture %a, i64 %n) { ; 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: %2 = freeze i1 %1 +; EPILOG-NEXT: %0 = freeze i64 %n +; EPILOG-NEXT: %1 = add i64 %0, -1 +; EPILOG-NEXT: %xtraiter = and i64 %0, 7 +; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 ; EPILOG-NEXT: br i1 %2, label %for.end.unr-lcssa, label %entry.new ; EPILOG: entry.new: -; EPILOG-NEXT: %unroll_iter = sub i64 %n, %xtraiter +; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter ; EPILOG-NEXT: br label %header ; EPILOG: header: ; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %for.body.7 ] @@ -528,13 +528,13 @@ define i32 @test2(i32* nocapture %a, i64 %n) { ; ; 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: %2 = freeze i1 %1 +; EPILOG-BLOCK-NEXT: %0 = freeze i64 %n +; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 +; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 ; EPILOG-BLOCK-NEXT: br i1 %2, label %for.end.unr-lcssa, label %entry.new ; EPILOG-BLOCK: entry.new: -; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %n, %xtraiter +; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %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 ] @@ -597,11 +597,11 @@ define i32 @test2(i32* nocapture %a, i64 %n) { ; ; PROLOG-LABEL: @test2( ; PROLOG-NEXT: entry: -; PROLOG-NEXT: %0 = add i64 %n, -1 -; PROLOG-NEXT: %xtraiter = and i64 %n, 7 +; PROLOG-NEXT: %0 = freeze i64 %n +; PROLOG-NEXT: %1 = add i64 %0, -1 +; PROLOG-NEXT: %xtraiter = and i64 %0, 7 ; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-NEXT: br i1 %1, label %header.prol.preheader, label %header.prol.loopexit +; 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: @@ -630,7 +630,7 @@ define i32 @test2(i32* nocapture %a, i64 %n) { ; 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: %3 = icmp ult i64 %0, 7 +; PROLOG-NEXT: %3 = icmp ult i64 %1, 7 ; PROLOG-NEXT: br i1 %3, label %for.end, label %entry.new ; PROLOG: entry.new: ; PROLOG-NEXT: br label %header @@ -729,11 +729,11 @@ define i32 @test2(i32* nocapture %a, i64 %n) { ; ; 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: %0 = freeze i64 %n +; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 ; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-BLOCK-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-BLOCK-NEXT: br i1 %1, label %header.prol.preheader, label %header.prol.loopexit +; 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: @@ -748,7 +748,7 @@ define i32 @test2(i32* nocapture %a, i64 %n) { ; PROLOG-BLOCK-NEXT: %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %2, %for.body.prol ] ; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %for.body.prol ] ; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %for.body.prol ] -; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %0, 1 +; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %1, 1 ; PROLOG-BLOCK-NEXT: br i1 %3, label %for.end, label %entry.new ; PROLOG-BLOCK: entry.new: ; PROLOG-BLOCK-NEXT: br label %header @@ -824,13 +824,13 @@ for.exit2: define void @test3(i64 %trip, i64 %add) { ; EPILOG-LABEL: @test3( ; 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: %2 = freeze i1 %1 +; EPILOG-NEXT: %0 = freeze i64 %trip +; EPILOG-NEXT: %1 = add i64 %0, -1 +; EPILOG-NEXT: %xtraiter = and i64 %0, 7 +; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 ; EPILOG-NEXT: br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new ; EPILOG: entry.new: -; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter +; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter ; EPILOG-NEXT: br label %loop_header ; EPILOG: loop_header: ; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] @@ -965,13 +965,13 @@ define void @test3(i64 %trip, i64 %add) { ; ; 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: %2 = freeze i1 %1 +; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip +; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 +; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 ; EPILOG-BLOCK-NEXT: br i1 %2, label %exit2.loopexit.unr-lcssa, label %entry.new ; EPILOG-BLOCK: entry.new: -; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter +; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %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 ] @@ -1030,11 +1030,11 @@ define void @test3(i64 %trip, i64 %add) { ; ; PROLOG-LABEL: @test3( ; PROLOG-NEXT: entry: -; PROLOG-NEXT: %0 = add i64 %trip, -1 -; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 +; PROLOG-NEXT: %0 = freeze i64 %trip +; PROLOG-NEXT: %1 = add i64 %0, -1 +; PROLOG-NEXT: %xtraiter = and i64 %0, 7 ; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-NEXT: br i1 %1, label %loop_header.prol.preheader, label %loop_header.prol.loopexit +; 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: @@ -1061,7 +1061,7 @@ define void @test3(i64 %trip, i64 %add) { ; 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: %2 = icmp ult i64 %0, 7 +; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 ; PROLOG-NEXT: br i1 %2, label %exit2.loopexit, label %entry.new ; PROLOG: entry.new: ; PROLOG-NEXT: br label %loop_header @@ -1161,11 +1161,11 @@ define void @test3(i64 %trip, i64 %add) { ; ; 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: %0 = freeze i64 %trip +; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 ; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-BLOCK-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-BLOCK-NEXT: br i1 %1, label %loop_header.prol.preheader, label %loop_header.prol.loopexit +; 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: @@ -1180,7 +1180,7 @@ define void @test3(i64 %trip, i64 %add) { ; PROLOG-BLOCK: loop_header.prol.loopexit: ; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] ; PROLOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %add, %loop_latch.prol ] -; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %0, 1 +; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 ; PROLOG-BLOCK-NEXT: br i1 %2, label %exit2.loopexit, label %entry.new ; PROLOG-BLOCK: entry.new: ; PROLOG-BLOCK-NEXT: br label %loop_header @@ -1256,13 +1256,13 @@ exit2.loopexit: define i32 @hdr_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) { ; EPILOG-LABEL: @hdr_latch_same_exit( ; 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: %2 = freeze i1 %1 +; EPILOG-NEXT: %0 = freeze i64 %n +; EPILOG-NEXT: %1 = add i64 %0, -1 +; 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 %entry.new ; EPILOG: entry.new: -; EPILOG-NEXT: %unroll_iter = sub i64 %n, %xtraiter +; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter ; EPILOG-NEXT: br label %header ; EPILOG: header: ; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] @@ -1401,13 +1401,13 @@ define i32 @hdr_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) { ; ; EPILOG-BLOCK-LABEL: @hdr_latch_same_exit( ; 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: %2 = freeze i1 %1 +; EPILOG-BLOCK-NEXT: %0 = freeze i64 %n +; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; 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 %entry.new ; EPILOG-BLOCK: entry.new: -; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %n, %xtraiter +; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %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 ] @@ -1474,11 +1474,11 @@ define i32 @hdr_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) { ; ; PROLOG-LABEL: @hdr_latch_same_exit( ; PROLOG-NEXT: entry: -; PROLOG-NEXT: %0 = add i64 %n, -1 -; PROLOG-NEXT: %xtraiter = and i64 %n, 7 +; PROLOG-NEXT: %0 = freeze i64 %n +; PROLOG-NEXT: %1 = add i64 %0, -1 +; PROLOG-NEXT: %xtraiter = and i64 %0, 7 ; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-NEXT: br i1 %1, label %header.prol.preheader, label %header.prol.loopexit +; 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: @@ -1507,7 +1507,7 @@ define i32 @hdr_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) { ; PROLOG-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %result.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: %3 = icmp ult i64 %0, 7 +; PROLOG-NEXT: %3 = icmp ult i64 %1, 7 ; PROLOG-NEXT: br i1 %3, label %latchExit, label %entry.new ; PROLOG: entry.new: ; PROLOG-NEXT: br label %header @@ -1609,11 +1609,11 @@ define i32 @hdr_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) { ; ; PROLOG-BLOCK-LABEL: @hdr_latch_same_exit( ; PROLOG-BLOCK-NEXT: entry: -; PROLOG-BLOCK-NEXT: %0 = add i64 %n, -1 -; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 +; PROLOG-BLOCK-NEXT: %0 = freeze i64 %n +; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 ; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-BLOCK-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-BLOCK-NEXT: br i1 %1, label %header.prol.preheader, label %header.prol.loopexit +; 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: @@ -1628,7 +1628,7 @@ define i32 @hdr_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) { ; PROLOG-BLOCK-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %2, %latch.prol ] ; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ] ; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ] -; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %0, 1 +; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %1, 1 ; PROLOG-BLOCK-NEXT: br i1 %3, label %latchExit, label %entry.new ; PROLOG-BLOCK: entry.new: ; PROLOG-BLOCK-NEXT: br label %header @@ -1704,13 +1704,13 @@ for.exit2: define i32 @otherblock_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) { ; EPILOG-LABEL: @otherblock_latch_same_exit( ; 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: %2 = freeze i1 %1 +; EPILOG-NEXT: %0 = freeze i64 %n +; EPILOG-NEXT: %1 = add i64 %0, -1 +; 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 %entry.new ; EPILOG: entry.new: -; EPILOG-NEXT: %unroll_iter = sub i64 %n, %xtraiter +; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter ; EPILOG-NEXT: br label %header ; EPILOG: header: ; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] @@ -1849,13 +1849,13 @@ define i32 @otherblock_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) { ; ; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit( ; 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: %2 = freeze i1 %1 +; EPILOG-BLOCK-NEXT: %0 = freeze i64 %n +; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; 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 %entry.new ; EPILOG-BLOCK: entry.new: -; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %n, %xtraiter +; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %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 ] @@ -1922,11 +1922,11 @@ define i32 @otherblock_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) { ; ; PROLOG-LABEL: @otherblock_latch_same_exit( ; PROLOG-NEXT: entry: -; PROLOG-NEXT: %0 = add i64 %n, -1 -; PROLOG-NEXT: %xtraiter = and i64 %n, 7 +; PROLOG-NEXT: %0 = freeze i64 %n +; PROLOG-NEXT: %1 = add i64 %0, -1 +; PROLOG-NEXT: %xtraiter = and i64 %0, 7 ; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-NEXT: br i1 %1, label %header.prol.preheader, label %header.prol.loopexit +; 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: @@ -1955,7 +1955,7 @@ define i32 @otherblock_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) { ; PROLOG-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %result.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: %3 = icmp ult i64 %0, 7 +; PROLOG-NEXT: %3 = icmp ult i64 %1, 7 ; PROLOG-NEXT: br i1 %3, label %latchExit, label %entry.new ; PROLOG: entry.new: ; PROLOG-NEXT: br label %header @@ -2057,11 +2057,11 @@ define i32 @otherblock_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) { ; ; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit( ; PROLOG-BLOCK-NEXT: entry: -; PROLOG-BLOCK-NEXT: %0 = add i64 %n, -1 -; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 +; PROLOG-BLOCK-NEXT: %0 = freeze i64 %n +; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 ; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-BLOCK-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-BLOCK-NEXT: br i1 %1, label %header.prol.preheader, label %header.prol.loopexit +; 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: @@ -2076,7 +2076,7 @@ define i32 @otherblock_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) { ; PROLOG-BLOCK-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %2, %latch.prol ] ; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ] ; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ] -; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %0, 1 +; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %1, 1 ; PROLOG-BLOCK-NEXT: br i1 %3, label %latchExit, label %entry.new ; PROLOG-BLOCK: entry.new: ; PROLOG-BLOCK-NEXT: br label %header @@ -2153,13 +2153,13 @@ for.exit2: define i32 @otherblock_latch_same_exit2(i32* nocapture %a, i64 %n, i1 %cond) { ; EPILOG-LABEL: @otherblock_latch_same_exit2( ; 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: %2 = freeze i1 %1 +; EPILOG-NEXT: %0 = freeze i64 %n +; EPILOG-NEXT: %1 = add i64 %0, -1 +; 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 %entry.new ; EPILOG: entry.new: -; EPILOG-NEXT: %unroll_iter = sub i64 %n, %xtraiter +; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter ; EPILOG-NEXT: br label %header ; EPILOG: header: ; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] @@ -2298,13 +2298,13 @@ define i32 @otherblock_latch_same_exit2(i32* nocapture %a, i64 %n, i1 %cond) { ; ; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit2( ; 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: %2 = freeze i1 %1 +; EPILOG-BLOCK-NEXT: %0 = freeze i64 %n +; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; 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 %entry.new ; EPILOG-BLOCK: entry.new: -; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %n, %xtraiter +; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %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 ] @@ -2371,11 +2371,11 @@ define i32 @otherblock_latch_same_exit2(i32* nocapture %a, i64 %n, i1 %cond) { ; ; PROLOG-LABEL: @otherblock_latch_same_exit2( ; PROLOG-NEXT: entry: -; PROLOG-NEXT: %0 = add i64 %n, -1 -; PROLOG-NEXT: %xtraiter = and i64 %n, 7 +; PROLOG-NEXT: %0 = freeze i64 %n +; PROLOG-NEXT: %1 = add i64 %0, -1 +; PROLOG-NEXT: %xtraiter = and i64 %0, 7 ; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-NEXT: br i1 %1, label %header.prol.preheader, label %header.prol.loopexit +; 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: @@ -2404,7 +2404,7 @@ define i32 @otherblock_latch_same_exit2(i32* nocapture %a, i64 %n, i1 %cond) { ; PROLOG-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %result.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: %3 = icmp ult i64 %0, 7 +; PROLOG-NEXT: %3 = icmp ult i64 %1, 7 ; PROLOG-NEXT: br i1 %3, label %latchExit, label %entry.new ; PROLOG: entry.new: ; PROLOG-NEXT: br label %header @@ -2506,11 +2506,11 @@ define i32 @otherblock_latch_same_exit2(i32* nocapture %a, i64 %n, i1 %cond) { ; ; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit2( ; PROLOG-BLOCK-NEXT: entry: -; PROLOG-BLOCK-NEXT: %0 = add i64 %n, -1 -; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 +; PROLOG-BLOCK-NEXT: %0 = freeze i64 %n +; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 ; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-BLOCK-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-BLOCK-NEXT: br i1 %1, label %header.prol.preheader, label %header.prol.loopexit +; 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: @@ -2525,7 +2525,7 @@ define i32 @otherblock_latch_same_exit2(i32* nocapture %a, i64 %n, i1 %cond) { ; PROLOG-BLOCK-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %2, %latch.prol ] ; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ] ; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ] -; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %0, 1 +; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %1, 1 ; PROLOG-BLOCK-NEXT: br i1 %3, label %latchExit, label %entry.new ; PROLOG-BLOCK: entry.new: ; PROLOG-BLOCK-NEXT: br label %header @@ -2603,13 +2603,13 @@ for.exit2: define i32 @otherblock_latch_same_exit3(i32* nocapture %a, i64 %n, i1 %cond) { ; EPILOG-LABEL: @otherblock_latch_same_exit3( ; 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: %2 = freeze i1 %1 +; EPILOG-NEXT: %0 = freeze i64 %n +; EPILOG-NEXT: %1 = add i64 %0, -1 +; 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 %entry.new ; EPILOG: entry.new: -; EPILOG-NEXT: %unroll_iter = sub i64 %n, %xtraiter +; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter ; EPILOG-NEXT: br label %header ; EPILOG: header: ; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] @@ -2748,13 +2748,13 @@ define i32 @otherblock_latch_same_exit3(i32* nocapture %a, i64 %n, i1 %cond) { ; ; EPILOG-BLOCK-LABEL: @otherblock_latch_same_exit3( ; 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: %2 = freeze i1 %1 +; EPILOG-BLOCK-NEXT: %0 = freeze i64 %n +; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; 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 %entry.new ; EPILOG-BLOCK: entry.new: -; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %n, %xtraiter +; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %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 ] @@ -2821,11 +2821,11 @@ define i32 @otherblock_latch_same_exit3(i32* nocapture %a, i64 %n, i1 %cond) { ; ; PROLOG-LABEL: @otherblock_latch_same_exit3( ; PROLOG-NEXT: entry: -; PROLOG-NEXT: %0 = add i64 %n, -1 -; PROLOG-NEXT: %xtraiter = and i64 %n, 7 +; PROLOG-NEXT: %0 = freeze i64 %n +; PROLOG-NEXT: %1 = add i64 %0, -1 +; PROLOG-NEXT: %xtraiter = and i64 %0, 7 ; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-NEXT: br i1 %1, label %header.prol.preheader, label %header.prol.loopexit +; 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: @@ -2854,7 +2854,7 @@ define i32 @otherblock_latch_same_exit3(i32* nocapture %a, i64 %n, i1 %cond) { ; PROLOG-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %result.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: %3 = icmp ult i64 %0, 7 +; PROLOG-NEXT: %3 = icmp ult i64 %1, 7 ; PROLOG-NEXT: br i1 %3, label %latchExit, label %entry.new ; PROLOG: entry.new: ; PROLOG-NEXT: br label %header @@ -2956,11 +2956,11 @@ define i32 @otherblock_latch_same_exit3(i32* nocapture %a, i64 %n, i1 %cond) { ; ; PROLOG-BLOCK-LABEL: @otherblock_latch_same_exit3( ; PROLOG-BLOCK-NEXT: entry: -; PROLOG-BLOCK-NEXT: %0 = add i64 %n, -1 -; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %n, 1 +; PROLOG-BLOCK-NEXT: %0 = freeze i64 %n +; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 ; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-BLOCK-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-BLOCK-NEXT: br i1 %1, label %header.prol.preheader, label %header.prol.loopexit +; 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: @@ -2975,7 +2975,7 @@ define i32 @otherblock_latch_same_exit3(i32* nocapture %a, i64 %n, i1 %cond) { ; PROLOG-BLOCK-NEXT: %result.unr = phi i32 [ undef, %entry ], [ %2, %latch.prol ] ; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ] ; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %2, %latch.prol ] -; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %0, 1 +; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %1, 1 ; PROLOG-BLOCK-NEXT: br i1 %3, label %latchExit, label %entry.new ; PROLOG-BLOCK: entry.new: ; PROLOG-BLOCK-NEXT: br label %header @@ -3097,13 +3097,13 @@ define void @unique_exit(i32 %N, i32 %M) { ; EPILOG-NEXT: preheader: ; EPILOG-NEXT: %M.shifted = shl i32 %M, 3 ; EPILOG-NEXT: %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1) -; EPILOG-NEXT: %0 = add i32 %umax, -1 -; EPILOG-NEXT: %xtraiter = and i32 %umax, 7 -; EPILOG-NEXT: %1 = icmp ult i32 %0, 7 -; EPILOG-NEXT: %2 = freeze i1 %1 +; EPILOG-NEXT: %0 = freeze i32 %umax +; EPILOG-NEXT: %1 = add i32 %0, -1 +; EPILOG-NEXT: %xtraiter = and i32 %0, 7 +; EPILOG-NEXT: %2 = icmp ult i32 %1, 7 ; EPILOG-NEXT: br i1 %2, label %latchExit.unr-lcssa, label %preheader.new ; EPILOG: preheader.new: -; EPILOG-NEXT: %unroll_iter = sub i32 %umax, %xtraiter +; EPILOG-NEXT: %unroll_iter = sub i32 %0, %xtraiter ; EPILOG-NEXT: br label %header ; EPILOG: header: ; EPILOG-NEXT: %i4 = phi i32 [ 0, %preheader.new ], [ %inc.7, %latch.7 ] @@ -3189,13 +3189,13 @@ define void @unique_exit(i32 %N, i32 %M) { ; EPILOG-BLOCK-NEXT: preheader: ; EPILOG-BLOCK-NEXT: %M.shifted = shl i32 %M, 3 ; EPILOG-BLOCK-NEXT: %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1) -; EPILOG-BLOCK-NEXT: %0 = add i32 %umax, -1 -; EPILOG-BLOCK-NEXT: %xtraiter = and i32 %umax, 1 -; EPILOG-BLOCK-NEXT: %1 = icmp ult i32 %0, 1 -; EPILOG-BLOCK-NEXT: %2 = freeze i1 %1 +; EPILOG-BLOCK-NEXT: %0 = freeze i32 %umax +; EPILOG-BLOCK-NEXT: %1 = add i32 %0, -1 +; EPILOG-BLOCK-NEXT: %xtraiter = and i32 %0, 1 +; EPILOG-BLOCK-NEXT: %2 = icmp ult i32 %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 i32 %umax, %xtraiter +; EPILOG-BLOCK-NEXT: %unroll_iter = sub i32 %0, %xtraiter ; EPILOG-BLOCK-NEXT: br label %header ; EPILOG-BLOCK: header: ; EPILOG-BLOCK-NEXT: %i4 = phi i32 [ 0, %preheader.new ], [ %inc.1, %latch.1 ] @@ -3243,11 +3243,11 @@ define void @unique_exit(i32 %N, i32 %M) { ; PROLOG-NEXT: preheader: ; PROLOG-NEXT: %M.shifted = shl i32 %M, 3 ; PROLOG-NEXT: %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1) -; PROLOG-NEXT: %0 = add i32 %umax, -1 -; PROLOG-NEXT: %xtraiter = and i32 %umax, 7 +; PROLOG-NEXT: %0 = freeze i32 %umax +; PROLOG-NEXT: %1 = add i32 %0, -1 +; PROLOG-NEXT: %xtraiter = and i32 %0, 7 ; PROLOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 -; PROLOG-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-NEXT: br i1 %1, label %header.prol.preheader, label %header.prol.loopexit +; 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: @@ -3268,7 +3268,7 @@ define void @unique_exit(i32 %N, i32 %M) { ; PROLOG: header.prol.loopexit: ; PROLOG-NEXT: %i4.unr = phi i32 [ 0, %preheader ], [ %i4.unr.ph, %header.prol.loopexit.unr-lcssa ] ; PROLOG-NEXT: %i2.ph.unr = phi i32 [ undef, %preheader ], [ %i2.ph.unr.ph, %header.prol.loopexit.unr-lcssa ] -; PROLOG-NEXT: %2 = icmp ult i32 %0, 7 +; PROLOG-NEXT: %2 = icmp ult i32 %1, 7 ; PROLOG-NEXT: br i1 %2, label %latchExit, label %preheader.new ; PROLOG: preheader.new: ; PROLOG-NEXT: br label %header @@ -3325,11 +3325,11 @@ define void @unique_exit(i32 %N, i32 %M) { ; PROLOG-BLOCK-NEXT: preheader: ; PROLOG-BLOCK-NEXT: %M.shifted = shl i32 %M, 3 ; PROLOG-BLOCK-NEXT: %umax = call i32 @llvm.umax.i32(i32 %M.shifted, i32 1) -; PROLOG-BLOCK-NEXT: %0 = add i32 %umax, -1 -; PROLOG-BLOCK-NEXT: %xtraiter = and i32 %umax, 1 +; PROLOG-BLOCK-NEXT: %0 = freeze i32 %umax +; PROLOG-BLOCK-NEXT: %1 = add i32 %0, -1 +; PROLOG-BLOCK-NEXT: %xtraiter = and i32 %0, 1 ; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 -; PROLOG-BLOCK-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-BLOCK-NEXT: br i1 %1, label %header.prol.preheader, label %header.prol.loopexit +; 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: @@ -3340,7 +3340,7 @@ define void @unique_exit(i32 %N, i32 %M) { ; PROLOG-BLOCK: header.prol.loopexit: ; PROLOG-BLOCK-NEXT: %i4.unr = phi i32 [ 0, %preheader ], [ 1, %latch.prol ] ; PROLOG-BLOCK-NEXT: %i2.ph.unr = phi i32 [ undef, %preheader ], [ -1, %latch.prol ] -; PROLOG-BLOCK-NEXT: %2 = icmp ult i32 %0, 1 +; PROLOG-BLOCK-NEXT: %2 = icmp ult i32 %1, 1 ; PROLOG-BLOCK-NEXT: br i1 %2, label %latchExit, label %preheader.new ; PROLOG-BLOCK: preheader.new: ; PROLOG-BLOCK-NEXT: br label %header @@ -3392,13 +3392,13 @@ latchExit: ; preds = %header, %latch define i64 @test5(i64 %trip, i64 %add, i1 %cond) { ; 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: %2 = freeze i1 %1 +; EPILOG-NEXT: %0 = freeze i64 %trip +; EPILOG-NEXT: %1 = add i64 %0, -1 +; 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 %entry.new ; EPILOG: entry.new: -; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter +; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter ; EPILOG-NEXT: br label %loop_header ; EPILOG: loop_header: ; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] @@ -3543,13 +3543,13 @@ define i64 @test5(i64 %trip, i64 %add, i1 %cond) { ; ; 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: %2 = freeze i1 %1 +; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip +; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; 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 %entry.new ; EPILOG-BLOCK: entry.new: -; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter +; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %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 ] @@ -3615,11 +3615,11 @@ define i64 @test5(i64 %trip, i64 %add, i1 %cond) { ; ; PROLOG-LABEL: @test5( ; PROLOG-NEXT: entry: -; PROLOG-NEXT: %0 = add i64 %trip, -1 -; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 +; PROLOG-NEXT: %0 = freeze i64 %trip +; PROLOG-NEXT: %1 = add i64 %0, -1 +; PROLOG-NEXT: %xtraiter = and i64 %0, 7 ; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-NEXT: br i1 %1, label %loop_header.prol.preheader, label %loop_header.prol.loopexit +; 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: @@ -3649,7 +3649,7 @@ define i64 @test5(i64 %trip, i64 %add, i1 %cond) { ; 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: %2 = icmp ult i64 %0, 7 +; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 ; PROLOG-NEXT: br i1 %2, label %latchexit, label %entry.new ; PROLOG: entry.new: ; PROLOG-NEXT: br label %loop_header @@ -3756,11 +3756,11 @@ define i64 @test5(i64 %trip, i64 %add, i1 %cond) { ; ; 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: %0 = freeze i64 %trip +; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 ; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-BLOCK-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-BLOCK-NEXT: br i1 %1, label %loop_header.prol.preheader, label %loop_header.prol.loopexit +; 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: @@ -3776,7 +3776,7 @@ define i64 @test5(i64 %trip, i64 %add, i1 %cond) { ; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] ; PROLOG-BLOCK-NEXT: %sum.unr = phi i64 [ 0, %entry ], [ %add, %loop_latch.prol ] ; PROLOG-BLOCK-NEXT: %sum.next.lcssa.unr = phi i64 [ undef, %entry ], [ %add, %loop_latch.prol ] -; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %0, 1 +; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 ; PROLOG-BLOCK-NEXT: br i1 %2, label %latchexit, label %entry.new ; PROLOG-BLOCK: entry.new: ; PROLOG-BLOCK-NEXT: br label %loop_header @@ -3852,13 +3852,13 @@ latchexit: define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) { ; 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: %2 = freeze i1 %1 +; EPILOG-NEXT: %0 = freeze i64 %n +; EPILOG-NEXT: %1 = add i64 %0, -1 +; EPILOG-NEXT: %xtraiter = and i64 %0, 7 +; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 ; EPILOG-NEXT: br i1 %2, label %latch_exit.unr-lcssa, label %entry.new ; EPILOG: entry.new: -; EPILOG-NEXT: %unroll_iter = sub i64 %n, %xtraiter +; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter ; EPILOG-NEXT: br label %header ; EPILOG: header: ; EPILOG-NEXT: %indvars.iv = phi i64 [ 0, %entry.new ], [ %indvars.iv.next.7, %latch.7 ] @@ -3999,13 +3999,13 @@ define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) { ; ; 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: %2 = freeze i1 %1 +; EPILOG-BLOCK-NEXT: %0 = freeze i64 %n +; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 +; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 ; EPILOG-BLOCK-NEXT: br i1 %2, label %latch_exit.unr-lcssa, label %entry.new ; EPILOG-BLOCK: entry.new: -; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %n, %xtraiter +; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %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 ] @@ -4073,11 +4073,11 @@ define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) { ; ; PROLOG-LABEL: @test6( ; PROLOG-NEXT: entry: -; PROLOG-NEXT: %0 = add i64 %n, -1 -; PROLOG-NEXT: %xtraiter = and i64 %n, 7 +; PROLOG-NEXT: %0 = freeze i64 %n +; PROLOG-NEXT: %1 = add i64 %0, -1 +; PROLOG-NEXT: %xtraiter = and i64 %0, 7 ; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-NEXT: br i1 %1, label %header.prol.preheader, label %header.prol.loopexit +; 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: @@ -4106,7 +4106,7 @@ define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) { ; 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: %2 = icmp ult i64 %1, 7 ; PROLOG-NEXT: br i1 %2, label %latch_exit, label %entry.new ; PROLOG: entry.new: ; PROLOG-NEXT: br label %header @@ -4210,11 +4210,11 @@ define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) { ; ; 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: %0 = freeze i64 %n +; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 ; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-BLOCK-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-BLOCK-NEXT: br i1 %1, label %header.prol.preheader, label %header.prol.loopexit +; 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: @@ -4229,7 +4229,7 @@ define i32 @test6(i32* nocapture %a, i64 %n, i1 %cond, i32 %x) { ; PROLOG-BLOCK-NEXT: %sum.0.lcssa.unr = phi i32 [ undef, %entry ], [ %load.prol, %latch.prol ] ; PROLOG-BLOCK-NEXT: %indvars.iv.unr = phi i64 [ 0, %entry ], [ 1, %latch.prol ] ; PROLOG-BLOCK-NEXT: %sum.02.unr = phi i32 [ 0, %entry ], [ %load.prol, %latch.prol ] -; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %0, 1 +; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 ; PROLOG-BLOCK-NEXT: br i1 %2, label %latch_exit, label %entry.new ; PROLOG-BLOCK: entry.new: ; PROLOG-BLOCK-NEXT: br label %header @@ -4321,13 +4321,13 @@ define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) { ; 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: %3 = freeze i1 %2 +; EPILOG-NEXT: %1 = freeze i64 %0 +; EPILOG-NEXT: %2 = add i64 %1, -1 +; EPILOG-NEXT: %xtraiter = and i64 %1, 7 +; EPILOG-NEXT: %3 = icmp ult i64 %2, 7 ; EPILOG-NEXT: br i1 %3, label %latchexit.unr-lcssa, label %preheader.new ; EPILOG: preheader.new: -; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter +; EPILOG-NEXT: %unroll_iter = sub i64 %1, %xtraiter ; EPILOG-NEXT: br label %header ; EPILOG: header: ; EPILOG-NEXT: %i6 = phi i64 [ 1, %preheader.new ], [ %add.7, %latch.7 ] @@ -4409,13 +4409,13 @@ define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) { ; 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: %3 = freeze i1 %2 +; EPILOG-BLOCK-NEXT: %1 = freeze i64 %0 +; EPILOG-BLOCK-NEXT: %2 = add i64 %1, -1 +; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %1, 1 +; EPILOG-BLOCK-NEXT: %3 = icmp ult i64 %2, 1 ; EPILOG-BLOCK-NEXT: br i1 %3, label %latchexit.unr-lcssa, label %preheader.new ; EPILOG-BLOCK: preheader.new: -; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %xtraiter +; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %1, %xtraiter ; EPILOG-BLOCK-NEXT: br label %header ; EPILOG-BLOCK: header: ; EPILOG-BLOCK-NEXT: %i6 = phi i64 [ 1, %preheader.new ], [ %add.1, %latch.1 ] @@ -4460,11 +4460,11 @@ define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) { ; 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: %1 = freeze i64 %0 +; PROLOG-NEXT: %2 = add i64 %1, -1 +; PROLOG-NEXT: %xtraiter = and i64 %1, 7 ; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-NEXT: %2 = freeze i1 %lcmp.mod -; PROLOG-NEXT: br i1 %2, label %header.prol.preheader, label %header.prol.loopexit +; 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: @@ -4482,7 +4482,7 @@ define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) { ; 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: %3 = icmp ult i64 %1, 7 +; PROLOG-NEXT: %3 = icmp ult i64 %2, 7 ; PROLOG-NEXT: br i1 %3, label %latchexit, label %preheader.new ; PROLOG: preheader.new: ; PROLOG-NEXT: br label %header @@ -4538,11 +4538,11 @@ define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) { ; 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: %1 = freeze i64 %0 +; PROLOG-BLOCK-NEXT: %2 = add i64 %1, -1 +; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %1, 1 ; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-BLOCK-NEXT: %2 = freeze i1 %lcmp.mod -; PROLOG-BLOCK-NEXT: br i1 %2, label %header.prol.preheader, label %header.prol.loopexit +; 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: @@ -4551,7 +4551,7 @@ define i32 @test7(i32 %arg, i32 %arg1, i32 %arg2) { ; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit ; PROLOG-BLOCK: header.prol.loopexit: ; PROLOG-BLOCK-NEXT: %i6.unr = phi i64 [ 1, %preheader ], [ 2, %latch.prol ] -; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %1, 1 +; PROLOG-BLOCK-NEXT: %3 = icmp ult i64 %2, 1 ; PROLOG-BLOCK-NEXT: br i1 %3, label %latchexit, label %preheader.new ; PROLOG-BLOCK: preheader.new: ; PROLOG-BLOCK-NEXT: br label %header @@ -4940,7 +4940,6 @@ define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) { ; EPILOG-LABEL: @test9( ; EPILOG-NEXT: bb: ; EPILOG-NEXT: %0 = add i32 %n, -1 -; EPILOG-NEXT: %1 = add i32 %n, -2 ; EPILOG-NEXT: br label %outerloopHdr ; EPILOG: outerloopHdr: ; EPILOG-NEXT: %trip = add i32 %n, -1 @@ -4948,12 +4947,13 @@ define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) { ; EPILOG-NEXT: br i1 %outercnd, label %preheader, label %outerLatch ; EPILOG: preheader: ; EPILOG-NEXT: %i4 = zext i32 0 to i64 -; EPILOG-NEXT: %xtraiter = and i32 %0, 7 -; EPILOG-NEXT: %2 = icmp ult i32 %1, 7 -; EPILOG-NEXT: %3 = freeze i1 %2 +; EPILOG-NEXT: %1 = freeze i32 %0 +; EPILOG-NEXT: %2 = add i32 %1, -1 +; EPILOG-NEXT: %xtraiter = and i32 %1, 7 +; EPILOG-NEXT: %3 = icmp ult i32 %2, 7 ; EPILOG-NEXT: br i1 %3, label %outerLatch.loopexit.unr-lcssa, label %preheader.new ; EPILOG: preheader.new: -; EPILOG-NEXT: %unroll_iter = sub i32 %0, %xtraiter +; EPILOG-NEXT: %unroll_iter = sub i32 %1, %xtraiter ; EPILOG-NEXT: br label %header ; EPILOG: header: ; EPILOG-NEXT: %phi = phi i64 [ %i4, %preheader.new ], [ %iv.next.7, %latch.7 ] @@ -5033,19 +5033,19 @@ define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) { ; EPILOG-BLOCK-LABEL: @test9( ; EPILOG-BLOCK-NEXT: bb: ; EPILOG-BLOCK-NEXT: %0 = add i32 %n, -1 -; EPILOG-BLOCK-NEXT: %1 = add i32 %n, -2 ; 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: %xtraiter = and i32 %0, 1 -; EPILOG-BLOCK-NEXT: %2 = icmp ult i32 %1, 1 -; EPILOG-BLOCK-NEXT: %3 = freeze i1 %2 +; EPILOG-BLOCK-NEXT: %1 = freeze i32 %0 +; EPILOG-BLOCK-NEXT: %2 = add i32 %1, -1 +; EPILOG-BLOCK-NEXT: %xtraiter = and i32 %1, 1 +; EPILOG-BLOCK-NEXT: %3 = icmp ult i32 %2, 1 ; EPILOG-BLOCK-NEXT: br i1 %3, label %outerLatch.loopexit.unr-lcssa, label %preheader.new ; EPILOG-BLOCK: preheader.new: -; EPILOG-BLOCK-NEXT: %unroll_iter = sub i32 %0, %xtraiter +; EPILOG-BLOCK-NEXT: %unroll_iter = sub i32 %1, %xtraiter ; EPILOG-BLOCK-NEXT: br label %header ; EPILOG-BLOCK: header: ; EPILOG-BLOCK-NEXT: %phi = phi i64 [ 0, %preheader.new ], [ %iv.next.1, %latch.1 ] @@ -5094,12 +5094,13 @@ define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) { ; 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: preheader.1: -; EPILOG-BLOCK-NEXT: %xtraiter.1 = and i32 %0, 1 -; EPILOG-BLOCK-NEXT: %4 = icmp ult i32 %1, 1 -; EPILOG-BLOCK-NEXT: %5 = freeze i1 %4 -; EPILOG-BLOCK-NEXT: br i1 %5, label %outerLatch.loopexit.unr-lcssa.1, label %preheader.new.1 +; EPILOG-BLOCK-NEXT: %4 = freeze i32 %0 +; EPILOG-BLOCK-NEXT: %5 = add i32 %4, -1 +; EPILOG-BLOCK-NEXT: %xtraiter.1 = and i32 %4, 1 +; EPILOG-BLOCK-NEXT: %6 = icmp ult i32 %5, 1 +; EPILOG-BLOCK-NEXT: br i1 %6, label %outerLatch.loopexit.unr-lcssa.1, label %preheader.new.1 ; EPILOG-BLOCK: preheader.new.1: -; EPILOG-BLOCK-NEXT: %unroll_iter.1 = sub i32 %0, %xtraiter.1 +; EPILOG-BLOCK-NEXT: %unroll_iter.1 = sub i32 %4, %xtraiter.1 ; EPILOG-BLOCK-NEXT: br label %header.1 ; EPILOG-BLOCK: header.1: ; EPILOG-BLOCK-NEXT: %phi.1 = phi i64 [ 0, %preheader.new.1 ], [ %iv.next.1.1, %latch.1.1 ] @@ -5133,7 +5134,6 @@ define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) { ; 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 @@ -5141,10 +5141,11 @@ define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) { ; 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: %1 = freeze i32 %0 +; PROLOG-NEXT: %2 = add i32 %1, -1 +; PROLOG-NEXT: %xtraiter = and i32 %1, 7 ; PROLOG-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 -; PROLOG-NEXT: %2 = freeze i1 %lcmp.mod -; PROLOG-NEXT: br i1 %2, label %header.prol.preheader, label %header.prol.loopexit +; 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: @@ -5164,7 +5165,7 @@ define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) { ; 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: %3 = icmp ult i32 %1, 7 +; PROLOG-NEXT: %3 = icmp ult i32 %2, 7 ; PROLOG-NEXT: br i1 %3, label %outerLatch.loopexit, label %preheader.new ; PROLOG: preheader.new: ; PROLOG-NEXT: br label %header @@ -5218,17 +5219,17 @@ define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) { ; 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: %1 = freeze i32 %0 +; PROLOG-BLOCK-NEXT: %2 = add i32 %1, -1 +; PROLOG-BLOCK-NEXT: %xtraiter = and i32 %1, 1 ; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i32 %xtraiter, 0 -; PROLOG-BLOCK-NEXT: %2 = freeze i1 %lcmp.mod -; PROLOG-BLOCK-NEXT: br i1 %2, label %header.prol.preheader, label %header.prol.loopexit +; 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: @@ -5237,7 +5238,7 @@ define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) { ; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit ; PROLOG-BLOCK: header.prol.loopexit: ; PROLOG-BLOCK-NEXT: %phi.unr = phi i64 [ 0, %preheader ], [ 1, %latch.prol ] -; PROLOG-BLOCK-NEXT: %3 = icmp ult i32 %1, 1 +; PROLOG-BLOCK-NEXT: %3 = icmp ult i32 %2, 1 ; PROLOG-BLOCK-NEXT: br i1 %3, label %outerLatch.loopexit, label %preheader.new ; PROLOG-BLOCK: preheader.new: ; PROLOG-BLOCK-NEXT: br label %header @@ -5278,10 +5279,11 @@ define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) { ; 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: preheader.1: -; PROLOG-BLOCK-NEXT: %xtraiter.1 = and i32 %0, 1 +; PROLOG-BLOCK-NEXT: %4 = freeze i32 %0 +; PROLOG-BLOCK-NEXT: %5 = add i32 %4, -1 +; PROLOG-BLOCK-NEXT: %xtraiter.1 = and i32 %4, 1 ; PROLOG-BLOCK-NEXT: %lcmp.mod.1 = icmp ne i32 %xtraiter.1, 0 -; PROLOG-BLOCK-NEXT: %4 = freeze i1 %lcmp.mod.1 -; PROLOG-BLOCK-NEXT: br i1 %4, label %header.prol.preheader.1, label %header.prol.loopexit.1 +; PROLOG-BLOCK-NEXT: br i1 %lcmp.mod.1, label %header.prol.preheader.1, label %header.prol.loopexit.1 ; PROLOG-BLOCK: header.prol.preheader.1: ; PROLOG-BLOCK-NEXT: br label %header.prol.1 ; PROLOG-BLOCK: header.prol.1: @@ -5290,8 +5292,8 @@ define i8 addrspace(1)* @test9(i8* nocapture readonly %arg, i32 %n) { ; PROLOG-BLOCK-NEXT: br label %header.prol.loopexit.1 ; PROLOG-BLOCK: header.prol.loopexit.1: ; PROLOG-BLOCK-NEXT: %phi.unr.1 = phi i64 [ 0, %preheader.1 ], [ 1, %latch.prol.1 ] -; PROLOG-BLOCK-NEXT: %5 = icmp ult i32 %1, 1 -; PROLOG-BLOCK-NEXT: br i1 %5, label %outerLatch.loopexit.1, label %preheader.new.1 +; PROLOG-BLOCK-NEXT: %6 = icmp ult i32 %5, 1 +; PROLOG-BLOCK-NEXT: br i1 %6, label %outerLatch.loopexit.1, label %preheader.new.1 ; PROLOG-BLOCK: preheader.new.1: ; PROLOG-BLOCK-NEXT: br label %header.1 ; PROLOG-BLOCK: header.1: @@ -5352,13 +5354,13 @@ declare void @bar() define void @test10(i64 %trip, i64 %trip2) { ; EPILOG-LABEL: @test10( ; EPILOG-NEXT: entry: -; EPILOG-NEXT: %0 = add i64 %trip, -1 -; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 -; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 -; EPILOG-NEXT: %2 = freeze i1 %1 +; EPILOG-NEXT: %0 = freeze i64 %trip +; EPILOG-NEXT: %1 = add i64 %0, -1 +; EPILOG-NEXT: %xtraiter = and i64 %0, 7 +; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 ; EPILOG-NEXT: br i1 %2, label %exit2.unr-lcssa, label %entry.new ; EPILOG: entry.new: -; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter +; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter ; EPILOG-NEXT: br label %loop_header ; EPILOG: loop_header: ; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] @@ -5447,13 +5449,13 @@ define void @test10(i64 %trip, i64 %trip2) { ; ; EPILOG-BLOCK-LABEL: @test10( ; EPILOG-BLOCK-NEXT: entry: -; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 -; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 -; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 -; EPILOG-BLOCK-NEXT: %2 = freeze i1 %1 +; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip +; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 +; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 ; EPILOG-BLOCK-NEXT: br i1 %2, label %exit2.unr-lcssa, label %entry.new ; EPILOG-BLOCK: entry.new: -; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter +; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %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 ] @@ -5496,11 +5498,11 @@ define void @test10(i64 %trip, i64 %trip2) { ; ; PROLOG-LABEL: @test10( ; PROLOG-NEXT: entry: -; PROLOG-NEXT: %0 = add i64 %trip, -1 -; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 +; PROLOG-NEXT: %0 = freeze i64 %trip +; PROLOG-NEXT: %1 = add i64 %0, -1 +; PROLOG-NEXT: %xtraiter = and i64 %0, 7 ; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-NEXT: br i1 %1, label %loop_header.prol.preheader, label %loop_header.prol.loopexit +; 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: @@ -5520,7 +5522,7 @@ define void @test10(i64 %trip, i64 %trip2) { ; 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: %2 = icmp ult i64 %0, 7 +; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 ; PROLOG-NEXT: br i1 %2, label %exit2, label %entry.new ; PROLOG: entry.new: ; PROLOG-NEXT: br label %loop_header @@ -5581,11 +5583,11 @@ define void @test10(i64 %trip, i64 %trip2) { ; ; PROLOG-BLOCK-LABEL: @test10( ; PROLOG-BLOCK-NEXT: entry: -; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 -; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 +; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip +; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 ; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-BLOCK-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-BLOCK-NEXT: br i1 %1, label %loop_header.prol.preheader, label %loop_header.prol.loopexit +; 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: @@ -5596,7 +5598,7 @@ define void @test10(i64 %trip, i64 %trip2) { ; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit ; PROLOG-BLOCK: loop_header.prol.loopexit: ; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] -; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %0, 1 +; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 ; PROLOG-BLOCK-NEXT: br i1 %2, label %exit2, label %entry.new ; PROLOG-BLOCK: entry.new: ; PROLOG-BLOCK-NEXT: br label %loop_header @@ -5649,13 +5651,13 @@ exit2: define void @test11(i64 %trip, i1 %cond) { ; EPILOG-LABEL: @test11( ; EPILOG-NEXT: entry: -; EPILOG-NEXT: %0 = add i64 %trip, -1 -; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 -; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 -; EPILOG-NEXT: %2 = freeze i1 %1 +; EPILOG-NEXT: %0 = freeze i64 %trip +; EPILOG-NEXT: %1 = add i64 %0, -1 +; EPILOG-NEXT: %xtraiter = and i64 %0, 7 +; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 ; EPILOG-NEXT: br i1 %2, label %exit2.unr-lcssa, label %entry.new ; EPILOG: entry.new: -; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter +; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter ; EPILOG-NEXT: br label %loop_header ; EPILOG: loop_header: ; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] @@ -5735,13 +5737,13 @@ define void @test11(i64 %trip, i1 %cond) { ; ; EPILOG-BLOCK-LABEL: @test11( ; EPILOG-BLOCK-NEXT: entry: -; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 -; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 -; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 -; EPILOG-BLOCK-NEXT: %2 = freeze i1 %1 +; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip +; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 +; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 ; EPILOG-BLOCK-NEXT: br i1 %2, label %exit2.unr-lcssa, label %entry.new ; EPILOG-BLOCK: entry.new: -; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter +; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %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 ] @@ -5779,11 +5781,11 @@ define void @test11(i64 %trip, i1 %cond) { ; ; PROLOG-LABEL: @test11( ; PROLOG-NEXT: entry: -; PROLOG-NEXT: %0 = add i64 %trip, -1 -; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 +; PROLOG-NEXT: %0 = freeze i64 %trip +; PROLOG-NEXT: %1 = add i64 %0, -1 +; PROLOG-NEXT: %xtraiter = and i64 %0, 7 ; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-NEXT: br i1 %1, label %loop_header.prol.preheader, label %loop_header.prol.loopexit +; 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: @@ -5802,7 +5804,7 @@ define void @test11(i64 %trip, i1 %cond) { ; 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: %2 = icmp ult i64 %0, 7 +; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 ; PROLOG-NEXT: br i1 %2, label %exit2, label %entry.new ; PROLOG: entry.new: ; PROLOG-NEXT: br label %loop_header @@ -5855,11 +5857,11 @@ define void @test11(i64 %trip, i1 %cond) { ; ; PROLOG-BLOCK-LABEL: @test11( ; PROLOG-BLOCK-NEXT: entry: -; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 -; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 +; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip +; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 ; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-BLOCK-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-BLOCK-NEXT: br i1 %1, label %loop_header.prol.preheader, label %loop_header.prol.loopexit +; 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: @@ -5869,7 +5871,7 @@ define void @test11(i64 %trip, i1 %cond) { ; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit ; PROLOG-BLOCK: loop_header.prol.loopexit: ; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] -; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %0, 1 +; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 ; PROLOG-BLOCK-NEXT: br i1 %2, label %exit2, label %entry.new ; PROLOG-BLOCK: entry.new: ; PROLOG-BLOCK-NEXT: br label %loop_header @@ -5919,13 +5921,13 @@ exit2: define void @test12(i64 %trip, i64 %trip2, i1 %cond) { ; EPILOG-LABEL: @test12( ; EPILOG-NEXT: entry: -; EPILOG-NEXT: %0 = add i64 %trip, -1 -; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 -; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 -; EPILOG-NEXT: %2 = freeze i1 %1 +; EPILOG-NEXT: %0 = freeze i64 %trip +; EPILOG-NEXT: %1 = add i64 %0, -1 +; EPILOG-NEXT: %xtraiter = and i64 %0, 7 +; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 ; EPILOG-NEXT: br i1 %2, label %exit1.unr-lcssa, label %entry.new ; EPILOG: entry.new: -; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter +; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter ; EPILOG-NEXT: br label %loop_header ; EPILOG: loop_header: ; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] @@ -6030,13 +6032,13 @@ define void @test12(i64 %trip, i64 %trip2, i1 %cond) { ; ; EPILOG-BLOCK-LABEL: @test12( ; EPILOG-BLOCK-NEXT: entry: -; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 -; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 -; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 -; EPILOG-BLOCK-NEXT: %2 = freeze i1 %1 +; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip +; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 +; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 ; EPILOG-BLOCK-NEXT: br i1 %2, label %exit1.unr-lcssa, label %entry.new ; EPILOG-BLOCK: entry.new: -; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter +; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %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 ] @@ -6085,11 +6087,11 @@ define void @test12(i64 %trip, i64 %trip2, i1 %cond) { ; ; PROLOG-LABEL: @test12( ; PROLOG-NEXT: entry: -; PROLOG-NEXT: %0 = add i64 %trip, -1 -; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 +; PROLOG-NEXT: %0 = freeze i64 %trip +; PROLOG-NEXT: %1 = add i64 %0, -1 +; PROLOG-NEXT: %xtraiter = and i64 %0, 7 ; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-NEXT: br i1 %1, label %loop_header.prol.preheader, label %loop_header.prol.loopexit +; 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: @@ -6111,7 +6113,7 @@ define void @test12(i64 %trip, i64 %trip2, i1 %cond) { ; 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: %2 = icmp ult i64 %0, 7 +; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 ; PROLOG-NEXT: br i1 %2, label %exit1, label %entry.new ; PROLOG: entry.new: ; PROLOG-NEXT: br label %loop_header @@ -6186,11 +6188,11 @@ define void @test12(i64 %trip, i64 %trip2, i1 %cond) { ; ; PROLOG-BLOCK-LABEL: @test12( ; PROLOG-BLOCK-NEXT: entry: -; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 -; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 +; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip +; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 ; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-BLOCK-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-BLOCK-NEXT: br i1 %1, label %loop_header.prol.preheader, label %loop_header.prol.loopexit +; 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: @@ -6203,7 +6205,7 @@ define void @test12(i64 %trip, i64 %trip2, i1 %cond) { ; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit ; PROLOG-BLOCK: loop_header.prol.loopexit: ; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] -; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %0, 1 +; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 ; PROLOG-BLOCK-NEXT: br i1 %2, label %exit1, label %entry.new ; PROLOG-BLOCK: entry.new: ; PROLOG-BLOCK-NEXT: br label %loop_header @@ -6259,13 +6261,13 @@ declare i1 @unknown_cond() define void @test13(i64 %trip, i64 %trip2) { ; EPILOG-LABEL: @test13( ; EPILOG-NEXT: entry: -; EPILOG-NEXT: %0 = add i64 %trip, -1 -; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 -; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 -; EPILOG-NEXT: %2 = freeze i1 %1 +; EPILOG-NEXT: %0 = freeze i64 %trip +; EPILOG-NEXT: %1 = add i64 %0, -1 +; EPILOG-NEXT: %xtraiter = and i64 %0, 7 +; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 ; EPILOG-NEXT: br i1 %2, label %exit1.unr-lcssa, label %entry.new ; EPILOG: entry.new: -; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter +; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter ; EPILOG-NEXT: br label %loop_header ; EPILOG: loop_header: ; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] @@ -6379,13 +6381,13 @@ define void @test13(i64 %trip, i64 %trip2) { ; ; EPILOG-BLOCK-LABEL: @test13( ; EPILOG-BLOCK-NEXT: entry: -; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 -; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 -; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 -; EPILOG-BLOCK-NEXT: %2 = freeze i1 %1 +; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip +; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 +; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 ; EPILOG-BLOCK-NEXT: br i1 %2, label %exit1.unr-lcssa, label %entry.new ; EPILOG-BLOCK: entry.new: -; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter +; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %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 ] @@ -6437,11 +6439,11 @@ define void @test13(i64 %trip, i64 %trip2) { ; ; PROLOG-LABEL: @test13( ; PROLOG-NEXT: entry: -; PROLOG-NEXT: %0 = add i64 %trip, -1 -; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 +; PROLOG-NEXT: %0 = freeze i64 %trip +; PROLOG-NEXT: %1 = add i64 %0, -1 +; PROLOG-NEXT: %xtraiter = and i64 %0, 7 ; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-NEXT: br i1 %1, label %loop_header.prol.preheader, label %loop_header.prol.loopexit +; 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: @@ -6464,7 +6466,7 @@ define void @test13(i64 %trip, i64 %trip2) { ; 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: %2 = icmp ult i64 %0, 7 +; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 ; PROLOG-NEXT: br i1 %2, label %exit1, label %entry.new ; PROLOG: entry.new: ; PROLOG-NEXT: br label %loop_header @@ -6547,11 +6549,11 @@ define void @test13(i64 %trip, i64 %trip2) { ; ; PROLOG-BLOCK-LABEL: @test13( ; PROLOG-BLOCK-NEXT: entry: -; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 -; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 +; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip +; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 ; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-BLOCK-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-BLOCK-NEXT: br i1 %1, label %loop_header.prol.preheader, label %loop_header.prol.loopexit +; 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: @@ -6565,7 +6567,7 @@ define void @test13(i64 %trip, i64 %trip2) { ; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit ; PROLOG-BLOCK: loop_header.prol.loopexit: ; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] -; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %0, 1 +; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 ; PROLOG-BLOCK-NEXT: br i1 %2, label %exit1, label %entry.new ; PROLOG-BLOCK: entry.new: ; PROLOG-BLOCK-NEXT: br label %loop_header @@ -6622,13 +6624,13 @@ exit1: define void @test14(i64 %trip, i1 %cond) { ; EPILOG-LABEL: @test14( ; EPILOG-NEXT: entry: -; EPILOG-NEXT: %0 = add i64 %trip, -1 -; EPILOG-NEXT: %xtraiter = and i64 %trip, 7 -; EPILOG-NEXT: %1 = icmp ult i64 %0, 7 -; EPILOG-NEXT: %2 = freeze i1 %1 +; EPILOG-NEXT: %0 = freeze i64 %trip +; EPILOG-NEXT: %1 = add i64 %0, -1 +; EPILOG-NEXT: %xtraiter = and i64 %0, 7 +; EPILOG-NEXT: %2 = icmp ult i64 %1, 7 ; EPILOG-NEXT: br i1 %2, label %exit1.unr-lcssa, label %entry.new ; EPILOG: entry.new: -; EPILOG-NEXT: %unroll_iter = sub i64 %trip, %xtraiter +; EPILOG-NEXT: %unroll_iter = sub i64 %0, %xtraiter ; EPILOG-NEXT: br label %loop_header ; EPILOG: loop_header: ; EPILOG-NEXT: %iv = phi i64 [ 0, %entry.new ], [ %iv_next.7, %loop_latch.7 ] @@ -6733,13 +6735,13 @@ define void @test14(i64 %trip, i1 %cond) { ; ; EPILOG-BLOCK-LABEL: @test14( ; EPILOG-BLOCK-NEXT: entry: -; EPILOG-BLOCK-NEXT: %0 = add i64 %trip, -1 -; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 -; EPILOG-BLOCK-NEXT: %1 = icmp ult i64 %0, 1 -; EPILOG-BLOCK-NEXT: %2 = freeze i1 %1 +; EPILOG-BLOCK-NEXT: %0 = freeze i64 %trip +; EPILOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; EPILOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 +; EPILOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 ; EPILOG-BLOCK-NEXT: br i1 %2, label %exit1.unr-lcssa, label %entry.new ; EPILOG-BLOCK: entry.new: -; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %trip, %xtraiter +; EPILOG-BLOCK-NEXT: %unroll_iter = sub i64 %0, %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 ] @@ -6786,11 +6788,11 @@ define void @test14(i64 %trip, i1 %cond) { ; ; PROLOG-LABEL: @test14( ; PROLOG-NEXT: entry: -; PROLOG-NEXT: %0 = add i64 %trip, -1 -; PROLOG-NEXT: %xtraiter = and i64 %trip, 7 +; PROLOG-NEXT: %0 = freeze i64 %trip +; PROLOG-NEXT: %1 = add i64 %0, -1 +; PROLOG-NEXT: %xtraiter = and i64 %0, 7 ; PROLOG-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-NEXT: br i1 %1, label %loop_header.prol.preheader, label %loop_header.prol.loopexit +; 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: @@ -6812,7 +6814,7 @@ define void @test14(i64 %trip, i1 %cond) { ; 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: %2 = icmp ult i64 %0, 7 +; PROLOG-NEXT: %2 = icmp ult i64 %1, 7 ; PROLOG-NEXT: br i1 %2, label %exit1, label %entry.new ; PROLOG: entry.new: ; PROLOG-NEXT: br label %loop_header @@ -6887,11 +6889,11 @@ define void @test14(i64 %trip, i1 %cond) { ; ; PROLOG-BLOCK-LABEL: @test14( ; PROLOG-BLOCK-NEXT: entry: -; PROLOG-BLOCK-NEXT: %0 = add i64 %trip, -1 -; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %trip, 1 +; PROLOG-BLOCK-NEXT: %0 = freeze i64 %trip +; PROLOG-BLOCK-NEXT: %1 = add i64 %0, -1 +; PROLOG-BLOCK-NEXT: %xtraiter = and i64 %0, 1 ; PROLOG-BLOCK-NEXT: %lcmp.mod = icmp ne i64 %xtraiter, 0 -; PROLOG-BLOCK-NEXT: %1 = freeze i1 %lcmp.mod -; PROLOG-BLOCK-NEXT: br i1 %1, label %loop_header.prol.preheader, label %loop_header.prol.loopexit +; 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: @@ -6904,7 +6906,7 @@ define void @test14(i64 %trip, i1 %cond) { ; PROLOG-BLOCK-NEXT: br label %loop_header.prol.loopexit ; PROLOG-BLOCK: loop_header.prol.loopexit: ; PROLOG-BLOCK-NEXT: %iv.unr = phi i64 [ 0, %entry ], [ 1, %loop_latch.prol ] -; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %0, 1 +; PROLOG-BLOCK-NEXT: %2 = icmp ult i64 %1, 1 ; PROLOG-BLOCK-NEXT: br i1 %2, label %exit1, label %entry.new ; PROLOG-BLOCK: entry.new: ; PROLOG-BLOCK-NEXT: br label %loop_header diff --git a/llvm/test/Transforms/LoopUnroll/runtime-multiexit-heuristic.ll b/llvm/test/Transforms/LoopUnroll/runtime-multiexit-heuristic.ll index fc6673e..8c3ff19 100644 --- a/llvm/test/Transforms/LoopUnroll/runtime-multiexit-heuristic.ll +++ b/llvm/test/Transforms/LoopUnroll/runtime-multiexit-heuristic.ll @@ -15,13 +15,13 @@ define i32 @test1(i32* nocapture %a, i64 %n) { ; CHECK-LABEL: @test1( ; CHECK-NEXT: entry: -; CHECK-NEXT: [[N_FR:%.*]] = freeze i64 [[N:%.*]] -; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[N_FR]], -1 -; CHECK-NEXT: [[XTRAITER:%.*]] = and i64 [[N_FR]], 7 -; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i64 [[TMP0]], 7 -; CHECK-NEXT: br i1 [[TMP1]], label [[LATCHEXIT_UNR_LCSSA:%.*]], label [[ENTRY_NEW:%.*]] +; CHECK-NEXT: [[TMP0:%.*]] = freeze i64 [[N:%.*]] +; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[TMP0]], -1 +; CHECK-NEXT: [[XTRAITER:%.*]] = and i64 [[TMP0]], 7 +; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i64 [[TMP1]], 7 +; CHECK-NEXT: br i1 [[TMP2]], label [[LATCHEXIT_UNR_LCSSA:%.*]], label [[ENTRY_NEW:%.*]] ; CHECK: entry.new: -; CHECK-NEXT: [[UNROLL_ITER:%.*]] = and i64 [[N_FR]], -8 +; CHECK-NEXT: [[UNROLL_ITER:%.*]] = and i64 [[TMP0]], -8 ; CHECK-NEXT: br label [[HEADER:%.*]] ; CHECK: header: ; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY_NEW]] ], [ [[INDVARS_IV_NEXT_7:%.*]], [[LATCH_7:%.*]] ] @@ -29,75 +29,75 @@ define i32 @test1(i32* nocapture %a, i64 %n) { ; CHECK-NEXT: [[NITER:%.*]] = phi i64 [ 0, [[ENTRY_NEW]] ], [ [[NITER_NEXT_7:%.*]], [[LATCH_7]] ] ; CHECK-NEXT: br label [[FOR_EXITING_BLOCK:%.*]] ; CHECK: for.exiting_block: -; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[N_FR]], 42 +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[TMP0]], 42 ; CHECK-NEXT: br i1 [[CMP]], label [[OTHEREXIT_LOOPEXIT:%.*]], label [[LATCH:%.*]] ; CHECK: latch: ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]] -; CHECK-NEXT: [[TMP2:%.*]] = load i32, i32* [[ARRAYIDX]], align 4 -; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], [[SUM_02]] +; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* [[ARRAYIDX]], align 4 +; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP3]], [[SUM_02]] ; CHECK-NEXT: [[INDVARS_IV_NEXT:%.*]] = or i64 [[INDVARS_IV]], 1 ; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_1:%.*]] ; CHECK: for.exiting_block.1: -; CHECK-NEXT: [[CMP_1:%.*]] = icmp eq i64 [[N_FR]], 42 +; CHECK-NEXT: [[CMP_1:%.*]] = icmp eq i64 [[TMP0]], 42 ; CHECK-NEXT: br i1 [[CMP_1]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_1:%.*]] ; CHECK: latch.1: ; CHECK-NEXT: [[ARRAYIDX_1:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[INDVARS_IV_NEXT]] -; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* [[ARRAYIDX_1]], align 4 -; CHECK-NEXT: [[ADD_1:%.*]] = add nsw i32 [[TMP3]], [[ADD]] +; CHECK-NEXT: [[TMP4:%.*]] = load i32, i32* [[ARRAYIDX_1]], align 4 +; CHECK-NEXT: [[ADD_1:%.*]] = add nsw i32 [[TMP4]], [[ADD]] ; CHECK-NEXT: [[INDVARS_IV_NEXT_1:%.*]] = or i64 [[INDVARS_IV]], 2 ; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_2:%.*]] ; CHECK: for.exiting_block.2: -; CHECK-NEXT: [[CMP_2:%.*]] = icmp eq i64 [[N_FR]], 42 +; CHECK-NEXT: [[CMP_2:%.*]] = icmp eq i64 [[TMP0]], 42 ; CHECK-NEXT: br i1 [[CMP_2]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_2:%.*]] ; CHECK: latch.2: ; CHECK-NEXT: [[ARRAYIDX_2:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[INDVARS_IV_NEXT_1]] -; CHECK-NEXT: [[TMP4:%.*]] = load i32, i32* [[ARRAYIDX_2]], align 4 -; CHECK-NEXT: [[ADD_2:%.*]] = add nsw i32 [[TMP4]], [[ADD_1]] +; CHECK-NEXT: [[TMP5:%.*]] = load i32, i32* [[ARRAYIDX_2]], align 4 +; CHECK-NEXT: [[ADD_2:%.*]] = add nsw i32 [[TMP5]], [[ADD_1]] ; CHECK-NEXT: [[INDVARS_IV_NEXT_2:%.*]] = or i64 [[INDVARS_IV]], 3 ; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_3:%.*]] ; CHECK: for.exiting_block.3: -; CHECK-NEXT: [[CMP_3:%.*]] = icmp eq i64 [[N_FR]], 42 +; CHECK-NEXT: [[CMP_3:%.*]] = icmp eq i64 [[TMP0]], 42 ; CHECK-NEXT: br i1 [[CMP_3]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_3:%.*]] ; CHECK: latch.3: ; CHECK-NEXT: [[ARRAYIDX_3:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[INDVARS_IV_NEXT_2]] -; CHECK-NEXT: [[TMP5:%.*]] = load i32, i32* [[ARRAYIDX_3]], align 4 -; CHECK-NEXT: [[ADD_3:%.*]] = add nsw i32 [[TMP5]], [[ADD_2]] +; CHECK-NEXT: [[TMP6:%.*]] = load i32, i32* [[ARRAYIDX_3]], align 4 +; CHECK-NEXT: [[ADD_3:%.*]] = add nsw i32 [[TMP6]], [[ADD_2]] ; CHECK-NEXT: [[INDVARS_IV_NEXT_3:%.*]] = or i64 [[INDVARS_IV]], 4 ; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_4:%.*]] ; CHECK: for.exiting_block.4: -; CHECK-NEXT: [[CMP_4:%.*]] = icmp eq i64 [[N_FR]], 42 +; CHECK-NEXT: [[CMP_4:%.*]] = icmp eq i64 [[TMP0]], 42 ; CHECK-NEXT: br i1 [[CMP_4]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_4:%.*]] ; CHECK: latch.4: ; CHECK-NEXT: [[ARRAYIDX_4:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[INDVARS_IV_NEXT_3]] -; CHECK-NEXT: [[TMP6:%.*]] = load i32, i32* [[ARRAYIDX_4]], align 4 -; CHECK-NEXT: [[ADD_4:%.*]] = add nsw i32 [[TMP6]], [[ADD_3]] +; CHECK-NEXT: [[TMP7:%.*]] = load i32, i32* [[ARRAYIDX_4]], align 4 +; CHECK-NEXT: [[ADD_4:%.*]] = add nsw i32 [[TMP7]], [[ADD_3]] ; CHECK-NEXT: [[INDVARS_IV_NEXT_4:%.*]] = or i64 [[INDVARS_IV]], 5 ; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_5:%.*]] ; CHECK: for.exiting_block.5: -; CHECK-NEXT: [[CMP_5:%.*]] = icmp eq i64 [[N_FR]], 42 +; CHECK-NEXT: [[CMP_5:%.*]] = icmp eq i64 [[TMP0]], 42 ; CHECK-NEXT: br i1 [[CMP_5]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_5:%.*]] ; CHECK: latch.5: ; CHECK-NEXT: [[ARRAYIDX_5:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[INDVARS_IV_NEXT_4]] -; CHECK-NEXT: [[TMP7:%.*]] = load i32, i32* [[ARRAYIDX_5]], align 4 -; CHECK-NEXT: [[ADD_5:%.*]] = add nsw i32 [[TMP7]], [[ADD_4]] +; CHECK-NEXT: [[TMP8:%.*]] = load i32, i32* [[ARRAYIDX_5]], align 4 +; CHECK-NEXT: [[ADD_5:%.*]] = add nsw i32 [[TMP8]], [[ADD_4]] ; CHECK-NEXT: [[INDVARS_IV_NEXT_5:%.*]] = or i64 [[INDVARS_IV]], 6 ; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_6:%.*]] ; CHECK: for.exiting_block.6: -; CHECK-NEXT: [[CMP_6:%.*]] = icmp eq i64 [[N_FR]], 42 +; CHECK-NEXT: [[CMP_6:%.*]] = icmp eq i64 [[TMP0]], 42 ; CHECK-NEXT: br i1 [[CMP_6]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_6:%.*]] ; CHECK: latch.6: ; CHECK-NEXT: [[ARRAYIDX_6:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[INDVARS_IV_NEXT_5]] -; CHECK-NEXT: [[TMP8:%.*]] = load i32, i32* [[ARRAYIDX_6]], align 4 -; CHECK-NEXT: [[ADD_6:%.*]] = add nsw i32 [[TMP8]], [[ADD_5]] +; CHECK-NEXT: [[TMP9:%.*]] = load i32, i32* [[ARRAYIDX_6]], align 4 +; CHECK-NEXT: [[ADD_6:%.*]] = add nsw i32 [[TMP9]], [[ADD_5]] ; CHECK-NEXT: [[INDVARS_IV_NEXT_6:%.*]] = or i64 [[INDVARS_IV]], 7 ; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_7:%.*]] ; CHECK: for.exiting_block.7: -; CHECK-NEXT: [[CMP_7:%.*]] = icmp eq i64 [[N_FR]], 42 +; CHECK-NEXT: [[CMP_7:%.*]] = icmp eq i64 [[TMP0]], 42 ; CHECK-NEXT: br i1 [[CMP_7]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_7]] ; CHECK: latch.7: ; CHECK-NEXT: [[ARRAYIDX_7:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[INDVARS_IV_NEXT_6]] -; CHECK-NEXT: [[TMP9:%.*]] = load i32, i32* [[ARRAYIDX_7]], align 4 -; CHECK-NEXT: [[ADD_7]] = add nsw i32 [[TMP9]], [[ADD_6]] +; CHECK-NEXT: [[TMP10:%.*]] = load i32, i32* [[ARRAYIDX_7]], align 4 +; CHECK-NEXT: [[ADD_7]] = add nsw i32 [[TMP10]], [[ADD_6]] ; CHECK-NEXT: [[INDVARS_IV_NEXT_7]] = add i64 [[INDVARS_IV]], 8 ; CHECK-NEXT: [[NITER_NEXT_7]] = add i64 [[NITER]], 8 ; CHECK-NEXT: [[NITER_NCMP_7:%.*]] = icmp eq i64 [[NITER_NEXT_7]], [[UNROLL_ITER]] @@ -118,12 +118,12 @@ define i32 @test1(i32* nocapture %a, i64 %n) { ; CHECK-NEXT: [[EPIL_ITER:%.*]] = phi i64 [ [[EPIL_ITER_NEXT:%.*]], [[LATCH_EPIL]] ], [ 0, [[HEADER_EPIL_PREHEADER]] ] ; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_EPIL:%.*]] ; CHECK: for.exiting_block.epil: -; CHECK-NEXT: [[CMP_EPIL:%.*]] = icmp eq i64 [[N_FR]], 42 +; CHECK-NEXT: [[CMP_EPIL:%.*]] = icmp eq i64 [[TMP0]], 42 ; CHECK-NEXT: br i1 [[CMP_EPIL]], label [[OTHEREXIT_LOOPEXIT3:%.*]], label [[LATCH_EPIL]] ; CHECK: latch.epil: ; CHECK-NEXT: [[ARRAYIDX_EPIL:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[INDVARS_IV_EPIL]] -; CHECK-NEXT: [[TMP10:%.*]] = load i32, i32* [[ARRAYIDX_EPIL]], align 4 -; CHECK-NEXT: [[ADD_EPIL]] = add nsw i32 [[TMP10]], [[SUM_02_EPIL]] +; CHECK-NEXT: [[TMP11:%.*]] = load i32, i32* [[ARRAYIDX_EPIL]], align 4 +; CHECK-NEXT: [[ADD_EPIL]] = add nsw i32 [[TMP11]], [[SUM_02_EPIL]] ; CHECK-NEXT: [[INDVARS_IV_NEXT_EPIL]] = add i64 [[INDVARS_IV_EPIL]], 1 ; CHECK-NEXT: [[EPIL_ITER_NEXT]] = add i64 [[EPIL_ITER]], 1 ; CHECK-NEXT: [[EPIL_ITER_CMP_NOT:%.*]] = icmp eq i64 [[EPIL_ITER_NEXT]], [[XTRAITER]] @@ -170,13 +170,13 @@ define i32 @test1(i32* nocapture %a, i64 %n) { ; ; ENABLED-LABEL: @test1( ; ENABLED-NEXT: entry: -; ENABLED-NEXT: [[TMP0:%.*]] = add i64 [[N:%.*]], -1 -; ENABLED-NEXT: [[XTRAITER:%.*]] = and i64 [[N]], 7 -; ENABLED-NEXT: [[TMP1:%.*]] = icmp ult i64 [[TMP0]], 7 -; ENABLED-NEXT: [[TMP2:%.*]] = freeze i1 [[TMP1]] +; ENABLED-NEXT: [[TMP0:%.*]] = freeze i64 [[N:%.*]] +; ENABLED-NEXT: [[TMP1:%.*]] = add i64 [[TMP0]], -1 +; ENABLED-NEXT: [[XTRAITER:%.*]] = and i64 [[TMP0]], 7 +; ENABLED-NEXT: [[TMP2:%.*]] = icmp ult i64 [[TMP1]], 7 ; ENABLED-NEXT: br i1 [[TMP2]], label [[LATCHEXIT_UNR_LCSSA:%.*]], label [[ENTRY_NEW:%.*]] ; ENABLED: entry.new: -; ENABLED-NEXT: [[UNROLL_ITER:%.*]] = sub i64 [[N]], [[XTRAITER]] +; ENABLED-NEXT: [[UNROLL_ITER:%.*]] = sub i64 [[TMP0]], [[XTRAITER]] ; ENABLED-NEXT: br label [[HEADER:%.*]] ; ENABLED: header: ; ENABLED-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY_NEW]] ], [ [[INDVARS_IV_NEXT_7:%.*]], [[LATCH_7:%.*]] ] @@ -391,13 +391,13 @@ define i32 @test2(i32* nocapture %a, i64 %n) { ; ; ENABLED-LABEL: @test2( ; ENABLED-NEXT: entry: -; ENABLED-NEXT: [[TMP0:%.*]] = add i64 [[N:%.*]], -1 -; ENABLED-NEXT: [[XTRAITER:%.*]] = and i64 [[N]], 7 -; ENABLED-NEXT: [[TMP1:%.*]] = icmp ult i64 [[TMP0]], 7 -; ENABLED-NEXT: [[TMP2:%.*]] = freeze i1 [[TMP1]] +; ENABLED-NEXT: [[TMP0:%.*]] = freeze i64 [[N:%.*]] +; ENABLED-NEXT: [[TMP1:%.*]] = add i64 [[TMP0]], -1 +; ENABLED-NEXT: [[XTRAITER:%.*]] = and i64 [[TMP0]], 7 +; ENABLED-NEXT: [[TMP2:%.*]] = icmp ult i64 [[TMP1]], 7 ; ENABLED-NEXT: br i1 [[TMP2]], label [[LATCHEXIT_UNR_LCSSA:%.*]], label [[ENTRY_NEW:%.*]] ; ENABLED: entry.new: -; ENABLED-NEXT: [[UNROLL_ITER:%.*]] = sub i64 [[N]], [[XTRAITER]] +; ENABLED-NEXT: [[UNROLL_ITER:%.*]] = sub i64 [[TMP0]], [[XTRAITER]] ; ENABLED-NEXT: br label [[HEADER:%.*]] ; ENABLED: header: ; ENABLED-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY_NEW]] ], [ [[INDVARS_IV_NEXT_7:%.*]], [[LATCH_7:%.*]] ] -- 2.7.4