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).

llvm-svn: 163519
This commit is contained in:
Michael Ilseman 2012-09-10 17:00:37 +00:00
parent eb6c004862
commit d331ea92fa

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!");