@@ -509,6 +509,7 @@ namespace {
509509 SDValue visitFMUL(SDNode *N);
510510 template <class MatchContextClass> SDValue visitFMA(SDNode *N);
511511 SDValue visitFMAD(SDNode *N);
512+ SDValue visitFMULADD(SDNode *N);
512513 SDValue visitFDIV(SDNode *N);
513514 SDValue visitFREM(SDNode *N);
514515 SDValue visitFSQRT(SDNode *N);
@@ -1991,6 +1992,7 @@ SDValue DAGCombiner::visit(SDNode *N) {
19911992 case ISD::FMUL: return visitFMUL(N);
19921993 case ISD::FMA: return visitFMA<EmptyMatchContext>(N);
19931994 case ISD::FMAD: return visitFMAD(N);
1995+ case ISD::FMULADD: return visitFMULADD(N);
19941996 case ISD::FDIV: return visitFDIV(N);
19951997 case ISD::FREM: return visitFREM(N);
19961998 case ISD::FSQRT: return visitFSQRT(N);
@@ -18444,6 +18446,21 @@ SDValue DAGCombiner::visitFMAD(SDNode *N) {
1844418446 return SDValue();
1844518447}
1844618448
18449+ SDValue DAGCombiner::visitFMULADD(SDNode *N) {
18450+ SDValue N0 = N->getOperand(0);
18451+ SDValue N1 = N->getOperand(1);
18452+ SDValue N2 = N->getOperand(2);
18453+ EVT VT = N->getValueType(0);
18454+ SDLoc DL(N);
18455+
18456+ // Constant fold FMULADD.
18457+ if (SDValue C =
18458+ DAG.FoldConstantArithmetic(ISD::FMULADD, DL, VT, {N0, N1, N2}))
18459+ return C;
18460+
18461+ return SDValue();
18462+ }
18463+
1844718464// Combine multiple FDIVs with the same divisor into multiple FMULs by the
1844818465// reciprocal.
1844918466// E.g., (a / D; b / D;) -> (recip = 1.0 / D; a * recip; b * recip)
0 commit comments