forked from OSchip/llvm-project
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> llvm-svn: 152777
This commit is contained in:
parent
aeef2ae8f9
commit
df170db2f6
|
@ -5568,6 +5568,23 @@ SDValue DAGCombiner::visitFSUB(SDNode *N) {
|
|||
return DAG.getNode(ISD::FADD, N->getDebugLoc(), VT, N0,
|
||||
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();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue