mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-19 19:03:50 +00:00
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:
parent
06b9690463
commit
10def396cb
@ -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!");
|
||||
|
Loading…
x
Reference in New Issue
Block a user