diff options
| -rw-r--r-- | llvm/include/llvm/CodeGen/SelectionDAG.h | 3 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 95 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 8 | ||||
| -rw-r--r-- | llvm/test/CodeGen/PowerPC/fmf-propagation.ll | 14 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/sqrt-fastmath-mir.ll | 4 | 
5 files changed, 68 insertions, 56 deletions
diff --git a/llvm/include/llvm/CodeGen/SelectionDAG.h b/llvm/include/llvm/CodeGen/SelectionDAG.h index befb011777a..323c58a6568 100644 --- a/llvm/include/llvm/CodeGen/SelectionDAG.h +++ b/llvm/include/llvm/CodeGen/SelectionDAG.h @@ -889,7 +889,8 @@ public:    SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1,                    SDValue N2, const SDNodeFlags Flags = SDNodeFlags());    SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1, -                  SDValue N2, SDValue N3); +                  SDValue N2, SDValue N3, +                  const SDNodeFlags Flags = SDNodeFlags());    SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1,                    SDValue N2, SDValue N3, SDValue N4);    SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, SDValue N1, diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 715f203ba47..d2b0fa15670 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -9626,6 +9626,7 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {    if (!HasFMAD && !HasFMA)      return SDValue(); +  SDNodeFlags Flags = N->getFlags();    bool AllowFusionGlobally = (Options.AllowFPOpFusion == FPOpFusion::Fast ||                                Options.UnsafeFPMath || HasFMAD);    // If the addition is not contractable, do not combine. @@ -9657,14 +9658,14 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {    // fold (fadd (fmul x, y), z) -> (fma x, y, z)    if (isContractableFMUL(N0) && (Aggressive || N0->hasOneUse())) {      return DAG.getNode(PreferredFusedOpcode, SL, VT, -                       N0.getOperand(0), N0.getOperand(1), N1); +                       N0.getOperand(0), N0.getOperand(1), N1, Flags);    }    // fold (fadd x, (fmul y, z)) -> (fma y, z, x)    // Note: Commutes FADD operands.    if (isContractableFMUL(N1) && (Aggressive || N1->hasOneUse())) {      return DAG.getNode(PreferredFusedOpcode, SL, VT, -                       N1.getOperand(0), N1.getOperand(1), N0); +                       N1.getOperand(0), N1.getOperand(1), N0, Flags);    }    // Look through FP_EXTEND nodes to do more combining. @@ -9678,7 +9679,7 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {                           DAG.getNode(ISD::FP_EXTEND, SL, VT,                                       N00.getOperand(0)),                           DAG.getNode(ISD::FP_EXTEND, SL, VT, -                                     N00.getOperand(1)), N1); +                                     N00.getOperand(1)), N1, Flags);      }    } @@ -9692,7 +9693,7 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {                           DAG.getNode(ISD::FP_EXTEND, SL, VT,                                       N10.getOperand(0)),                           DAG.getNode(ISD::FP_EXTEND, SL, VT, -                                     N10.getOperand(1)), N0); +                                     N10.getOperand(1)), N0, Flags);      }    } @@ -9710,7 +9711,7 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {                           DAG.getNode(PreferredFusedOpcode, SL, VT,                                       N0.getOperand(2).getOperand(0),                                       N0.getOperand(2).getOperand(1), -                                     N1)); +                                     N1, Flags), Flags);      }      // fold (fadd x, (fma y, z, (fmul u, v)) -> (fma y, z (fma u, v, x)) @@ -9725,19 +9726,20 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {                           DAG.getNode(PreferredFusedOpcode, SL, VT,                                       N1.getOperand(2).getOperand(0),                                       N1.getOperand(2).getOperand(1), -                                     N0)); +                                     N0, Flags), Flags);      }      // fold (fadd (fma x, y, (fpext (fmul u, v))), z)      //   -> (fma x, y, (fma (fpext u), (fpext v), z))      auto FoldFAddFMAFPExtFMul = [&] ( -      SDValue X, SDValue Y, SDValue U, SDValue V, SDValue Z) { +      SDValue X, SDValue Y, SDValue U, SDValue V, SDValue Z, +      SDNodeFlags Flags) {        return DAG.getNode(PreferredFusedOpcode, SL, VT, X, Y,                           DAG.getNode(PreferredFusedOpcode, SL, VT,                                       DAG.getNode(ISD::FP_EXTEND, SL, VT, U),                                       DAG.getNode(ISD::FP_EXTEND, SL, VT, V), -                                     Z)); +                                     Z, Flags), Flags);      };      if (N0.getOpcode() == PreferredFusedOpcode) {        SDValue N02 = N0.getOperand(2); @@ -9747,7 +9749,7 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {              TLI.isFPExtFoldable(PreferredFusedOpcode, VT, N020.getValueType())) {            return FoldFAddFMAFPExtFMul(N0.getOperand(0), N0.getOperand(1),                                        N020.getOperand(0), N020.getOperand(1), -                                      N1); +                                      N1, Flags);          }        }      } @@ -9758,14 +9760,15 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {      // operation into two double-precision operations, which might not be      // interesting for all targets, especially GPUs.      auto FoldFAddFPExtFMAFMul = [&] ( -      SDValue X, SDValue Y, SDValue U, SDValue V, SDValue Z) { +      SDValue X, SDValue Y, SDValue U, SDValue V, SDValue Z, +      SDNodeFlags Flags) {        return DAG.getNode(PreferredFusedOpcode, SL, VT,                           DAG.getNode(ISD::FP_EXTEND, SL, VT, X),                           DAG.getNode(ISD::FP_EXTEND, SL, VT, Y),                           DAG.getNode(PreferredFusedOpcode, SL, VT,                                       DAG.getNode(ISD::FP_EXTEND, SL, VT, U),                                       DAG.getNode(ISD::FP_EXTEND, SL, VT, V), -                                     Z)); +                                     Z, Flags), Flags);      };      if (N0.getOpcode() == ISD::FP_EXTEND) {        SDValue N00 = N0.getOperand(0); @@ -9775,7 +9778,7 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {              TLI.isFPExtFoldable(PreferredFusedOpcode, VT, N00.getValueType())) {            return FoldFAddFPExtFMAFMul(N00.getOperand(0), N00.getOperand(1),                                        N002.getOperand(0), N002.getOperand(1), -                                      N1); +                                      N1, Flags);          }        }      } @@ -9790,7 +9793,7 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {              TLI.isFPExtFoldable(PreferredFusedOpcode, VT, N120.getValueType())) {            return FoldFAddFMAFPExtFMul(N1.getOperand(0), N1.getOperand(1),                                        N120.getOperand(0), N120.getOperand(1), -                                      N0); +                                      N0, Flags);          }        }      } @@ -9808,7 +9811,7 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {              TLI.isFPExtFoldable(PreferredFusedOpcode, VT, N10.getValueType())) {            return FoldFAddFPExtFMAFMul(N10.getOperand(0), N10.getOperand(1),                                        N102.getOperand(0), N102.getOperand(1), -                                      N0); +                                      N0, Flags);          }        }      } @@ -9837,8 +9840,10 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {    if (!HasFMAD && !HasFMA)      return SDValue(); +  const SDNodeFlags Flags = N->getFlags();    bool AllowFusionGlobally = (Options.AllowFPOpFusion == FPOpFusion::Fast ||                                Options.UnsafeFPMath || HasFMAD); +    // If the subtraction is not contractable, do not combine.    if (!AllowFusionGlobally && !isContractable(N))      return SDValue(); @@ -9863,7 +9868,7 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {    if (isContractableFMUL(N0) && (Aggressive || N0->hasOneUse())) {      return DAG.getNode(PreferredFusedOpcode, SL, VT,                         N0.getOperand(0), N0.getOperand(1), -                       DAG.getNode(ISD::FNEG, SL, VT, N1)); +                       DAG.getNode(ISD::FNEG, SL, VT, N1), Flags);    }    // fold (fsub x, (fmul y, z)) -> (fma (fneg y), z, x) @@ -9872,7 +9877,7 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {      return DAG.getNode(PreferredFusedOpcode, SL, VT,                         DAG.getNode(ISD::FNEG, SL, VT,                                     N1.getOperand(0)), -                       N1.getOperand(1), N0); +                       N1.getOperand(1), N0, Flags);    // fold (fsub (fneg (fmul, x, y)), z) -> (fma (fneg x), y, (fneg z))    if (N0.getOpcode() == ISD::FNEG && isContractableFMUL(N0.getOperand(0)) && @@ -9881,7 +9886,7 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {      SDValue N01 = N0.getOperand(0).getOperand(1);      return DAG.getNode(PreferredFusedOpcode, SL, VT,                         DAG.getNode(ISD::FNEG, SL, VT, N00), N01, -                       DAG.getNode(ISD::FNEG, SL, VT, N1)); +                       DAG.getNode(ISD::FNEG, SL, VT, N1), Flags);    }    // Look through FP_EXTEND nodes to do more combining. @@ -9897,7 +9902,7 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {                                       N00.getOperand(0)),                           DAG.getNode(ISD::FP_EXTEND, SL, VT,                                       N00.getOperand(1)), -                         DAG.getNode(ISD::FNEG, SL, VT, N1)); +                         DAG.getNode(ISD::FNEG, SL, VT, N1), Flags);      }    } @@ -9914,7 +9919,7 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {                                                   N10.getOperand(0))),                           DAG.getNode(ISD::FP_EXTEND, SL, VT,                                       N10.getOperand(1)), -                         N0); +                         N0, Flags);                }    } @@ -9936,7 +9941,7 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {                                                     N000.getOperand(0)),                                         DAG.getNode(ISD::FP_EXTEND, SL, VT,                                                     N000.getOperand(1)), -                                       N1)); +                                       N1, Flags));        }      }    } @@ -9959,7 +9964,7 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {                                                     N000.getOperand(0)),                                         DAG.getNode(ISD::FP_EXTEND, SL, VT,                                                     N000.getOperand(1)), -                                       N1)); +                                       N1, Flags));        }      }    } @@ -9979,7 +9984,7 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {                                       N0.getOperand(2).getOperand(0),                                       N0.getOperand(2).getOperand(1),                                       DAG.getNode(ISD::FNEG, SL, VT, -                                                 N1))); +                                                 N1), Flags), Flags);                }      // fold (fsub x, (fma y, z, (fmul u, v))) @@ -9996,8 +10001,7 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {                           N1.getOperand(1),                           DAG.getNode(PreferredFusedOpcode, SL, VT,                                       DAG.getNode(ISD::FNEG, SL, VT, N20), - -                                     N21, N0)); +                                     N21, N0, Flags), Flags);            } @@ -10017,7 +10021,7 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {                                           DAG.getNode(ISD::FP_EXTEND, SL, VT,                                                       N020.getOperand(1)),                                           DAG.getNode(ISD::FNEG, SL, VT, -                                                     N1))); +                                                     N1), Flags), Flags);                        }        }      } @@ -10045,7 +10049,7 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {                                           DAG.getNode(ISD::FP_EXTEND, SL, VT,                                                       N002.getOperand(1)),                                           DAG.getNode(ISD::FNEG, SL, VT, -                                                     N1))); +                                                     N1), Flags), Flags);                        }        }      } @@ -10068,7 +10072,7 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {                                                                 VT, N1200)),                                         DAG.getNode(ISD::FP_EXTEND, SL, VT,                                                     N1201), -                                       N0)); +                                       N0, Flags), Flags);                }      } @@ -10099,7 +10103,7 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {                                                                 VT, N1020)),                                         DAG.getNode(ISD::FP_EXTEND, SL, VT,                                                     N1021), -                                       N0)); +                                       N0, Flags), Flags);                }      }    } @@ -10115,6 +10119,7 @@ SDValue DAGCombiner::visitFMULForFMADistributiveCombine(SDNode *N) {    SDValue N1 = N->getOperand(1);    EVT VT = N->getValueType(0);    SDLoc SL(N); +  const SDNodeFlags Flags = N->getFlags();    assert(N->getOpcode() == ISD::FMUL && "Expected FMUL Operation"); @@ -10146,52 +10151,54 @@ SDValue DAGCombiner::visitFMULForFMADistributiveCombine(SDNode *N) {    // fold (fmul (fadd x, +1.0), y) -> (fma x, y, y)    // fold (fmul (fadd x, -1.0), y) -> (fma x, y, (fneg y)) -  auto FuseFADD = [&](SDValue X, SDValue Y) { +  auto FuseFADD = [&](SDValue X, SDValue Y, const SDNodeFlags Flags) {      if (X.getOpcode() == ISD::FADD && (Aggressive || X->hasOneUse())) {        auto XC1 = isConstOrConstSplatFP(X.getOperand(1));        if (XC1 && XC1->isExactlyValue(+1.0)) -        return DAG.getNode(PreferredFusedOpcode, SL, VT, X.getOperand(0), Y, Y); +        return DAG.getNode(PreferredFusedOpcode, SL, VT, X.getOperand(0), Y, +                           Y, Flags);        if (XC1 && XC1->isExactlyValue(-1.0))          return DAG.getNode(PreferredFusedOpcode, SL, VT, X.getOperand(0), Y, -                           DAG.getNode(ISD::FNEG, SL, VT, Y)); +                           DAG.getNode(ISD::FNEG, SL, VT, Y), Flags);            }      return SDValue();    }; -  if (SDValue FMA = FuseFADD(N0, N1)) +  if (SDValue FMA = FuseFADD(N0, N1, Flags))      return FMA; -  if (SDValue FMA = FuseFADD(N1, N0)) +  if (SDValue FMA = FuseFADD(N1, N0, Flags))      return FMA;    // fold (fmul (fsub +1.0, x), y) -> (fma (fneg x), y, y)    // fold (fmul (fsub -1.0, x), y) -> (fma (fneg x), y, (fneg y))    // fold (fmul (fsub x, +1.0), y) -> (fma x, y, (fneg y))    // fold (fmul (fsub x, -1.0), y) -> (fma x, y, y) -  auto FuseFSUB = [&](SDValue X, SDValue Y) { +  auto FuseFSUB = [&](SDValue X, SDValue Y, const SDNodeFlags Flags) {      if (X.getOpcode() == ISD::FSUB && (Aggressive || X->hasOneUse())) {        auto XC0 = isConstOrConstSplatFP(X.getOperand(0));        if (XC0 && XC0->isExactlyValue(+1.0))          return DAG.getNode(PreferredFusedOpcode, SL, VT,                             DAG.getNode(ISD::FNEG, SL, VT, X.getOperand(1)), Y, -                           Y); +                           Y, Flags);        if (XC0 && XC0->isExactlyValue(-1.0))          return DAG.getNode(PreferredFusedOpcode, SL, VT,                             DAG.getNode(ISD::FNEG, SL, VT, X.getOperand(1)), Y, -                           DAG.getNode(ISD::FNEG, SL, VT, Y)); +                           DAG.getNode(ISD::FNEG, SL, VT, Y), Flags);              auto XC1 = isConstOrConstSplatFP(X.getOperand(1));        if (XC1 && XC1->isExactlyValue(+1.0))          return DAG.getNode(PreferredFusedOpcode, SL, VT, X.getOperand(0), Y, -                           DAG.getNode(ISD::FNEG, SL, VT, Y)); +                           DAG.getNode(ISD::FNEG, SL, VT, Y), Flags);        if (XC1 && XC1->isExactlyValue(-1.0)) -        return DAG.getNode(PreferredFusedOpcode, SL, VT, X.getOperand(0), Y, Y); +        return DAG.getNode(PreferredFusedOpcode, SL, VT, X.getOperand(0), Y, +                           Y, Flags);      }      return SDValue();    }; -  if (SDValue FMA = FuseFSUB(N0, N1)) +  if (SDValue FMA = FuseFSUB(N0, N1, Flags))      return FMA; -  if (SDValue FMA = FuseFSUB(N1, N0)) +  if (SDValue FMA = FuseFSUB(N1, N0, Flags))      return FMA;    return SDValue(); @@ -10602,6 +10609,9 @@ SDValue DAGCombiner::visitFMA(SDNode *N) {    SDLoc DL(N);    const TargetOptions &Options = DAG.getTarget().Options; +  // FMA nodes have flags that propagate to the created nodes. +  const SDNodeFlags Flags = N->getFlags(); +    // Constant fold FMA.    if (isa<ConstantFPSDNode>(N0) &&        isa<ConstantFPSDNode>(N1) && @@ -10626,11 +10636,6 @@ SDValue DAGCombiner::visitFMA(SDNode *N) {       !isConstantFPBuildVectorOrConstantFP(N1))      return DAG.getNode(ISD::FMA, SDLoc(N), VT, N1, N0, N2); -  // TODO: FMA nodes should have flags that propagate to the created nodes. -  // For now, create a Flags object for use with reassociation math transforms. -  SDNodeFlags Flags; -  Flags.setAllowReassociation(true); -    if (Options.UnsafeFPMath) {      // (fma x, c1, (fmul x, c2)) -> (fmul x, c1+c2)      if (N2.getOpcode() == ISD::FMUL && N0 == N2.getOperand(0) && diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index bdecb8b37c4..d227c4a0efa 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -4859,7 +4859,8 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,  }  SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT, -                              SDValue N1, SDValue N2, SDValue N3) { +                              SDValue N1, SDValue N2, SDValue N3, +                              const SDNodeFlags Flags) {    // Perform various simplifications.    switch (Opcode) {    case ISD::FMA: { @@ -4953,10 +4954,13 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,      FoldingSetNodeID ID;      AddNodeIDNode(ID, Opcode, VTs, Ops);      void *IP = nullptr; -    if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) +    if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) { +      E->intersectFlagsWith(Flags);        return SDValue(E, 0); +    }      N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs); +    N->setFlags(Flags);      createOperands(N, Ops);      CSEMap.InsertNode(N, IP);    } else { diff --git a/llvm/test/CodeGen/PowerPC/fmf-propagation.ll b/llvm/test/CodeGen/PowerPC/fmf-propagation.ll index e1a7019fc72..d8e8448bfe8 100644 --- a/llvm/test/CodeGen/PowerPC/fmf-propagation.ll +++ b/llvm/test/CodeGen/PowerPC/fmf-propagation.ll @@ -39,7 +39,7 @@ define float @fmul_fadd_contract1(float %x, float %y, float %z) {  ; This shouldn't change anything - the intermediate fmul result is now also flagged.  ; FMFDEBUG-LABEL: Optimized lowered selection DAG: %bb.0 'fmul_fadd_contract2:' -; FMFDEBUG:         fma {{t[0-9]+}}, {{t[0-9]+}}, {{t[0-9]+}} +; FMFDEBUG:         fma contract {{t[0-9]+}}, {{t[0-9]+}}, {{t[0-9]+}}  ; FMFDEBUG:       Type-legalized selection DAG: %bb.0 'fmul_fadd_contract2:'  define float @fmul_fadd_contract2(float %x, float %y, float %z) { @@ -86,7 +86,7 @@ define float @fmul_fadd_reassoc1(float %x, float %y, float %z) {  ; This shouldn't change anything - the intermediate fmul result is now also flagged.  ; FMFDEBUG-LABEL: Optimized lowered selection DAG: %bb.0 'fmul_fadd_reassoc2:' -; FMFDEBUG:         fma {{t[0-9]+}}, {{t[0-9]+}} +; FMFDEBUG:         fma reassoc {{t[0-9]+}}, {{t[0-9]+}}  ; FMFDEBUG:       Type-legalized selection DAG: %bb.0 'fmul_fadd_reassoc2:'  define float @fmul_fadd_reassoc2(float %x, float %y, float %z) { @@ -109,7 +109,7 @@ define float @fmul_fadd_reassoc2(float %x, float %y, float %z) {  ; The fadd is now fully 'fast'. This implies that contraction is allowed.  ; FMFDEBUG-LABEL: Optimized lowered selection DAG: %bb.0 'fmul_fadd_fast1:' -; FMFDEBUG:         fma {{t[0-9]+}}, {{t[0-9]+}}, {{t[0-9]+}} +; FMFDEBUG:         fma nnan ninf nsz arcp contract afn reassoc {{t[0-9]+}}, {{t[0-9]+}}, {{t[0-9]+}}  ; FMFDEBUG:       Type-legalized selection DAG: %bb.0 'fmul_fadd_fast1:'  define float @fmul_fadd_fast1(float %x, float %y, float %z) { @@ -132,7 +132,7 @@ define float @fmul_fadd_fast1(float %x, float %y, float %z) {  ; This shouldn't change anything - the intermediate fmul result is now also flagged.  ; FMFDEBUG-LABEL: Optimized lowered selection DAG: %bb.0 'fmul_fadd_fast2:' -; FMFDEBUG:         fma {{t[0-9]+}}, {{t[0-9]+}}, {{t[0-9]+}} +; FMFDEBUG:         fma nnan ninf nsz arcp contract afn reassoc {{t[0-9]+}}, {{t[0-9]+}}, {{t[0-9]+}}  ; FMFDEBUG:       Type-legalized selection DAG: %bb.0 'fmul_fadd_fast2:'  define float @fmul_fadd_fast2(float %x, float %y, float %z) { @@ -192,6 +192,7 @@ define float @fmul_fma_reassoc1(float %x) {  ; This shouldn't change anything - the intermediate fmul result is now also flagged.  ; FMFDEBUG-LABEL: Optimized lowered selection DAG: %bb.0 'fmul_fma_reassoc2:' +; FMFDEBUG:         fmul reassoc {{t[0-9]+}}  ; FMFDEBUG:         fma reassoc {{t[0-9]+}}  ; FMFDEBUG:       Type-legalized selection DAG: %bb.0 'fmul_fma_reassoc2:' @@ -232,7 +233,7 @@ define float @fmul_fma_reassoc2(float %x) {  ; FMFDEBUG:       Type-legalized selection DAG: %bb.0 'fmul_fma_fast1:'  ; GLOBALDEBUG-LABEL: Optimized lowered selection DAG: %bb.0 'fmul_fma_fast1:' -; GLOBALDEBUG:         fmul reassoc {{t[0-9]+}} +; GLOBALDEBUG:         fmul nnan ninf nsz arcp contract afn reassoc {{t[0-9]+}}  ; GLOBALDEBUG:       Type-legalized selection DAG: %bb.0 'fmul_fma_fast1:'  define float @fmul_fma_fast1(float %x) { @@ -264,11 +265,12 @@ define float @fmul_fma_fast1(float %x) {  ; This shouldn't change anything - the intermediate fmul result is now also flagged.  ; FMFDEBUG-LABEL: Optimized lowered selection DAG: %bb.0 'fmul_fma_fast2:' +; FMFDEBUG:         fmul nnan ninf nsz arcp contract afn reassoc {{t[0-9]+}}  ; FMFDEBUG:         fma nnan ninf nsz arcp contract afn reassoc {{t[0-9]+}}  ; FMFDEBUG:       Type-legalized selection DAG: %bb.0 'fmul_fma_fast2:'  ; GLOBALDEBUG-LABEL: Optimized lowered selection DAG: %bb.0 'fmul_fma_fast2:' -; GLOBALDEBUG:         fmul reassoc {{t[0-9]+}} +; GLOBALDEBUG:         fmul nnan ninf nsz arcp contract afn reassoc {{t[0-9]+}}  ; GLOBALDEBUG:       Type-legalized selection DAG: %bb.0 'fmul_fma_fast2:'  define float @fmul_fma_fast2(float %x) { diff --git a/llvm/test/CodeGen/X86/sqrt-fastmath-mir.ll b/llvm/test/CodeGen/X86/sqrt-fastmath-mir.ll index 33e44731557..30f528cebb2 100644 --- a/llvm/test/CodeGen/X86/sqrt-fastmath-mir.ll +++ b/llvm/test/CodeGen/X86/sqrt-fastmath-mir.ll @@ -33,12 +33,12 @@ define float @rfoo(float %f) #0 {  ; CHECK:     %1:fr32 = VRSQRTSSr killed %2, %0  ; CHECK:     %3:fr32 = nnan ninf nsz arcp contract afn reassoc VMULSSrr %0, %1  ; CHECK:     %4:fr32 = VMOVSSrm -; CHECK:     %5:fr32 = VFMADD213SSr %1, killed %3, %4 +; CHECK:     %5:fr32 = nnan ninf nsz arcp contract afn reassoc VFMADD213SSr %1, killed %3, %4  ; CHECK:     %6:fr32 = VMOVSSrm  ; CHECK:     %7:fr32 = nnan ninf nsz arcp contract afn reassoc VMULSSrr %1, %6  ; CHECK:     %8:fr32 = nnan ninf nsz arcp contract afn reassoc VMULSSrr killed %7, killed %5  ; CHECK:     %9:fr32 = nnan ninf nsz arcp contract afn reassoc VMULSSrr %0, %8 -; CHECK:     %10:fr32 = VFMADD213SSr %8, killed %9, %4 +; CHECK:     %10:fr32 = nnan ninf nsz arcp contract afn reassoc VFMADD213SSr %8, killed %9, %4  ; CHECK:     %11:fr32 = nnan ninf nsz arcp contract afn reassoc VMULSSrr %8, %6  ; CHECK:     %12:fr32 = nnan ninf nsz arcp contract afn reassoc VMULSSrr killed %11, killed %10  ; CHECK:     $xmm0 = COPY %12  | 

