Skip to content

Commit ecdf0da

Browse files
authored
[DAG] SDPatternMatch - Add m_ExtractElt and m_InsertElt matchers (#119430)
Resolves #118844
1 parent 71d2fa7 commit ecdf0da

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

llvm/include/llvm/CodeGen/SDPatternMatch.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,13 @@ m_VSelect(const T0_P &Cond, const T1_P &T, const T2_P &F) {
507507
return TernaryOpc_match<T0_P, T1_P, T2_P>(ISD::VSELECT, Cond, T, F);
508508
}
509509

510+
template <typename T0_P, typename T1_P, typename T2_P>
511+
inline TernaryOpc_match<T0_P, T1_P, T2_P>
512+
m_InsertElt(const T0_P &Vec, const T1_P &Val, const T2_P &Idx) {
513+
return TernaryOpc_match<T0_P, T1_P, T2_P>(ISD::INSERT_VECTOR_ELT, Vec, Val,
514+
Idx);
515+
}
516+
510517
// === Binary operations ===
511518
template <typename LHS_P, typename RHS_P, bool Commutable = false,
512519
bool ExcludeChain = false>
@@ -790,6 +797,11 @@ inline BinaryOpc_match<LHS, RHS> m_FRem(const LHS &L, const RHS &R) {
790797
return BinaryOpc_match<LHS, RHS>(ISD::FREM, L, R);
791798
}
792799

800+
template <typename LHS, typename RHS>
801+
inline BinaryOpc_match<LHS, RHS> m_ExtractElt(const LHS &Vec, const RHS &Idx) {
802+
return BinaryOpc_match<LHS, RHS>(ISD::EXTRACT_VECTOR_ELT, Vec, Idx);
803+
}
804+
793805
// === Unary operations ===
794806
template <typename Opnd_P, bool ExcludeChain = false> struct UnaryOpc_match {
795807
unsigned Opcode;

llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) {
125125

126126
SDValue Op0 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 1, Int32VT);
127127
SDValue Op1 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 2, Int32VT);
128+
SDValue Op3 = DAG->getConstant(1, DL, Int32VT);
128129

129130
SDValue ICMP_UGT = DAG->getSetCC(DL, MVT::i1, Op0, Op1, ISD::SETUGT);
130131
SDValue ICMP_EQ01 = DAG->getSetCC(DL, MVT::i1, Op0, Op1, ISD::SETEQ);
@@ -141,6 +142,9 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) {
141142
SDValue V2 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 7, VInt32VT);
142143
SDValue VSelect = DAG->getNode(ISD::VSELECT, DL, VInt32VT, Cond, V1, V2);
143144

145+
SDValue ExtractELT =
146+
DAG->getNode(ISD::EXTRACT_VECTOR_ELT, DL, Int32VT, V1, Op3);
147+
144148
using namespace SDPatternMatch;
145149
ISD::CondCode CC;
146150
EXPECT_TRUE(sd_match(ICMP_UGT, m_SetCC(m_Value(), m_Value(),
@@ -174,17 +178,25 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) {
174178
VSelect, m_VSelect(m_Specific(Cond), m_Specific(V1), m_Specific(V2))));
175179
EXPECT_FALSE(sd_match(
176180
Select, m_VSelect(m_Specific(Cond), m_Specific(V1), m_Specific(V2))));
181+
182+
EXPECT_TRUE(sd_match(ExtractELT, m_ExtractElt(m_Value(), m_Value())));
183+
EXPECT_TRUE(sd_match(ExtractELT, m_ExtractElt(m_Value(), m_ConstInt())));
184+
EXPECT_TRUE(sd_match(ExtractELT, m_ExtractElt(m_Value(), m_SpecificInt(1))));
177185
}
178186

179187
TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
180188
SDLoc DL;
181189
auto Int32VT = EVT::getIntegerVT(Context, 32);
182190
auto Float32VT = EVT::getFloatingPointVT(32);
191+
auto VInt32VT = EVT::getVectorVT(Context, Int32VT, 4);
192+
193+
SDValue V1 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 6, VInt32VT);
183194

184195
SDValue Op0 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 1, Int32VT);
185196
SDValue Op1 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 2, Int32VT);
186197
SDValue Op2 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 3, Float32VT);
187198
SDValue Op3 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 8, Int32VT);
199+
SDValue Op4 = DAG->getConstant(1, DL, Int32VT);
188200

189201
SDValue Add = DAG->getNode(ISD::ADD, DL, Int32VT, Op0, Op1);
190202
SDValue Sub = DAG->getNode(ISD::SUB, DL, Int32VT, Add, Op0);
@@ -221,6 +233,9 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
221233
SDValue SFAdd = DAG->getNode(ISD::STRICT_FADD, DL, {Float32VT, MVT::Other},
222234
{DAG->getEntryNode(), Op2, Op2});
223235

236+
SDValue InsertELT =
237+
DAG->getNode(ISD::INSERT_VECTOR_ELT, DL, VInt32VT, V1, Op0, Op4);
238+
224239
using namespace SDPatternMatch;
225240
EXPECT_TRUE(sd_match(Sub, m_BinOp(ISD::SUB, m_Value(), m_Value())));
226241
EXPECT_TRUE(sd_match(Sub, m_Sub(m_Value(), m_Value())));
@@ -277,6 +292,13 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
277292
m_Deferred(BindVal))));
278293
EXPECT_FALSE(sd_match(SFAdd, m_ChainedBinOp(ISD::STRICT_FADD, m_OtherVT(),
279294
m_SpecificVT(Float32VT))));
295+
296+
EXPECT_TRUE(
297+
sd_match(InsertELT, m_InsertElt(m_Value(), m_Value(), m_Value())));
298+
EXPECT_TRUE(
299+
sd_match(InsertELT, m_InsertElt(m_Value(), m_Value(), m_ConstInt())));
300+
EXPECT_TRUE(
301+
sd_match(InsertELT, m_InsertElt(m_Value(), m_Value(), m_SpecificInt(1))));
280302
}
281303

282304
TEST_F(SelectionDAGPatternMatchTest, matchUnaryOp) {

0 commit comments

Comments
 (0)