[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