Skip to content

Commit f021f3e

Browse files
committed
[X86] Swap NewX and NewY for ordered elements for minimumnum/maximumnum
It is incorrect to just check for NewX and return its ordered elements.
1 parent eace84d commit f021f3e

File tree

2 files changed

+1039
-754
lines changed

2 files changed

+1039
-754
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29502,16 +29502,23 @@ static SDValue LowerFMINIMUM_FMAXIMUM(SDValue Op, const X86Subtarget &Subtarget,
2950229502
DAG.isKnownNeverNaN(IsNum ? NewX : NewY))
2950329503
std::swap(NewX, NewY);
2950429504

29505+
if (!IgnoreNaN && IsNum && !DAG.isKnownNeverNaN(NewY)) {
29506+
SDValue IsOrdered = DAG.getSetCC(DL, SetCCType, NewX, NewX, ISD::SETO);
29507+
SDValue X = DAG.getSelect(DL, VT, IsOrdered, NewY, NewX);
29508+
SDValue Y = DAG.getSelect(DL, VT, IsOrdered, NewX, NewY);
29509+
NewX = X;
29510+
NewY = Y;
29511+
}
29512+
2950529513
SDValue MinMax = DAG.getNode(MinMaxOp, DL, VT, NewX, NewY, Op->getFlags());
2950629514

29507-
if (IgnoreNaN || DAG.isKnownNeverNaN(IsNum ? NewY : NewX))
29515+
if (IgnoreNaN || IsNum || DAG.isKnownNeverNaN(NewX))
2950829516
return MinMax;
2950929517

2951029518
if (DAG.isKnownNeverNaN(NewX))
2951129519
NewX = NewY;
2951229520

29513-
SDValue IsNaN =
29514-
DAG.getSetCC(DL, SetCCType, NewX, NewX, IsNum ? ISD::SETO : ISD::SETUO);
29521+
SDValue IsNaN = DAG.getSetCC(DL, SetCCType, NewX, NewX, ISD::SETUO);
2951529522

2951629523
return DAG.getSelect(DL, VT, IsNaN, NewX, MinMax);
2951729524
}

0 commit comments

Comments
 (0)