55e8d61391
With bytecode flushing and lazy feedback allocation, we need to call %PrepareForOptimization before we call %OptimizeFunctionOnNextCall Bug: v8:8801, v8:8394 Change-Id: I1f84477a8cef27b4cff61b54daf6fe1a9e5f8e76 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1591775 Commit-Queue: Ross McIlroy <rmcilroy@chromium.org> Reviewed-by: Ross McIlroy <rmcilroy@chromium.org> Cr-Commit-Position: refs/heads/master@{#61148}
284 lines
11 KiB
JavaScript
284 lines
11 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: --expose-gc --allow-natives-syntax
|
|
|
|
"use strict";
|
|
{
|
|
|
|
|
|
// We use g(a, b, c) instead of [a, b, c] when we care about Sminess being
|
|
// preserved.
|
|
function* g(...args) { for (const x of args) yield x; }
|
|
// G is like g but triggers GC to avoid allocation-site updates.
|
|
function* G(...args) { gc(); for (const x of args) { gc(); yield x; }; gc(); }
|
|
|
|
|
|
assertEquals([], [...[]]);
|
|
assertEquals([], [...[], ]);
|
|
assertEquals([1], [1, ...[]]);
|
|
assertEquals([1, 2], [1, ...[], 2]);
|
|
assertEquals([, ], [, ...[]]);
|
|
assertEquals([, ], [, ...[], ]);
|
|
assertEquals([, ], [, ...[],...[]]);
|
|
assertEquals([, ], [, ...[],...[], ]);
|
|
assertEquals([1, 2, 3], [...[1, 2, 3]]);
|
|
assertEquals([1, 1.5], [...g(1, 1.5)]);
|
|
assertEquals([, 1, 1.5], [, ...g(1, 1.5)]);
|
|
assertEquals([1, 2, 2.5, 3.5], [...g(1, 2, 2.5, 3.5)]);
|
|
assertEquals([2.5, 1, 3.5, 4], [...g(2.5, 1, 3.5, 4)]);
|
|
assertEquals([2.5, 3.5, 1, 4], [...g(2.5, 3.5, 1, 4)]);
|
|
assertEquals([{a: 1}, {b: 2}], [...[{a: 1}, {b: 2}]]);
|
|
assertEquals([0, {a: 1}, {b: 2}], [...g(0, {a: 1}, {b: 2})]);
|
|
assertEquals([1, 1.5, "2"], [...g(1, 1.5, "2")]);
|
|
|
|
|
|
function f1(x) {
|
|
return [...[x, x, x]];
|
|
}
|
|
assertEquals([1, 1, 1], f1(1));
|
|
assertEquals([0.1, 0.1, 0.1], f1(0.1));
|
|
assertEquals([{}, {}, {}], f1({}));
|
|
assertEquals([1, 1, 1], f1(1));
|
|
|
|
function f1_(x) {
|
|
return [...[x, x, x]];
|
|
}
|
|
%PrepareFunctionForOptimization(f1_);
|
|
assertEquals([1, 1, 1], f1_(1));
|
|
%OptimizeFunctionOnNextCall(f1_);
|
|
assertEquals([1, 1, 1], f1_(1));
|
|
assertEquals([0.1, 0.1, 0.1], f1_(0.1));
|
|
assertEquals([{}, {}, {}], f1_({}));
|
|
assertEquals([1, 1, 1], f1_(1));
|
|
|
|
|
|
function f2(x) {
|
|
return [...[x, x, x], ,];
|
|
}
|
|
assertEquals([1, 1, 1, ,], f2(1));
|
|
assertEquals([0.1, 0.1, 0.1, ,], f2(0.1));
|
|
assertEquals([{}, {}, {}, ,], f2({}));
|
|
assertEquals([1, 1, 1, ,], f2(1));
|
|
|
|
function f2_(x) {
|
|
return [...[x, x, x], ,];
|
|
}
|
|
%PrepareFunctionForOptimization(f2_);
|
|
assertEquals([1, 1, 1, ,], f2_(1));
|
|
%OptimizeFunctionOnNextCall(f2_);
|
|
assertEquals([1, 1, 1, ,], f2_(1));
|
|
assertEquals([0.1, 0.1, 0.1, ,], f2_(0.1));
|
|
assertEquals([{}, {}, {}, ,], f2_({}));
|
|
assertEquals([1, 1, 1, ,], f2_(1));
|
|
|
|
|
|
function f3(it) {
|
|
return [...it, ,];
|
|
}
|
|
assertEquals([1, 0.1, "1", , ], f3(g(1, 0.1, "1")));
|
|
assertEquals([{}, 0.1, "1", , ], f3(g({}, 0.1, "1")));
|
|
assertEquals([0, 0, 0, , ], f3(g(0, 0, 0)));
|
|
assertEquals([1, 0.1, "1", , ], f3(g(1, 0.1, "1")));
|
|
|
|
function f3_(it) {
|
|
return [...it, ,];
|
|
}
|
|
%PrepareFunctionForOptimization(f3_);
|
|
assertEquals([1, 0.1, "1", , ], f3_(g(1, 0.1, "1")));
|
|
%OptimizeFunctionOnNextCall(f3_);
|
|
assertEquals([1, 0.1, "1", , ], f3_(g(1, 0.1, "1")));
|
|
assertEquals([{}, 0.1, "1", , ], f3_(g({}, 0.1, "1")));
|
|
assertEquals([0, 0, 0, , ], f3_(g(0, 0, 0)));
|
|
assertEquals([1, 0.1, "1", , ], f3_(g(1, 0.1, "1")));
|
|
|
|
|
|
function f4(x) {
|
|
return [...[x, x, x]];
|
|
}
|
|
assertEquals([1, 1, 1], f4(1));
|
|
assertEquals([0.1, 0.1, 0.1], f4(0.1));
|
|
assertEquals([{}, {}, {}], f4({}));
|
|
assertEquals([1, 1, 1], f4(1));
|
|
|
|
function f4_(x) {
|
|
return [...[x, x, x]];
|
|
}
|
|
%PrepareFunctionForOptimization(f4_);
|
|
assertEquals([1, 1, 1], f4_(1));
|
|
%OptimizeFunctionOnNextCall(f4_);
|
|
assertEquals([1, 1, 1], f4_(1));
|
|
assertEquals([0.1, 0.1, 0.1], f4_(0.1));
|
|
assertEquals([{}, {}, {}], f4_({}));
|
|
assertEquals([1, 1, 1], f4_(1));
|
|
|
|
|
|
function f5(x) {
|
|
return [...[x, x, x], ,];
|
|
}
|
|
assertEquals([1, 1, 1, ,], f5(1));
|
|
assertEquals([0.1, 0.1, 0.1, ,], f5(0.1));
|
|
assertEquals([{}, {}, {}, ,], f5({}));
|
|
assertEquals([1, 1, 1, ,], f5(1));
|
|
|
|
function f5_(x) {
|
|
return [...[x, x, x], ,];
|
|
}
|
|
%PrepareFunctionForOptimization(f5_);
|
|
assertEquals([1, 1, 1, ,], f5_(1));
|
|
%OptimizeFunctionOnNextCall(f5_);
|
|
assertEquals([1, 1, 1, ,], f5_(1));
|
|
assertEquals([0.1, 0.1, 0.1, ,], f5_(0.1));
|
|
assertEquals([{}, {}, {}, ,], f5_({}));
|
|
assertEquals([1, 1, 1, ,], f5_(1));
|
|
|
|
|
|
function f6(it) {
|
|
return [...it, ,];
|
|
}
|
|
assertEquals([1, 0.1, "1", , ], f6(g(1, 0.1, "1")));
|
|
assertEquals([{}, 0.1, "1", , ], f6(g({}, 0.1, "1")));
|
|
assertEquals([0, 0, 0, , ], f6(g(0, 0, 0)));
|
|
assertEquals([1, 0.1, "1", , ], f6(g(1, 0.1, "1")));
|
|
|
|
function f6_(it) {
|
|
return [...it, ,];
|
|
}
|
|
%PrepareFunctionForOptimization(f6_);
|
|
assertEquals([1, 0.1, "1", , ], f6_(g(1, 0.1, "1")));
|
|
%OptimizeFunctionOnNextCall(f6_);
|
|
assertEquals([1, 0.1, "1", , ], f6_(g(1, 0.1, "1")));
|
|
assertEquals([{}, 0.1, "1", , ], f6_(g({}, 0.1, "1")));
|
|
assertEquals([0, 0, 0, , ], f6_(g(0, 0, 0)));
|
|
assertEquals([1, 0.1, "1", , ], f6_(g(1, 0.1, "1")));
|
|
|
|
|
|
function f7(it) {
|
|
return [...it];
|
|
}
|
|
assertEquals([1, 0.1, "1"], f7(G(1, 0.1, "1")));
|
|
assertEquals([{}, 0.1, "1"], f7(G({}, 0.1, "1")));
|
|
assertEquals([0, 0, 0], f7(G(0, 0, 0)));
|
|
assertEquals([1, 0.1, "1"], f7(G(1, 0.1, "1")));
|
|
|
|
function f7_(it) {
|
|
return [...it];
|
|
}
|
|
%PrepareFunctionForOptimization(f7_);
|
|
assertEquals([1, 0.1, "1"], f7_(G(1, 0.1, "1")));
|
|
%OptimizeFunctionOnNextCall(f7_);
|
|
assertEquals([1, 0.1, "1"], f7_(G(1, 0.1, "1")));
|
|
assertEquals([{}, 0.1, "1"], f7_(G({}, 0.1, "1")));
|
|
assertEquals([0, 0, 0], f7_(G(0, 0, 0)));
|
|
assertEquals([1, 0.1, "1"], f7_(G(1, 0.1, "1")));
|
|
|
|
|
|
function f8(it) {
|
|
return [...it, ,];
|
|
}
|
|
assertEquals([1, 0.1, "1", , ], f8(G(1, 0.1, "1")));
|
|
assertEquals([{}, 0.1, "1", , ], f8(G({}, 0.1, "1")));
|
|
assertEquals([0, 0, 0, , ], f8(G(0, 0, 0)));
|
|
assertEquals([1, 0.1, "1", , ], f8(G(1, 0.1, "1")));
|
|
|
|
function f8_(it) {
|
|
return [...it, ,];
|
|
}
|
|
%PrepareFunctionForOptimization(f8_);
|
|
assertEquals([1, 0.1, "1", , ], f8_(G(1, 0.1, "1")));
|
|
%OptimizeFunctionOnNextCall(f8_);
|
|
assertEquals([1, 0.1, "1", , ], f8_(G(1, 0.1, "1")));
|
|
assertEquals([{}, 0.1, "1", , ], f8_(G({}, 0.1, "1")));
|
|
assertEquals([0, 0, 0, , ], f8_(G(0, 0, 0)));
|
|
assertEquals([1, 0.1, "1", , ], f8_(G(1, 0.1, "1")));
|
|
|
|
|
|
// Megamorphic
|
|
function* f9() {
|
|
for (let i = 0; i < 160000; ++i) yield i;
|
|
}
|
|
%PrepareFunctionForOptimization(f9);
|
|
let a = [...f9()];
|
|
assertEquals(160000, a.length);
|
|
assertEquals(0, a[0]);
|
|
assertEquals(159999, a[159999]);
|
|
%OptimizeFunctionOnNextCall(f9);
|
|
a = [...f9()];
|
|
assertEquals(160000, a.length);
|
|
assertEquals(0, a[0]);
|
|
assertEquals(159999, a[159999]);
|
|
|
|
// Slow stub
|
|
function f10(b) {
|
|
let x = [
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
|
...b];
|
|
return x.length;
|
|
}
|
|
%PrepareFunctionForOptimization(f10);
|
|
assertEquals(4335, f10([3.3, 3.3, 3.3]));
|
|
assertEquals(4335, f10([{}, "", 3.3]));
|
|
%OptimizeFunctionOnNextCall(f10);
|
|
assertEquals(4335, f10([{}, "", 3.3]));
|
|
assertEquals(4332, f10([]));
|
|
|
|
|
|
} // top-level scope
|