• Benedikt Meurer's avatar
    [turbofan] Properly optimize polymorphic constructor call inlining. · 947101c8
    Benedikt Meurer authored
    This CL addresses a couple of minor issues that were in the way of
    properly inlining polymorphic constructors calls, i.e. as found in
    this common pattern using Symbol.species:
    
      class A {
        static get [Symbol.species]() { return this; }
        clone() { return new this.constructor[Symbol.species](); }
      }
      class B extends A {
        static get [Symbol.species]() { return this; }
      }
    
      function foo(o) { return o.clone(); }
      foo(new A());
      foo(new B());
    
    Here the call to this.constructor[Symbol.species]() is the interesting
    site. To get this fully inlined, we had to
    
      - make sure we don't introduce too many CheckHeapObject eagerly that
        block later optimizations (instead we try harder to see whether the
        receiver is already provably a HeapObject), and
      - also update the new.target of polymorphic JSConstruct nodes, when
        it refers to the same node as the target that we're specializing
        to (this way the JSCreate becomes fully inlinable later).
    
    This seems to yield a solid 1.5% on the ARES6 ML benchmark (run via the
    d8 cli runner), which confirms the previous profiled estimation. On the
    micro-benchmark that specifically measures this feature in isolation we
    go from
    
      testClone: 828 ms.
    
    on V8 ToT as of today and
    
      testClone: 1439 ms.
    
    on V8 6.1 to
    
      testClone: 219 ms.
    
    which is a 3.7x improvement, on top of the previous ~2x boost that we
    got from inlining the polymorphic symbol lookup.
    
    Bug: v8:6885, v8:6278, v8:6344
    Change-Id: Ida7abf683c7879978f181ba7f52a125f4f83ae6f
    Reviewed-on: https://chromium-review.googlesource.com/700596Reviewed-by: 's avatarBenedikt Meurer <bmeurer@chromium.org>
    Reviewed-by: 's avatarJaroslav Sevcik <jarin@chromium.org>
    Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#48284}
    947101c8
js-inlining-heuristic.cc 29.5 KB