From: Chris Lattner Date: Sat, 2 Apr 2005 05:04:50 +0000 (+0000) Subject: Turn -0.0 - X -> fneg X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=b9fccc41933648647e3f7669612c683eb5de0d58;p=oota-llvm.git Turn -0.0 - X -> fneg git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21011 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 75352982034..052daa29c4e 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -314,7 +314,7 @@ public: // void visitBinary(User &I, unsigned Opcode); void visitAdd(User &I) { visitBinary(I, ISD::ADD); } - void visitSub(User &I) { visitBinary(I, ISD::SUB); } + void visitSub(User &I); void visitMul(User &I) { visitBinary(I, ISD::MUL); } void visitDiv(User &I) { visitBinary(I, I.getType()->isUnsigned() ? ISD::UDIV : ISD::SDIV); @@ -454,6 +454,18 @@ void SelectionDAGLowering::visitBr(BranchInst &I) { } } +void SelectionDAGLowering::visitSub(User &I) { + // -0.0 - X --> fneg + if (ConstantFP *CFP = dyn_cast(I.getOperand(0))) + if (CFP->isExactlyValue(-0.0)) { + SDOperand Op2 = getValue(I.getOperand(1)); + setValue(&I, DAG.getNode(ISD::FNEG, Op2.getValueType(), Op2)); + return; + } + + visitBinary(I, ISD::SUB); +} + void SelectionDAGLowering::visitBinary(User &I, unsigned Opcode) { SDOperand Op1 = getValue(I.getOperand(0)); SDOperand Op2 = getValue(I.getOperand(1));