[llvm] [VPlanPatternMatch] Introduce m_ConstantInt (PR #159558)
Ramkumar Ramachandra via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 18 08:19:49 PDT 2025
https://github.com/artagnon updated https://github.com/llvm/llvm-project/pull/159558
>From 3aa97359238aabd0394c4c4914c4f27095f357b1 Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <ramkumar.ramachandra at codasip.com>
Date: Thu, 18 Sep 2025 12:35:02 +0100
Subject: [PATCH 1/3] [VPlanPatternMatch] Introduce m_APInt
---
.../Transforms/Vectorize/VPlanPatternMatch.h | 26 +++++++++++++++++++
.../Transforms/Vectorize/VPlanTransforms.cpp | 9 ++++---
2 files changed, 31 insertions(+), 4 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h b/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
index 8f9ce7a74b58b..7da75473ba00e 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
+++ b/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
@@ -176,6 +176,32 @@ inline int_pred_ty<is_zero_int> m_ZeroInt() {
/// For vectors, this includes constants with undefined elements.
inline int_pred_ty<is_one> m_One() { return int_pred_ty<is_one>(); }
+struct apint_match {
+ const APInt *&Res;
+
+ apint_match(const APInt *&Res) : Res(Res) {}
+
+ bool match(VPValue *VPV) const {
+ if (!VPV->isLiveIn())
+ return false;
+ Value *V = VPV->getLiveInIRValue();
+ if (!V)
+ return false;
+ const auto *CI = dyn_cast<ConstantInt>(V);
+ if (!CI && V->getType()->isVectorTy())
+ if (const auto *C = dyn_cast<Constant>(V))
+ CI = dyn_cast_or_null<ConstantInt>(
+ C->getSplatValue(/*AllowPoison=*/false));
+ if (!CI)
+ return false;
+ Res = &CI->getValue();
+ return true;
+ }
+};
+
+/// Match an APInt, capturing it if we match.
+inline apint_match m_APInt(const APInt *&C) { return C; }
+
/// Matching combinators
template <typename LTy, typename RTy> struct match_combine_or {
LTy L;
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 9996b0167edcb..c71655f08bf49 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -1592,11 +1592,12 @@ static bool tryToReplaceALMWithWideALM(VPlan &Plan, ElementCount VF,
m_ActiveLaneMask(m_VPValue(Index), m_VPValue(), m_VPValue()));
assert(Index && "Expected index from ActiveLaneMask instruction");
- auto *II = dyn_cast<VPInstruction>(Index);
- if (II && II->getOpcode() == VPInstruction::CanonicalIVIncrementForPart) {
- auto Part = cast<ConstantInt>(II->getOperand(1)->getLiveInIRValue());
+ const APInt *Part;
+ if (match(Index,
+ m_VPInstruction<VPInstruction::CanonicalIVIncrementForPart>(
+ m_VPValue(), m_APInt(Part))))
Phis[Part->getZExtValue()] = Phi;
- } else
+ else
// Anything other than a CanonicalIVIncrementForPart is part 0
Phis[0] = Phi;
}
>From 784ca147f8b459351c709e50c8beaa827e1df277 Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <ramkumar.ramachandra at codasip.com>
Date: Thu, 18 Sep 2025 13:00:15 +0100
Subject: [PATCH 2/3] [VPlan/PM] Introduce m_ConstantInt
---
.../Transforms/Vectorize/VPlanPatternMatch.h | 22 +++++++++++++++++--
.../Transforms/Vectorize/VPlanTransforms.cpp | 6 ++---
2 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h b/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
index 7da75473ba00e..ae7b8d696a7ee 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
+++ b/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
@@ -199,8 +199,26 @@ struct apint_match {
}
};
-/// Match an APInt, capturing it if we match.
-inline apint_match m_APInt(const APInt *&C) { return C; }
+struct bind_const_intval_ty {
+ uint64_t &VR;
+
+ bind_const_intval_ty(uint64_t &V) : VR(V) {}
+
+ template <typename ITy> bool match(ITy *V) const {
+ const APInt *ConstInt;
+ if (!apint_match(ConstInt).match(V))
+ return false;
+ if (auto C = ConstInt->tryZExtValue()) {
+ VR = *C;
+ return true;
+ }
+ return false;
+ }
+};
+
+/// Match a plain integer constant no wider than 64-bits, capturing it if we
+/// match.
+inline bind_const_intval_ty m_ConstantInt(uint64_t &C) { return C; }
/// Matching combinators
template <typename LTy, typename RTy> struct match_combine_or {
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index c71655f08bf49..ea3df95c8e5be 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -1592,11 +1592,11 @@ static bool tryToReplaceALMWithWideALM(VPlan &Plan, ElementCount VF,
m_ActiveLaneMask(m_VPValue(Index), m_VPValue(), m_VPValue()));
assert(Index && "Expected index from ActiveLaneMask instruction");
- const APInt *Part;
+ uint64_t Part;
if (match(Index,
m_VPInstruction<VPInstruction::CanonicalIVIncrementForPart>(
- m_VPValue(), m_APInt(Part))))
- Phis[Part->getZExtValue()] = Phi;
+ m_VPValue(), m_ConstantInt(Part))))
+ Phis[Part] = Phi;
else
// Anything other than a CanonicalIVIncrementForPart is part 0
Phis[0] = Phi;
>From b078dc2a12e3e7c1ecfd97fc3cbbf0c9754abf3b Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <ramkumar.ramachandra at codasip.com>
Date: Thu, 18 Sep 2025 16:18:04 +0100
Subject: [PATCH 3/3] [VPlan/PM] Remove indirection, strip dead code
---
.../Transforms/Vectorize/VPlanPatternMatch.h | 31 +++++--------------
1 file changed, 7 insertions(+), 24 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h b/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
index ae7b8d696a7ee..35cba04b66cc7 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
+++ b/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h
@@ -176,10 +176,10 @@ inline int_pred_ty<is_zero_int> m_ZeroInt() {
/// For vectors, this includes constants with undefined elements.
inline int_pred_ty<is_one> m_One() { return int_pred_ty<is_one>(); }
-struct apint_match {
- const APInt *&Res;
+struct bind_const_int {
+ uint64_t &Res;
- apint_match(const APInt *&Res) : Res(Res) {}
+ bind_const_int(uint64_t &Res) : Res(Res) {}
bool match(VPValue *VPV) const {
if (!VPV->isLiveIn())
@@ -187,29 +187,12 @@ struct apint_match {
Value *V = VPV->getLiveInIRValue();
if (!V)
return false;
+ assert(!V->getType()->isVectorTy() && "Unexpected vector live-in");
const auto *CI = dyn_cast<ConstantInt>(V);
- if (!CI && V->getType()->isVectorTy())
- if (const auto *C = dyn_cast<Constant>(V))
- CI = dyn_cast_or_null<ConstantInt>(
- C->getSplatValue(/*AllowPoison=*/false));
if (!CI)
return false;
- Res = &CI->getValue();
- return true;
- }
-};
-
-struct bind_const_intval_ty {
- uint64_t &VR;
-
- bind_const_intval_ty(uint64_t &V) : VR(V) {}
-
- template <typename ITy> bool match(ITy *V) const {
- const APInt *ConstInt;
- if (!apint_match(ConstInt).match(V))
- return false;
- if (auto C = ConstInt->tryZExtValue()) {
- VR = *C;
+ if (auto C = CI->getValue().tryZExtValue()) {
+ Res = *C;
return true;
}
return false;
@@ -218,7 +201,7 @@ struct bind_const_intval_ty {
/// Match a plain integer constant no wider than 64-bits, capturing it if we
/// match.
-inline bind_const_intval_ty m_ConstantInt(uint64_t &C) { return C; }
+inline bind_const_int m_ConstantInt(uint64_t &C) { return C; }
/// Matching combinators
template <typename LTy, typename RTy> struct match_combine_or {
More information about the llvm-commits
mailing list