Skip to content

Commit 6e19eea

Browse files
author
Serguei Katkov
committed
[X86] Improve handling on zero constant for fminimum/fmaximum lowering
If we know that zero constant operand is already in the right place we do not need to re-order anything. Reviewed By: e-kud Differential Revision: https://reviews.llvm.org/D150249
1 parent b537963 commit 6e19eea

File tree

2 files changed

+94
-176
lines changed

2 files changed

+94
-176
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30279,10 +30279,12 @@ static SDValue LowerFMINIMUM_FMAXIMUM(SDValue Op, const X86Subtarget &Subtarget,
3027930279
SDLoc DL(Op);
3028030280
uint64_t SizeInBits = VT.getScalarSizeInBits();
3028130281
APInt PreferredZero = APInt::getZero(SizeInBits);
30282+
APInt OppositeZero = PreferredZero;
3028230283
EVT IVT = VT.changeTypeToInteger();
3028330284
X86ISD::NodeType MinMaxOp;
3028430285
if (Op.getOpcode() == ISD::FMAXIMUM) {
3028530286
MinMaxOp = X86ISD::FMAX;
30287+
OppositeZero.setSignBit();
3028630288
} else {
3028730289
PreferredZero.setSignBit();
3028830290
MinMaxOp = X86ISD::FMIN;
@@ -30307,12 +30309,12 @@ static SDValue LowerFMINIMUM_FMAXIMUM(SDValue Op, const X86Subtarget &Subtarget,
3030730309
// We check if any of operands is NaN and return NaN. Then we check if any of
3030830310
// operands is zero or negative zero (for fmaximum and fminimum respectively)
3030930311
// to ensure the correct zero is returned.
30310-
auto IsPreferredZero = [PreferredZero](SDValue Op) {
30312+
auto MatchesZero = [](SDValue Op, APInt Zero) {
3031130313
Op = peekThroughBitcasts(Op);
3031230314
if (auto *CstOp = dyn_cast<ConstantFPSDNode>(Op))
30313-
return CstOp->getValueAPF().bitcastToAPInt() == PreferredZero;
30315+
return CstOp->getValueAPF().bitcastToAPInt() == Zero;
3031430316
if (auto *CstOp = dyn_cast<ConstantSDNode>(Op))
30315-
return CstOp->getAPIntValue() == PreferredZero;
30317+
return CstOp->getAPIntValue() == Zero;
3031630318
if (Op->getOpcode() == ISD::BUILD_VECTOR ||
3031730319
Op->getOpcode() == ISD::SPLAT_VECTOR) {
3031830320
for (const SDValue &OpVal : Op->op_values()) {
@@ -30321,7 +30323,9 @@ static SDValue LowerFMINIMUM_FMAXIMUM(SDValue Op, const X86Subtarget &Subtarget,
3032130323
auto *CstOp = dyn_cast<ConstantFPSDNode>(OpVal);
3032230324
if (!CstOp)
3032330325
return false;
30324-
if (CstOp->getValueAPF().bitcastToAPInt() != PreferredZero)
30326+
if (!CstOp->getValueAPF().isZero())
30327+
continue;
30328+
if (CstOp->getValueAPF().bitcastToAPInt() != Zero)
3032530329
return false;
3032630330
}
3032730331
return true;
@@ -30336,11 +30340,12 @@ static SDValue LowerFMINIMUM_FMAXIMUM(SDValue Op, const X86Subtarget &Subtarget,
3033630340
DAG.isKnownNeverZeroFloat(X) ||
3033730341
DAG.isKnownNeverZeroFloat(Y);
3033830342
SDValue NewX, NewY;
30339-
if (IgnoreSignedZero || IsPreferredZero(Y)) {
30343+
if (IgnoreSignedZero || MatchesZero(Y, PreferredZero) ||
30344+
MatchesZero(X, OppositeZero)) {
3034030345
// Operands are already in right order or order does not matter.
3034130346
NewX = X;
3034230347
NewY = Y;
30343-
} else if (IsPreferredZero(X)) {
30348+
} else if (MatchesZero(X, PreferredZero) || MatchesZero(Y, OppositeZero)) {
3034430349
NewX = Y;
3034530350
NewY = X;
3034630351
} else if (!VT.isVector() && (VT == MVT::f16 || Subtarget.hasDQI()) &&

0 commit comments

Comments
 (0)