diff --git a/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp b/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp --- a/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp +++ b/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp @@ -738,11 +738,28 @@ // 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 @@ 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 --- 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 --- 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 --- 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 @@ ; ; 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 @@ ; ; 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 @@ ; 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 @@ ; ; 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 @@ ; 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 @@ 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 @@ ; ; 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 @@ ; ; 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 @@ ; 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 @@ ; ; 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 @@ ; 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 @@ 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 @@ ; ; 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 @@ ; ; 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 @@ ; 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 @@ ; ; 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 @@ ; 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 @@ 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 @@ ; ; 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 @@ ; ; 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 @@ ; 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 @@ ; ; 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 @@ ; 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 @@ 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 @@ ; ; 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 @@ ; ; 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 @@ ; 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 @@ ; ; 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 @@ ; 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 @@ 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 @@ ; ; 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 @@ ; ; 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 @@ ; 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 @@ ; ; 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 @@ ; 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 @@ 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 @@ ; ; 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 @@ ; ; 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 @@ ; 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 @@ ; ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ 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 @@ ; ; 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 @@ ; ; 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 @@ ; 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 @@ ; ; 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 @@ ; 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 @@ 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 @@ ; ; 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 @@ ; ; 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 @@ ; 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 @@ ; ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ 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 @@ ; ; 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 @@ ; ; 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 @@ ; 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 @@ ; ; 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 @@ ; 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 @@ 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 @@ ; ; 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 @@ ; ; 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 @@ ; 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 @@ ; ; 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 @@ ; 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 @@ 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 @@ ; ; 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 @@ ; ; 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 @@ ; 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 @@ ; ; 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 @@ ; 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 @@ 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 @@ ; ; 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 @@ ; ; 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 @@ ; 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 @@ ; ; 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 @@ ; 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 @@ 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 @@ ; ; 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 @@ ; ; 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 @@ ; 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 @@ ; ; 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 @@ ; 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 --- 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 @@ ; 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 @@ ; 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 @@ ; ; 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 @@ ; ; 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:%.*]] ]