<!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>[200502] 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/200502">200502</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2016-05-05 19:30:51 -0700 (Thu, 05 May 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[JSC] Get rid of NonNegZeroDouble, it is broken
https://bugs.webkit.org/show_bug.cgi?id=157399
rdar://problem/25339647

Patch by Benjamin Poulain &lt;bpoulain@apple.com&gt; on 2016-05-05
Reviewed by Mark Lam.

The profile &quot;NonNegZeroDouble&quot; is fundamentally broken.

It is used by DFG to predict the result of ArithMul as being a Double
or Int32.
The problem is you are likely to mispredict, and when you do, you are
guaranteed to end up in a recompile loop.

The compile loops usually happen like this:
-We speculate you have Int32 despite producing doubles.
-We OSR exit on another node (ValueToInt32 for example) from the result of this ArithMul.
-When we compile this block again, ArithMul will do the same misprediction
 because it unconditionally predicts Int32.

The flag NonNegZeroDouble was very unlikely to be set correctly
in the first place.

In LLINT, the flag is only set on the slow path.
Since double*double is on the fast path, those cases are ignored.

In Baseline, the flag is set for any case that falls back on double
multiplication. BUT, the DFG flag was only set for nodes that spend
many iteration in slow path, which obviously does not apply to double*double.

Given the perf drawbacks and the recompile loops, I removed
the whole flag for now.

