[PATCH] D33848: Do not recombine FMA when that is not needed.
Amaury SECHET via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 31 09:57:24 PDT 2017
This revision was automatically updated to reflect the committed changes.
Closed by commit rL309578: Do not recombine FMA when that is not needed. (authored by deadalnix).
Repository:
rL LLVM
https://reviews.llvm.org/D33848
Files:
llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
Index: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
===================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
@@ -34517,13 +34517,22 @@
// Negative multiplication when NegA xor NegB
bool NegMul = (NegA != NegB);
+ bool HasNeg = NegA || NegB || NegC;
unsigned NewOpcode;
if (!NegMul)
NewOpcode = (!NegC) ? X86ISD::FMADD : X86ISD::FMSUB;
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 @@
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,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D33848.108944.patch
Type: text/x-patch
Size: 1774 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170731/1c010472/attachment.bin>
More information about the llvm-commits
mailing list