Fold multiply by 0 or 1 when in UnsafeFPMath mode in SelectionDAG::getNode().

This folding happens as early as possible for performance reasons, and to make sure it isn't foiled by other transforms (e.g. forming FMAs).



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@163519 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Michael Ilseman 2012-09-10 17:00:37 +00:00
parent 06b9690463
commit 10def396cb

View File

@ -2816,6 +2816,24 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,
if (ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(N2))
if (CFP->getValueAPF().isZero())
return N1;
} else if (Opcode == ISD::FMUL) {
ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(N1);
SDValue V = N2;
// If the first operand isn't the constant, try the second
if (!CFP) {
CFP = dyn_cast<ConstantFPSDNode>(N2);
V = N1;
}
if (CFP) {
// 0*x --> 0
if (CFP->isZero())
return SDValue(CFP,0);
// 1*x --> x
if (CFP->isExactlyValue(1.0))
return V;
}
}
}
assert(VT.isFloatingPoint() && "This operator only applies to FP types!");