diff --git a/llvm/include/llvm/CodeGen/SDPatternMatch.h b/llvm/include/llvm/CodeGen/SDPatternMatch.h index 96667952a16ef..d21cc962da46c 100644 --- a/llvm/include/llvm/CodeGen/SDPatternMatch.h +++ b/llvm/include/llvm/CodeGen/SDPatternMatch.h @@ -507,6 +507,13 @@ m_VSelect(const T0_P &Cond, const T1_P &T, const T2_P &F) { return TernaryOpc_match(ISD::VSELECT, Cond, T, F); } +template +inline TernaryOpc_match +m_InsertElt(const T0_P &Vec, const T1_P &Val, const T2_P &Idx) { + return TernaryOpc_match(ISD::INSERT_VECTOR_ELT, Vec, Val, + Idx); +} + // === Binary operations === template @@ -790,6 +797,11 @@ inline BinaryOpc_match m_FRem(const LHS &L, const RHS &R) { return BinaryOpc_match(ISD::FREM, L, R); } +template +inline BinaryOpc_match m_ExtractElt(const LHS &Vec, const RHS &Idx) { + return BinaryOpc_match(ISD::EXTRACT_VECTOR_ELT, Vec, Idx); +} + // === Unary operations === template struct UnaryOpc_match { unsigned Opcode; diff --git a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp index b9bcb2479fdcc..259bdad0ab272 100644 --- a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp +++ b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp @@ -125,6 +125,7 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) { SDValue Op0 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 1, Int32VT); SDValue Op1 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 2, Int32VT); + SDValue Op3 = DAG->getConstant(1, DL, Int32VT); SDValue ICMP_UGT = DAG->getSetCC(DL, MVT::i1, Op0, Op1, ISD::SETUGT); SDValue ICMP_EQ01 = DAG->getSetCC(DL, MVT::i1, Op0, Op1, ISD::SETEQ); @@ -141,6 +142,9 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) { SDValue V2 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 7, VInt32VT); SDValue VSelect = DAG->getNode(ISD::VSELECT, DL, VInt32VT, Cond, V1, V2); + SDValue ExtractELT = + DAG->getNode(ISD::EXTRACT_VECTOR_ELT, DL, Int32VT, V1, Op3); + using namespace SDPatternMatch; ISD::CondCode CC; EXPECT_TRUE(sd_match(ICMP_UGT, m_SetCC(m_Value(), m_Value(), @@ -174,17 +178,25 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) { VSelect, m_VSelect(m_Specific(Cond), m_Specific(V1), m_Specific(V2)))); EXPECT_FALSE(sd_match( Select, m_VSelect(m_Specific(Cond), m_Specific(V1), m_Specific(V2)))); + + EXPECT_TRUE(sd_match(ExtractELT, m_ExtractElt(m_Value(), m_Value()))); + EXPECT_TRUE(sd_match(ExtractELT, m_ExtractElt(m_Value(), m_ConstInt()))); + EXPECT_TRUE(sd_match(ExtractELT, m_ExtractElt(m_Value(), m_SpecificInt(1)))); } TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) { SDLoc DL; auto Int32VT = EVT::getIntegerVT(Context, 32); auto Float32VT = EVT::getFloatingPointVT(32); + auto VInt32VT = EVT::getVectorVT(Context, Int32VT, 4); + + SDValue V1 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 6, VInt32VT); SDValue Op0 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 1, Int32VT); SDValue Op1 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 2, Int32VT); SDValue Op2 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 3, Float32VT); SDValue Op3 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 8, Int32VT); + SDValue Op4 = DAG->getConstant(1, DL, Int32VT); SDValue Add = DAG->getNode(ISD::ADD, DL, Int32VT, Op0, Op1); SDValue Sub = DAG->getNode(ISD::SUB, DL, Int32VT, Add, Op0); @@ -221,6 +233,9 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) { SDValue SFAdd = DAG->getNode(ISD::STRICT_FADD, DL, {Float32VT, MVT::Other}, {DAG->getEntryNode(), Op2, Op2}); + SDValue InsertELT = + DAG->getNode(ISD::INSERT_VECTOR_ELT, DL, VInt32VT, V1, Op0, Op4); + using namespace SDPatternMatch; EXPECT_TRUE(sd_match(Sub, m_BinOp(ISD::SUB, m_Value(), m_Value()))); EXPECT_TRUE(sd_match(Sub, m_Sub(m_Value(), m_Value()))); @@ -277,6 +292,13 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) { m_Deferred(BindVal)))); EXPECT_FALSE(sd_match(SFAdd, m_ChainedBinOp(ISD::STRICT_FADD, m_OtherVT(), m_SpecificVT(Float32VT)))); + + EXPECT_TRUE( + sd_match(InsertELT, m_InsertElt(m_Value(), m_Value(), m_Value()))); + EXPECT_TRUE( + sd_match(InsertELT, m_InsertElt(m_Value(), m_Value(), m_ConstInt()))); + EXPECT_TRUE( + sd_match(InsertELT, m_InsertElt(m_Value(), m_Value(), m_SpecificInt(1)))); } TEST_F(SelectionDAGPatternMatchTest, matchUnaryOp) {