diff options
author | Bill Wendling <isanbard@gmail.com> | 2012-03-15 05:12:00 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2012-03-15 05:12:00 +0000 |
commit | df170db2f641d6ad170516bd11a146f05c3b0bf3 (patch) | |
tree | 48d36498708a9b27278d32438d1b5ec0519ab609 | |
parent | aeef2ae8f9657cf061eb585b046e9e084de4f34f (diff) | |
download | bcm5719-llvm-df170db2f641d6ad170516bd11a146f05c3b0bf3.tar.gz bcm5719-llvm-df170db2f641d6ad170516bd11a146f05c3b0bf3.zip |
Add a xform to the DAG combiner.
Transform:
(fsub x, (fadd x, y)) -> (fneg y) and
(fsub x, (fadd y, x)) -> (fneg y)
if 'unsafe math' is specified.
<rdar://problem/7540295>
llvm-svn: 152777
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index e3c14b08730..8337d763acd 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -5568,6 +5568,23 @@ SDValue DAGCombiner::visitFSUB(SDNode *N) { return DAG.getNode(ISD::FADD, N->getDebugLoc(), VT, N0, GetNegatedExpression(N1, DAG, LegalOperations)); + // If 'unsafe math' is enabled, fold + // (fsub x, (fadd x, y)) -> (fneg y) & + // (fsub x, (fadd y, x)) -> (fneg y) + if (DAG.getTarget().Options.UnsafeFPMath) { + if (N1.getOpcode() == ISD::FADD) { + SDValue N10 = N1->getOperand(0); + SDValue N11 = N1->getOperand(1); + + if (N10 == N0 && isNegatibleForFree(N11, LegalOperations, TLI, + &DAG.getTarget().Options)) + return GetNegatedExpression(N11, DAG, LegalOperations); + else if (N11 == N0 && isNegatibleForFree(N10, LegalOperations, TLI, + &DAG.getTarget().Options)) + return GetNegatedExpression(N10, DAG, LegalOperations); + } + } + return SDValue(); } |