diff --git a/llvm/include/llvm/CodeGen/SDPatternMatch.h b/llvm/include/llvm/CodeGen/SDPatternMatch.h index 9eb6dd45f912f..a1e98a29c9b0c 100644 --- a/llvm/include/llvm/CodeGen/SDPatternMatch.h +++ b/llvm/include/llvm/CodeGen/SDPatternMatch.h @@ -513,6 +513,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 Result_match<0, TernaryOpc_match> +m_Load(const T0_P &Ch, const T1_P &Ptr, const T2_P &Offset) { + return m_Result<0>( + TernaryOpc_match(ISD::LOAD, Ch, Ptr, Offset)); +} + template inline TernaryOpc_match m_InsertElt(const T0_P &Vec, const T1_P &Val, const T2_P &Idx) { diff --git a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp index 2b1fa75a1475a..f1562ca73d3e2 100644 --- a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp +++ b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp @@ -178,6 +178,12 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) { SDValue ExtractELT = DAG->getNode(ISD::EXTRACT_VECTOR_ELT, DL, Int32VT, V1, Op3); + SDValue Ch = DAG->getEntryNode(); + SDValue BasePtr = DAG->getRegister(1, MVT::i64); + SDValue Offset = DAG->getUNDEF(MVT::i64); + MachinePointerInfo PtrInfo; + SDValue Load = DAG->getLoad(MVT::i32, DL, Ch, BasePtr, PtrInfo); + using namespace SDPatternMatch; ISD::CondCode CC; EXPECT_TRUE(sd_match(ICMP_UGT, m_SetCC(m_Value(), m_Value(), @@ -230,6 +236,13 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) { EXPECT_FALSE(sd_match( InsertSubvector, m_InsertSubvector(m_Specific(V2), m_Specific(V3), m_SpecificInt(3)))); + + EXPECT_TRUE(sd_match( + Load, m_Load(m_Specific(Ch), m_Specific(BasePtr), m_Specific(Offset)))); + + EXPECT_FALSE( + sd_match(Load.getValue(1), m_Load(m_Specific(Ch), m_Specific(BasePtr), + m_Specific(Offset)))); } TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {