Author: djg Date: Mon Jul 2 10:48:56 2007 New Revision: 37842 URL: http://llvm.org/viewvc/llvm-project?rev=37842&view=rev Log: Teach GetNegatedExpression to negate 0-B to B in UnsafeFPMath mode, and visitFSUB to fold 0-B to -B in UnsafeFPMath mode. Also change visitFNEG to use isNegatibleForFree/GetNegatedExpression instead of doing a subset of the same thing manually.
This fixes test/CodeGen/X86/negative-sin.ll. Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=37842&r1=37841&r2=37842&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon Jul 2 10:48:56 2007 @@ -429,6 +429,11 @@ case ISD::FSUB: // We can't turn -(A-B) into B-A when we honor signed zeros. assert(UnsafeFPMath); + + // -(0-B) -> B + if (ConstantFPSDNode *N0CFP = dyn_cast<ConstantFPSDNode>(Op.getOperand(0))) + if (N0CFP->getValue() == 0.0) + return Op.getOperand(1); // -(A-B) -> B-A return DAG.getNode(ISD::FSUB, Op.getValueType(), Op.getOperand(1), @@ -3025,6 +3030,12 @@ // fold (fsub c1, c2) -> c1-c2 if (N0CFP && N1CFP) return DAG.getNode(ISD::FSUB, VT, N0, N1); + // fold (0-B) -> -B + if (UnsafeFPMath && N0CFP && N0CFP->getValue() == 0.0) { + if (isNegatibleForFree(N1)) + return GetNegatedExpression(N1, DAG); + return DAG.getNode(ISD::FNEG, VT, N1); + } // fold (A-(-B)) -> A+B if (isNegatibleForFree(N1)) return DAG.getNode(ISD::FADD, VT, N0, GetNegatedExpression(N1, DAG)); @@ -3297,18 +3308,10 @@ SDOperand DAGCombiner::visitFNEG(SDNode *N) { SDOperand N0 = N->getOperand(0); - ConstantFPSDNode *N0CFP = dyn_cast<ConstantFPSDNode>(N0); - MVT::ValueType VT = N->getValueType(0); - // fold (fneg c1) -> -c1 - if (N0CFP) - return DAG.getNode(ISD::FNEG, VT, N0); - // fold (fneg (sub x, y)) -> (sub y, x) - if (N0.getOpcode() == ISD::SUB) - return DAG.getNode(ISD::SUB, VT, N0.getOperand(1), N0.getOperand(0)); - // fold (fneg (fneg x)) -> x - if (N0.getOpcode() == ISD::FNEG) - return N0.getOperand(0); + if (isNegatibleForFree(N0)) + return GetNegatedExpression(N0, DAG); + return SDOperand(); } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits