Skip to content

Commit eb1a80b

Browse files
zhaohuiw42RKSimon
andauthored
[DAG] Implement SDPatternMatch m_SpecificScalarVT and m_SpecificVectorElementVT matchers (#144996)
Resolves #144477 --------- Co-authored-by: Simon Pilgrim <[email protected]>
1 parent 749c7c5 commit eb1a80b

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

llvm/include/llvm/CodeGen/SDPatternMatch.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,34 @@ inline auto m_SpecificVT(EVT RefVT) {
294294
inline auto m_Glue() { return m_SpecificVT(MVT::Glue); }
295295
inline auto m_OtherVT() { return m_SpecificVT(MVT::Other); }
296296

297+
/// Match a scalar ValueType.
298+
template <typename Pattern>
299+
inline auto m_SpecificScalarVT(EVT RefVT, const Pattern &P) {
300+
return ValueType_match{[=](EVT VT) { return VT.getScalarType() == RefVT; },
301+
P};
302+
}
303+
inline auto m_SpecificScalarVT(EVT RefVT) {
304+
return ValueType_match{[=](EVT VT) { return VT.getScalarType() == RefVT; },
305+
m_Value()};
306+
}
307+
308+
/// Match a vector ValueType.
309+
template <typename Pattern>
310+
inline auto m_SpecificVectorElementVT(EVT RefVT, const Pattern &P) {
311+
return ValueType_match{[=](EVT VT) {
312+
return VT.isVector() &&
313+
VT.getVectorElementType() == RefVT;
314+
},
315+
P};
316+
}
317+
inline auto m_SpecificVectorElementVT(EVT RefVT) {
318+
return ValueType_match{[=](EVT VT) {
319+
return VT.isVector() &&
320+
VT.getVectorElementType() == RefVT;
321+
},
322+
m_Value()};
323+
}
324+
297325
/// Match any integer ValueTypes.
298326
template <typename Pattern> inline auto m_IntegerVT(const Pattern &P) {
299327
return ValueType_match{[](EVT VT) { return VT.isInteger(); }, P};

llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,14 @@ TEST_F(SelectionDAGPatternMatchTest, matchValueType) {
110110

111111
using namespace SDPatternMatch;
112112
EXPECT_TRUE(sd_match(Op0, m_SpecificVT(Int32VT)));
113+
EXPECT_TRUE(sd_match(Op0, m_SpecificScalarVT(Int32VT)));
114+
EXPECT_TRUE(sd_match(Op0, m_SpecificScalarVT(Int32VT, m_Value())));
115+
EXPECT_FALSE(sd_match(Op0, m_SpecificScalarVT(Float32VT)));
116+
EXPECT_FALSE(sd_match(Op0, m_SpecificScalarVT(Float32VT, m_Value())));
117+
EXPECT_TRUE(sd_match(Op2, m_SpecificVectorElementVT(Int32VT)));
118+
EXPECT_TRUE(sd_match(Op2, m_SpecificVectorElementVT(Int32VT, m_Value())));
119+
EXPECT_FALSE(sd_match(Op2, m_SpecificVectorElementVT(Float32VT)));
120+
EXPECT_FALSE(sd_match(Op2, m_SpecificVectorElementVT(Float32VT, m_Value())));
113121
EVT BindVT;
114122
EXPECT_TRUE(sd_match(Op1, m_VT(BindVT)));
115123
EXPECT_EQ(BindVT, Float32VT);

0 commit comments

Comments
 (0)