<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[205107] trunk/Source/JavaScriptCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/205107">205107</a></dd>
<dt>Author</dt> <dd>sbarati@apple.com</dd>
<dt>Date</dt> <dd>2016-08-28 16:31:46 -0700 (Sun, 28 Aug 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Make SpeculatedType a 64-bit integer
https://bugs.webkit.org/show_bug.cgi?id=161268

Reviewed by Filip Pizlo and Benjamin Poulain.

I'm going to introduce two new types into this and we only
have room for one in 32-bits. So, this patch widens SpeculatedType
to 64 bits. This also pulls this information through the DFG where
we needed to change DFGNode to support this.

* bytecode/SpeculatedType.h:
* dfg/DFGNode.cpp:
(JSC::DFG::Node::convertToPutHint):
(JSC::DFG::Node::promotedLocationDescriptor):
* dfg/DFGNode.h:
(JSC::DFG::Node::Node):
(JSC::DFG::Node::convertToCheckStructure):
(JSC::DFG::Node::constant):
(JSC::DFG::Node::convertToConstant):
(JSC::DFG::Node::convertToConstantStoragePointer):
(JSC::DFG::Node::convertToPutStack):
(JSC::DFG::Node::convertToGetStack):
(JSC::DFG::Node::convertToGetByOffset):
(JSC::DFG::Node::convertToMultiGetByOffset):
(JSC::DFG::Node::convertToPutByOffset):
(JSC::DFG::Node::convertToMultiPutByOffset):
(JSC::DFG::Node::convertToPhantomNewObject):
(JSC::DFG::Node::convertToPhantomNewFunction):
(JSC::DFG::Node::convertToPhantomNewGeneratorFunction):
(JSC::DFG::Node::convertToPhantomCreateActivation):
(JSC::DFG::Node::convertToGetLocal):
(JSC::DFG::Node::lazyJSValue):
(JSC::DFG::Node::initializationValueForActivation):
(JSC::DFG::Node::tryGetVariableAccessData):
(JSC::DFG::Node::variableAccessData):
(JSC::DFG::Node::unlinkedLocal):
(JSC::DFG::Node::unlinkedMachineLocal):
(JSC::DFG::Node::stackAccessData):
(JSC::DFG::Node::phi):
(JSC::DFG::Node::identifierNumber):
(JSC::DFG::Node::getPutInfo):
(JSC::DFG::Node::accessorAttributes):
(JSC::DFG::Node::newArrayBufferData):
(JSC::DFG::Node::indexingType):
(JSC::DFG::Node::typedArrayType):
(JSC::DFG::Node::inlineCapacity):
(JSC::DFG::Node::scopeOffset):
(JSC::DFG::Node::capturedArgumentsOffset):
(JSC::DFG::Node::variablePointer):
(JSC::DFG::Node::callVarargsData):
(JSC::DFG::Node::loadVarargsData):
(JSC::DFG::Node::targetBytecodeOffsetDuringParsing):
(JSC::DFG::Node::targetBlock):
(JSC::DFG::Node::branchData):
(JSC::DFG::Node::switchData):
(JSC::DFG::Node::getHeapPrediction):
(JSC::DFG::Node::cellOperand):
(JSC::DFG::Node::watchpointSet):
(JSC::DFG::Node::storagePointer):
(JSC::DFG::Node::uidOperand):
(JSC::DFG::Node::typeInfoOperand):
(JSC::DFG::Node::transition):
(JSC::DFG::Node::structureSet):
(JSC::DFG::Node::structure):
(JSC::DFG::Node::storageAccessData):
(JSC::DFG::Node::multiGetByOffsetData):
(JSC::DFG::Node::multiPutByOffsetData):
(JSC::DFG::Node::objectMaterializationData):
(JSC::DFG::Node::arrayMode):
(JSC::DFG::Node::arithMode):
(JSC::DFG::Node::arithRoundingMode):
(JSC::DFG::Node::setArithRoundingMode):
(JSC::DFG::Node::executionCounter):
(JSC::DFG::Node::typeLocation):
(JSC::DFG::Node::basicBlockLocation):
(JSC::DFG::Node::numberOfArgumentsToSkip):
(JSC::DFG::Node::OpInfoWrapper::OpInfoWrapper):
(JSC::DFG::Node::OpInfoWrapper::operator=):
* dfg/DFGOpInfo.h:
(JSC::DFG::OpInfo::OpInfo):
* dfg/DFGPromotedHeapLocation.h:
(JSC::DFG::PromotedLocationDescriptor::imm1):
(JSC::DFG::PromotedLocationDescriptor::imm2):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeSpeculatedTypeh">trunk/Source/JavaScriptCore/bytecode/SpeculatedType.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGNodecpp">trunk/Source/JavaScriptCore/dfg/DFGNode.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGNodeh">trunk/Source/JavaScriptCore/dfg/DFGNode.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGOpInfoh">trunk/Source/JavaScriptCore/dfg/DFGOpInfo.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGPromotedHeapLocationh">trunk/Source/JavaScriptCore/dfg/DFGPromotedHeapLocation.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (205106 => 205107)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-08-28 22:38:41 UTC (rev 205106)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-08-28 23:31:46 UTC (rev 205107)
</span><span class="lines">@@ -1,3 +1,89 @@
</span><ins>+2016-08-28  Saam Barati  &lt;sbarati@apple.com&gt;
+
+        Make SpeculatedType a 64-bit integer
+        https://bugs.webkit.org/show_bug.cgi?id=161268
+
+        Reviewed by Filip Pizlo and Benjamin Poulain.
+
+        I'm going to introduce two new types into this and we only
+        have room for one in 32-bits. So, this patch widens SpeculatedType
+        to 64 bits. This also pulls this information through the DFG where
+        we needed to change DFGNode to support this.
+
+        * bytecode/SpeculatedType.h:
+        * dfg/DFGNode.cpp:
+        (JSC::DFG::Node::convertToPutHint):
+        (JSC::DFG::Node::promotedLocationDescriptor):
+        * dfg/DFGNode.h:
+        (JSC::DFG::Node::Node):
+        (JSC::DFG::Node::convertToCheckStructure):
+        (JSC::DFG::Node::constant):
+        (JSC::DFG::Node::convertToConstant):
+        (JSC::DFG::Node::convertToConstantStoragePointer):
+        (JSC::DFG::Node::convertToPutStack):
+        (JSC::DFG::Node::convertToGetStack):
+        (JSC::DFG::Node::convertToGetByOffset):
+        (JSC::DFG::Node::convertToMultiGetByOffset):
+        (JSC::DFG::Node::convertToPutByOffset):
+        (JSC::DFG::Node::convertToMultiPutByOffset):
+        (JSC::DFG::Node::convertToPhantomNewObject):
+        (JSC::DFG::Node::convertToPhantomNewFunction):
+        (JSC::DFG::Node::convertToPhantomNewGeneratorFunction):
+        (JSC::DFG::Node::convertToPhantomCreateActivation):
+        (JSC::DFG::Node::convertToGetLocal):
+        (JSC::DFG::Node::lazyJSValue):
+        (JSC::DFG::Node::initializationValueForActivation):
+        (JSC::DFG::Node::tryGetVariableAccessData):
+        (JSC::DFG::Node::variableAccessData):
+        (JSC::DFG::Node::unlinkedLocal):
+        (JSC::DFG::Node::unlinkedMachineLocal):
+        (JSC::DFG::Node::stackAccessData):
+        (JSC::DFG::Node::phi):
+        (JSC::DFG::Node::identifierNumber):
+        (JSC::DFG::Node::getPutInfo):
+        (JSC::DFG::Node::accessorAttributes):
+        (JSC::DFG::Node::newArrayBufferData):
+        (JSC::DFG::Node::indexingType):
+        (JSC::DFG::Node::typedArrayType):
+        (JSC::DFG::Node::inlineCapacity):
+        (JSC::DFG::Node::scopeOffset):
+        (JSC::DFG::Node::capturedArgumentsOffset):
+        (JSC::DFG::Node::variablePointer):
+        (JSC::DFG::Node::callVarargsData):
+        (JSC::DFG::Node::loadVarargsData):
+        (JSC::DFG::Node::targetBytecodeOffsetDuringParsing):
+        (JSC::DFG::Node::targetBlock):
+        (JSC::DFG::Node::branchData):
+        (JSC::DFG::Node::switchData):
+        (JSC::DFG::Node::getHeapPrediction):
+        (JSC::DFG::Node::cellOperand):
+        (JSC::DFG::Node::watchpointSet):
+        (JSC::DFG::Node::storagePointer):
+        (JSC::DFG::Node::uidOperand):
+        (JSC::DFG::Node::typeInfoOperand):
+        (JSC::DFG::Node::transition):
+        (JSC::DFG::Node::structureSet):
+        (JSC::DFG::Node::structure):
+        (JSC::DFG::Node::storageAccessData):
+        (JSC::DFG::Node::multiGetByOffsetData):
+        (JSC::DFG::Node::multiPutByOffsetData):
+        (JSC::DFG::Node::objectMaterializationData):
+        (JSC::DFG::Node::arrayMode):
+        (JSC::DFG::Node::arithMode):
+        (JSC::DFG::Node::arithRoundingMode):
+        (JSC::DFG::Node::setArithRoundingMode):
+        (JSC::DFG::Node::executionCounter):
+        (JSC::DFG::Node::typeLocation):
+        (JSC::DFG::Node::basicBlockLocation):
+        (JSC::DFG::Node::numberOfArgumentsToSkip):
+        (JSC::DFG::Node::OpInfoWrapper::OpInfoWrapper):
+        (JSC::DFG::Node::OpInfoWrapper::operator=):
+        * dfg/DFGOpInfo.h:
+        (JSC::DFG::OpInfo::OpInfo):
+        * dfg/DFGPromotedHeapLocation.h:
+        (JSC::DFG::PromotedLocationDescriptor::imm1):
+        (JSC::DFG::PromotedLocationDescriptor::imm2):
+
</ins><span class="cx"> 2016-08-27  Don Olmstead  &lt;don.olmstead@am.sony.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unused cxxabi.h include in JSGlobalObjectInspectorController.cpp
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeSpeculatedTypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/SpeculatedType.h (205106 => 205107)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/SpeculatedType.h        2016-08-28 22:38:41 UTC (rev 205106)
+++ trunk/Source/JavaScriptCore/bytecode/SpeculatedType.h        2016-08-28 23:31:46 UTC (rev 205107)
</span><span class="lines">@@ -37,7 +37,7 @@
</span><span class="cx"> 
</span><span class="cx"> class Structure;
</span><span class="cx"> 
</span><del>-typedef uint32_t SpeculatedType;
</del><ins>+typedef uint64_t SpeculatedType;
</ins><span class="cx"> static const SpeculatedType SpecNone               = 0; // We don't know anything yet.
</span><span class="cx"> static const SpeculatedType SpecFinalObject        = 1u &lt;&lt; 0; // It's definitely a JSFinalObject.
</span><span class="cx"> static const SpeculatedType SpecArray              = 1u &lt;&lt; 1; // It's definitely a JSArray.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGNode.cpp (205106 => 205107)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGNode.cpp        2016-08-28 22:38:41 UTC (rev 205106)
+++ trunk/Source/JavaScriptCore/dfg/DFGNode.cpp        2016-08-28 23:31:46 UTC (rev 205107)
</span><span class="lines">@@ -158,7 +158,7 @@
</span><span class="cx"> {
</span><span class="cx">     m_op = LazyJSConstant;
</span><span class="cx">     m_flags &amp;= ~NodeMustGenerate;
</span><del>-    m_opInfo = bitwise_cast&lt;uintptr_t&gt;(graph.m_lazyJSValues.add(value));
</del><ins>+    m_opInfo = graph.m_lazyJSValues.add(value);
</ins><span class="cx">     children.reset();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -165,8 +165,8 @@
</span><span class="cx"> void Node::convertToPutHint(const PromotedLocationDescriptor&amp; descriptor, Node* base, Node* value)
</span><span class="cx"> {
</span><span class="cx">     m_op = PutHint;
</span><del>-    m_opInfo = descriptor.imm1().m_value;
-    m_opInfo2 = descriptor.imm2().m_value;
</del><ins>+    m_opInfo = descriptor.imm1();
+    m_opInfo2 = descriptor.imm2();
</ins><span class="cx">     child1() = base-&gt;defaultEdge();
</span><span class="cx">     child2() = value-&gt;defaultEdge();
</span><span class="cx">     child3() = Edge();
</span><span class="lines">@@ -206,7 +206,7 @@
</span><span class="cx"> 
</span><span class="cx"> PromotedLocationDescriptor Node::promotedLocationDescriptor()
</span><span class="cx"> {
</span><del>-    return PromotedLocationDescriptor(static_cast&lt;PromotedLocationKind&gt;(m_opInfo), m_opInfo2);
</del><ins>+    return PromotedLocationDescriptor(static_cast&lt;PromotedLocationKind&gt;(m_opInfo.as&lt;uint32_t&gt;()), m_opInfo2.as&lt;uint32_t&gt;());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } } // namespace JSC::DFG
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGNode.h (205106 => 205107)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGNode.h        2016-08-28 22:38:41 UTC (rev 205106)
+++ trunk/Source/JavaScriptCore/dfg/DFGNode.h        2016-08-28 23:31:46 UTC (rev 205107)
</span><span class="lines">@@ -54,6 +54,7 @@
</span><span class="cx"> #include &quot;StructureSet.h&quot;
</span><span class="cx"> #include &quot;TypeLocation.h&quot;
</span><span class="cx"> #include &quot;ValueProfile.h&quot;
</span><ins>+#include &lt;type_traits&gt;
</ins><span class="cx"> #include &lt;wtf/ListDump.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="lines">@@ -254,8 +255,6 @@
</span><span class="cx">         , m_virtualRegister(VirtualRegister())
</span><span class="cx">         , m_refCount(1)
</span><span class="cx">         , m_prediction(SpecNone)
</span><del>-        , m_opInfo(0)
-        , m_opInfo2(0)
</del><span class="cx">         , owner(nullptr)
</span><span class="cx">     {
</span><span class="cx">         m_misc.replacement = nullptr;
</span><span class="lines">@@ -270,8 +269,6 @@
</span><span class="cx">         , m_virtualRegister(VirtualRegister())
</span><span class="cx">         , m_refCount(1)
</span><span class="cx">         , m_prediction(SpecNone)
</span><del>-        , m_opInfo(0)
-        , m_opInfo2(0)
</del><span class="cx">         , owner(nullptr)
</span><span class="cx">     {
</span><span class="cx">         m_misc.replacement = nullptr;
</span><span class="lines">@@ -288,7 +285,6 @@
</span><span class="cx">         , m_refCount(1)
</span><span class="cx">         , m_prediction(SpecNone)
</span><span class="cx">         , m_opInfo(imm.m_value)
</span><del>-        , m_opInfo2(0)
</del><span class="cx">         , owner(nullptr)
</span><span class="cx">     {
</span><span class="cx">         m_misc.replacement = nullptr;
</span><span class="lines">@@ -304,7 +300,6 @@
</span><span class="cx">         , m_refCount(1)
</span><span class="cx">         , m_prediction(SpecNone)
</span><span class="cx">         , m_opInfo(imm.m_value)
</span><del>-        , m_opInfo2(0)
</del><span class="cx">         , owner(nullptr)
</span><span class="cx">     {
</span><span class="cx">         m_misc.replacement = nullptr;
</span><span class="lines">@@ -406,7 +401,7 @@
</span><span class="cx">     void convertToCheckStructure(StructureSet* set)
</span><span class="cx">     {
</span><span class="cx">         setOpAndDefaultFlags(CheckStructure);
</span><del>-        m_opInfo = bitwise_cast&lt;uintptr_t&gt;(set); 
</del><ins>+        m_opInfo = set; 
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void convertToCheckStructureImmediate(Node* structure)
</span><span class="lines">@@ -471,7 +466,7 @@
</span><span class="cx">             return FrozenValue::emptySingleton();
</span><span class="cx">         }
</span><span class="cx">         
</span><del>-        return bitwise_cast&lt;FrozenValue*&gt;(m_opInfo);
</del><ins>+        return m_opInfo.as&lt;FrozenValue*&gt;();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     // Don't call this directly - use Graph::convertToConstant() instead!
</span><span class="lines">@@ -484,7 +479,7 @@
</span><span class="cx">         else
</span><span class="cx">             m_op = JSConstant;
</span><span class="cx">         m_flags &amp;= ~NodeMustGenerate;
</span><del>-        m_opInfo = bitwise_cast&lt;uintptr_t&gt;(value);
</del><ins>+        m_opInfo = value;
</ins><span class="cx">         children.reset();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -494,7 +489,7 @@
</span><span class="cx">     {
</span><span class="cx">         ASSERT(op() == GetIndexedPropertyStorage);
</span><span class="cx">         m_op = ConstantStoragePointer;
</span><del>-        m_opInfo = bitwise_cast&lt;uintptr_t&gt;(pointer);
</del><ins>+        m_opInfo = pointer;
</ins><span class="cx">         children.reset();
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="lines">@@ -511,8 +506,8 @@
</span><span class="cx">     {
</span><span class="cx">         m_op = PutStack;
</span><span class="cx">         m_flags |= NodeMustGenerate;
</span><del>-        m_opInfo = bitwise_cast&lt;uintptr_t&gt;(data);
-        m_opInfo2 = 0;
</del><ins>+        m_opInfo = data;
+        m_opInfo2 = OpInfoWrapper();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     void convertToGetStack(StackAccessData* data)
</span><span class="lines">@@ -519,8 +514,8 @@
</span><span class="cx">     {
</span><span class="cx">         m_op = GetStack;
</span><span class="cx">         m_flags &amp;= ~NodeMustGenerate;
</span><del>-        m_opInfo = bitwise_cast&lt;uintptr_t&gt;(data);
-        m_opInfo2 = 0;
</del><ins>+        m_opInfo = data;
+        m_opInfo2 = OpInfoWrapper();
</ins><span class="cx">         children.reset();
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="lines">@@ -527,7 +522,7 @@
</span><span class="cx">     void convertToGetByOffset(StorageAccessData&amp; data, Edge storage, Edge base)
</span><span class="cx">     {
</span><span class="cx">         ASSERT(m_op == GetById || m_op == GetByIdFlush || m_op == MultiGetByOffset);
</span><del>-        m_opInfo = bitwise_cast&lt;uintptr_t&gt;(&amp;data);
</del><ins>+        m_opInfo = &amp;data;
</ins><span class="cx">         children.setChild1(storage);
</span><span class="cx">         children.setChild2(base);
</span><span class="cx">         m_op = GetByOffset;
</span><span class="lines">@@ -537,7 +532,7 @@
</span><span class="cx">     void convertToMultiGetByOffset(MultiGetByOffsetData* data)
</span><span class="cx">     {
</span><span class="cx">         ASSERT(m_op == GetById || m_op == GetByIdFlush);
</span><del>-        m_opInfo = bitwise_cast&lt;intptr_t&gt;(data);
</del><ins>+        m_opInfo = data;
</ins><span class="cx">         child1().setUseKind(CellUse);
</span><span class="cx">         m_op = MultiGetByOffset;
</span><span class="cx">         ASSERT(m_flags &amp; NodeMustGenerate);
</span><span class="lines">@@ -546,7 +541,7 @@
</span><span class="cx">     void convertToPutByOffset(StorageAccessData&amp; data, Edge storage, Edge base)
</span><span class="cx">     {
</span><span class="cx">         ASSERT(m_op == PutById || m_op == PutByIdDirect || m_op == PutByIdFlush || m_op == MultiPutByOffset);
</span><del>-        m_opInfo = bitwise_cast&lt;uintptr_t&gt;(&amp;data);
</del><ins>+        m_opInfo = &amp;data;
</ins><span class="cx">         children.setChild3(children.child2());
</span><span class="cx">         children.setChild2(base);
</span><span class="cx">         children.setChild1(storage);
</span><span class="lines">@@ -556,7 +551,7 @@
</span><span class="cx">     void convertToMultiPutByOffset(MultiPutByOffsetData* data)
</span><span class="cx">     {
</span><span class="cx">         ASSERT(m_op == PutById || m_op == PutByIdDirect || m_op == PutByIdFlush);
</span><del>-        m_opInfo = bitwise_cast&lt;intptr_t&gt;(data);
</del><ins>+        m_opInfo = data;
</ins><span class="cx">         m_op = MultiPutByOffset;
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="lines">@@ -572,8 +567,8 @@
</span><span class="cx">         m_op = PhantomNewObject;
</span><span class="cx">         m_flags &amp;= ~NodeHasVarArgs;
</span><span class="cx">         m_flags |= NodeMustGenerate;
</span><del>-        m_opInfo = 0;
-        m_opInfo2 = 0;
</del><ins>+        m_opInfo = OpInfoWrapper();
+        m_opInfo2 = OpInfoWrapper();
</ins><span class="cx">         children = AdjacencyList();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -582,8 +577,8 @@
</span><span class="cx">         ASSERT(m_op == NewFunction || m_op == NewGeneratorFunction);
</span><span class="cx">         m_op = PhantomNewFunction;
</span><span class="cx">         m_flags |= NodeMustGenerate;
</span><del>-        m_opInfo = 0;
-        m_opInfo2 = 0;
</del><ins>+        m_opInfo = OpInfoWrapper();
+        m_opInfo2 = OpInfoWrapper();
</ins><span class="cx">         children = AdjacencyList();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -592,8 +587,8 @@
</span><span class="cx">         ASSERT(m_op == NewGeneratorFunction);
</span><span class="cx">         m_op = PhantomNewGeneratorFunction;
</span><span class="cx">         m_flags |= NodeMustGenerate;
</span><del>-        m_opInfo = 0;
-        m_opInfo2 = 0;
</del><ins>+        m_opInfo = OpInfoWrapper();
+        m_opInfo2 = OpInfoWrapper();
</ins><span class="cx">         children = AdjacencyList();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -603,8 +598,8 @@
</span><span class="cx">         m_op = PhantomCreateActivation;
</span><span class="cx">         m_flags &amp;= ~NodeHasVarArgs;
</span><span class="cx">         m_flags |= NodeMustGenerate;
</span><del>-        m_opInfo = 0;
-        m_opInfo2 = 0;
</del><ins>+        m_opInfo = OpInfoWrapper();
+        m_opInfo2 = OpInfoWrapper();
</ins><span class="cx">         children = AdjacencyList();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -627,8 +622,8 @@
</span><span class="cx">     {
</span><span class="cx">         ASSERT(m_op == GetLocalUnlinked);
</span><span class="cx">         m_op = GetLocal;
</span><del>-        m_opInfo = bitwise_cast&lt;uintptr_t&gt;(variable);
-        m_opInfo2 = 0;
</del><ins>+        m_opInfo = variable;
+        m_opInfo2 = OpInfoWrapper();
</ins><span class="cx">         children.setChild1(Edge(phi));
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="lines">@@ -738,7 +733,7 @@
</span><span class="cx">     LazyJSValue lazyJSValue()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasLazyJSValue());
</span><del>-        return *bitwise_cast&lt;LazyJSValue*&gt;(m_opInfo);
</del><ins>+        return *m_opInfo.as&lt;LazyJSValue*&gt;();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     String tryGetString(Graph&amp;);
</span><span class="lines">@@ -746,7 +741,7 @@
</span><span class="cx">     JSValue initializationValueForActivation() const
</span><span class="cx">     {
</span><span class="cx">         ASSERT(op() == CreateActivation);
</span><del>-        return bitwise_cast&lt;FrozenValue*&gt;(m_opInfo2)-&gt;value();
</del><ins>+        return m_opInfo2.as&lt;FrozenValue*&gt;()-&gt;value();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool hasArgumentsChild()
</span><span class="lines">@@ -814,7 +809,7 @@
</span><span class="cx">     // access data doesn't have one because it hasn't been initialized yet.
</span><span class="cx">     VariableAccessData* tryGetVariableAccessData()
</span><span class="cx">     {
</span><del>-        VariableAccessData* result = reinterpret_cast&lt;VariableAccessData*&gt;(m_opInfo);
</del><ins>+        VariableAccessData* result = m_opInfo.as&lt;VariableAccessData*&gt;();
</ins><span class="cx">         if (!result)
</span><span class="cx">             return 0;
</span><span class="cx">         return result-&gt;find();
</span><span class="lines">@@ -822,7 +817,7 @@
</span><span class="cx">     
</span><span class="cx">     VariableAccessData* variableAccessData()
</span><span class="cx">     {
</span><del>-        return reinterpret_cast&lt;VariableAccessData*&gt;(m_opInfo)-&gt;find();
</del><ins>+        return m_opInfo.as&lt;VariableAccessData*&gt;()-&gt;find();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     VirtualRegister local()
</span><span class="lines">@@ -852,7 +847,7 @@
</span><span class="cx">     VirtualRegister unlinkedLocal()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasUnlinkedLocal());
</span><del>-        return static_cast&lt;VirtualRegister&gt;(m_opInfo);
</del><ins>+        return VirtualRegister(m_opInfo.as&lt;int32_t&gt;());
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool hasUnlinkedMachineLocal()
</span><span class="lines">@@ -869,7 +864,7 @@
</span><span class="cx">     VirtualRegister unlinkedMachineLocal()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasUnlinkedMachineLocal());
</span><del>-        return VirtualRegister(m_opInfo2);
</del><ins>+        return VirtualRegister(m_opInfo2.as&lt;int32_t&gt;());
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool hasStackAccessData()
</span><span class="lines">@@ -886,7 +881,7 @@
</span><span class="cx">     StackAccessData* stackAccessData()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasStackAccessData());
</span><del>-        return bitwise_cast&lt;StackAccessData*&gt;(m_opInfo);
</del><ins>+        return m_opInfo.as&lt;StackAccessData*&gt;();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool hasPhi()
</span><span class="lines">@@ -897,7 +892,7 @@
</span><span class="cx">     Node* phi()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasPhi());
</span><del>-        return bitwise_cast&lt;Node*&gt;(m_opInfo);
</del><ins>+        return m_opInfo.as&lt;Node*&gt;();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool isStoreBarrier()
</span><span class="lines">@@ -932,7 +927,7 @@
</span><span class="cx">     unsigned identifierNumber()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasIdentifier());
</span><del>-        return m_opInfo;
</del><ins>+        return m_opInfo.as&lt;unsigned&gt;();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool hasGetPutInfo()
</span><span class="lines">@@ -949,7 +944,7 @@
</span><span class="cx">     unsigned getPutInfo()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasGetPutInfo());
</span><del>-        return m_opInfo2;
</del><ins>+        return m_opInfo2.as&lt;unsigned&gt;();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool hasAccessorAttributes()
</span><span class="lines">@@ -973,10 +968,10 @@
</span><span class="cx">         case PutGetterById:
</span><span class="cx">         case PutSetterById:
</span><span class="cx">         case PutGetterSetterById:
</span><del>-            return m_opInfo2;
</del><ins>+            return m_opInfo2.as&lt;int32_t&gt;();
</ins><span class="cx">         case PutGetterByVal:
</span><span class="cx">         case PutSetterByVal:
</span><del>-            return m_opInfo;
</del><ins>+            return m_opInfo.as&lt;int32_t&gt;();
</ins><span class="cx">         default:
</span><span class="cx">             RELEASE_ASSERT_NOT_REACHED();
</span><span class="cx">             return 0;
</span><span class="lines">@@ -1024,7 +1019,7 @@
</span><span class="cx">     NewArrayBufferData* newArrayBufferData()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasConstantBuffer());
</span><del>-        return reinterpret_cast&lt;NewArrayBufferData*&gt;(m_opInfo);
</del><ins>+        return m_opInfo.as&lt;NewArrayBufferData*&gt;();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     unsigned startConstant()
</span><span class="lines">@@ -1062,7 +1057,7 @@
</span><span class="cx">         ASSERT(hasIndexingType());
</span><span class="cx">         if (op() == NewArrayBuffer)
</span><span class="cx">             return newArrayBufferData()-&gt;indexingType;
</span><del>-        return m_opInfo;
</del><ins>+        return static_cast&lt;IndexingType&gt;(m_opInfo.as&lt;uint32_t&gt;());
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool hasTypedArrayType()
</span><span class="lines">@@ -1078,7 +1073,7 @@
</span><span class="cx">     TypedArrayType typedArrayType()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasTypedArrayType());
</span><del>-        TypedArrayType result = static_cast&lt;TypedArrayType&gt;(m_opInfo);
</del><ins>+        TypedArrayType result = static_cast&lt;TypedArrayType&gt;(m_opInfo.as&lt;uint32_t&gt;());
</ins><span class="cx">         ASSERT(isTypedView(result));
</span><span class="cx">         return result;
</span><span class="cx">     }
</span><span class="lines">@@ -1091,7 +1086,7 @@
</span><span class="cx">     unsigned inlineCapacity()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasInlineCapacity());
</span><del>-        return m_opInfo;
</del><ins>+        return m_opInfo.as&lt;unsigned&gt;();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void setIndexingType(IndexingType indexingType)
</span><span class="lines">@@ -1108,7 +1103,7 @@
</span><span class="cx">     ScopeOffset scopeOffset()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasScopeOffset());
</span><del>-        return ScopeOffset(m_opInfo);
</del><ins>+        return ScopeOffset(m_opInfo.as&lt;uint32_t&gt;());
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool hasDirectArgumentsOffset()
</span><span class="lines">@@ -1119,7 +1114,7 @@
</span><span class="cx">     DirectArgumentsOffset capturedArgumentsOffset()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasDirectArgumentsOffset());
</span><del>-        return DirectArgumentsOffset(m_opInfo);
</del><ins>+        return DirectArgumentsOffset(m_opInfo.as&lt;uint32_t&gt;());
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool hasRegisterPointer()
</span><span class="lines">@@ -1129,7 +1124,7 @@
</span><span class="cx">     
</span><span class="cx">     WriteBarrier&lt;Unknown&gt;* variablePointer()
</span><span class="cx">     {
</span><del>-        return bitwise_cast&lt;WriteBarrier&lt;Unknown&gt;*&gt;(m_opInfo);
</del><ins>+        return m_opInfo.as&lt;WriteBarrier&lt;Unknown&gt;*&gt;();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool hasCallVarargsData()
</span><span class="lines">@@ -1152,7 +1147,7 @@
</span><span class="cx">     CallVarargsData* callVarargsData()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasCallVarargsData());
</span><del>-        return bitwise_cast&lt;CallVarargsData*&gt;(m_opInfo);
</del><ins>+        return m_opInfo.as&lt;CallVarargsData*&gt;();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool hasLoadVarargsData()
</span><span class="lines">@@ -1163,7 +1158,7 @@
</span><span class="cx">     LoadVarargsData* loadVarargsData()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasLoadVarargsData());
</span><del>-        return bitwise_cast&lt;LoadVarargsData*&gt;(m_opInfo);
</del><ins>+        return m_opInfo.as&lt;LoadVarargsData*&gt;();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool hasResult()
</span><span class="lines">@@ -1259,25 +1254,25 @@
</span><span class="cx">     unsigned targetBytecodeOffsetDuringParsing()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(isJump());
</span><del>-        return m_opInfo;
</del><ins>+        return m_opInfo.as&lt;unsigned&gt;();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     BasicBlock*&amp; targetBlock()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(isJump());
</span><del>-        return *bitwise_cast&lt;BasicBlock**&gt;(&amp;m_opInfo);
</del><ins>+        return *bitwise_cast&lt;BasicBlock**&gt;(&amp;m_opInfo.u.pointer);
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     BranchData* branchData()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(isBranch());
</span><del>-        return bitwise_cast&lt;BranchData*&gt;(m_opInfo);
</del><ins>+        return m_opInfo.as&lt;BranchData*&gt;();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     SwitchData* switchData()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(isSwitch());
</span><del>-        return bitwise_cast&lt;SwitchData*&gt;(m_opInfo);
</del><ins>+        return m_opInfo.as&lt;SwitchData*&gt;();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     unsigned numSuccessors()
</span><span class="lines">@@ -1437,7 +1432,7 @@
</span><span class="cx">     SpeculatedType getHeapPrediction()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasHeapPrediction());
</span><del>-        return static_cast&lt;SpeculatedType&gt;(m_opInfo2);
</del><ins>+        return m_opInfo2.as&lt;SpeculatedType&gt;();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void setHeapPrediction(SpeculatedType prediction)
</span><span class="lines">@@ -1466,7 +1461,7 @@
</span><span class="cx">     FrozenValue* cellOperand()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasCellOperand());
</span><del>-        return reinterpret_cast&lt;FrozenValue*&gt;(m_opInfo);
</del><ins>+        return m_opInfo.as&lt;FrozenValue*&gt;();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     template&lt;typename T&gt;
</span><span class="lines">@@ -1478,7 +1473,7 @@
</span><span class="cx">     void setCellOperand(FrozenValue* value)
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasCellOperand());
</span><del>-        m_opInfo = bitwise_cast&lt;uintptr_t&gt;(value);
</del><ins>+        m_opInfo = value;
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool hasWatchpointSet()
</span><span class="lines">@@ -1489,7 +1484,7 @@
</span><span class="cx">     WatchpointSet* watchpointSet()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasWatchpointSet());
</span><del>-        return reinterpret_cast&lt;WatchpointSet*&gt;(m_opInfo);
</del><ins>+        return m_opInfo.as&lt;WatchpointSet*&gt;();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool hasStoragePointer()
</span><span class="lines">@@ -1500,7 +1495,7 @@
</span><span class="cx">     void* storagePointer()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasStoragePointer());
</span><del>-        return reinterpret_cast&lt;void*&gt;(m_opInfo);
</del><ins>+        return m_opInfo.as&lt;void*&gt;();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool hasUidOperand()
</span><span class="lines">@@ -1511,7 +1506,7 @@
</span><span class="cx">     UniquedStringImpl* uidOperand()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasUidOperand());
</span><del>-        return reinterpret_cast&lt;UniquedStringImpl*&gt;(m_opInfo);
</del><ins>+        return m_opInfo.as&lt;UniquedStringImpl*&gt;();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool hasTypeInfoOperand()
</span><span class="lines">@@ -1521,8 +1516,8 @@
</span><span class="cx"> 
</span><span class="cx">     unsigned typeInfoOperand()
</span><span class="cx">     {
</span><del>-        ASSERT(hasTypeInfoOperand() &amp;&amp; m_opInfo &lt;= UCHAR_MAX);
-        return static_cast&lt;unsigned&gt;(m_opInfo);
</del><ins>+        ASSERT(hasTypeInfoOperand() &amp;&amp; m_opInfo.as&lt;uint32_t&gt;() &lt;= static_cast&lt;uint32_t&gt;(UCHAR_MAX));
+        return m_opInfo.as&lt;uint32_t&gt;();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool hasTransition()
</span><span class="lines">@@ -1540,7 +1535,7 @@
</span><span class="cx">     Transition* transition()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasTransition());
</span><del>-        return reinterpret_cast&lt;Transition*&gt;(m_opInfo);
</del><ins>+        return m_opInfo.as&lt;Transition*&gt;();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool hasStructureSet()
</span><span class="lines">@@ -1558,7 +1553,7 @@
</span><span class="cx">     StructureSet&amp; structureSet()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasStructureSet());
</span><del>-        return *reinterpret_cast&lt;StructureSet*&gt;(m_opInfo);
</del><ins>+        return *m_opInfo.as&lt;StructureSet*&gt;();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool hasStructure()
</span><span class="lines">@@ -1576,7 +1571,7 @@
</span><span class="cx">     Structure* structure()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasStructure());
</span><del>-        return reinterpret_cast&lt;Structure*&gt;(m_opInfo);
</del><ins>+        return m_opInfo.as&lt;Structure*&gt;();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool hasStorageAccessData()
</span><span class="lines">@@ -1594,7 +1589,7 @@
</span><span class="cx">     StorageAccessData&amp; storageAccessData()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasStorageAccessData());
</span><del>-        return *bitwise_cast&lt;StorageAccessData*&gt;(m_opInfo);
</del><ins>+        return *m_opInfo.as&lt;StorageAccessData*&gt;();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool hasMultiGetByOffsetData()
</span><span class="lines">@@ -1605,7 +1600,7 @@
</span><span class="cx">     MultiGetByOffsetData&amp; multiGetByOffsetData()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasMultiGetByOffsetData());
</span><del>-        return *reinterpret_cast&lt;MultiGetByOffsetData*&gt;(m_opInfo);
</del><ins>+        return *m_opInfo.as&lt;MultiGetByOffsetData*&gt;();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool hasMultiPutByOffsetData()
</span><span class="lines">@@ -1616,7 +1611,7 @@
</span><span class="cx">     MultiPutByOffsetData&amp; multiPutByOffsetData()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasMultiPutByOffsetData());
</span><del>-        return *reinterpret_cast&lt;MultiPutByOffsetData*&gt;(m_opInfo);
</del><ins>+        return *m_opInfo.as&lt;MultiPutByOffsetData*&gt;();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool hasObjectMaterializationData()
</span><span class="lines">@@ -1634,7 +1629,7 @@
</span><span class="cx">     ObjectMaterializationData&amp; objectMaterializationData()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasObjectMaterializationData());
</span><del>-        return *reinterpret_cast&lt;ObjectMaterializationData*&gt;(m_opInfo2);
</del><ins>+        return *m_opInfo2.as&lt;ObjectMaterializationData*&gt;();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool isObjectAllocation()
</span><span class="lines">@@ -1743,8 +1738,8 @@
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasArrayMode());
</span><span class="cx">         if (op() == ArrayifyToStructure)
</span><del>-            return ArrayMode::fromWord(m_opInfo2);
-        return ArrayMode::fromWord(m_opInfo);
</del><ins>+            return ArrayMode::fromWord(m_opInfo2.as&lt;uint32_t&gt;());
+        return ArrayMode::fromWord(m_opInfo.as&lt;uint32_t&gt;());
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool setArrayMode(ArrayMode arrayMode)
</span><span class="lines">@@ -1777,7 +1772,7 @@
</span><span class="cx">     Arith::Mode arithMode()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasArithMode());
</span><del>-        return static_cast&lt;Arith::Mode&gt;(m_opInfo);
</del><ins>+        return static_cast&lt;Arith::Mode&gt;(m_opInfo.as&lt;uint32_t&gt;());
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     void setArithMode(Arith::Mode mode)
</span><span class="lines">@@ -1793,13 +1788,13 @@
</span><span class="cx">     Arith::RoundingMode arithRoundingMode()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasArithRoundingMode());
</span><del>-        return static_cast&lt;Arith::RoundingMode&gt;(m_opInfo);
</del><ins>+        return static_cast&lt;Arith::RoundingMode&gt;(m_opInfo.as&lt;uint32_t&gt;());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void setArithRoundingMode(Arith::RoundingMode mode)
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasArithRoundingMode());
</span><del>-        m_opInfo = static_cast&lt;uintptr_t&gt;(mode);
</del><ins>+        m_opInfo = static_cast&lt;uint32_t&gt;(mode);
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool hasVirtualRegister()
</span><span class="lines">@@ -1828,7 +1823,7 @@
</span><span class="cx">     
</span><span class="cx">     Profiler::ExecutionCounter* executionCounter()
</span><span class="cx">     {
</span><del>-        return bitwise_cast&lt;Profiler::ExecutionCounter*&gt;(m_opInfo);
</del><ins>+        return m_opInfo.as&lt;Profiler::ExecutionCounter*&gt;();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool shouldGenerate()
</span><span class="lines">@@ -2271,7 +2266,7 @@
</span><span class="cx">     TypeLocation* typeLocation()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasTypeLocation());
</span><del>-        return reinterpret_cast&lt;TypeLocation*&gt;(m_opInfo);
</del><ins>+        return m_opInfo.as&lt;TypeLocation*&gt;();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool hasBasicBlockLocation()
</span><span class="lines">@@ -2282,7 +2277,7 @@
</span><span class="cx">     BasicBlockLocation* basicBlockLocation()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(hasBasicBlockLocation());
</span><del>-        return reinterpret_cast&lt;BasicBlockLocation*&gt;(m_opInfo);
</del><ins>+        return m_opInfo.as&lt;BasicBlockLocation*&gt;();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     Node* replacement() const
</span><span class="lines">@@ -2308,7 +2303,7 @@
</span><span class="cx">     unsigned numberOfArgumentsToSkip()
</span><span class="cx">     {
</span><span class="cx">         ASSERT(op() == CreateRest || op() == GetRestLength);
</span><del>-        return static_cast&lt;unsigned&gt;(m_opInfo);
</del><ins>+        return m_opInfo.as&lt;unsigned&gt;();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void dumpChildren(PrintStream&amp; out)
</span><span class="lines">@@ -2345,8 +2340,71 @@
</span><span class="cx">     SpeculatedType m_prediction { SpecNone };
</span><span class="cx">     // Immediate values, accesses type-checked via accessors above. The first one is
</span><span class="cx">     // big enough to store a pointer.
</span><del>-    uintptr_t m_opInfo;
-    uintptr_t m_opInfo2;
</del><ins>+    struct OpInfoWrapper {
+        OpInfoWrapper()
+        {
+            u.int64 = 0;
+        }
+        OpInfoWrapper(uint32_t intValue)
+        {
+            u.int64 = 0;
+            u.int32 = intValue;
+        }
+        OpInfoWrapper(uint64_t intValue)
+        {
+            u.int64 = intValue;
+        }
+        OpInfoWrapper(void* pointer)
+        {
+            u.int64 = 0;
+            u.pointer = pointer;
+        }
+        OpInfoWrapper&amp; operator=(uint32_t int32)
+        {
+            u.int64 = 0;
+            u.int32 = int32;
+            return *this;
+        }
+        OpInfoWrapper&amp; operator=(int32_t int32)
+        {
+            u.int64 = 0;
+            u.int32 = int32;
+            return *this;
+        }
+        OpInfoWrapper&amp; operator=(uint64_t int64)
+        {
+            u.int64 = int64;
+            return *this;
+        }
+        OpInfoWrapper&amp; operator=(void* pointer)
+        {
+            u.int64 = 0;
+            u.pointer = pointer;
+            return *this;
+        }
+        template &lt;typename T&gt;
+        ALWAYS_INLINE auto as() const -&gt; typename std::enable_if&lt;std::is_pointer&lt;T&gt;::value, T&gt;::type
+        {
+            return static_cast&lt;T&gt;(u.pointer);
+        }
+        template &lt;typename T&gt;
+        ALWAYS_INLINE auto as() const -&gt; typename std::enable_if&lt;std::is_integral&lt;T&gt;::value &amp;&amp; sizeof(T) == 4, T&gt;::type
+        {
+            return u.int32;
+        }
+        template &lt;typename T&gt;
+        ALWAYS_INLINE auto as() const -&gt; typename std::enable_if&lt;std::is_integral&lt;T&gt;::value &amp;&amp; sizeof(T) == 8, T&gt;::type
+        {
+            return u.int64;
+        }
+        union {
+            uint32_t int32;
+            uint64_t int64;
+            void* pointer;
+        } u;
+    };
+    OpInfoWrapper m_opInfo;
+    OpInfoWrapper m_opInfo2;
</ins><span class="cx"> 
</span><span class="cx">     // Miscellaneous data that is usually meaningless, but can hold some analysis results
</span><span class="cx">     // if you ask right. For example, if you do Graph::initializeNodeOwners(), Node::owner
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGOpInfoh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGOpInfo.h (205106 => 205107)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGOpInfo.h        2016-08-28 22:38:41 UTC (rev 205106)
+++ trunk/Source/JavaScriptCore/dfg/DFGOpInfo.h        2016-08-28 23:31:46 UTC (rev 205107)
</span><span class="lines">@@ -37,13 +37,14 @@
</span><span class="cx"> // a constant index, argument, or identifier) from a Node*.
</span><span class="cx"> struct OpInfo {
</span><span class="cx">     OpInfo() : m_value(0) { }
</span><del>-    explicit OpInfo(int32_t value) : m_value(static_cast&lt;uintptr_t&gt;(value)) { }
-    explicit OpInfo(uint32_t value) : m_value(static_cast&lt;uintptr_t&gt;(value)) { }
-#if OS(DARWIN) || USE(JSVALUE64)
-    explicit OpInfo(size_t value) : m_value(static_cast&lt;uintptr_t&gt;(value)) { }
</del><ins>+    explicit OpInfo(int32_t value) : m_value(static_cast&lt;uint64_t&gt;(value)) { }
+    explicit OpInfo(uint32_t value) : m_value(static_cast&lt;uint64_t&gt;(value)) { }
+    explicit OpInfo(uint64_t value) : m_value(static_cast&lt;uint64_t&gt;(value)) { }
+#if OS(DARWIN)
+    explicit OpInfo(uintptr_t value) : m_value(static_cast&lt;uint64_t&gt;(value)) { }
</ins><span class="cx"> #endif
</span><del>-    explicit OpInfo(void* value) : m_value(reinterpret_cast&lt;uintptr_t&gt;(value)) { }
-    uintptr_t m_value;
</del><ins>+    explicit OpInfo(void* value) : m_value(static_cast&lt;uint64_t&gt;(reinterpret_cast&lt;uintptr_t&gt;(value))) { }
+    uint64_t m_value;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } } // namespace JSC::DFG
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGPromotedHeapLocationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGPromotedHeapLocation.h (205106 => 205107)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGPromotedHeapLocation.h        2016-08-28 22:38:41 UTC (rev 205106)
+++ trunk/Source/JavaScriptCore/dfg/DFGPromotedHeapLocation.h        2016-08-28 23:31:46 UTC (rev 205107)
</span><span class="lines">@@ -87,8 +87,8 @@
</span><span class="cx">     PromotedLocationKind kind() const { return m_kind; }
</span><span class="cx">     unsigned info() const { return m_info; }
</span><span class="cx">     
</span><del>-    OpInfo imm1() const { return OpInfo(static_cast&lt;uint32_t&gt;(m_kind)); }
-    OpInfo imm2() const { return OpInfo(static_cast&lt;uint32_t&gt;(m_info)); }
</del><ins>+    unsigned imm1() const { return static_cast&lt;uint32_t&gt;(m_kind); }
+    unsigned imm2() const { return static_cast&lt;uint32_t&gt;(m_info); }
</ins><span class="cx">     
</span><span class="cx">     unsigned hash() const
</span><span class="cx">     {
</span></span></pre>
</div>
</div>

</body>
</html>