[llvm] [SCEV] Unify and optimize constant folding (NFC) (PR #101473)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 2 00:54:17 PDT 2024
================
@@ -831,6 +831,49 @@ static bool hasHugeExpression(ArrayRef<const SCEV *> Ops) {
});
}
+/// Performs a number of common optimizations on the passed \p Ops. If the
+/// whole expression reduces down to a single operand, it will be returned.
+///
+/// The following optimizations are performed:
+/// * Fold constants using the \p Fold function.
+/// * Remove identity constants satisfying \p IsIdentity.
+/// * If a constant satisfies \p IsAbsorber, return it.
+/// * Sort operands by complexity.
+template <typename FoldT, typename IsIdentityT, typename IsAbsorberT>
+static const SCEV *
+constantFoldAndGroupOps(ScalarEvolution &SE, LoopInfo &LI, DominatorTree &DT,
+ SmallVectorImpl<const SCEV *> &Ops, FoldT Fold,
+ IsIdentityT IsIdentity, IsAbsorberT IsAbsorber) {
+ const SCEVConstant *Folded = nullptr;
+ for (unsigned Idx = 0; Idx < Ops.size();) {
+ const SCEV *Op = Ops[Idx];
+ if (const auto *C = dyn_cast<SCEVConstant>(Op)) {
+ if (!Folded)
+ Folded = C;
+ else
+ Folded = cast<SCEVConstant>(
+ SE.getConstant(Fold(Folded->getAPInt(), C->getAPInt())));
+ Ops.erase(Ops.begin() + Idx);
+ continue;
+ }
+ ++Idx;
+ }
+
+ if (Ops.empty()) {
+ assert(Folded && "Must have folded value");
+ return Folded;
+ }
+
+ if (Folded && IsAbsorber(Folded->getAPInt()))
+ return Folded;
+
+ GroupByComplexity(Ops, &LI, DT);
+ if (Folded && !IsIdentity(Folded->getAPInt()))
----------------
nikic wrote:
I'll investigate whether this is better this in a followup.
https://github.com/llvm/llvm-project/pull/101473
More information about the llvm-commits
mailing list