diff options
author | Michael Ilseman <milseman@apple.com> | 2012-09-10 17:00:37 +0000 |
---|---|---|
committer | Michael Ilseman <milseman@apple.com> | 2012-09-10 17:00:37 +0000 |
commit | 0666f0580cd9d1cc0d08e5cd7d832c96d5bba7f2 (patch) | |
tree | e95bde0b490f73a2f5b352ca41f5bcc3dde3f684 /llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | |
parent | d5f91515f33849e3e726a8240f9d40aed880be55 (diff) | |
download | bcm5719-llvm-0666f0580cd9d1cc0d08e5cd7d832c96d5bba7f2.tar.gz bcm5719-llvm-0666f0580cd9d1cc0d08e5cd7d832c96d5bba7f2.zip |
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
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index c6f49c8ddcb..d85d41bd86a 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -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!"); |