diff options
Diffstat (limited to 'lib/CodeGen')
| -rw-r--r-- | lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 24 | 
1 files changed, 18 insertions, 6 deletions
| diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 680f62fa91bc..fd156fa7dd07 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -8123,9 +8123,12 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {    }    // More folding opportunities when target permits. -  if ((AllowFusion || HasFMAD)  && Aggressive) { +  if (Aggressive) {      // fold (fadd (fma x, y, (fmul u, v)), z) -> (fma x, y (fma u, v, z)) -    if (N0.getOpcode() == PreferredFusedOpcode && +    // FIXME: The UnsafeAlgebra flag should be propagated to FMA/FMAD, but FMF +    // are currently only supported on binary nodes. +    if (Options.UnsafeFPMath && +        N0.getOpcode() == PreferredFusedOpcode &&          N0.getOperand(2).getOpcode() == ISD::FMUL &&          N0->hasOneUse() && N0.getOperand(2)->hasOneUse()) {        return DAG.getNode(PreferredFusedOpcode, SL, VT, @@ -8137,7 +8140,10 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {      }      // fold (fadd x, (fma y, z, (fmul u, v)) -> (fma y, z (fma u, v, x)) -    if (N1->getOpcode() == PreferredFusedOpcode && +    // FIXME: The UnsafeAlgebra flag should be propagated to FMA/FMAD, but FMF +    // are currently only supported on binary nodes. +    if (Options.UnsafeFPMath && +        N1->getOpcode() == PreferredFusedOpcode &&          N1.getOperand(2).getOpcode() == ISD::FMUL &&          N1->hasOneUse() && N1.getOperand(2)->hasOneUse()) {        return DAG.getNode(PreferredFusedOpcode, SL, VT, @@ -8367,10 +8373,13 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {    }    // More folding opportunities when target permits. -  if ((AllowFusion || HasFMAD) && Aggressive) { +  if (Aggressive) {      // fold (fsub (fma x, y, (fmul u, v)), z)      //   -> (fma x, y (fma u, v, (fneg z))) -    if (N0.getOpcode() == PreferredFusedOpcode && +    // FIXME: The UnsafeAlgebra flag should be propagated to FMA/FMAD, but FMF +    // are currently only supported on binary nodes. +    if (Options.UnsafeFPMath && +        N0.getOpcode() == PreferredFusedOpcode &&          N0.getOperand(2).getOpcode() == ISD::FMUL &&          N0->hasOneUse() && N0.getOperand(2)->hasOneUse()) {        return DAG.getNode(PreferredFusedOpcode, SL, VT, @@ -8384,7 +8393,10 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {      // fold (fsub x, (fma y, z, (fmul u, v)))      //   -> (fma (fneg y), z, (fma (fneg u), v, x)) -    if (N1.getOpcode() == PreferredFusedOpcode && +    // FIXME: The UnsafeAlgebra flag should be propagated to FMA/FMAD, but FMF +    // are currently only supported on binary nodes. +    if (Options.UnsafeFPMath && +        N1.getOpcode() == PreferredFusedOpcode &&          N1.getOperand(2).getOpcode() == ISD::FMUL) {        SDValue N20 = N1.getOperand(2).getOperand(0);        SDValue N21 = N1.getOperand(2).getOperand(1); | 
