diff options
author | Amaury Sechet <deadalnix@gmail.com> | 2017-07-31 16:56:25 +0000 |
---|---|---|
committer | Amaury Sechet <deadalnix@gmail.com> | 2017-07-31 16:56:25 +0000 |
commit | 4358c5217dc7a16d17c931a291489ec1d3f69902 (patch) | |
tree | 6c31681e75ee3cf385c2f970a2656e1f51b0f919 | |
parent | a3ad61d874b0cf122437265d4af9e0c6ee521a48 (diff) | |
download | bcm5719-llvm-4358c5217dc7a16d17c931a291489ec1d3f69902.tar.gz bcm5719-llvm-4358c5217dc7a16d17c931a291489ec1d3f69902.zip |
Do not recombine FMA when that is not needed.
Summary: As per title. This creates useless recombines.
Reviewers: jyknight, nemanjai, mkuper, spatel, RKSimon, zvi, bkramer
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D33848
llvm-svn: 309578
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index da9adcb50fb..5448c28c6da 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -34517,6 +34517,7 @@ static SDValue combineFMA(SDNode *N, SelectionDAG &DAG, // Negative multiplication when NegA xor NegB bool NegMul = (NegA != NegB); + bool HasNeg = NegA || NegB || NegC; unsigned NewOpcode; if (!NegMul) @@ -34524,6 +34525,14 @@ static SDValue combineFMA(SDNode *N, SelectionDAG &DAG, else NewOpcode = (!NegC) ? X86ISD::FNMADD : X86ISD::FNMSUB; + // For FMA and FAMDD, we risk reconstructing the node we started with. + // In order to avoid this, we check for negation or opcode change. If + // one of the two happened, then it is a new node and we return it. + if (N->getOpcode() == X86ISD::FMADD || N->getOpcode() == ISD::FMA) { + if (HasNeg || NewOpcode != N->getOpcode()) + return DAG.getNode(NewOpcode, dl, VT, A, B, C); + return SDValue(); + } if (N->getOpcode() == X86ISD::FMADD_RND) { switch (NewOpcode) { @@ -34547,12 +34556,15 @@ static SDValue combineFMA(SDNode *N, SelectionDAG &DAG, case X86ISD::FNMSUB: NewOpcode = X86ISD::FNMSUBS3_RND; break; } } else { - assert((N->getOpcode() == X86ISD::FMADD || N->getOpcode() == ISD::FMA) && - "Unexpected opcode!"); - return DAG.getNode(NewOpcode, dl, VT, A, B, C); + llvm_unreachable("Unexpected opcode!"); } - return DAG.getNode(NewOpcode, dl, VT, A, B, C, N->getOperand(3)); + // Only return the node is the opcode was changed or one of the + // operand was negated. If not, we'll just recreate the same node. + if (HasNeg || NewOpcode != N->getOpcode()) + return DAG.getNode(NewOpcode, dl, VT, A, B, C, N->getOperand(3)); + + return SDValue(); } static SDValue combineZext(SDNode *N, SelectionDAG &DAG, |