<html>
    <head>
      <base href="https://bugs.webkit.org/" />
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - [JSC][DOMJIT] IC should have a way to handle super-polymorphic DOM accessor calls"
   href="https://bugs.webkit.org/show_bug.cgi?id=163226">163226</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>[JSC][DOMJIT] IC should have a way to handle super-polymorphic DOM accessor calls
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>WebKit
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>WebKit Nightly Build
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>Unspecified
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Unspecified
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>Normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P2
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>JavaScriptCore
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>webkit-unassigned&#64;lists.webkit.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>utatane.tea&#64;gmail.com
          </td>
        </tr></table>
      <p>
        <div>
        <pre>This inlining is super effective if we run some microbenchmarks. However, Dromaeo does not
show so much performance benefit. This is because Dromaeo's dom-traverse.html is super
polymorphic call site where JSC gives up optimization. For example, in the following
dromaeo's benchmark, we can see so various DOM nodes at the `cur.firstChild` site, like,
HTMLDivElement, HTMLAnchorElement, Text, Comment etc. JSC gives up optimization since we
encounter so many Structures. This should be optimized since they share the large part of
prototype-chain and they hit the exactly same CustomGetter, Node.prototype.firstChild.

               test( &quot;firstChild&quot;, function(){
                   var nodes = document.body.childNodes, nl = nodes.length;

                   for ( var i = 0; i &lt; num; i++ ) {
                       for ( var j = 0; j &lt; nl; j++ ) {
                           var cur = nodes[j];
                           while ( cur )
                               cur = cur.firstChild;
                           ret = cur;
                       }
                   }
               });

This is unfortunate because this call site has very interesting features.

1. All the look up hits the exact same accessor of the same object (Node.prototype).

This call site hits the same Node.prototype.firstChild custom accessor. Inlining has a chance to optimize it.

2. Structure chain of polymorphic ones are very very similar.

While we see various Structures at this call site, their ancestors are quite similar.

HTMLDivElement -&gt; HTMLDivElement.prototype -&gt; HTMLElement.prototype -&gt; Element.prototype -&gt; Node.prototype -&gt; ...
HTMLAnchorElement -&gt; HTMLAnchorElement.prototype -&gt; HTMLElement.prototype -&gt; Element.prototype -&gt; Node.prototype -&gt; ...
Text -&gt; Text.prototype -&gt; CharacterData.prototype -&gt; Node.prototype -&gt; ...

We can ensure that Node.prototype, Element.prototype, and HTMLElement.prototype are not changed by using watchpoint. And typically they are not changed so frequently.
Caching Structures of HTMLDivElement, HTMLAnchorElement, and Text is the current design. But it does not work because there are so many structures.

So, what we should do is ensuring non watched Structures (e.g. HTMLDivElement -&gt; HTMLDivElement.prototype) does not have the property with the specific name (&quot;firstChild&quot;).

After discussing with rniwa and keith_miller, currently, I'm planning to add a bloom filter for each Structure.
This filter says &quot;This Structure must not have a property with the specific name&quot;.
And by using this, we can query the given Structure chain does not have a property with the specific name (&quot;firstChild&quot;).</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are the assignee for the bug.</li>
      </ul>
    </body>
</html>