From 485284a43a5f71810dd89b3dd2e47ef31203a30f Mon Sep 17 00:00:00 2001 From: ravil-mobile Date: Tue, 11 Nov 2025 02:40:45 +0100 Subject: [PATCH] [DAG] Add SpecificFP matcher --- llvm/include/llvm/CodeGen/SDPatternMatch.h | 21 +++++++++++++++++++ .../CodeGen/SelectionDAGPatternMatchTest.cpp | 15 +++++++++++++ 2 files changed, 36 insertions(+) diff --git a/llvm/include/llvm/CodeGen/SDPatternMatch.h b/llvm/include/llvm/CodeGen/SDPatternMatch.h index 9a6bf5ffdd227..8d0498bfa6d8a 100644 --- a/llvm/include/llvm/CodeGen/SDPatternMatch.h +++ b/llvm/include/llvm/CodeGen/SDPatternMatch.h @@ -1144,6 +1144,27 @@ inline SpecificInt_match m_SpecificInt(uint64_t V) { return SpecificInt_match(APInt(64, V)); } +struct SpecificFP_match { + double Val; + + explicit SpecificFP_match(double V) : Val(V) {} + + template + bool match(const MatchContext &Ctx, SDValue V) { + if (const auto *CFP = dyn_cast(V.getNode())) + if (CFP->isExactlyValue(Val)) + return true; + return false; + } +}; + +/// Match a specific float constant. +inline SpecificFP_match m_SpecificFP(APFloat V) { + return SpecificFP_match(V.convertToDouble()); +} + +inline SpecificFP_match m_SpecificFP(double V) { return SpecificFP_match(V); } + struct Zero_match { bool AllowUndefs; diff --git a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp index ceaee52a3948b..dff1c4e9e1f3f 100644 --- a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp +++ b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp @@ -354,6 +354,21 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) { sd_match(InsertELT, m_InsertElt(m_Value(), m_Value(), m_SpecificInt(1)))); } +TEST_F(SelectionDAGPatternMatchTest, matchSpecificFpOp) { + SDLoc DL; + APFloat Value(1.5f); + auto Float32VT = EVT::getFloatingPointVT(32); + SDValue Op0 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 1, Float32VT); + SDValue Op1 = DAG->getConstantFP(Value, DL, Float32VT); + SDValue FAdd = DAG->getNode(ISD::FADD, DL, Float32VT, Op0, Op1); + + using namespace SDPatternMatch; + + EXPECT_TRUE(sd_match(Op0, m_SpecificFP(Value))); + EXPECT_TRUE( + sd_match(FAdd, m_BinOp(ISD::FADD, m_Specific(Op1), m_SpecificFP(Value)))); +} + TEST_F(SelectionDAGPatternMatchTest, matchGenericTernaryOp) { SDLoc DL; auto Float32VT = EVT::getFloatingPointVT(32);