diff options
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp index c8fe897..e8e820a 100644 --- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -8610,18 +8610,16 @@ SDValue TargetLowering::expandFMINIMUM_FMAXIMUM(SDNode *N, // fminimum/fmaximum requires -0.0 less than +0.0 if (!MinMaxMustRespectOrderedZero && !N->getFlags().hasNoSignedZeros() && !DAG.isKnownNeverZeroFloat(RHS) && !DAG.isKnownNeverZeroFloat(LHS)) { - auto IsSpecificZero = [&](SDValue F) { - FloatSignAsInt State; - DAG.getSignAsIntValue(State, DL, F); - return DAG.getSetCC(DL, CCVT, State.IntValue, - DAG.getConstant(0, DL, State.IntValue.getValueType()), - IsMax ? ISD::SETEQ : ISD::SETNE); - }; SDValue IsZero = DAG.getSetCC(DL, CCVT, MinMax, DAG.getConstantFP(0.0, DL, VT), ISD::SETOEQ); - SDValue LCmp = - DAG.getSelect(DL, VT, IsSpecificZero(LHS), LHS, MinMax, Flags); - SDValue RCmp = DAG.getSelect(DL, VT, IsSpecificZero(RHS), RHS, LCmp, Flags); + SDValue TestZero = + DAG.getTargetConstant(IsMax ? fcPosZero : fcNegZero, DL, MVT::i32); + SDValue LCmp = DAG.getSelect( + DL, VT, DAG.getNode(ISD::IS_FPCLASS, DL, CCVT, LHS, TestZero), LHS, + MinMax, Flags); + SDValue RCmp = DAG.getSelect( + DL, VT, DAG.getNode(ISD::IS_FPCLASS, DL, CCVT, RHS, TestZero), RHS, + LCmp, Flags); MinMax = DAG.getSelect(DL, VT, IsZero, RCmp, MinMax, Flags); } |