diff options
author | Chris Lattner <sabre@nondot.org> | 2005-02-17 20:17:32 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-02-17 20:17:32 +0000 |
commit | d8658616cf8b6ad984974bb764dc9ee4b77499aa (patch) | |
tree | 3e367815a6d0c61ece5f3d96328cf582e959ca0e /lib | |
parent | b29cb29364d3e22f062c695d2d5740dda42d8e8e (diff) | |
download | external_llvm-d8658616cf8b6ad984974bb764dc9ee4b77499aa.zip external_llvm-d8658616cf8b6ad984974bb764dc9ee4b77499aa.tar.gz external_llvm-d8658616cf8b6ad984974bb764dc9ee4b77499aa.tar.bz2 |
Don't rely on doubles comparing identical to each other, which doesn't work
for 0.0 and -0.0.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@20230 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index a35e584..a0e5d93 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -196,10 +196,15 @@ void SelectionDAG::DeleteNodeIfDead(SDNode *N, void *NodeSet) { Constants.erase(std::make_pair(cast<ConstantSDNode>(N)->getValue(), N->getValueType(0))); break; - case ISD::ConstantFP: - ConstantFPs.erase(std::make_pair(cast<ConstantFPSDNode>(N)->getValue(), - N->getValueType(0))); + case ISD::ConstantFP: { + union { + double DV; + uint64_t IV; + }; + DV = cast<ConstantFPSDNode>(N)->getValue(); + ConstantFPs.erase(std::make_pair(IV, N->getValueType(0))); break; + } case ISD::GlobalAddress: GlobalValues.erase(cast<GlobalAddressSDNode>(N)->getGlobal()); break; @@ -299,7 +304,17 @@ SDOperand SelectionDAG::getConstantFP(double Val, MVT::ValueType VT) { if (VT == MVT::f32) Val = (float)Val; // Mask out extra precision. - SDNode *&N = ConstantFPs[std::make_pair(Val, VT)]; + // Do the map lookup using the actual bit pattern for the floating point + // value, so that we don't have problems with 0.0 comparing equal to -0.0, and + // we don't have issues with SNANs. + union { + double DV; + uint64_t IV; + }; + + DV = Val; + + SDNode *&N = ConstantFPs[std::make_pair(IV, VT)]; if (N) return SDOperand(N, 0); N = new ConstantFPSDNode(Val, VT); AllNodes.push_back(N); |