diff --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp index bca37da5ff10f..e71e7eeb8ef1e 100644 --- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp +++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp @@ -859,18 +859,18 @@ void State::addInfoForInductions(BasicBlock &BB) { return; auto *AR = dyn_cast_or_null(SE.getSCEV(PN)); - if (!AR) + BasicBlock *LoopPred = L->getLoopPredecessor(); + if (!AR || !LoopPred) return; const SCEV *StartSCEV = AR->getStart(); Value *StartValue = nullptr; - if (auto *C = dyn_cast(StartSCEV)) + if (auto *C = dyn_cast(StartSCEV)) { StartValue = C->getValue(); - else if (auto *U = dyn_cast(StartSCEV)) - StartValue = U->getValue(); - - if (!StartValue) - return; + } else { + StartValue = PN->getIncomingValueForBlock(LoopPred); + assert(SE.getSCEV(StartValue) == StartSCEV && "inconsistent start value"); + } DomTreeNode *DTN = DT.getNode(InLoopSucc); auto Inc = SE.getMonotonicPredicateType(AR, CmpInst::ICMP_UGT); diff --git a/llvm/test/Transforms/ConstraintElimination/monotonic-int-phis-nested-loops.ll b/llvm/test/Transforms/ConstraintElimination/monotonic-int-phis-nested-loops.ll index 4835d48c57b63..e5d101f7fdea1 100644 --- a/llvm/test/Transforms/ConstraintElimination/monotonic-int-phis-nested-loops.ll +++ b/llvm/test/Transforms/ConstraintElimination/monotonic-int-phis-nested-loops.ll @@ -17,8 +17,7 @@ define void @start_value_of_inner_add_rec_is_add_rec_condition_can_be_simplified ; CHECK-NEXT: [[CMP2_NOT:%.*]] = icmp eq i32 [[K_0]], [[LEN]] ; CHECK-NEXT: br i1 [[CMP2_NOT]], label [[OUTER_LATCH]], label [[INNER_LATCH]] ; CHECK: inner.latch: -; CHECK-NEXT: [[CMP_NOT_I:%.*]] = icmp ult i32 [[K_0]], [[LEN]] -; CHECK-NEXT: call void @use(i1 [[CMP_NOT_I]]) +; CHECK-NEXT: call void @use(i1 true) ; CHECK-NEXT: [[K_INC]] = add i32 [[K_0]], 1 ; CHECK-NEXT: br label [[INNER_HEADER]] ; CHECK: outer.latch: