[llvm] [DAG] Add SpecificFP matcher (PR #167438)
Ravil Dorozhinskii via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 19 16:55:17 PST 2025
https://github.com/ravil-mobile updated https://github.com/llvm/llvm-project/pull/167438
>From 12292193c305820b8eb089de420abb6596ada08f Mon Sep 17 00:00:00 2001
From: ravil-mobile <ravil.aviva.com at gmail.com>
Date: Tue, 11 Nov 2025 02:40:45 +0100
Subject: [PATCH] [DAG] Add SpecificFP matcher
---
llvm/include/llvm/CodeGen/SDPatternMatch.h | 30 +++++++++++++++++++
.../CodeGen/SelectionDAGPatternMatchTest.cpp | 29 ++++++++++++++++++
2 files changed, 59 insertions(+)
diff --git a/llvm/include/llvm/CodeGen/SDPatternMatch.h b/llvm/include/llvm/CodeGen/SDPatternMatch.h
index 9a6bf5ffdd227..195274479db81 100644
--- a/llvm/include/llvm/CodeGen/SDPatternMatch.h
+++ b/llvm/include/llvm/CodeGen/SDPatternMatch.h
@@ -1144,6 +1144,36 @@ inline SpecificInt_match m_SpecificInt(uint64_t V) {
return SpecificInt_match(APInt(64, V));
}
+struct SpecificFP_match {
+ std::optional<double> Val = std::nullopt;
+
+ explicit SpecificFP_match(std::optional<double> V) : Val(V) {}
+
+ template <typename MatchContext>
+ bool match(const MatchContext &Ctx, SDValue V) {
+ if (!Val.has_value())
+ return false;
+ if (const auto *CFP = dyn_cast<ConstantFPSDNode>(V.getNode()))
+ return CFP->isExactlyValue(Val.value());
+ if (ConstantFPSDNode *C = isConstOrConstSplatFP(V, true))
+ return C->getValueAPF().isExactlyValue(Val.value());
+ 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); }
+
+inline SpecificFP_match m_SpecificFP(SDValue V) {
+ if (ConstantFPSDNode *C = isConstOrConstSplatFP(V, true))
+ return SpecificFP_match(C->getValueAPF().convertToDouble());
+ return SpecificFP_match(std::nullopt);
+}
+
struct Zero_match {
bool AllowUndefs;
diff --git a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp
index ceaee52a3948b..5df7b6e61aa9e 100644
--- a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp
+++ b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp
@@ -354,6 +354,35 @@ 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(Op1, m_SpecificFP(Value)));
+ EXPECT_TRUE(
+ sd_match(FAdd, m_BinOp(ISD::FADD, m_Specific(Op0), m_SpecificFP(Value))));
+ EXPECT_TRUE(
+ sd_match(FAdd, m_c_BinOp(ISD::FADD, m_SpecificFP(Value), m_Specific(Op0))));
+
+ auto VFloat32VT = EVT::getVectorVT(Context, Float32VT, 2);
+ SDValue VOp0 = DAG->getSplat(VFloat32VT, DL, Op0);
+ SDValue VOp1 = DAG->getSplat(VFloat32VT, DL, Op1);
+
+ EXPECT_TRUE(sd_match(VOp1, m_SpecificFP(VOp1)));
+
+ SDValue VFAdd = DAG->getNode(ISD::FADD, DL, VFloat32VT, VOp0, VOp1);
+ EXPECT_TRUE(
+ sd_match(VFAdd, m_BinOp(ISD::FADD, m_Specific(VOp0), m_SpecificFP(VOp1))));
+ EXPECT_TRUE(
+ sd_match(VFAdd, m_c_BinOp(ISD::FADD, m_SpecificFP(VOp1), m_Specific(VOp0))));
+}
+
TEST_F(SelectionDAGPatternMatchTest, matchGenericTernaryOp) {
SDLoc DL;
auto Float32VT = EVT::getFloatingPointVT(32);
More information about the llvm-commits
mailing list