024d3499c2
This is a reland of 181ac2b0dc
that fixes
the issue with load elimination.
Original change's description:
> [ic] Improve performance of KeyedStoreIC on literal-based arrays.
>
> In mode STORE_AND_GROW_NO_TRANSITION, the handler for elements stores
> used to bail out when seeing a COW array, even if the store that
> installed the handler had been operating on the very same array.
>
> This CL adds support for COW arrays to the mode (and renames it to
> STORE_AND_GROW_NO_TRANSITION_HANDLE_COW).
>
> Bug: v8:7334
> Change-Id: I6a15e8c1ff8d4ad4d5b8fc447745dce5d146c67c
> Reviewed-on: https://chromium-review.googlesource.com/876014
> Commit-Queue: Georg Neis <neis@chromium.org>
> Reviewed-by: Igor Sheludko <ishell@chromium.org>
> Reviewed-by: Benedikt Meurer <bmeurer@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#50840}
TBR=bmeurer@chromium.org
Bug: v8:7334, chromium:805768
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_chromium_rel_ng
Change-Id: I3d9c1b08583e08d68a1d30242a25e4a2190c8c55
Reviewed-on: https://chromium-review.googlesource.com/886261
Commit-Queue: Georg Neis <neis@chromium.org>
Reviewed-by: Igor Sheludko <ishell@chromium.org>
Reviewed-by: Jaroslav Sevcik <jarin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#50885}
76 lines
1.1 KiB
JavaScript
76 lines
1.1 KiB
JavaScript
// Copyright 2018 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// Flags: --allow-natives-syntax
|
|
|
|
|
|
function f1() {
|
|
const x = [,];
|
|
x[1] = 42;
|
|
assertEquals([undefined, 42], x);
|
|
}
|
|
|
|
f1();
|
|
f1();
|
|
%OptimizeFunctionOnNextCall(f1);
|
|
f1();
|
|
f1();
|
|
|
|
|
|
function f2() {
|
|
const x = [0];
|
|
for (const y of [1, 2, 3, 4]) {
|
|
x[x.length] = y;
|
|
}
|
|
assertEquals([0, 1, 2, 3, 4], x);
|
|
}
|
|
|
|
f2();
|
|
f2();
|
|
%OptimizeFunctionOnNextCall(f2);
|
|
f2();
|
|
f2();
|
|
|
|
|
|
function f3() {
|
|
const x = [0];
|
|
for (const y of [1.1, {}]) {
|
|
x[x.length] = y;
|
|
}
|
|
assertEquals([0, 1.1, {}], x);
|
|
}
|
|
|
|
f3();
|
|
f3();
|
|
%OptimizeFunctionOnNextCall(f3);
|
|
f3();
|
|
f3();
|
|
|
|
|
|
function f4(x) {
|
|
x[x.length] = x.length;
|
|
}
|
|
|
|
let x1 = [];
|
|
f4(x1);
|
|
assertEquals([0], x1);
|
|
f4(x1);
|
|
assertEquals([0, 1], x1);
|
|
%OptimizeFunctionOnNextCall(f4);
|
|
f4(x1);
|
|
assertEquals([0, 1, 2], x1);
|
|
f4(x1);
|
|
assertEquals([0, 1, 2, 3], x1);
|
|
|
|
let x2 = {length: 42};
|
|
f4(x2);
|
|
assertEquals(42, x2[42]);
|
|
f4(x2);
|
|
assertEquals(42, x2[42]);
|
|
%OptimizeFunctionOnNextCall(f4);
|
|
f4(x2);
|
|
assertEquals(42, x2[42]);
|
|
f4(x2);
|
|
assertEquals(42, x2[42]);
|