mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-17 21:29:20 +00:00
fold fmul X, +2.0 -> fadd X, X;
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23774 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8532cf6258
commit
11af4eaa6d
@ -1464,8 +1464,7 @@ SDOperand DAGCombiner::visitFADD(SDNode *N) {
|
||||
if (ConstantFPSDNode *N0CFP = dyn_cast<ConstantFPSDNode>(N0))
|
||||
if (ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1)) {
|
||||
// fold floating point (fadd c1, c2)
|
||||
return DAG.getConstantFP(N0CFP->getValue() + N1CFP->getValue(),
|
||||
N->getValueType(0));
|
||||
return DAG.getConstantFP(N0CFP->getValue() + N1CFP->getValue(), VT);
|
||||
}
|
||||
// fold (A + (-B)) -> A-B
|
||||
if (N1.getOpcode() == ISD::FNEG)
|
||||
@ -1486,8 +1485,7 @@ SDOperand DAGCombiner::visitFSUB(SDNode *N) {
|
||||
if (ConstantFPSDNode *N0CFP = dyn_cast<ConstantFPSDNode>(N0))
|
||||
if (ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1)) {
|
||||
// fold floating point (fsub c1, c2)
|
||||
return DAG.getConstantFP(N0CFP->getValue() - N1CFP->getValue(),
|
||||
N->getValueType(0));
|
||||
return DAG.getConstantFP(N0CFP->getValue() - N1CFP->getValue(), VT);
|
||||
}
|
||||
// fold (A-(-B)) -> A+B
|
||||
if (N1.getOpcode() == ISD::FNEG)
|
||||
@ -1499,14 +1497,21 @@ SDOperand DAGCombiner::visitFSUB(SDNode *N) {
|
||||
SDOperand DAGCombiner::visitFMUL(SDNode *N) {
|
||||
SDOperand N0 = N->getOperand(0);
|
||||
SDOperand N1 = N->getOperand(1);
|
||||
ConstantFPSDNode *N0CFP = dyn_cast<ConstantFPSDNode>(N0);
|
||||
ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1);
|
||||
MVT::ValueType VT = N->getValueType(0);
|
||||
|
||||
if (ConstantFPSDNode *N0CFP = dyn_cast<ConstantFPSDNode>(N0))
|
||||
if (ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1)) {
|
||||
// fold floating point (fmul c1, c2)
|
||||
return DAG.getConstantFP(N0CFP->getValue() * N1CFP->getValue(),
|
||||
N->getValueType(0));
|
||||
}
|
||||
// fold (fmul c1, c2) -> c1*c2
|
||||
if (N0CFP && N1CFP)
|
||||
return DAG.getConstantFP(N0CFP->getValue() * N1CFP->getValue(), VT);
|
||||
// canonicalize constant to RHS
|
||||
if (N0CFP && !N1CFP) {
|
||||
std::swap(N0, N1);
|
||||
std::swap(N0CFP, N1CFP);
|
||||
}
|
||||
// fold (fmul X, 2.0) -> (fadd X, X)
|
||||
if (N1CFP && N1CFP->isExactlyValue(+2.0))
|
||||
return DAG.getNode(ISD::FADD, VT, N0, N0);
|
||||
return SDOperand();
|
||||
}
|
||||
|
||||
@ -1518,8 +1523,7 @@ SDOperand DAGCombiner::visitFDIV(SDNode *N) {
|
||||
if (ConstantFPSDNode *N0CFP = dyn_cast<ConstantFPSDNode>(N0))
|
||||
if (ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1)) {
|
||||
// fold floating point (fdiv c1, c2)
|
||||
return DAG.getConstantFP(N0CFP->getValue() / N1CFP->getValue(),
|
||||
N->getValueType(0));
|
||||
return DAG.getConstantFP(N0CFP->getValue() / N1CFP->getValue(), VT);
|
||||
}
|
||||
return SDOperand();
|
||||
}
|
||||
@ -1532,8 +1536,7 @@ SDOperand DAGCombiner::visitFREM(SDNode *N) {
|
||||
if (ConstantFPSDNode *N0CFP = dyn_cast<ConstantFPSDNode>(N0))
|
||||
if (ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1)) {
|
||||
// fold floating point (frem c1, c2) -> fmod(c1, c2)
|
||||
return DAG.getConstantFP(fmod(N0CFP->getValue(),N1CFP->getValue()),
|
||||
N->getValueType(0));
|
||||
return DAG.getConstantFP(fmod(N0CFP->getValue(),N1CFP->getValue()), VT);
|
||||
}
|
||||
return SDOperand();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user