From ac69bb38a1628d6a27998122b7fe30de976be032 Mon Sep 17 00:00:00 2001 From: Abhishek Kaushik Date: Tue, 24 Jun 2025 14:55:08 +0530 Subject: [PATCH 1/4] [DAG] Add `SDPatternMatch::m_Load` --- llvm/include/llvm/CodeGen/SDPatternMatch.h | 6 ++++++ llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/llvm/include/llvm/CodeGen/SDPatternMatch.h b/llvm/include/llvm/CodeGen/SDPatternMatch.h index 9eb6dd45f912f..c45fdfc688d91 100644 --- a/llvm/include/llvm/CodeGen/SDPatternMatch.h +++ b/llvm/include/llvm/CodeGen/SDPatternMatch.h @@ -513,6 +513,12 @@ 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_Load(const T0_P &Ch, const T1_P &Ptr, const T2_P &Offset) { + return 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..c594eb1e002a0 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,8 @@ 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)))); } TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) { From b931000a9fc4585dd6c8f5c2540371471a999284 Mon Sep 17 00:00:00 2001 From: Abhishek Kaushik Date: Tue, 24 Jun 2025 15:00:17 +0530 Subject: [PATCH 2/4] Fix formatting --- llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp index c594eb1e002a0..047b579871b84 100644 --- a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp +++ b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp @@ -237,7 +237,8 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) { 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_TRUE(sd_match( + Load, m_Load(m_Specific(Ch), m_Specific(BasePtr), m_Specific(Offset)))); } TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) { From a95c9f96720fca65068825970193ca141896595c Mon Sep 17 00:00:00 2001 From: Abhishek Kaushik Date: Thu, 26 Jun 2025 12:54:47 +0530 Subject: [PATCH 3/4] Update SelectionDAGPatternMatchTest.cpp --- llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp index 047b579871b84..66993ac8811ef 100644 --- a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp +++ b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp @@ -239,6 +239,10 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) { EXPECT_TRUE(sd_match( Load, m_Load(m_Specific(Ch), m_Specific(BasePtr), m_Specific(Offset)))); + + EXPECT_TRUE( + sd_match(Load.getValue(1), m_Load(m_Specific(Ch), m_Specific(BasePtr), + m_Specific(Offset)))); } TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) { From c961ba3d5c592877055932d5ad99d4aeee40cecb Mon Sep 17 00:00:00 2001 From: Abhishek Kaushik Date: Thu, 26 Jun 2025 22:08:43 +0530 Subject: [PATCH 4/4] Use m_Result to match only the loaded value --- llvm/include/llvm/CodeGen/SDPatternMatch.h | 5 +++-- llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/llvm/include/llvm/CodeGen/SDPatternMatch.h b/llvm/include/llvm/CodeGen/SDPatternMatch.h index c45fdfc688d91..a1e98a29c9b0c 100644 --- a/llvm/include/llvm/CodeGen/SDPatternMatch.h +++ b/llvm/include/llvm/CodeGen/SDPatternMatch.h @@ -514,9 +514,10 @@ m_VSelect(const T0_P &Cond, const T1_P &T, const T2_P &F) { } template -inline TernaryOpc_match +inline Result_match<0, TernaryOpc_match> m_Load(const T0_P &Ch, const T1_P &Ptr, const T2_P &Offset) { - return TernaryOpc_match(ISD::LOAD, Ch, Ptr, Offset); + return m_Result<0>( + TernaryOpc_match(ISD::LOAD, Ch, Ptr, Offset)); } template diff --git a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp index 66993ac8811ef..f1562ca73d3e2 100644 --- a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp +++ b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp @@ -240,7 +240,7 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) { EXPECT_TRUE(sd_match( Load, m_Load(m_Specific(Ch), m_Specific(BasePtr), m_Specific(Offset)))); - EXPECT_TRUE( + EXPECT_FALSE( sd_match(Load.getValue(1), m_Load(m_Specific(Ch), m_Specific(BasePtr), m_Specific(Offset)))); }