Index: lib/Transforms/Utils/LoopUnroll.cpp =================================================================== --- lib/Transforms/Utils/LoopUnroll.cpp +++ lib/Transforms/Utils/LoopUnroll.cpp @@ -403,8 +403,9 @@ "Did not expect runtime trip-count unrolling " "and peeling for the same loop"); + bool Peeled = false; if (PeelCount) { - bool Peeled = peelLoop(L, PeelCount, LI, SE, DT, AC, PreserveLCSSA); + Peeled = peelLoop(L, PeelCount, LI, SE, DT, AC, PreserveLCSSA); // Successful peeling may result in a change in the loop preheader/trip // counts. If we later unroll the loop, we want these to be updated. @@ -790,7 +791,7 @@ } // Simplify any new induction variables in the partially unrolled loop. - if (SE && !CompletelyUnroll && Count > 1) { + if (SE && !CompletelyUnroll && (Count > 1 || Peeled)) { SmallVector DeadInsts; simplifyLoopIVs(L, SE, DT, LI, DeadInsts); Index: test/Transforms/LoopUnroll/peel-loop-conditions.ll =================================================================== --- test/Transforms/LoopUnroll/peel-loop-conditions.ll +++ test/Transforms/LoopUnroll/peel-loop-conditions.ll @@ -33,17 +33,9 @@ ; CHECK-NEXT: [[CMP_PEEL8:%.*]] = icmp slt i32 [[INC_PEEL7]], [[K]] ; CHECK-NEXT: br i1 [[CMP_PEEL8]], label [[FOR_BODY:%.*]], label [[FOR_END]] ; CHECK: for.body: -; CHECK-NEXT: [[I_05:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_INC:%.*]] ], [ [[INC_PEEL7]], [[FOR_INC_PEEL6]] ] -; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i32 [[I_05]], 2 -; CHECK-NEXT: br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] -; CHECK: if.then: -; CHECK-NEXT: call void @f1() -; CHECK-NEXT: br label [[FOR_INC]] -; CHECK: if.else: +; CHECK-NEXT: [[I_05:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ [[INC_PEEL7]], [[FOR_INC_PEEL6]] ] ; CHECK-NEXT: call void @f2() -; CHECK-NEXT: br label [[FOR_INC]] -; CHECK: for.inc: -; CHECK-NEXT: [[INC]] = add nsw i32 [[I_05]], 1 +; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_05]], 1 ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[INC]], [[K]] ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END]], !llvm.loop !0 ; CHECK: for.end: