@@ -16737,8 +16737,10 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {
16737
16737
}
16738
16738
16739
16739
// fold (fadd (freeze (fmul x, y)), z) -> (fma x, y, z).
16740
- if ((Options.UnsafeFPMath || N->getFlags().hasAllowContract()) &&
16741
- N0.getOpcode() == ISD::FREEZE) {
16740
+ bool CanContract =
16741
+ (Options.UnsafeFPMath || N->getFlags().hasAllowContract()) &&
16742
+ (Options.NoSignedZerosFPMath || N->getFlags().hasNoSignedZeros());
16743
+ if (CanContract && N0.getOpcode() == ISD::FREEZE) {
16742
16744
SDValue FrozenMul = N0.getOperand(0);
16743
16745
if (matcher.match(FrozenMul, ISD::FMUL) && isContractableFMUL(FrozenMul)) {
16744
16746
SDValue X = FrozenMul.getOperand(0);
@@ -16748,8 +16750,7 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {
16748
16750
}
16749
16751
16750
16752
// fold (fadd x, (freeze (fmul y, z))) -> (fma y, z, x)
16751
- if ((Options.UnsafeFPMath || N->getFlags().hasAllowContract()) &&
16752
- N1.getOpcode() == ISD::FREEZE) {
16753
+ if (CanContract && N1.getOpcode() == ISD::FREEZE) {
16753
16754
SDValue FrozenMul = N1.getOperand(0);
16754
16755
if (matcher.match(FrozenMul, ISD::FMUL) && isContractableFMUL(FrozenMul)) {
16755
16756
SDValue X = FrozenMul.getOperand(0);
@@ -17036,8 +17037,10 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {
17036
17037
}
17037
17038
17038
17039
// fold (fsub (freeze (fmul x, y)), z) -> (fma x, y, (fneg z))
17039
- if ((Options.UnsafeFPMath || N->getFlags().hasAllowContract()) &&
17040
- N0.getOpcode() == ISD::FREEZE) {
17040
+ bool CanContract =
17041
+ (Options.UnsafeFPMath || N->getFlags().hasAllowContract()) &&
17042
+ (Options.NoSignedZerosFPMath || N->getFlags().hasNoSignedZeros());
17043
+ if (CanContract && N0.getOpcode() == ISD::FREEZE) {
17041
17044
SDValue FrozenMul = N0.getOperand(0);
17042
17045
if (matcher.match(FrozenMul, ISD::FMUL) && isContractableFMUL(FrozenMul)) {
17043
17046
SDValue X = FrozenMul.getOperand(0);
@@ -17048,8 +17051,7 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {
17048
17051
}
17049
17052
17050
17053
// fold (fsub z, (freeze(fmul x, y))) -> (fma (fneg x), y, z)
17051
- if ((Options.UnsafeFPMath || N->getFlags().hasAllowContract()) &&
17052
- N1.getOpcode() == ISD::FREEZE) {
17054
+ if (CanContract && N1.getOpcode() == ISD::FREEZE) {
17053
17055
SDValue FrozenMul = N1.getOperand(0);
17054
17056
if (matcher.match(FrozenMul, ISD::FMUL) && isContractableFMUL(FrozenMul)) {
17055
17057
SDValue X = FrozenMul.getOperand(0);
0 commit comments