• 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
operation-typer.cc 39.5 KB