[llvm] [DAG] Implement SDPatternMatch `m_SpecificScalarVT` and `m_SpecificVectorElementVT` matchers (PR #144996)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 20 01:37:23 PDT 2025
https://github.com/zhaohuiw42 created https://github.com/llvm/llvm-project/pull/144996
Resolves https://github.com/llvm/llvm-project/issues/144477
>From a0842eb3b803b78e298650caec1365cf3ad15c12 Mon Sep 17 00:00:00 2001
From: wangzhaohui <wangzhaohui at uniontech.com>
Date: Fri, 20 Jun 2025 16:33:40 +0800
Subject: [PATCH] [DAG] Implement SDPatternMatch `m_SpecificScalarVT` and
`m_SpecificVectorElementVT` matchers
---
llvm/include/llvm/CodeGen/SDPatternMatch.h | 23 +++++++++++++++++++
.../CodeGen/SelectionDAGPatternMatchTest.cpp | 4 ++++
2 files changed, 27 insertions(+)
diff --git a/llvm/include/llvm/CodeGen/SDPatternMatch.h b/llvm/include/llvm/CodeGen/SDPatternMatch.h
index 9eb6dd45f912f..5b3682352ab68 100644
--- a/llvm/include/llvm/CodeGen/SDPatternMatch.h
+++ b/llvm/include/llvm/CodeGen/SDPatternMatch.h
@@ -277,6 +277,29 @@ inline auto m_SpecificVT(EVT RefVT) {
inline auto m_Glue() { return m_SpecificVT(MVT::Glue); }
inline auto m_OtherVT() { return m_SpecificVT(MVT::Other); }
+/// Match a scalar ValueType.
+template <typename Pattern>
+inline auto m_SpecificScalarVT(EVT RefVT, const Pattern &P) {
+ return ValueType_match{[=](EVT VT) { return VT.getScalarType() == RefVT; }, P};
+}
+inline auto m_SpecificScalarVT(EVT RefVT) {
+ return ValueType_match{[=](EVT VT) { return VT.getScalarType() == RefVT; }, m_Value()};
+}
+
+/// Match a vector ValueType.
+template <typename Pattern>
+inline auto m_SpecificVectorElementVT(EVT RefVT, const Pattern &P) {
+ return ValueType_match{
+ [=](EVT VT) { return VT.isVector() && VT.getVectorElementType() == RefVT; },
+ P};
+}
+inline auto m_SpecificVectorElementVT(EVT RefVT) {
+ return ValueType_match{
+ [=](EVT VT) { return VT.isVector() && VT.getVectorElementType() == RefVT; },
+ m_Value()};
+}
+
+
/// Match any integer ValueTypes.
template <typename Pattern> inline auto m_IntegerVT(const Pattern &P) {
return ValueType_match{[](EVT VT) { return VT.isInteger(); }, P};
diff --git a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp
index 2b1fa75a1475a..cc21c748b47ee 100644
--- a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp
+++ b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp
@@ -110,6 +110,10 @@ TEST_F(SelectionDAGPatternMatchTest, matchValueType) {
using namespace SDPatternMatch;
EXPECT_TRUE(sd_match(Op0, m_SpecificVT(Int32VT)));
+ EXPECT_TRUE(sd_match(Op0, m_SpecificScalarVT(Int32VT)));
+ EXPECT_FALSE(sd_match(Op0, m_SpecificScalarVT(Float32VT)));
+ EXPECT_TRUE(sd_match(Op2, m_SpecificVectorElementVT(Int32VT)));
+ EXPECT_FALSE(sd_match(Op2, m_SpecificVectorElementVT(Float32VT)));
EVT BindVT;
EXPECT_TRUE(sd_match(Op1, m_VT(BindVT)));
EXPECT_EQ(BindVT, Float32VT);
More information about the llvm-commits
mailing list