Skip to content

Conversation

@fhahn
Copy link
Contributor

@fhahn fhahn commented Dec 4, 2025

Add matcher for SCEVUnknown wrapping undef or poison.

Add matcher for SCEVUnknown wrapping undef or poison.
@fhahn fhahn requested a review from nikic as a code owner December 4, 2025 20:44
@llvmbot llvmbot added the llvm:analysis Includes value tracking, cost tables and constant folding label Dec 4, 2025
@llvmbot
Copy link
Member

llvmbot commented Dec 4, 2025

@llvm/pr-subscribers-llvm-analysis

Author: Florian Hahn (fhahn)

Changes

Add matcher for SCEVUnknown wrapping undef or poison.


Full diff: https://github.com/llvm/llvm-project/pull/170740.diff

3 Files Affected:

  • (modified) llvm/include/llvm/Analysis/ScalarEvolutionPatternMatch.h (+13)
  • (modified) llvm/lib/Analysis/LoopAccessAnalysis.cpp (+2-3)
  • (modified) llvm/lib/Analysis/ScalarEvolution.cpp (+2-5)
diff --git a/llvm/include/llvm/Analysis/ScalarEvolutionPatternMatch.h b/llvm/include/llvm/Analysis/ScalarEvolutionPatternMatch.h
index 9354eef98fe91..f285eacc4c565 100644
--- a/llvm/include/llvm/Analysis/ScalarEvolutionPatternMatch.h
+++ b/llvm/include/llvm/Analysis/ScalarEvolutionPatternMatch.h
@@ -380,6 +380,19 @@ m_scev_AffineAddRec(const Op0_t &Op0, const Op1_t &Op1, const Loop_t &L) {
   return SCEVAffineAddRec_match<Op0_t, Op1_t, Loop_t>(Op0, Op1, L);
 }
 
+struct is_undef_or_poison {
+  bool match(const SCEV *S) const {
+    const SCEVUnknown *Unknown;
+    return SCEVPatternMatch::match(S, m_SCEVUnknown(Unknown)) &&
+           isa<UndefValue>(Unknown->getValue());
+  }
+};
+
+/// Match an SCEVUnknown wrapping undef or poison.
+inline is_undef_or_poison m_scev_UndefOrPoison() {
+  return is_undef_or_poison();
+}
+
 } // namespace SCEVPatternMatch
 } // namespace llvm
 
diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp
index 5d88e5f54e3d6..df793de7c817b 100644
--- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp
+++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp
@@ -2998,9 +2998,8 @@ void LoopAccessInfo::collectStridedAccess(Value *MemAccess) {
   if (!StrideExpr)
     return;
 
-  if (auto *Unknown = dyn_cast<SCEVUnknown>(StrideExpr))
-    if (isa<UndefValue>(Unknown->getValue()))
-      return;
+  if (match(StrideExpr, m_scev_UndefOrPoison()))
+    return;
 
   LLVM_DEBUG(dbgs() << "LAA: Found a strided access that is a candidate for "
                        "versioning:");
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index 1d7a8b981b5ee..e1f90264be7a2 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -13695,11 +13695,8 @@ SCEVAddRecExpr::getPostIncExpr(ScalarEvolution &SE) const {
 
 // Return true when S contains at least an undef value.
 bool ScalarEvolution::containsUndefs(const SCEV *S) const {
-  return SCEVExprContains(S, [](const SCEV *S) {
-    if (const auto *SU = dyn_cast<SCEVUnknown>(S))
-      return isa<UndefValue>(SU->getValue());
-    return false;
-  });
+  return SCEVExprContains(
+      S, [](const SCEV *S) { return match(S, m_scev_UndefOrPoison()); });
 }
 
 // Return true when S contains a value that is a nullptr.

Copy link
Collaborator

@preames preames left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@fhahn fhahn enabled auto-merge (squash) December 5, 2025 10:54
@fhahn fhahn merged commit 113f058 into llvm:main Dec 5, 2025
9 of 10 checks passed
llvm-sync bot pushed a commit to arm/arm-toolchain that referenced this pull request Dec 5, 2025
Add matcher for SCEVUnknown wrapping undef or poison.

PR: llvm/llvm-project#170740
@fhahn fhahn deleted the scev-match-undef-poison branch December 5, 2025 14:32
honeygoyal pushed a commit to honeygoyal/llvm-project that referenced this pull request Dec 9, 2025
Add matcher for SCEVUnknown wrapping undef or poison.

PR: llvm#170740
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

llvm:analysis Includes value tracking, cost tables and constant folding

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants