[llvm] ab9b23c - [SCEV] Use pattern match to check ZExt(Add()). (NFC)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 31 04:47:39 PDT 2025
Author: Florian Hahn
Date: 2025-07-31T12:47:14+01:00
New Revision: ab9b23c446531f5d9f081123c9f2fde4e8a334eb
URL: https://github.com/llvm/llvm-project/commit/ab9b23c446531f5d9f081123c9f2fde4e8a334eb
DIFF: https://github.com/llvm/llvm-project/commit/ab9b23c446531f5d9f081123c9f2fde4e8a334eb.diff
LOG: [SCEV] Use pattern match to check ZExt(Add()). (NFC)
Follow-up to
https://github.com/llvm/llvm-project/pull/151227#pullrequestreview-3074670031
to check the inner expression is an Add before calling getTruncateExpr.
Adds a new matcher that just matches and captures SCEVAddExpr, to
support matching a SCEVAddExpr with arbitrary number of operands.
Added:
Modified:
llvm/include/llvm/Analysis/ScalarEvolutionPatternMatch.h
llvm/lib/Analysis/ScalarEvolution.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Analysis/ScalarEvolutionPatternMatch.h b/llvm/include/llvm/Analysis/ScalarEvolutionPatternMatch.h
index bff77073ef4e1..011d5994dc670 100644
--- a/llvm/include/llvm/Analysis/ScalarEvolutionPatternMatch.h
+++ b/llvm/include/llvm/Analysis/ScalarEvolutionPatternMatch.h
@@ -91,6 +91,10 @@ inline bind_ty<const SCEVUnknown> m_SCEVUnknown(const SCEVUnknown *&V) {
return V;
}
+inline bind_ty<const SCEVAddExpr> m_scev_Add(const SCEVAddExpr *&V) {
+ return V;
+}
+
/// Match a specified const SCEV *.
struct specificscev_ty {
const SCEV *Expr;
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index 61a575c8a0370..477e4771e04aa 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -2685,16 +2685,15 @@ const SCEV *ScalarEvolution::getAddExpr(SmallVectorImpl<const SCEV *> &Ops,
// Try to push the constant operand into a ZExt: A + zext (-A + B) -> zext
// (B), if trunc (A) + -A + B does not unsigned-wrap.
- if (auto *ZExt = dyn_cast<SCEVZeroExtendExpr>(Ops[1])) {
- const SCEV *B = ZExt->getOperand(0);
- const SCEV *NarrowA = getTruncateExpr(A, B->getType());
- if (isa<SCEVAddExpr>(B) &&
- NarrowA == getNegativeSCEV(cast<SCEVAddExpr>(B)->getOperand(0)) &&
- getZeroExtendExpr(NarrowA, ZExt->getType()) == A &&
- hasFlags(StrengthenNoWrapFlags(this, scAddExpr, {NarrowA, B},
+ const SCEVAddExpr *InnerAdd;
+ if (match(B, m_scev_ZExt(m_scev_Add(InnerAdd)))) {
+ const SCEV *NarrowA = getTruncateExpr(A, InnerAdd->getType());
+ if (NarrowA == getNegativeSCEV(InnerAdd->getOperand(0)) &&
+ getZeroExtendExpr(NarrowA, B->getType()) == A &&
+ hasFlags(StrengthenNoWrapFlags(this, scAddExpr, {NarrowA, InnerAdd},
SCEV::FlagAnyWrap),
SCEV::FlagNUW)) {
- return getZeroExtendExpr(getAddExpr(NarrowA, B), ZExt->getType());
+ return getZeroExtendExpr(getAddExpr(NarrowA, InnerAdd), B->getType());
}
}
}
More information about the llvm-commits
mailing list