summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-04-09 05:15:53 +0000
committerChris Lattner <sabre@nondot.org>2005-04-09 05:15:53 +0000
commit6a31b878f82fa2344d8dd0b90f38519007834209 (patch)
tree006029490b04b49f778b488c83014181bba70879 /llvm/lib/CodeGen
parentd9748bcae5a3371964dbdeed0cbcf824a0654ec7 (diff)
downloadbcm5719-llvm-6a31b878f82fa2344d8dd0b90f38519007834209.tar.gz
bcm5719-llvm-6a31b878f82fa2344d8dd0b90f38519007834209.zip
recognize some patterns as fabs operations, so that fabs at the source level
is deconstructed then reconstructed here. This catches 19 fabs's in 177.mesa 9 in 168.wupwise, 5 in 171.swim, 3 in 172.mgrid, and 14 in 173.applu out of specfp2000. This allows the X86 code generator to make MUCH better code than before for each of these and saves one instr on ppc. This depends on the previous CFE patch to expose these correctly. llvm-svn: 21171
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 8918c455626..765ff1b758a 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -952,6 +952,27 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
}
}
+ // If this is a selectcc, check to see if we can simplify the result.
+ if (SetCCSDNode *SetCC = dyn_cast<SetCCSDNode>(N1)) {
+ if (ConstantFPSDNode *CFP =
+ dyn_cast<ConstantFPSDNode>(SetCC->getOperand(1)))
+ if (CFP->getValue() == 0.0) { // Allow either -0.0 or 0.0
+ // select (setg[te] X, +/-0.0), X, fneg(X) -> fabs
+ if ((SetCC->getCondition() == ISD::SETGE ||
+ SetCC->getCondition() == ISD::SETGT) &&
+ N2 == SetCC->getOperand(0) && N3.getOpcode() == ISD::FNEG &&
+ N3.getOperand(0) == N2)
+ return getNode(ISD::FABS, VT, N2);
+
+ // select (setl[te] X, +/-0.0), fneg(X), X -> fabs
+ if ((SetCC->getCondition() == ISD::SETLT ||
+ SetCC->getCondition() == ISD::SETLE) &&
+ N3 == SetCC->getOperand(0) && N2.getOpcode() == ISD::FNEG &&
+ N2.getOperand(0) == N3)
+ return getNode(ISD::FABS, VT, N3);
+ }
+
+ }
break;
case ISD::BRCOND:
if (N2C)
OpenPOWER on IntegriCloud