summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
diff options
context:
space:
mode:
authorNate Begeman <natebegeman@mac.com>2005-10-17 20:40:11 +0000
committerNate Begeman <natebegeman@mac.com>2005-10-17 20:40:11 +0000
commitec48a1bfbd1b43282c0393d0ca2944ab28ced3a2 (patch)
tree35e70eb7fe70a34b1836881c4593d6ff095721f2 /llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
parentda1b152c4367d89fa34ec75a55a8427132f12cb8 (diff)
downloadbcm5719-llvm-ec48a1bfbd1b43282c0393d0ca2944ab28ced3a2.tar.gz
bcm5719-llvm-ec48a1bfbd1b43282c0393d0ca2944ab28ced3a2.zip
fold fmul X, +2.0 -> fadd X, X;
llvm-svn: 23774
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp31
1 files changed, 17 insertions, 14 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 69478e3b846..02b1f9ddcaa 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -1464,8 +1464,7 @@ SDOperand DAGCombiner::visitFADD(SDNode *N) {
if (ConstantFPSDNode *N0CFP = dyn_cast<ConstantFPSDNode>(N0))
if (ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1)) {
// fold floating point (fadd c1, c2)
- return DAG.getConstantFP(N0CFP->getValue() + N1CFP->getValue(),
- N->getValueType(0));
+ return DAG.getConstantFP(N0CFP->getValue() + N1CFP->getValue(), VT);
}
// fold (A + (-B)) -> A-B
if (N1.getOpcode() == ISD::FNEG)
@@ -1486,8 +1485,7 @@ SDOperand DAGCombiner::visitFSUB(SDNode *N) {
if (ConstantFPSDNode *N0CFP = dyn_cast<ConstantFPSDNode>(N0))
if (ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1)) {
// fold floating point (fsub c1, c2)
- return DAG.getConstantFP(N0CFP->getValue() - N1CFP->getValue(),
- N->getValueType(0));
+ return DAG.getConstantFP(N0CFP->getValue() - N1CFP->getValue(), VT);
}
// fold (A-(-B)) -> A+B
if (N1.getOpcode() == ISD::FNEG)
@@ -1499,14 +1497,21 @@ SDOperand DAGCombiner::visitFSUB(SDNode *N) {
SDOperand DAGCombiner::visitFMUL(SDNode *N) {
SDOperand N0 = N->getOperand(0);
SDOperand N1 = N->getOperand(1);
+ ConstantFPSDNode *N0CFP = dyn_cast<ConstantFPSDNode>(N0);
+ ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1);
MVT::ValueType VT = N->getValueType(0);
- if (ConstantFPSDNode *N0CFP = dyn_cast<ConstantFPSDNode>(N0))
- if (ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1)) {
- // fold floating point (fmul c1, c2)
- return DAG.getConstantFP(N0CFP->getValue() * N1CFP->getValue(),
- N->getValueType(0));
- }
+ // fold (fmul c1, c2) -> c1*c2
+ if (N0CFP && N1CFP)
+ return DAG.getConstantFP(N0CFP->getValue() * N1CFP->getValue(), VT);
+ // canonicalize constant to RHS
+ if (N0CFP && !N1CFP) {
+ std::swap(N0, N1);
+ std::swap(N0CFP, N1CFP);
+ }
+ // fold (fmul X, 2.0) -> (fadd X, X)
+ if (N1CFP && N1CFP->isExactlyValue(+2.0))
+ return DAG.getNode(ISD::FADD, VT, N0, N0);
return SDOperand();
}
@@ -1518,8 +1523,7 @@ SDOperand DAGCombiner::visitFDIV(SDNode *N) {
if (ConstantFPSDNode *N0CFP = dyn_cast<ConstantFPSDNode>(N0))
if (ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1)) {
// fold floating point (fdiv c1, c2)
- return DAG.getConstantFP(N0CFP->getValue() / N1CFP->getValue(),
- N->getValueType(0));
+ return DAG.getConstantFP(N0CFP->getValue() / N1CFP->getValue(), VT);
}
return SDOperand();
}
@@ -1532,8 +1536,7 @@ SDOperand DAGCombiner::visitFREM(SDNode *N) {
if (ConstantFPSDNode *N0CFP = dyn_cast<ConstantFPSDNode>(N0))
if (ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1)) {
// fold floating point (frem c1, c2) -> fmod(c1, c2)
- return DAG.getConstantFP(fmod(N0CFP->getValue(),N1CFP->getValue()),
- N->getValueType(0));
+ return DAG.getConstantFP(fmod(N0CFP->getValue(),N1CFP->getValue()), VT);
}
return SDOperand();
}
OpenPOWER on IntegriCloud