• Jaroslav Sevcik's avatar
    [turbofan] Optimize array destructuring · 3fe7d698
    Jaroslav Sevcik authored
    This CL introduces type narrowing and constant folding reducers
    to constant fold code that comes out of inlined destructuring
    of arrays. In particular, array iterator introduces code that
    contains a phi of a temporary array that blocks escape analysis.
    The phi comes from conditional that can be evaluated statically
    (i.e., constant folded), so with better constant folding we
    allow escape analysis to get rid of the temporary array.
    
    On a quick micro-benchmark below, we see more than 6x improvement.
    This is close to the hand-optimized version - if we replace
    body of f with 'return b + a', we get 220ms (versus 218ms with
    destructuring).
    
    function f(a, b) {
      [b, a] = [a, b];
      return a + b;
    }
    
    function sum(count) {
      let s = 0;
      for (let i = 0; i < count; i++) {
        s += f(1, 2);
      }
      return s;
    }
    
    // Warm up
    sum(1e5); sum(1e5);
    console.time("destructure array");
    sum(1e8);
    console.timeEnd("destructure array");
    
    console.timeEnd: destructure array, 213.526000
    
    console.timeEnd: destructure array, 1503.537000
    
    Bug: v8:7728
    Change-Id: Ib7aec1d5897989e6adb1af1eddd516d8b3866db5
    Reviewed-on: https://chromium-review.googlesource.com/1047672Reviewed-by: 's avatarBenedikt Meurer <bmeurer@chromium.org>
    Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#53048}
    3fe7d698
Name
Last commit
Last update
..
api Loading commit data...
asmjs Loading commit data...
base Loading commit data...
compiler Loading commit data...
compiler-dispatcher Loading commit data...
heap Loading commit data...
interpreter Loading commit data...
libplatform Loading commit data...
parser Loading commit data...
wasm Loading commit data...
zone Loading commit data...
BUILD.gn Loading commit data...
DEPS Loading commit data...
allocation-unittest.cc Loading commit data...
bigint-unittest.cc Loading commit data...
cancelable-tasks-unittest.cc Loading commit data...
char-predicates-unittest.cc Loading commit data...
code-stub-assembler-unittest.cc Loading commit data...
code-stub-assembler-unittest.h Loading commit data...
counters-unittest.cc Loading commit data...
detachable-vector-unittest.cc Loading commit data...
eh-frame-iterator-unittest.cc Loading commit data...
eh-frame-writer-unittest.cc Loading commit data...
locked-queue-unittest.cc Loading commit data...
object-unittest.cc Loading commit data...
register-configuration-unittest.cc Loading commit data...
run-all-unittests.cc Loading commit data...
source-position-table-unittest.cc Loading commit data...
strings-storage-unittest.cc Loading commit data...
test-helpers.cc Loading commit data...
test-helpers.h Loading commit data...
test-utils.cc Loading commit data...
test-utils.h Loading commit data...
testcfg.py Loading commit data...
unicode-unittest.cc Loading commit data...
unittests.status Loading commit data...
utils-unittest.cc Loading commit data...
value-serializer-unittest.cc Loading commit data...