@@ -16392,12 +16392,11 @@ SDValue DAGCombiner::visitFREEZE(SDNode *N) {
16392
16392
return SDValue();
16393
16393
16394
16394
bool AllowMultipleMaybePoisonOperands =
16395
- N0.getOpcode() == ISD::SELECT_CC ||
16396
- N0.getOpcode() == ISD::SETCC ||
16395
+ N0.getOpcode() == ISD::SELECT_CC || N0.getOpcode() == ISD::SETCC ||
16397
16396
N0.getOpcode() == ISD::BUILD_VECTOR ||
16398
16397
N0.getOpcode() == ISD::BUILD_PAIR ||
16399
16398
N0.getOpcode() == ISD::VECTOR_SHUFFLE ||
16400
- N0.getOpcode() == ISD::CONCAT_VECTORS;
16399
+ N0.getOpcode() == ISD::CONCAT_VECTORS || N0.getOpcode() == ISD::FMUL ;
16401
16400
16402
16401
// Avoid turning a BUILD_VECTOR that can be recognized as "all zeros", "all
16403
16402
// ones" or "constant" into something that depends on FrozenUndef. We can
@@ -16495,7 +16494,17 @@ SDValue DAGCombiner::visitFREEZE(SDNode *N) {
16495
16494
SVN->getMask());
16496
16495
} else {
16497
16496
// NOTE: this strips poison generating flags.
16498
- R = DAG.getNode(N0.getOpcode(), SDLoc(N0), N0->getVTList(), Ops);
16497
+ // Folding freeze(op(x, ...)) -> op(freeze(x), ...) does not require nnan,
16498
+ // ninf, nsz, or fast.
16499
+ // However, contract, reassoc, afn, and arcp should be preserved,
16500
+ // as these fast-math flags do not introduce poison values.
16501
+ SDNodeFlags SrcFlags = N0->getFlags();
16502
+ SDNodeFlags SafeFlags;
16503
+ SafeFlags.setAllowContract(SrcFlags.hasAllowContract());
16504
+ SafeFlags.setAllowReassociation(SrcFlags.hasAllowReassociation());
16505
+ SafeFlags.setApproximateFuncs(SrcFlags.hasApproximateFuncs());
16506
+ SafeFlags.setAllowReciprocal(SrcFlags.hasAllowReciprocal());
16507
+ R = DAG.getNode(N0.getOpcode(), SDLoc(N0), N0->getVTList(), Ops, SafeFlags);
16499
16508
}
16500
16509
assert(DAG.isGuaranteedNotToBeUndefOrPoison(R, /*PoisonOnly*/ false) &&
16501
16510
"Can't create node that may be undef/poison!");
@@ -16736,29 +16745,6 @@ SDValue DAGCombiner::visitFADDForFMACombine(SDNode *N) {
16736
16745
}
16737
16746
}
16738
16747
16739
- // fold (fadd (freeze (fmul x, y)), z) -> (fma x, y, z).
16740
- bool CanContract =
16741
- (Options.UnsafeFPMath || N->getFlags().hasAllowContract()) &&
16742
- (Options.NoSignedZerosFPMath || N->getFlags().hasNoSignedZeros());
16743
- if (CanContract && N0.getOpcode() == ISD::FREEZE) {
16744
- SDValue FrozenMul = N0.getOperand(0);
16745
- if (matcher.match(FrozenMul, ISD::FMUL) && isContractableFMUL(FrozenMul)) {
16746
- SDValue X = FrozenMul.getOperand(0);
16747
- SDValue Y = FrozenMul.getOperand(1);
16748
- return matcher.getNode(PreferredFusedOpcode, SL, VT, X, Y, N1);
16749
- }
16750
- }
16751
-
16752
- // fold (fadd x, (freeze (fmul y, z))) -> (fma y, z, x)
16753
- if (CanContract && N1.getOpcode() == ISD::FREEZE) {
16754
- SDValue FrozenMul = N1.getOperand(0);
16755
- if (matcher.match(FrozenMul, ISD::FMUL) && isContractableFMUL(FrozenMul)) {
16756
- SDValue X = FrozenMul.getOperand(0);
16757
- SDValue Y = FrozenMul.getOperand(1);
16758
- return matcher.getNode(PreferredFusedOpcode, SL, VT, X, Y, N0);
16759
- }
16760
- }
16761
-
16762
16748
// More folding opportunities when target permits.
16763
16749
if (Aggressive) {
16764
16750
// fold (fadd (fma x, y, (fpext (fmul u, v))), z)
@@ -17036,31 +17022,6 @@ SDValue DAGCombiner::visitFSUBForFMACombine(SDNode *N) {
17036
17022
}
17037
17023
}
17038
17024
17039
- // fold (fsub (freeze (fmul x, y)), z) -> (fma x, y, (fneg z))
17040
- bool CanContract =
17041
- (Options.UnsafeFPMath || N->getFlags().hasAllowContract()) &&
17042
- (Options.NoSignedZerosFPMath || N->getFlags().hasNoSignedZeros());
17043
- if (CanContract && N0.getOpcode() == ISD::FREEZE) {
17044
- SDValue FrozenMul = N0.getOperand(0);
17045
- if (matcher.match(FrozenMul, ISD::FMUL) && isContractableFMUL(FrozenMul)) {
17046
- SDValue X = FrozenMul.getOperand(0);
17047
- SDValue Y = FrozenMul.getOperand(1);
17048
- SDValue NegZ = matcher.getNode(ISD::FNEG, SL, VT, N1);
17049
- return matcher.getNode(PreferredFusedOpcode, SL, VT, X, Y, NegZ);
17050
- }
17051
- }
17052
-
17053
- // fold (fsub z, (freeze(fmul x, y))) -> (fma (fneg x), y, z)
17054
- if (CanContract && N1.getOpcode() == ISD::FREEZE) {
17055
- SDValue FrozenMul = N1.getOperand(0);
17056
- if (matcher.match(FrozenMul, ISD::FMUL) && isContractableFMUL(FrozenMul)) {
17057
- SDValue X = FrozenMul.getOperand(0);
17058
- SDValue Y = FrozenMul.getOperand(1);
17059
- SDValue NegX = matcher.getNode(ISD::FNEG, SL, VT, X);
17060
- return matcher.getNode(PreferredFusedOpcode, SL, VT, NegX, Y, N0);
17061
- }
17062
- }
17063
-
17064
17025
auto isReassociable = [&Options](SDNode *N) {
17065
17026
return Options.UnsafeFPMath || N->getFlags().hasAllowReassociation();
17066
17027
};
0 commit comments