summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-04-02 05:04:50 +0000
committerChris Lattner <sabre@nondot.org>2005-04-02 05:04:50 +0000
commitf68fd0b533daace9c768e05882166788e5ad86f2 (patch)
tree8e2c4c3f483ad5c946ce6c53802c6ece498d7276 /llvm/lib
parent0b7e4cd107e81db6bac9dc6747df28e8a44a6e66 (diff)
downloadbcm5719-llvm-f68fd0b533daace9c768e05882166788e5ad86f2.tar.gz
bcm5719-llvm-f68fd0b533daace9c768e05882166788e5ad86f2.zip
Turn -0.0 - X -> fneg
llvm-svn: 21011
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index 75352982034..052daa29c4e 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/llvm/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<ConstantFP>(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));
OpenPOWER on IntegriCloud