@@ -14973,10 +14973,7 @@ const SCEVAddRecExpr *SCEVWrapPredicate::getExpr() const { return AR; }
14973
14973
bool SCEVWrapPredicate::implies(const SCEVPredicate *N,
14974
14974
ScalarEvolution &SE) const {
14975
14975
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)
14980
14977
return false;
14981
14978
14982
14979
if (Op->AR == AR)
@@ -14986,36 +14983,27 @@ bool SCEVWrapPredicate::implies(const SCEVPredicate *N,
14986
14983
Flags != SCEVWrapPredicate::IncrementNUSW)
14987
14984
return false;
14988
14985
14989
- bool IsNUW = Flags == SCEVWrapPredicate::IncrementNUSW;
14990
14986
const SCEV *Step = AR->getStepRecurrence(SE);
14991
14987
const SCEV *OpStep = Op->AR->getStepRecurrence(SE);
14988
+ if (!SE.isKnownPositive(Step) || !SE.isKnownPositive(OpStep))
14989
+ return false;
14992
14990
14993
14991
// If both steps are positive, this implies N, if N's start and step are
14994
14992
// 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);
15013
14996
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);
15019
15007
}
15020
15008
15021
15009
bool SCEVWrapPredicate::isAlwaysTrue() const {
0 commit comments