@@ -30279,10 +30279,12 @@ static SDValue LowerFMINIMUM_FMAXIMUM(SDValue Op, const X86Subtarget &Subtarget,
30279
30279
SDLoc DL(Op);
30280
30280
uint64_t SizeInBits = VT.getScalarSizeInBits();
30281
30281
APInt PreferredZero = APInt::getZero(SizeInBits);
30282
+ APInt OppositeZero = PreferredZero;
30282
30283
EVT IVT = VT.changeTypeToInteger();
30283
30284
X86ISD::NodeType MinMaxOp;
30284
30285
if (Op.getOpcode() == ISD::FMAXIMUM) {
30285
30286
MinMaxOp = X86ISD::FMAX;
30287
+ OppositeZero.setSignBit();
30286
30288
} else {
30287
30289
PreferredZero.setSignBit();
30288
30290
MinMaxOp = X86ISD::FMIN;
@@ -30307,12 +30309,12 @@ static SDValue LowerFMINIMUM_FMAXIMUM(SDValue Op, const X86Subtarget &Subtarget,
30307
30309
// We check if any of operands is NaN and return NaN. Then we check if any of
30308
30310
// operands is zero or negative zero (for fmaximum and fminimum respectively)
30309
30311
// to ensure the correct zero is returned.
30310
- auto IsPreferredZero = [PreferredZero ](SDValue Op) {
30312
+ auto MatchesZero = [](SDValue Op, APInt Zero ) {
30311
30313
Op = peekThroughBitcasts(Op);
30312
30314
if (auto *CstOp = dyn_cast<ConstantFPSDNode>(Op))
30313
- return CstOp->getValueAPF().bitcastToAPInt() == PreferredZero ;
30315
+ return CstOp->getValueAPF().bitcastToAPInt() == Zero ;
30314
30316
if (auto *CstOp = dyn_cast<ConstantSDNode>(Op))
30315
- return CstOp->getAPIntValue() == PreferredZero ;
30317
+ return CstOp->getAPIntValue() == Zero ;
30316
30318
if (Op->getOpcode() == ISD::BUILD_VECTOR ||
30317
30319
Op->getOpcode() == ISD::SPLAT_VECTOR) {
30318
30320
for (const SDValue &OpVal : Op->op_values()) {
@@ -30321,7 +30323,9 @@ static SDValue LowerFMINIMUM_FMAXIMUM(SDValue Op, const X86Subtarget &Subtarget,
30321
30323
auto *CstOp = dyn_cast<ConstantFPSDNode>(OpVal);
30322
30324
if (!CstOp)
30323
30325
return false;
30324
- if (CstOp->getValueAPF().bitcastToAPInt() != PreferredZero)
30326
+ if (!CstOp->getValueAPF().isZero())
30327
+ continue;
30328
+ if (CstOp->getValueAPF().bitcastToAPInt() != Zero)
30325
30329
return false;
30326
30330
}
30327
30331
return true;
@@ -30336,11 +30340,12 @@ static SDValue LowerFMINIMUM_FMAXIMUM(SDValue Op, const X86Subtarget &Subtarget,
30336
30340
DAG.isKnownNeverZeroFloat(X) ||
30337
30341
DAG.isKnownNeverZeroFloat(Y);
30338
30342
SDValue NewX, NewY;
30339
- if (IgnoreSignedZero || IsPreferredZero(Y)) {
30343
+ if (IgnoreSignedZero || MatchesZero(Y, PreferredZero) ||
30344
+ MatchesZero(X, OppositeZero)) {
30340
30345
// Operands are already in right order or order does not matter.
30341
30346
NewX = X;
30342
30347
NewY = Y;
30343
- } else if (IsPreferredZero(X )) {
30348
+ } else if (MatchesZero(X, PreferredZero) || MatchesZero(Y, OppositeZero )) {
30344
30349
NewX = Y;
30345
30350
NewY = X;
30346
30351
} else if (!VT.isVector() && (VT == MVT::f16 || Subtarget.hasDQI()) &&
0 commit comments