mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
refactor of visitFADD for AllowNewConst cases
Summary: Refactoring for all constant cases which require AllowNewConst and some staging for future fmf usage. Reviewers: spatel, hfinkel, wristow Reviewed By: spatel Subscribers: nhaehnle Differential Revision: https://reviews.llvm.org/D48289 llvm-svn: 334984
This commit is contained in:
parent
14aa992de5
commit
93992cb417
@ -10335,12 +10335,24 @@ SDValue DAGCombiner::visitFADD(SDNode *N) {
|
||||
return N0;
|
||||
}
|
||||
|
||||
// If 'unsafe math' is enabled, fold lots of things.
|
||||
if (Options.UnsafeFPMath) {
|
||||
// No FP constant should be created after legalization as Instruction
|
||||
// Selection pass has a hard time dealing with FP constants.
|
||||
bool AllowNewConst = (Level < AfterLegalizeDAG);
|
||||
// No FP constant should be created after legalization as Instruction
|
||||
// Selection pass has a hard time dealing with FP constants.
|
||||
bool AllowNewConst = (Level < AfterLegalizeDAG);
|
||||
|
||||
// TODO: fmf test for NaNs could be done here too
|
||||
if (Options.UnsafeFPMath && AllowNewConst) {
|
||||
// If allowed, fold (fadd (fneg x), x) -> 0.0
|
||||
if (N0.getOpcode() == ISD::FNEG && N0.getOperand(0) == N1)
|
||||
return DAG.getConstantFP(0.0, DL, VT);
|
||||
|
||||
// If allowed, fold (fadd x, (fneg x)) -> 0.0
|
||||
if (N1.getOpcode() == ISD::FNEG && N1.getOperand(0) == N0)
|
||||
return DAG.getConstantFP(0.0, DL, VT);
|
||||
}
|
||||
|
||||
// If 'unsafe math' is enabled, fold lots of things.
|
||||
// TODO: fmf testing for reassoc/nsz could be done here too
|
||||
if (Options.UnsafeFPMath && AllowNewConst) {
|
||||
// fadd (fadd x, c1), c2 -> fadd x, c1 + c2
|
||||
if (N1CFP && N0.getOpcode() == ISD::FADD &&
|
||||
isConstantFPBuildVectorOrConstantFP(N0.getOperand(1))) {
|
||||
@ -10348,14 +10360,6 @@ SDValue DAGCombiner::visitFADD(SDNode *N) {
|
||||
return DAG.getNode(ISD::FADD, DL, VT, N0.getOperand(0), NewC, Flags);
|
||||
}
|
||||
|
||||
// If allowed, fold (fadd (fneg x), x) -> 0.0
|
||||
if (AllowNewConst && N0.getOpcode() == ISD::FNEG && N0.getOperand(0) == N1)
|
||||
return DAG.getConstantFP(0.0, DL, VT);
|
||||
|
||||
// If allowed, fold (fadd x, (fneg x)) -> 0.0
|
||||
if (AllowNewConst && N1.getOpcode() == ISD::FNEG && N1.getOperand(0) == N0)
|
||||
return DAG.getConstantFP(0.0, DL, VT);
|
||||
|
||||
// We can fold chains of FADD's of the same value into multiplications.
|
||||
// This transform is not safe in general because we are reducing the number
|
||||
// of rounding steps.
|
||||
@ -10402,7 +10406,7 @@ SDValue DAGCombiner::visitFADD(SDNode *N) {
|
||||
}
|
||||
}
|
||||
|
||||
if (N0.getOpcode() == ISD::FADD && AllowNewConst) {
|
||||
if (N0.getOpcode() == ISD::FADD) {
|
||||
bool CFP00 = isConstantFPBuildVectorOrConstantFP(N0.getOperand(0));
|
||||
// (fadd (fadd x, x), x) -> (fmul x, 3.0)
|
||||
if (!CFP00 && N0.getOperand(0) == N0.getOperand(1) &&
|
||||
@ -10412,7 +10416,7 @@ SDValue DAGCombiner::visitFADD(SDNode *N) {
|
||||
}
|
||||
}
|
||||
|
||||
if (N1.getOpcode() == ISD::FADD && AllowNewConst) {
|
||||
if (N1.getOpcode() == ISD::FADD) {
|
||||
bool CFP10 = isConstantFPBuildVectorOrConstantFP(N1.getOperand(0));
|
||||
// (fadd x, (fadd x, x)) -> (fmul x, 3.0)
|
||||
if (!CFP10 && N1.getOperand(0) == N1.getOperand(1) &&
|
||||
@ -10423,8 +10427,7 @@ SDValue DAGCombiner::visitFADD(SDNode *N) {
|
||||
}
|
||||
|
||||
// (fadd (fadd x, x), (fadd x, x)) -> (fmul x, 4.0)
|
||||
if (AllowNewConst &&
|
||||
N0.getOpcode() == ISD::FADD && N1.getOpcode() == ISD::FADD &&
|
||||
if (N0.getOpcode() == ISD::FADD && N1.getOpcode() == ISD::FADD &&
|
||||
N0.getOperand(0) == N0.getOperand(1) &&
|
||||
N1.getOperand(0) == N1.getOperand(1) &&
|
||||
N0.getOperand(0) == N1.getOperand(0)) {
|
||||
|
Loading…
Reference in New Issue
Block a user