DFGGraph::m_doubleConstantMap will not map 0 values correctly.
authormark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 17 Jun 2014 23:05:48 +0000 (23:05 +0000)
committermark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 17 Jun 2014 23:05:48 +0000 (23:05 +0000)
<https://webkit.org/b/133994>

Reviewed by Geoffrey Garen.

DFGGraph::m_doubleConstantsMap should not use a double as a key to its HashMap,
because it means two unfortunate things:
- It will probably break for zero.
- It will think that -0 is the same as +0 under some circumstances, size
  -0==+0 even though they are distinct values (for example 1/-0 != 1/+0).

The fix is to use std::unordered_map which does not require special empty
and deleted values, and to use the raw bits instead of the double value as
the key.

* dfg/DFGGraph.h:
* dfg/DFGJITCompiler.cpp:
(JSC::DFG::JITCompiler::addressOfDoubleConstant):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@170082 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/dfg/DFGGraph.h
Source/JavaScriptCore/dfg/DFGJITCompiler.cpp

index 4a551d2..55b26b6 100644 (file)
@@ -1,3 +1,24 @@
+2014-06-17  Mark Lam  <mark.lam@apple.com>
+
+        DFGGraph::m_doubleConstantMap will not map 0 values correctly.
+        <https://webkit.org/b/133994>
+
+        Reviewed by Geoffrey Garen.
+
+        DFGGraph::m_doubleConstantsMap should not use a double as a key to its HashMap,
+        because it means two unfortunate things:
+        - It will probably break for zero.
+        - It will think that -0 is the same as +0 under some circumstances, size
+          -0==+0 even though they are distinct values (for example 1/-0 != 1/+0).
+
+        The fix is to use std::unordered_map which does not require special empty
+        and deleted values, and to use the raw bits instead of the double value as
+        the key.
+
+        * dfg/DFGGraph.h:
+        * dfg/DFGJITCompiler.cpp:
+        (JSC::DFG::JITCompiler::addressOfDoubleConstant):
+
 2014-06-17  Oliver Hunt  <oliver@apple.com>
 
         Fix error messages for incorrect hex literals
index 593bfc5..6cd1052 100644 (file)
@@ -41,6 +41,7 @@
 #include "DFGScannable.h"
 #include "JSStack.h"
 #include "MethodOfGettingAValueProfile.h"
+#include <unordered_map>
 #include <wtf/BitVector.h>
 #include <wtf/HashMap.h>
 #include <wtf/Vector.h>
@@ -854,7 +855,7 @@ public:
     std::unique_ptr<SlowArgument[]> m_slowArguments;
 
 #if USE(JSVALUE32_64)
-    HashMap<double, double*> m_doubleConstantsMap;
+    std::unordered_map<int64_t, double*> m_doubleConstantsMap;
     std::unique_ptr<Bag<double>> m_doubleConstants;
 #endif
     
index 2fd497a..c3a4918 100644 (file)
@@ -443,8 +443,8 @@ void* JITCompiler::addressOfDoubleConstant(Node* node)
     JSValue jsvalue = node->valueOfJSConstant(codeBlock());
     ASSERT(jsvalue.isDouble());
 
-    double value = jsvalue.asDouble();
-    auto it = m_graph.m_doubleConstantsMap.find(value);
+    int64_t valueBits = jsvalue.asMachineInt();
+    auto it = m_graph.m_doubleConstantsMap.find(valueBits);
     if (it != m_graph.m_doubleConstantsMap.end())
         return it->value;
 
@@ -452,8 +452,8 @@ void* JITCompiler::addressOfDoubleConstant(Node* node)
         m_graph.m_doubleConstants = std::make_unique<Bag<double>>();
 
     double* addressInConstantPool = m_graph.m_doubleConstants->add();
-    *addressInConstantPool = value;
-    m_graph.m_doubleConstantsMap.add(value, addressInConstantPool);
+    *addressInConstantPool = jsvalue.asDouble();
+    m_graph.m_doubleConstantsMap[valueBits] = addressInConstantPool;
     return addressInConstantPool;
 }
 #endif