[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