diff options
author | Owen Anderson <resistor@mac.com> | 2014-08-02 08:45:33 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2014-08-02 08:45:33 +0000 |
commit | 9d5a8c281362ac1b2a5a571526e813bf13519e13 (patch) | |
tree | d6a04ce2ba199a2d4d53baa83d9036516964bcf2 /llvm/lib/CodeGen | |
parent | da2734d4d043349bee11c1351093f1be352dbc3c (diff) | |
download | bcm5719-llvm-9d5a8c281362ac1b2a5a571526e813bf13519e13.tar.gz bcm5719-llvm-9d5a8c281362ac1b2a5a571526e813bf13519e13.zip |
Fix issues with ISD::FNEG and ISD::FMA SDNodes where they would not be constant-folded
during DAGCombine in certain circumstances. Unfortunately, the circumstances required
to trigger the issue seem to require a pretty specific interaction of DAGCombines,
and I haven't been able to find a testcase that reproduces on X86, ARM, or AArch64.
The functionality added here is replicated in essentially every other DAG combine,
so it seems pretty obviously correct.
llvm-svn: 214622
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 445b4e02043..8b1762a82ed 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -6893,6 +6893,14 @@ SDValue DAGCombiner::visitFMA(SDNode *N) { EVT VT = N->getValueType(0); SDLoc dl(N); + + // Constant fold FMA. + if (isa<ConstantFPSDNode>(N0) && + isa<ConstantFPSDNode>(N1) && + isa<ConstantFPSDNode>(N2)) { + return DAG.getNode(ISD::FMA, dl, VT, N0, N1, N2); + } + if (DAG.getTarget().Options.UnsafeFPMath) { if (N0CFP && N0CFP->isZero()) return N2; @@ -7293,6 +7301,10 @@ SDValue DAGCombiner::visitFNEG(SDNode *N) { SDValue N0 = N->getOperand(0); EVT VT = N->getValueType(0); + // Constant fold FNEG. + if (isa<ConstantFPSDNode>(N0)) + return DAG.getNode(ISD::FNEG, SDLoc(N), VT, N->getOperand(0)); + if (VT.isVector()) { SDValue FoldedVOp = SimplifyVUnaryOp(N); if (FoldedVOp.getNode()) return FoldedVOp; |