* bytecode/ValueProfile.cpp:
(WTF::printInternal):
* bytecode/ValueProfile.h:
(JSC::ResultProfile::didObserveNonInt32): Deleted.
(JSC::ResultProfile::didObserveDouble): Deleted.
(JSC::ResultProfile::didObserveNonNegZeroDouble): Deleted.
(JSC::ResultProfile::setObservedNonNegZeroDouble): Deleted.
* dfg/DFGByteCodeParser.cpp:
(JSC::DFG::ByteCodeParser::makeSafe): Deleted.
* dfg/DFGNode.h:
(JSC::DFG::Node::mayHaveNonIntResult): Deleted.
* dfg/DFGNodeFlags.cpp:
(JSC::DFG::dumpNodeFlags): Deleted.
* dfg/DFGNodeFlags.h:
* dfg/DFGPredictionPropagationPhase.cpp:
* jit/JITMulGenerator.cpp:
(JSC::JITMulGenerator::generateFastPath): Deleted.
* runtime/CommonSlowPaths.cpp:
(JSC::updateResultProfileForBinaryArithOp): Deleted.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeValueProfilecpp">trunk/Source/JavaScriptCore/bytecode/ValueProfile.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeValueProfileh">trunk/Source/JavaScriptCore/bytecode/ValueProfile.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGByteCodeParsercpp">trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGNodeh">trunk/Source/JavaScriptCore/dfg/DFGNode.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGNodeFlagscpp">trunk/Source/JavaScriptCore/dfg/DFGNodeFlags.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGNodeFlagsh">trunk/Source/JavaScriptCore/dfg/DFGNodeFlags.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGPredictionPropagationPhasecpp">trunk/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITMulGeneratorcpp">trunk/Source/JavaScriptCore/jit/JITMulGenerator.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeCommonSlowPathscpp">trunk/Source/JavaScriptCore/runtime/CommonSlowPaths.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (200501 => 200502)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-05-06 01:26:26 UTC (rev 200501)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-05-06 02:30:51 UTC (rev 200502)
</span><span class="lines">@@ -1,3 +1,57 @@
</span><ins>+2016-05-05  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
+
+        [JSC] Get rid of NonNegZeroDouble, it is broken
+        https://bugs.webkit.org/show_bug.cgi?id=157399
+        rdar://problem/25339647
+
+        Reviewed by Mark Lam.
+
+        The profile &quot;NonNegZeroDouble&quot; is fundamentally broken.
+
+        It is used by DFG to predict the result of ArithMul as being a Double
+        or Int32.
+        The problem is you are likely to mispredict, and when you do, you are
+        guaranteed to end up in a recompile loop.
+
+        The compile loops usually happen like this:
+        -We speculate you have Int32 despite producing doubles.
+        -We OSR exit on another node (ValueToInt32 for example) from the result of this ArithMul.
+        -When we compile this block again, ArithMul will do the same misprediction
+         because it unconditionally predicts Int32.
+
+        The flag NonNegZeroDouble was very unlikely to be set correctly
+        in the first place.
+
+        In LLINT, the flag is only set on the slow path.
+        Since double*double is on the fast path, those cases are ignored.
+
+        In Baseline, the flag is set for any case that falls back on double
+        multiplication. BUT, the DFG flag was only set for nodes that spend
+        many iteration in slow path, which obviously does not apply to double*double.
+
+        Given the perf drawbacks and the recompile loops, I removed
+        the whole flag for now.
+
+        * bytecode/ValueProfile.cpp:
+        (WTF::printInternal):
+        * bytecode/ValueProfile.h:
+        (JSC::ResultProfile::didObserveNonInt32): Deleted.
+        (JSC::ResultProfile::didObserveDouble): Deleted.
+        (JSC::ResultProfile::didObserveNonNegZeroDouble): Deleted.
+        (JSC::ResultProfile::setObservedNonNegZeroDouble): Deleted.
+        * dfg/DFGByteCodeParser.cpp:
+        (JSC::DFG::ByteCodeParser::makeSafe): Deleted.
+        * dfg/DFGNode.h:
+        (JSC::DFG::Node::mayHaveNonIntResult): Deleted.
+        * dfg/DFGNodeFlags.cpp:
+        (JSC::DFG::dumpNodeFlags): Deleted.
+        * dfg/DFGNodeFlags.h:
+        * dfg/DFGPredictionPropagationPhase.cpp:
+        * jit/JITMulGenerator.cpp:
+        (JSC::JITMulGenerator::generateFastPath): Deleted.
+        * runtime/CommonSlowPaths.cpp:
+        (JSC::updateResultProfileForBinaryArithOp): Deleted.
+
</ins><span class="cx"> 2016-05-05  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION(r200422): Web Inspector: Make new Array Iterator objects play nice with Web Inspector
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeValueProfilecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/ValueProfile.cpp (200501 => 200502)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/ValueProfile.cpp        2016-05-06 01:26:26 UTC (rev 200501)
+++ trunk/Source/JavaScriptCore/bytecode/ValueProfile.cpp        2016-05-06 02:30:51 UTC (rev 200502)
</span><span class="lines">@@ -34,31 +34,23 @@
</span><span class="cx"> {
</span><span class="cx">     const char* separator = &quot;&quot;;
</span><span class="cx"> 
</span><del>-    if (!profile.didObserveNonInt32()) {
-        out.print(&quot;Int32&quot;);
</del><ins>+    if (profile.didObserveNegZeroDouble()) {
+        out.print(separator, &quot;NegZeroDouble&quot;);
</ins><span class="cx">         separator = &quot;|&quot;;
</span><del>-    } else {
-        if (profile.didObserveNegZeroDouble()) {
-            out.print(separator, &quot;NegZeroDouble&quot;);
-            separator = &quot;|&quot;;
-        }
-        if (profile.didObserveNonNegZeroDouble()) {
-            out.print(&quot;NonNegZeroDouble&quot;);
-            separator = &quot;|&quot;;
-        }
-        if (profile.didObserveNonNumber()) {
-            out.print(&quot;NonNumber&quot;);
-            separator = &quot;|&quot;;
-        }
-        if (profile.didObserveInt32Overflow()) {
-            out.print(&quot;Int32Overflow&quot;);
-            separator = &quot;|&quot;;
-        }
-        if (profile.didObserveInt52Overflow()) {
-            out.print(&quot;Int52Overflow&quot;);
-            separator = &quot;|&quot;;
-        }
</del><span class="cx">     }
</span><ins>+    if (profile.didObserveNonNumber()) {
+        out.print(&quot;NonNumber&quot;);
+        separator = &quot;|&quot;;
+    }
+    if (profile.didObserveInt32Overflow()) {
+        out.print(&quot;Int32Overflow&quot;);
+        separator = &quot;|&quot;;
+    }
+    if (profile.didObserveInt52Overflow()) {
+        out.print(&quot;Int52Overflow&quot;);
+        separator = &quot;|&quot;;
+    }
+
</ins><span class="cx">     if (profile.specialFastPathCount()) {
</span><span class="cx">         out.print(&quot; special fast path: &quot;);
</span><span class="cx">         out.print(profile.specialFastPathCount());
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeValueProfileh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/ValueProfile.h (200501 => 200502)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/ValueProfile.h        2016-05-06 01:26:26 UTC (rev 200501)
+++ trunk/Source/JavaScriptCore/bytecode/ValueProfile.h        2016-05-06 02:30:51 UTC (rev 200502)
</span><span class="lines">@@ -218,25 +218,20 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     enum ObservedResults {
</span><del>-        NonNegZeroDouble = 1 &lt;&lt; 0,
-        NegZeroDouble    = 1 &lt;&lt; 1,
-        NonNumber        = 1 &lt;&lt; 2,
-        Int32Overflow    = 1 &lt;&lt; 3,
-        Int52Overflow    = 1 &lt;&lt; 4,
</del><ins>+        NegZeroDouble    = 1 &lt;&lt; 0,
+        NonNumber        = 1 &lt;&lt; 1,
+        Int32Overflow    = 1 &lt;&lt; 2,
+        Int52Overflow    = 1 &lt;&lt; 3,
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     int bytecodeOffset() const { return m_bytecodeOffsetAndFlags &gt;&gt; numberOfFlagBits; }
</span><span class="cx">     unsigned specialFastPathCount() const { return m_specialFastPathCount; }
</span><span class="cx"> 
</span><del>-    bool didObserveNonInt32() const { return hasBits(NonNegZeroDouble | NegZeroDouble | NonNumber); }
-    bool didObserveDouble() const { return hasBits(NonNegZeroDouble | NegZeroDouble); }
-    bool didObserveNonNegZeroDouble() const { return hasBits(NonNegZeroDouble); }
</del><span class="cx">     bool didObserveNegZeroDouble() const { return hasBits(NegZeroDouble); }
</span><span class="cx">     bool didObserveNonNumber() const { return hasBits(NonNumber); }
</span><span class="cx">     bool didObserveInt32Overflow() const { return hasBits(Int32Overflow); }
</span><span class="cx">     bool didObserveInt52Overflow() const { return hasBits(Int52Overflow); }
</span><span class="cx"> 
</span><del>-    void setObservedNonNegZeroDouble() { setBit(NonNegZeroDouble); }
</del><span class="cx">     void setObservedNegZeroDouble() { setBit(NegZeroDouble); }
</span><span class="cx">     void setObservedNonNumber() { setBit(NonNumber); }
</span><span class="cx">     void setObservedInt32Overflow() { setBit(Int32Overflow); }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGByteCodeParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp (200501 => 200502)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp        2016-05-06 01:26:26 UTC (rev 200501)
+++ trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp        2016-05-06 02:30:51 UTC (rev 200502)
</span><span class="lines">@@ -934,8 +934,6 @@
</span><span class="cx">                 node-&gt;mergeFlags(NodeMayOverflowInt32InBaseline);
</span><span class="cx">             if (resultProfile.didObserveNegZeroDouble() || m_inlineStackTop-&gt;m_exitProfile.hasExitSite(m_currentIndex, NegativeZero))
</span><span class="cx">                 node-&gt;mergeFlags(NodeMayNegZeroInBaseline);
</span><del>-            if (resultProfile.didObserveNonInt32())
-                node-&gt;mergeFlags(NodeMayHaveNonIntResult);
</del><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGNode.h (200501 => 200502)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGNode.h        2016-05-06 01:26:26 UTC (rev 200501)
+++ trunk/Source/JavaScriptCore/dfg/DFGNode.h        2016-05-06 02:30:51 UTC (rev 200502)
</span><span class="lines">@@ -950,11 +950,6 @@
</span><span class="cx">         return result &amp; ~NodeBytecodeNeedsNegZero;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    bool mayHaveNonIntResult()
-    {
-        return m_flags &amp; NodeMayHaveNonIntResult;
-    }
-
</del><span class="cx">     bool hasConstantBuffer()
</span><span class="cx">     {
</span><span class="cx">         return op() == NewArrayBuffer;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGNodeFlagscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGNodeFlags.cpp (200501 => 200502)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGNodeFlags.cpp        2016-05-06 01:26:26 UTC (rev 200501)
+++ trunk/Source/JavaScriptCore/dfg/DFGNodeFlags.cpp        2016-05-06 02:30:51 UTC (rev 200502)
</span><span class="lines">@@ -85,9 +85,6 @@
</span><span class="cx">             out.print(comma, &quot;UseAsOther&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (flags &amp; NodeMayHaveNonIntResult)
-        out.print(comma, &quot;MayHaveNonIntResult&quot;);
-
</del><span class="cx">     if (flags &amp; NodeMayOverflowInt52)
</span><span class="cx">         out.print(comma, &quot;MayOverflowInt52&quot;);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGNodeFlagsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGNodeFlags.h (200501 => 200502)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGNodeFlags.h        2016-05-06 01:26:26 UTC (rev 200501)
+++ trunk/Source/JavaScriptCore/dfg/DFGNodeFlags.h        2016-05-06 02:30:51 UTC (rev 200502)
</span><span class="lines">@@ -48,7 +48,6 @@
</span><span class="cx"> #define NodeHasVarArgs                   0x0010
</span><span class="cx">     
</span><span class="cx"> #define NodeBehaviorMask                 0x07e0
</span><del>-#define NodeMayHaveNonIntResult          0x0020
</del><span class="cx"> #define NodeMayOverflowInt52             0x0040
</span><span class="cx"> #define NodeMayOverflowInt32InBaseline   0x0080
</span><span class="cx"> #define NodeMayOverflowInt32InDFG        0x0100
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGPredictionPropagationPhasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp (200501 => 200502)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp        2016-05-06 01:26:26 UTC (rev 200501)
+++ trunk/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp        2016-05-06 02:30:51 UTC (rev 200502)
</span><span class="lines">@@ -275,12 +275,8 @@
</span><span class="cx">                         changed |= mergePrediction(SpecInt52Only);
</span><span class="cx">                     else
</span><span class="cx">                         changed |= mergePrediction(speculatedDoubleTypeForPredictions(left, right));
</span><del>-                } else {
-                    if (node-&gt;mayHaveNonIntResult())
-                        changed |= mergePrediction(SpecInt32Only | SpecBytecodeDouble);
-                    else
-                        changed |= mergePrediction(SpecInt32Only);
-                }
</del><ins>+                } else
+                    changed |= mergePrediction(SpecInt32Only | SpecBytecodeDouble);
</ins><span class="cx">             }
</span><span class="cx">             break;
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITMulGeneratorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITMulGenerator.cpp (200501 => 200502)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITMulGenerator.cpp        2016-05-06 01:26:26 UTC (rev 200501)
+++ trunk/Source/JavaScriptCore/jit/JITMulGenerator.cpp        2016-05-06 02:30:51 UTC (rev 200502)
</span><span class="lines">@@ -153,7 +153,6 @@
</span><span class="cx">         CCallHelpers::Jump done = jit.jump();
</span><span class="cx"> 
</span><span class="cx">         notNegativeZero.link(&amp;jit);
</span><del>-        jit.or32(CCallHelpers::TrustedImm32(ResultProfile::NonNegZeroDouble), CCallHelpers::AbsoluteAddress(m_resultProfile-&gt;addressOfFlags()));
</del><span class="cx"> 
</span><span class="cx">         jit.move(m_result.payloadGPR(), m_scratchGPR);
</span><span class="cx">         jit.urshiftPtr(CCallHelpers::Imm32(52), m_scratchGPR);
</span><span class="lines">@@ -175,7 +174,6 @@
</span><span class="cx">         CCallHelpers::Jump done = jit.jump();
</span><span class="cx"> 
</span><span class="cx">         notNegativeZero.link(&amp;jit);
</span><del>-        jit.or32(CCallHelpers::TrustedImm32(ResultProfile::NonNegZeroDouble), CCallHelpers::AbsoluteAddress(m_resultProfile-&gt;addressOfFlags()));
</del><span class="cx"> 
</span><span class="cx">         jit.move(m_result.tagGPR(), m_scratchGPR);
</span><span class="cx">         jit.urshiftPtr(CCallHelpers::Imm32(52 - 32), m_scratchGPR);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeCommonSlowPathscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/CommonSlowPaths.cpp (200501 => 200502)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/CommonSlowPaths.cpp        2016-05-06 01:26:26 UTC (rev 200501)
+++ trunk/Source/JavaScriptCore/runtime/CommonSlowPaths.cpp        2016-05-06 02:30:51 UTC (rev 200502)
</span><span class="lines">@@ -378,8 +378,6 @@
</span><span class="cx">             if (!doubleVal &amp;&amp; std::signbit(doubleVal))
</span><span class="cx">                 profile-&gt;setObservedNegZeroDouble();
</span><span class="cx">             else {
</span><del>-                profile-&gt;setObservedNonNegZeroDouble();
-
</del><span class="cx">                 // The Int52 overflow check here intentionally omits 1ll &lt;&lt; 51 as a valid negative Int52 value.
</span><span class="cx">                 // Therefore, we will get a false positive if the result is that value. This is intentionally
</span><span class="cx">                 // done to simplify the checking algorithm.
</span></span></pre>
</div>
</div>

</body>
</html>