summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmaury Sechet <deadalnix@gmail.com>2017-07-31 16:56:25 +0000
committerAmaury Sechet <deadalnix@gmail.com>2017-07-31 16:56:25 +0000
commit4358c5217dc7a16d17c931a291489ec1d3f69902 (patch)
tree6c31681e75ee3cf385c2f970a2656e1f51b0f919
parenta3ad61d874b0cf122437265d4af9e0c6ee521a48 (diff)
downloadbcm5719-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.cpp20
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,
OpenPOWER on IntegriCloud