[llvm] e00c73c - [SCEV] Extract a helper to create a SCEV with new operands (NFC)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 3 05:50:55 PST 2023
Author: Nikita Popov
Date: 2023-03-03T14:50:25+01:00
New Revision: e00c73c856a325008afead10cfb3e9d0fc4a1e41
URL: https://github.com/llvm/llvm-project/commit/e00c73c856a325008afead10cfb3e9d0fc4a1e41
DIFF: https://github.com/llvm/llvm-project/commit/e00c73c856a325008afead10cfb3e9d0fc4a1e41.diff
LOG: [SCEV] Extract a helper to create a SCEV with new operands (NFC)
Added:
Modified:
llvm/include/llvm/Analysis/ScalarEvolution.h
llvm/lib/Analysis/ScalarEvolution.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Analysis/ScalarEvolution.h b/llvm/include/llvm/Analysis/ScalarEvolution.h
index 6cb8fec4737fa..ee1f2eabc77a3 100644
--- a/llvm/include/llvm/Analysis/ScalarEvolution.h
+++ b/llvm/include/llvm/Analysis/ScalarEvolution.h
@@ -2206,6 +2206,11 @@ class ScalarEvolution {
void getReachableBlocks(SmallPtrSetImpl<BasicBlock *> &Reachable,
Function &F);
+ /// Return the given SCEV expression with a new set of operands.
+ /// This preserves the origial nowrap flags.
+ const SCEV *getWithOperands(const SCEV *S,
+ SmallVectorImpl<const SCEV *> &NewOps);
+
FoldingSet<SCEV> UniqueSCEVs;
FoldingSet<SCEVPredicate> UniquePreds;
BumpPtrAllocator SCEVAllocator;
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index 395901c043e26..d86d04c764167 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -9784,6 +9784,41 @@ static Constant *BuildConstantFromSCEV(const SCEV *V) {
llvm_unreachable("Unknown SCEV kind!");
}
+const SCEV *
+ScalarEvolution::getWithOperands(const SCEV *S,
+ SmallVectorImpl<const SCEV *> &NewOps) {
+ switch (S->getSCEVType()) {
+ case scTruncate:
+ case scZeroExtend:
+ case scSignExtend:
+ case scPtrToInt:
+ return getCastExpr(S->getSCEVType(), NewOps[0], S->getType());
+ case scAddRecExpr: {
+ auto *AddRec = cast<SCEVAddRecExpr>(S);
+ return getAddRecExpr(NewOps, AddRec->getLoop(), AddRec->getNoWrapFlags());
+ }
+ case scAddExpr:
+ return getAddExpr(NewOps, cast<SCEVAddExpr>(S)->getNoWrapFlags());
+ case scMulExpr:
+ return getMulExpr(NewOps, cast<SCEVMulExpr>(S)->getNoWrapFlags());
+ case scUDivExpr:
+ return getUDivExpr(NewOps[0], NewOps[1]);
+ case scUMaxExpr:
+ case scSMaxExpr:
+ case scUMinExpr:
+ case scSMinExpr:
+ return getMinMaxExpr(S->getSCEVType(), NewOps);
+ case scSequentialUMinExpr:
+ return getSequentialMinMaxExpr(S->getSCEVType(), NewOps);
+ case scConstant:
+ case scVScale:
+ case scUnknown:
+ return S;
+ case scCouldNotCompute:
+ llvm_unreachable("Attempt to use a SCEVCouldNotCompute object!");
+ }
+}
+
const SCEV *ScalarEvolution::computeSCEVAtScope(const SCEV *V, const Loop *L) {
switch (V->getSCEVType()) {
case scConstant:
@@ -9866,33 +9901,7 @@ const SCEV *ScalarEvolution::computeSCEVAtScope(const SCEV *V, const Loop *L) {
NewOps.push_back(OpAtScope);
}
- switch (V->getSCEVType()) {
- case scTruncate:
- case scZeroExtend:
- case scSignExtend:
- case scPtrToInt:
- return getCastExpr(V->getSCEVType(), NewOps[0], V->getType());
- case scAddExpr:
- return getAddExpr(NewOps, cast<SCEVAddExpr>(V)->getNoWrapFlags());
- case scMulExpr:
- return getMulExpr(NewOps, cast<SCEVMulExpr>(V)->getNoWrapFlags());
- case scUDivExpr:
- return getUDivExpr(NewOps[0], NewOps[1]);
- case scUMaxExpr:
- case scSMaxExpr:
- case scUMinExpr:
- case scSMinExpr:
- return getMinMaxExpr(V->getSCEVType(), NewOps);
- case scSequentialUMinExpr:
- return getSequentialMinMaxExpr(V->getSCEVType(), NewOps);
- case scConstant:
- case scVScale:
- case scAddRecExpr:
- case scUnknown:
- case scCouldNotCompute:
- llvm_unreachable("Can not get those expressions here.");
- }
- llvm_unreachable("Unknown n-ary-like SCEV type!");
+ return getWithOperands(V, NewOps);
}
}
// If we got here, all operands are loop invariant.
More information about the llvm-commits
mailing list