mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-14 17:57:43 +00:00
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> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152777 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
59c5d7bf2c
commit
5a89434236
@ -5568,6 +5568,23 @@ SDValue DAGCombiner::visitFSUB(SDNode *N) {
|
|||||||
return DAG.getNode(ISD::FADD, N->getDebugLoc(), VT, N0,
|
return DAG.getNode(ISD::FADD, N->getDebugLoc(), VT, N0,
|
||||||
GetNegatedExpression(N1, DAG, LegalOperations));
|
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();
|
return SDValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user