@@ -14973,10 +14973,7 @@ const SCEVAddRecExpr *SCEVWrapPredicate::getExpr() const { return AR; }
1497314973bool SCEVWrapPredicate::implies(const SCEVPredicate *N,
1497414974 ScalarEvolution &SE) const {
1497514975 const auto *Op = dyn_cast<SCEVWrapPredicate>(N);
14976- if (!Op)
14977- return false;
14978-
14979- if (setFlags(Flags, Op->Flags) != Flags)
14976+ if (!Op || setFlags(Flags, Op->Flags) != Flags)
1498014977 return false;
1498114978
1498214979 if (Op->AR == AR)
@@ -14986,36 +14983,27 @@ bool SCEVWrapPredicate::implies(const SCEVPredicate *N,
1498614983 Flags != SCEVWrapPredicate::IncrementNUSW)
1498714984 return false;
1498814985
14989- bool IsNUW = Flags == SCEVWrapPredicate::IncrementNUSW;
1499014986 const SCEV *Step = AR->getStepRecurrence(SE);
1499114987 const SCEV *OpStep = Op->AR->getStepRecurrence(SE);
14988+ if (!SE.isKnownPositive(Step) || !SE.isKnownPositive(OpStep))
14989+ return false;
1499214990
1499314991 // If both steps are positive, this implies N, if N's start and step are
1499414992 // ULE/SLE (for NSUW/NSSW) than this'.
14995- if (SE.isKnownPositive(Step) && SE.isKnownPositive(OpStep)) {
14996- const SCEV *OpStart = Op->AR->getStart();
14997- const SCEV *Start = AR->getStart();
14998- if (SE.getTypeSizeInBits(Step->getType()) >
14999- SE.getTypeSizeInBits(OpStep->getType())) {
15000- OpStep = SE.getZeroExtendExpr(OpStep, Step->getType());
15001- } else {
15002- Step = IsNUW ? SE.getNoopOrZeroExtend(Step, OpStep->getType())
15003- : SE.getNoopOrSignExtend(Step, OpStep->getType());
15004- }
15005- if (SE.getTypeSizeInBits(Start->getType()) >
15006- SE.getTypeSizeInBits(OpStart->getType())) {
15007- OpStart = IsNUW ? SE.getZeroExtendExpr(OpStart, Start->getType())
15008- : SE.getSignExtendExpr(OpStart, Start->getType());
15009- } else {
15010- Start = IsNUW ? SE.getNoopOrZeroExtend(Start, OpStart->getType())
15011- : SE.getNoopOrSignExtend(Start, OpStart->getType());
15012- }
14993+ Type *WiderTy = SE.getWiderType(Step->getType(), OpStep->getType());
14994+ Step = SE.getNoopOrZeroExtend(Step, WiderTy);
14995+ OpStep = SE.getNoopOrZeroExtend(OpStep, WiderTy);
1501314996
15014- CmpInst::Predicate Pred = IsNUW ? CmpInst::ICMP_ULE : CmpInst::ICMP_SLE;
15015- return SE.isKnownPredicate(Pred, OpStep, Step) &&
15016- SE.isKnownPredicate(Pred, OpStart, Start);
15017- }
15018- return false;
14997+ bool IsNUW = Flags == SCEVWrapPredicate::IncrementNUSW;
14998+ const SCEV *OpStart = Op->AR->getStart();
14999+ const SCEV *Start = AR->getStart();
15000+ OpStart = IsNUW ? SE.getNoopOrZeroExtend(OpStart, WiderTy)
15001+ : SE.getNoopOrSignExtend(OpStart, WiderTy);
15002+ Start = IsNUW ? SE.getNoopOrZeroExtend(Start, WiderTy)
15003+ : SE.getNoopOrSignExtend(Start, WiderTy);
15004+ CmpInst::Predicate Pred = IsNUW ? CmpInst::ICMP_ULE : CmpInst::ICMP_SLE;
15005+ return SE.isKnownPredicate(Pred, OpStep, Step) &&
15006+ SE.isKnownPredicate(Pred, OpStart, Start);
1501915007}
1502015008
1502115009bool SCEVWrapPredicate::isAlwaysTrue() const {
0 commit comments