Skip to content

Commit c1c50c7

Browse files
[SDPatternMatch] Add matchers m_ExtractSubvector and m_InsertSubvector (#120212)
Fixes #118846
1 parent ba704d5 commit c1c50c7

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

llvm/include/llvm/CodeGen/SDPatternMatch.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,12 @@ m_InsertElt(const T0_P &Vec, const T1_P &Val, const T2_P &Idx) {
514514
Idx);
515515
}
516516

517+
template <typename LHS, typename RHS, typename IDX>
518+
inline TernaryOpc_match<LHS, RHS, IDX>
519+
m_InsertSubvector(const LHS &Base, const RHS &Sub, const IDX &Idx) {
520+
return TernaryOpc_match<LHS, RHS, IDX>(ISD::INSERT_SUBVECTOR, Base, Sub, Idx);
521+
}
522+
517523
// === Binary operations ===
518524
template <typename LHS_P, typename RHS_P, bool Commutable = false,
519525
bool ExcludeChain = false>
@@ -846,6 +852,12 @@ inline BinaryOpc_match<LHS, RHS> m_ExtractElt(const LHS &Vec, const RHS &Idx) {
846852
return BinaryOpc_match<LHS, RHS>(ISD::EXTRACT_VECTOR_ELT, Vec, Idx);
847853
}
848854

855+
template <typename LHS, typename RHS>
856+
inline BinaryOpc_match<LHS, RHS> m_ExtractSubvector(const LHS &Vec,
857+
const RHS &Idx) {
858+
return BinaryOpc_match<LHS, RHS>(ISD::EXTRACT_SUBVECTOR, Vec, Idx);
859+
}
860+
849861
// === Unary operations ===
850862
template <typename Opnd_P, bool ExcludeChain = false> struct UnaryOpc_match {
851863
unsigned Opcode;

llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,15 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) {
165165
SDValue Select = DAG->getSelect(DL, MVT::i1, Cond, T, F);
166166

167167
auto VInt32VT = EVT::getVectorVT(Context, Int32VT, 4);
168+
auto SmallVInt32VT = EVT::getVectorVT(Context, Int32VT, 2);
169+
auto Idx0 = DAG->getVectorIdxConstant(0, DL);
170+
auto Idx3 = DAG->getVectorIdxConstant(3, DL);
168171
SDValue V1 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 6, VInt32VT);
169172
SDValue V2 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 7, VInt32VT);
173+
SDValue V3 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 8, SmallVInt32VT);
170174
SDValue VSelect = DAG->getNode(ISD::VSELECT, DL, VInt32VT, Cond, V1, V2);
175+
SDValue InsertSubvector =
176+
DAG->getNode(ISD::INSERT_SUBVECTOR, DL, VInt32VT, V2, V3, Idx0);
171177

172178
SDValue ExtractELT =
173179
DAG->getNode(ISD::EXTRACT_VECTOR_ELT, DL, Int32VT, V1, Op3);
@@ -209,15 +215,33 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) {
209215
EXPECT_TRUE(sd_match(ExtractELT, m_ExtractElt(m_Value(), m_Value())));
210216
EXPECT_TRUE(sd_match(ExtractELT, m_ExtractElt(m_Value(), m_ConstInt())));
211217
EXPECT_TRUE(sd_match(ExtractELT, m_ExtractElt(m_Value(), m_SpecificInt(1))));
218+
219+
EXPECT_TRUE(sd_match(InsertSubvector,
220+
m_InsertSubvector(m_Value(), m_Value(), m_Value())));
221+
EXPECT_TRUE(sd_match(
222+
InsertSubvector,
223+
m_InsertSubvector(m_Specific(V2), m_Specific(V3), m_Specific(Idx0))));
224+
EXPECT_TRUE(sd_match(
225+
InsertSubvector,
226+
m_InsertSubvector(m_Specific(V2), m_Specific(V3), m_SpecificInt(0))));
227+
EXPECT_FALSE(sd_match(
228+
InsertSubvector,
229+
m_InsertSubvector(m_Specific(V2), m_Specific(V3), m_Specific(Idx3))));
230+
EXPECT_FALSE(sd_match(
231+
InsertSubvector,
232+
m_InsertSubvector(m_Specific(V2), m_Specific(V3), m_SpecificInt(3))));
212233
}
213234

214235
TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
215236
SDLoc DL;
216237
auto Int32VT = EVT::getIntegerVT(Context, 32);
217238
auto Float32VT = EVT::getFloatingPointVT(32);
239+
auto BigVInt32VT = EVT::getVectorVT(Context, Int32VT, 8);
218240
auto VInt32VT = EVT::getVectorVT(Context, Int32VT, 4);
219241

220242
SDValue V1 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 6, VInt32VT);
243+
auto Idx0 = DAG->getVectorIdxConstant(0, DL);
244+
auto Idx1 = DAG->getVectorIdxConstant(1, DL);
221245

222246
SDValue Op0 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 1, Int32VT);
223247
SDValue Op1 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 2, Int32VT);
@@ -260,6 +284,10 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
260284
SDValue SFAdd = DAG->getNode(ISD::STRICT_FADD, DL, {Float32VT, MVT::Other},
261285
{DAG->getEntryNode(), Op2, Op2});
262286

287+
SDValue Vec = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 9, BigVInt32VT);
288+
SDValue SubVec =
289+
DAG->getNode(ISD::EXTRACT_SUBVECTOR, DL, VInt32VT, Vec, Idx0);
290+
263291
SDValue InsertELT =
264292
DAG->getNode(ISD::INSERT_VECTOR_ELT, DL, VInt32VT, V1, Op0, Op4);
265293

@@ -320,6 +348,16 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
320348
EXPECT_FALSE(sd_match(SFAdd, m_ChainedBinOp(ISD::STRICT_FADD, m_OtherVT(),
321349
m_SpecificVT(Float32VT))));
322350

351+
EXPECT_TRUE(sd_match(SubVec, m_ExtractSubvector(m_Value(), m_Value())));
352+
EXPECT_TRUE(
353+
sd_match(SubVec, m_ExtractSubvector(m_Specific(Vec), m_Specific(Idx0))));
354+
EXPECT_TRUE(
355+
sd_match(SubVec, m_ExtractSubvector(m_Specific(Vec), m_SpecificInt(0))));
356+
EXPECT_FALSE(
357+
sd_match(SubVec, m_ExtractSubvector(m_Specific(Vec), m_Specific(Idx1))));
358+
EXPECT_FALSE(
359+
sd_match(SubVec, m_ExtractSubvector(m_Specific(Vec), m_SpecificInt(1))));
360+
323361
EXPECT_TRUE(
324362
sd_match(InsertELT, m_InsertElt(m_Value(), m_Value(), m_Value())));
325363
EXPECT_TRUE(

0 commit comments

Comments
 (0)