@@ -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+
357397TEST_F (SelectionDAGPatternMatchTest, matchGenericTernaryOp) {
358398 SDLoc DL;
359399 auto Float32VT = EVT::getFloatingPointVT (32 );
0 commit comments