@@ -354,6 +354,76 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
354354 sd_match (InsertELT, m_InsertElt (m_Value (), m_Value (), m_SpecificInt (1 ))));
355355}
356356
357+ TEST_F (SelectionDAGPatternMatchTest, matchGenericTernaryOp) {
358+ SDLoc DL;
359+ auto Float32VT = EVT::getFloatingPointVT (32 );
360+
361+ SDValue Op0 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 1 , Float32VT);
362+ SDValue Op1 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 2 , Float32VT);
363+ SDValue Op2 = DAG->getCopyFromReg (DAG->getEntryNode (), DL, 3 , Float32VT);
364+
365+ SDValue FMA = DAG->getNode (ISD::FMA, DL, Float32VT, Op0, Op1, Op2);
366+ SDValue FAdd = DAG->getNode (ISD::FADD, DL, Float32VT, Op0, Op1);
367+
368+ using namespace SDPatternMatch ;
369+ SDValue A, B, C;
370+
371+ EXPECT_TRUE (sd_match (FMA, m_TernaryOp (ISD::FMA, m_Specific (Op0),
372+ m_Specific (Op1), m_Specific (Op2))));
373+ EXPECT_FALSE (sd_match (FMA, m_TernaryOp (ISD::FADD, m_Specific (Op0),
374+ m_Specific (Op1), m_Specific (Op2))));
375+ EXPECT_FALSE (
376+ sd_match (FAdd, m_TernaryOp (ISD::FMA, m_Value (), m_Value (), m_Value ())));
377+ EXPECT_FALSE (sd_match (FMA, m_TernaryOp (ISD::FMA, m_Specific (Op1),
378+ m_Specific (Op0), m_Specific (Op2))));
379+
380+ EXPECT_TRUE (
381+ sd_match (FMA, m_TernaryOp (ISD::FMA, m_Value (A), m_Value (B), m_Value (C))));
382+ EXPECT_EQ (A, Op0);
383+ EXPECT_EQ (B, Op1);
384+ EXPECT_EQ (C, Op2);
385+
386+ A = B = C = SDValue ();
387+
388+ EXPECT_TRUE (sd_match (FMA, m_c_TernaryOp (ISD::FMA, m_Specific (Op0),
389+ m_Specific (Op1), m_Specific (Op2))));
390+ EXPECT_TRUE (sd_match (FMA, m_c_TernaryOp (ISD::FMA, m_Specific (Op1),
391+ m_Specific (Op0), m_Specific (Op2))));
392+
393+ EXPECT_FALSE (sd_match (FMA, m_c_TernaryOp (ISD::FMA, m_Specific (Op2),
394+ m_Specific (Op1), m_Specific (Op0))));
395+ EXPECT_FALSE (sd_match (FMA, m_c_TernaryOp (ISD::FMA, m_Specific (Op2),
396+ m_Specific (Op0), m_Specific (Op1))));
397+
398+ EXPECT_FALSE (sd_match (FMA, m_c_TernaryOp (ISD::FMA, m_Specific (Op0),
399+ m_Specific (Op2), m_Specific (Op1))));
400+ EXPECT_FALSE (sd_match (FMA, m_c_TernaryOp (ISD::FMA, m_Specific (Op1),
401+ m_Specific (Op2), m_Specific (Op0))));
402+
403+ EXPECT_TRUE (sd_match (
404+ FMA, m_c_TernaryOp (ISD::FMA, m_Value (A), m_Value (B), m_Value (C))));
405+ EXPECT_EQ (A, Op0);
406+ EXPECT_EQ (B, Op1);
407+ EXPECT_EQ (C, Op2);
408+
409+ A = B = C = SDValue ();
410+ EXPECT_TRUE (sd_match (
411+ FMA, m_c_TernaryOp (ISD::FMA, m_Value (B), m_Value (A), m_Value (C))));
412+ EXPECT_EQ (A, Op1);
413+ EXPECT_EQ (B, Op0);
414+ EXPECT_EQ (C, Op2);
415+
416+ A = B = C = SDValue ();
417+ EXPECT_TRUE (sd_match (
418+ FMA, m_c_TernaryOp (ISD::FMA, m_Value (A), m_Value (B), m_Value (C))));
419+ EXPECT_EQ (A, Op0);
420+ EXPECT_EQ (B, Op1);
421+ EXPECT_EQ (C, Op2);
422+
423+ EXPECT_FALSE (
424+ sd_match (FAdd, m_c_TernaryOp (ISD::FMA, m_Value (), m_Value (), m_Value ())));
425+ }
426+
357427TEST_F (SelectionDAGPatternMatchTest, matchUnaryOp) {
358428 SDLoc DL;
359429 auto Int32VT = EVT::getIntegerVT (Context, 32 );
0 commit comments