diff --git a/llvm/include/llvm/Analysis/ScalarEvolution.h b/llvm/include/llvm/Analysis/ScalarEvolution.h index 34849ebeb4f5..65d092a59347 100644 --- a/llvm/include/llvm/Analysis/ScalarEvolution.h +++ b/llvm/include/llvm/Analysis/ScalarEvolution.h @@ -572,6 +572,7 @@ public: /// \p IndexExprs The expressions for the indices. const SCEV *getGEPExpr(GEPOperator *GEP, const SmallVectorImpl &IndexExprs); + const SCEV *getAbsExpr(const SCEV *Op, bool IsNSW); const SCEV *getMinMaxExpr(unsigned Kind, SmallVectorImpl &Operands); const SCEV *getSMaxExpr(const SCEV *LHS, const SCEV *RHS); diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 697d254f02c4..f3e152b00967 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -3334,6 +3334,11 @@ ScalarEvolution::findExistingSCEVInCache(int SCEVType, UniqueSCEVs.FindNodeOrInsertPos(ID, IP), std::move(ID), IP); } +const SCEV *ScalarEvolution::getAbsExpr(const SCEV *Op, bool IsNSW) { + SCEV::NoWrapFlags Flags = IsNSW ? SCEV::FlagNSW : SCEV::FlagAnyWrap; + return getSMaxExpr(Op, getNegativeSCEV(Op, Flags)); +} + const SCEV *ScalarEvolution::getMinMaxExpr(unsigned Kind, SmallVectorImpl &Ops) { assert(!Ops.empty() && "Cannot get empty (u|s)(min|max)!"); @@ -6340,14 +6345,10 @@ const SCEV *ScalarEvolution::createSCEV(Value *V) { if (auto *II = dyn_cast(U)) { switch (II->getIntrinsicID()) { - case Intrinsic::abs: { - const SCEV *Op = getSCEV(II->getArgOperand(0)); - SCEV::NoWrapFlags Flags = - cast(II->getArgOperand(1))->isOne() - ? SCEV::FlagNSW - : SCEV::FlagAnyWrap; - return getSMaxExpr(Op, getNegativeSCEV(Op, Flags)); - } + case Intrinsic::abs: + return getAbsExpr( + getSCEV(II->getArgOperand(0)), + /*IsNSW=*/cast(II->getArgOperand(1))->isOne()); case Intrinsic::umax: return getUMaxExpr(getSCEV(II->getArgOperand(0)), getSCEV(II->getArgOperand(1)));