Skip to content

Commit bc4143b

Browse files
authored
[DAG] SDPatternMatch - add m_SpecificFP matcher (#167438)
This patch introduces SpecificFP matcher for SelectionDAG nodes. This includes: Adding SpecificFP_match() in SDPatternMatch.h. Adding test coverage in SelectionDAGPatternMatchTest.cpp. Closes #165566
1 parent 4b137e7 commit bc4143b

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

llvm/include/llvm/CodeGen/SDPatternMatch.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,6 +1151,28 @@ inline SpecificInt_match m_SpecificInt(uint64_t V) {
11511151
return SpecificInt_match(APInt(64, V));
11521152
}
11531153

1154+
struct SpecificFP_match {
1155+
APFloat Val;
1156+
1157+
explicit SpecificFP_match(APFloat V) : Val(V) {}
1158+
1159+
template <typename MatchContext>
1160+
bool match(const MatchContext &Ctx, SDValue V) {
1161+
if (const auto *CFP = dyn_cast<ConstantFPSDNode>(V.getNode()))
1162+
return CFP->isExactlyValue(Val);
1163+
if (ConstantFPSDNode *C = isConstOrConstSplatFP(V, /*AllowUndefs=*/true))
1164+
return C->getValueAPF().compare(Val) == APFloat::cmpEqual;
1165+
return false;
1166+
}
1167+
};
1168+
1169+
/// Match a specific float constant.
1170+
inline SpecificFP_match m_SpecificFP(APFloat V) { return SpecificFP_match(V); }
1171+
1172+
inline SpecificFP_match m_SpecificFP(double V) {
1173+
return SpecificFP_match(APFloat(V));
1174+
}
1175+
11541176
struct Zero_match {
11551177
bool AllowUndefs;
11561178

llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,46 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
354354
sd_match(InsertELT, m_InsertElt(m_Value(), m_Value(), m_SpecificInt(1))));
355355
}
356356

357+
TEST_F(SelectionDAGPatternMatchTest, matchSpecificFpOp) {
358+
SDLoc DL;
359+
APFloat Value(1.5f);
360+
auto Float32VT = EVT::getFloatingPointVT(32);
361+
SDValue Op0 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 1, Float32VT);
362+
SDValue Op1 = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 2, Float32VT);
363+
SDValue Op2 = DAG->getConstantFP(Value, DL, Float32VT);
364+
SDValue FAdd0 = DAG->getNode(ISD::FADD, DL, Float32VT, Op0, Op1);
365+
SDValue FAdd1 = DAG->getNode(ISD::FADD, DL, Float32VT, Op1, Op2);
366+
367+
using namespace SDPatternMatch;
368+
369+
EXPECT_FALSE(sd_match(Op1, m_SpecificFP(Value)));
370+
EXPECT_TRUE(sd_match(Op2, m_SpecificFP(Value)));
371+
372+
EXPECT_FALSE(sd_match(
373+
FAdd0, m_BinOp(ISD::FADD, m_Specific(Op0), m_SpecificFP(Value))));
374+
EXPECT_TRUE(sd_match(
375+
FAdd1, m_BinOp(ISD::FADD, m_Specific(Op1), m_SpecificFP(Value))));
376+
EXPECT_TRUE(sd_match(
377+
FAdd1, m_c_BinOp(ISD::FADD, m_SpecificFP(Value), m_Specific(Op1))));
378+
379+
auto VFloat32VT = EVT::getVectorVT(Context, Float32VT, 2);
380+
SDValue VOp0 = DAG->getSplat(VFloat32VT, DL, Op0);
381+
SDValue VOp1 = DAG->getSplat(VFloat32VT, DL, Op1);
382+
SDValue VOp2 = DAG->getSplat(VFloat32VT, DL, Op2);
383+
384+
EXPECT_FALSE(sd_match(VOp0, m_SpecificFP(Value)));
385+
EXPECT_TRUE(sd_match(VOp2, m_SpecificFP(Value)));
386+
387+
SDValue VFAdd0 = DAG->getNode(ISD::FADD, DL, VFloat32VT, VOp0, VOp1);
388+
SDValue VFAdd1 = DAG->getNode(ISD::FADD, DL, VFloat32VT, VOp1, VOp2);
389+
EXPECT_FALSE(sd_match(
390+
VFAdd0, m_BinOp(ISD::FADD, m_Specific(VOp0), m_SpecificFP(Value))));
391+
EXPECT_TRUE(sd_match(
392+
VFAdd1, m_BinOp(ISD::FADD, m_Specific(VOp1), m_SpecificFP(Value))));
393+
EXPECT_TRUE(sd_match(
394+
VFAdd1, m_c_BinOp(ISD::FADD, m_SpecificFP(Value), m_Specific(VOp1))));
395+
}
396+
357397
TEST_F(SelectionDAGPatternMatchTest, matchGenericTernaryOp) {
358398
SDLoc DL;
359399
auto Float32VT = EVT::getFloatingPointVT(32);

0 commit comments

Comments
 (0)