Commit 289b2576 authored by Mythri A's avatar Mythri A Committed by Commit Bot

[Test] Update tests to work with lazy feedback allocation.

This adds either %EnsureFeedbackVectorForFunction or
%PrepareFunctionForOptimization to allocate feedback vectors when testing
optimization, allocation sites, IC transitions etc.,

Bug: v8:8394
Change-Id: I6ad1b6d460e4abda693b326cddb87754e080a0a1
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1593303
Commit-Queue: Mythri Alle <mythria@chromium.org>
Auto-Submit: Mythri Alle <mythria@chromium.org>
Reviewed-by: 's avatarRoss McIlroy <rmcilroy@chromium.org>
Cr-Commit-Position: refs/heads/master@{#61212}
parent 1d1c8018
...@@ -784,7 +784,9 @@ TEST(InvocationCount) { ...@@ -784,7 +784,9 @@ TEST(InvocationCount) {
CompileRun( CompileRun(
"function bar() {};" "function bar() {};"
"%EnsureFeedbackVectorForFunction(bar);"
"function foo() { return bar(); };" "function foo() { return bar(); };"
"%EnsureFeedbackVectorForFunction(foo);"
"foo();"); "foo();");
Handle<JSFunction> foo = Handle<JSFunction>::cast(GetGlobalProperty("foo")); Handle<JSFunction> foo = Handle<JSFunction>::cast(GetGlobalProperty("foo"));
CHECK_EQ(1, foo->feedback_vector()->invocation_count()); CHECK_EQ(1, foo->feedback_vector()->invocation_count());
......
...@@ -37,6 +37,7 @@ function ChangeSmiConstantAndOsr() { ...@@ -37,6 +37,7 @@ function ChangeSmiConstantAndOsr() {
} }
return j; return j;
} }
%PrepareFunctionForOptimization(ChangeSmiConstantAndOsr);
var r1 = ChangeSmiConstantAndOsr(); var r1 = ChangeSmiConstantAndOsr();
if (changed) { if (changed) {
assertEquals("result", r1); assertEquals("result", r1);
...@@ -54,6 +55,7 @@ function ChangeFloatConstantAndOsr() { ...@@ -54,6 +55,7 @@ function ChangeFloatConstantAndOsr() {
} }
return j; return j;
} }
%PrepareFunctionForOptimization(ChangeFloatConstantAndOsr);
var r2 = ChangeFloatConstantAndOsr(); var r2 = ChangeFloatConstantAndOsr();
if (changed) { if (changed) {
assertEquals("result", r2); assertEquals("result", r2);
...@@ -72,6 +74,7 @@ function ChangeFloatVarAndOsr() { ...@@ -72,6 +74,7 @@ function ChangeFloatVarAndOsr() {
} }
return j; return j;
} }
%PrepareFunctionForOptimization(ChangeFloatVarAndOsr);
var r3 = ChangeFloatVarAndOsr(); var r3 = ChangeFloatVarAndOsr();
if (changed) { if (changed) {
assertEquals("result0.1", r3); assertEquals("result0.1", r3);
...@@ -105,6 +108,7 @@ function ChangeIntVarAndOsr() { ...@@ -105,6 +108,7 @@ function ChangeIntVarAndOsr() {
} }
return j; return j;
} }
%PrepareFunctionForOptimization(ChangeIntVarAndOsr);
var r4 = ChangeIntVarAndOsr(); var r4 = ChangeIntVarAndOsr();
if (changed) { if (changed) {
......
...@@ -7,9 +7,13 @@ var Debug = debug.Debug; ...@@ -7,9 +7,13 @@ var Debug = debug.Debug;
Debug.setListener(() => undefined); Debug.setListener(() => undefined);
const myObj = {}; function f() {
const myObj = {};
for (let i = 0; i < 10; i++) { for (let i = 0; i < 10; i++) {
%OptimizeOsr(); %OptimizeOsr();
%ScheduleBreak(); %ScheduleBreak();
}
} }
%PrepareFunctionForOptimization(f);
f()
...@@ -9,6 +9,7 @@ Debug.setListener(function() {}); ...@@ -9,6 +9,7 @@ Debug.setListener(function() {});
function f() { function f() {
for (var i = 0; i < 100; i++) %OptimizeOsr(); for (var i = 0; i < 100; i++) %OptimizeOsr();
} }
%PrepareFunctionForOptimization(f);
Debug.setBreakPoint(f, 0, 0); Debug.setBreakPoint(f, 0, 0);
f(); f();
......
...@@ -23,6 +23,7 @@ function wrapper1() { ...@@ -23,6 +23,7 @@ function wrapper1() {
} }
f1(); f1();
} }
%PrepareFunctionForOptimization(wrapper1);
function f2() { function f2() {
counter++; counter++;
......
...@@ -67,6 +67,7 @@ function assertKind(expected, obj, name_opt) { ...@@ -67,6 +67,7 @@ function assertKind(expected, obj, name_opt) {
function bar0(t) { function bar0(t) {
return new t(); return new t();
} }
%PrepareFunctionForOptimization(bar0);
a = bar0(Array); a = bar0(Array);
a[0] = 3.5; a[0] = 3.5;
b = bar0(Array); b = bar0(Array);
...@@ -77,7 +78,8 @@ function assertKind(expected, obj, name_opt) { ...@@ -77,7 +78,8 @@ function assertKind(expected, obj, name_opt) {
assertOptimized(bar0); assertOptimized(bar0);
// bar0 should deopt // bar0 should deopt
b = bar0(Object); b = bar0(Object);
assertUnoptimized(bar0) assertUnoptimized(bar0);
%PrepareFunctionForOptimization(bar0);
// When it's re-optimized, we should call through the full stub // When it's re-optimized, we should call through the full stub
bar0(Array); bar0(Array);
%OptimizeFunctionOnNextCall(bar0); %OptimizeFunctionOnNextCall(bar0);
...@@ -99,6 +101,7 @@ function assertKind(expected, obj, name_opt) { ...@@ -99,6 +101,7 @@ function assertKind(expected, obj, name_opt) {
function bar() { function bar() {
return new Array(); return new Array();
} }
%PrepareFunctionForOptimization(bar);
a = bar(); a = bar();
bar(); bar();
%OptimizeFunctionOnNextCall(bar); %OptimizeFunctionOnNextCall(bar);
...@@ -115,6 +118,7 @@ function assertKind(expected, obj, name_opt) { ...@@ -115,6 +118,7 @@ function assertKind(expected, obj, name_opt) {
// map for Array in that context will be used. // map for Array in that context will be used.
(function() { (function() {
function bar() { return new Array(); } function bar() { return new Array(); }
%PrepareFunctionForOptimization(bar);
bar(); bar();
bar(); bar();
%OptimizeFunctionOnNextCall(bar); %OptimizeFunctionOnNextCall(bar);
...@@ -134,6 +138,7 @@ function assertKind(expected, obj, name_opt) { ...@@ -134,6 +138,7 @@ function assertKind(expected, obj, name_opt) {
// should deal with arguments that create holey arrays. // should deal with arguments that create holey arrays.
(function() { (function() {
function bar(len) { return new Array(len); } function bar(len) { return new Array(len); }
%PrepareFunctionForOptimization(bar);
bar(0); bar(0);
bar(0); bar(0);
%OptimizeFunctionOnNextCall(bar); %OptimizeFunctionOnNextCall(bar);
...@@ -153,6 +158,7 @@ function assertKind(expected, obj, name_opt) { ...@@ -153,6 +158,7 @@ function assertKind(expected, obj, name_opt) {
// Test: Make sure that crankshaft continues with feedback for large arrays. // Test: Make sure that crankshaft continues with feedback for large arrays.
(function() { (function() {
function bar(len) { return new Array(len); } function bar(len) { return new Array(len); }
%PrepareFunctionForOptimization(bar);
var size = 100001; var size = 100001;
// Perform a gc, because we are allocating a very large array and if a gc // Perform a gc, because we are allocating a very large array and if a gc
// happens during the allocation we could lose our memento. // happens during the allocation we could lose our memento.
......
...@@ -79,6 +79,7 @@ function array_literal_test() { ...@@ -79,6 +79,7 @@ function array_literal_test() {
assertEquals(2, f0[1]); assertEquals(2, f0[1]);
assertEquals(1, f0[0]); assertEquals(1, f0[0]);
} }
%PrepareFunctionForOptimization(array_literal_test);
%PrepareFunctionForOptimization(array_literal_test); %PrepareFunctionForOptimization(array_literal_test);
for (var i = 0; i < 3; i++) { for (var i = 0; i < 3; i++) {
...@@ -109,6 +110,7 @@ function test_large_literal() { ...@@ -109,6 +110,7 @@ function test_large_literal() {
[0, 1, 2, 3, 4, 5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, [0, 1, 2, 3, 4, 5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5,
new Object(), new Object(), new Object(), new Object()]); new Object(), new Object(), new Object(), new Object()]);
} }
%PrepareFunctionForOptimization(test_large_literal);
%PrepareFunctionForOptimization(test_large_literal); %PrepareFunctionForOptimization(test_large_literal);
for (var i = 0; i < 3; i++) { for (var i = 0; i < 3; i++) {
...@@ -124,6 +126,7 @@ function deopt_array(use_literal) { ...@@ -124,6 +126,7 @@ function deopt_array(use_literal) {
return new Array(); return new Array();
} }
} }
%PrepareFunctionForOptimization(deopt_array);
%PrepareFunctionForOptimization(deopt_array); %PrepareFunctionForOptimization(deopt_array);
deopt_array(false); deopt_array(false);
...@@ -142,6 +145,7 @@ assertOptimized(deopt_array); ...@@ -142,6 +145,7 @@ assertOptimized(deopt_array);
function deopt_array_literal_all_smis(a) { function deopt_array_literal_all_smis(a) {
return [0, 1, a]; return [0, 1, a];
} }
%PrepareFunctionForOptimization(deopt_array_literal_all_smis);
%PrepareFunctionForOptimization(deopt_array_literal_all_smis); %PrepareFunctionForOptimization(deopt_array_literal_all_smis);
deopt_array_literal_all_smis(2); deopt_array_literal_all_smis(2);
...@@ -168,6 +172,7 @@ assertEquals(.5, array[2]); ...@@ -168,6 +172,7 @@ assertEquals(.5, array[2]);
function deopt_array_literal_all_doubles(a) { function deopt_array_literal_all_doubles(a) {
return [0.5, 1, a]; return [0.5, 1, a];
} }
%PrepareFunctionForOptimization(deopt_array_literal_all_doubles);
%PrepareFunctionForOptimization(deopt_array_literal_all_doubles); %PrepareFunctionForOptimization(deopt_array_literal_all_doubles);
deopt_array_literal_all_doubles(.5); deopt_array_literal_all_doubles(.5);
......
...@@ -17,6 +17,7 @@ function makeArray() { ...@@ -17,6 +17,7 @@ function makeArray() {
return a; return a;
} }
%PrepareFunctionForOptimization(doShift);
doShift(makeArray()); doShift(makeArray());
doShift(makeArray()); doShift(makeArray());
%OptimizeFunctionOnNextCall(doShift); %OptimizeFunctionOnNextCall(doShift);
......
...@@ -197,6 +197,7 @@ assertEquals(0.5, array_store_1([], 0, 0.5)); ...@@ -197,6 +197,7 @@ assertEquals(0.5, array_store_1([], 0, 0.5));
a[b] = c; a[b] = c;
} }
%PrepareFunctionForOptimization(grow_store);
a = new Array(1); a = new Array(1);
grow_store(a,1,1); grow_store(a,1,1);
grow_store(a,2,1); grow_store(a,2,1);
...@@ -216,6 +217,7 @@ assertEquals(0.5, array_store_1([], 0, 0.5)); ...@@ -216,6 +217,7 @@ assertEquals(0.5, array_store_1([], 0, 0.5));
function f(o, k, v) { function f(o, k, v) {
o[k] = v; o[k] = v;
} }
%PrepareFunctionForOptimization(f);
a = [3.5]; a = [3.5];
f(a, 1, "hi"); // DOUBLE packed array -> tagged packed grow f(a, 1, "hi"); // DOUBLE packed array -> tagged packed grow
...@@ -238,6 +240,7 @@ assertEquals(0.5, array_store_1([], 0, 0.5)); ...@@ -238,6 +240,7 @@ assertEquals(0.5, array_store_1([], 0, 0.5));
function f(o, k, v) { function f(o, k, v) {
o[k] = v; o[k] = v;
} }
%PrepareFunctionForOptimization(f);
a = [3.5]; a = [3.5];
f(a, 0, "hi"); // DOUBLE packed array -> tagged packed grow f(a, 0, "hi"); // DOUBLE packed array -> tagged packed grow
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
} }
%PrepareFunctionForOptimization(slice0); %PrepareFunctionForOptimization(slice0);
%PrepareFunctionForOptimization(slice);
assertEquals(arr, slice()); assertEquals(arr, slice());
assertFalse(arr === slice()); assertFalse(arr === slice());
...@@ -29,7 +30,6 @@ ...@@ -29,7 +30,6 @@
%OptimizeFunctionOnNextCall(slice0); %OptimizeFunctionOnNextCall(slice0);
assertEquals(slice(), slice0()); assertEquals(slice(), slice0());
%PrepareFunctionForOptimization(slice);
%OptimizeFunctionOnNextCall(slice); %OptimizeFunctionOnNextCall(slice);
assertEquals(slice(), slice0()); assertEquals(slice(), slice0());
...@@ -415,6 +415,7 @@ ...@@ -415,6 +415,7 @@
function test() { function test() {
%PrepareFunctionForOptimization(slice0); %PrepareFunctionForOptimization(slice0);
%PrepareFunctionForOptimization(slice);
assertEquals(arr, slice()); assertEquals(arr, slice());
assertFalse(arr === slice()); assertFalse(arr === slice());
...@@ -423,7 +424,6 @@ ...@@ -423,7 +424,6 @@
%OptimizeFunctionOnNextCall(slice0); %OptimizeFunctionOnNextCall(slice0);
assertEquals(slice(), slice0()); assertEquals(slice(), slice0());
%PrepareFunctionForOptimization(slice);
%OptimizeFunctionOnNextCall(slice); %OptimizeFunctionOnNextCall(slice);
assertEquals(slice(), slice0()); assertEquals(slice(), slice0());
...@@ -455,13 +455,13 @@ ...@@ -455,13 +455,13 @@
} }
function test() { function test() {
%PrepareFunctionForOptimization(slice0);
%PrepareFunctionForOptimization(slice);
assertEquals(arr, slice()); assertEquals(arr, slice());
assertFalse(arr === slice()); assertFalse(arr === slice());
assertEquals(slice(), slice0()); assertEquals(slice(), slice0());
assertEquals(slice0(), slice()); assertEquals(slice0(), slice());
%PrepareFunctionForOptimization(slice0);
%PrepareFunctionForOptimization(slice);
%OptimizeFunctionOnNextCall(slice0); %OptimizeFunctionOnNextCall(slice0);
assertEquals(slice(), slice0()); assertEquals(slice(), slice0());
%OptimizeFunctionOnNextCall(slice); %OptimizeFunctionOnNextCall(slice);
......
...@@ -38,6 +38,7 @@ function f() { ...@@ -38,6 +38,7 @@ function f() {
arr[500] = 20; arr[500] = 20;
arr[10] = arr[50]; arr[10] = arr[50];
} }
%EnsureFeedbackVectorForFunction(f);
function g() { function g() {
f(); f();
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
(function() { (function() {
// Produce a SpeculativeNumberEqual with Number feedback. // Produce a SpeculativeNumberEqual with Number feedback.
function bar(x, y) { return x === y; } function bar(x, y) { return x === y; }
%EnsureFeedbackVectorForFunction(bar);
bar(0.1, 0.5); bar(0.1, 0.5);
bar(-0, 100); bar(-0, 100);
...@@ -83,6 +84,7 @@ ...@@ -83,6 +84,7 @@
(function() { (function() {
// Produce a SpeculativeNumberLessThan with Number feedback. // Produce a SpeculativeNumberLessThan with Number feedback.
function bar(x, y) { return x < y; } function bar(x, y) { return x < y; }
%EnsureFeedbackVectorForFunction(bar);
bar(0.1, 0.5); bar(0.1, 0.5);
bar(-0, 100); bar(-0, 100);
...@@ -134,6 +136,7 @@ ...@@ -134,6 +136,7 @@
(function() { (function() {
// Produce a SpeculativeNumberLessThanOrEqual with Number feedback. // Produce a SpeculativeNumberLessThanOrEqual with Number feedback.
function bar(x, y) { return x <= y; } function bar(x, y) { return x <= y; }
%EnsureFeedbackVectorForFunction(bar);
bar(0.1, 0.5); bar(0.1, 0.5);
bar(-0, 100); bar(-0, 100);
......
...@@ -269,6 +269,7 @@ function osr_inner(t, limit) { ...@@ -269,6 +269,7 @@ function osr_inner(t, limit) {
} }
return r; return r;
} }
%PrepareFunctionForOptimization(osr_inner);
function osr_outer(t, osr_after) { function osr_outer(t, osr_after) {
var r = 1; var r = 1;
...@@ -281,6 +282,7 @@ function osr_outer(t, osr_after) { ...@@ -281,6 +282,7 @@ function osr_outer(t, osr_after) {
} }
return r; return r;
} }
%PrepareFunctionForOptimization(osr_outer);
function osr_outer_and_deopt(t, osr_after) { function osr_outer_and_deopt(t, osr_after) {
var r = 1; var r = 1;
...@@ -290,6 +292,7 @@ function osr_outer_and_deopt(t, osr_after) { ...@@ -290,6 +292,7 @@ function osr_outer_and_deopt(t, osr_after) {
} }
return r; return r;
} }
%PrepareFunctionForOptimization(osr_outer_and_deopt);
function test_osr() { function test_osr() {
with ({}) {} // Disable optimizations of this function. with ({}) {} // Disable optimizations of this function.
......
...@@ -38,6 +38,7 @@ function f1() { ...@@ -38,6 +38,7 @@ function f1() {
} }
return sum; return sum;
} }
%PrepareFunctionForOptimization(f1);
function f2() { function f2() {
var sum = 0; var sum = 0;
...@@ -50,6 +51,7 @@ function f2() { ...@@ -50,6 +51,7 @@ function f2() {
} }
return sum; return sum;
} }
%PrepareFunctionForOptimization(f2);
function f3() { function f3() {
var sum = 0; var sum = 0;
...@@ -62,6 +64,7 @@ function f3() { ...@@ -62,6 +64,7 @@ function f3() {
} }
return sum; return sum;
} }
%PrepareFunctionForOptimization(f3);
function test1() { function test1() {
var j = 11; var j = 11;
......
...@@ -14,6 +14,7 @@ function fastaRandom(n, table) { ...@@ -14,6 +14,7 @@ function fastaRandom(n, table) {
n--; n--;
} }
} }
%PrepareFunctionForOptimization(fastaRandom);
print("---BEGIN 1"); print("---BEGIN 1");
assertEquals(undefined, fastaRandom(6, null)); assertEquals(undefined, fastaRandom(6, null));
......
...@@ -41,4 +41,5 @@ function f(x, b, c) { ...@@ -41,4 +41,5 @@ function f(x, b, c) {
return a + 4; return a + 4;
} }
%PrepareFunctionForOptimization(f);
assertEquals(55, f(5, "122", "1221")); assertEquals(55, f(5, "122", "1221"));
...@@ -24,6 +24,7 @@ function foo() { ...@@ -24,6 +24,7 @@ function foo() {
result.push(out); result.push(out);
return result; return result;
} }
%PrepareFunctionForOptimization(foo);
function check() { function check() {
......
...@@ -28,6 +28,7 @@ function test(expected, func, depth) { ...@@ -28,6 +28,7 @@ function test(expected, func, depth) {
for (var depth = 1; depth < 4; depth++) { for (var depth = 1; depth < 4; depth++) {
var body = nest(orig, name, depth); var body = nest(orig, name, depth);
func = eval("(" + body + ")"); func = eval("(" + body + ")");
%PrepareFunctionForOptimization(func);
assertEquals(expected, func()); assertEquals(expected, func());
assertEquals(expected, func()); assertEquals(expected, func());
...@@ -47,6 +48,7 @@ function foo() { ...@@ -47,6 +48,7 @@ function foo() {
} }
return result; return result;
} }
%PrepareFunctionForOptimization(foo);
test(45, foo); test(45, foo);
...@@ -58,6 +60,7 @@ function bar() { ...@@ -58,6 +60,7 @@ function bar() {
} }
return sum; return sum;
} }
%PrepareFunctionForOptimization(bar);
test(45, bar); test(45, bar);
...@@ -71,6 +74,7 @@ function bon() { ...@@ -71,6 +74,7 @@ function bon() {
return sum; return sum;
} }
} }
%PrepareFunctionForOptimization(bon);
test(45, bon); test(45, bon);
...@@ -87,6 +91,7 @@ function row() { ...@@ -87,6 +91,7 @@ function row() {
} }
return 11; return 11;
} }
%PrepareFunctionForOptimization(row);
test(7, row); test(7, row);
...@@ -98,6 +103,7 @@ function nub() { ...@@ -98,6 +103,7 @@ function nub() {
} }
return i; return i;
} }
%PrepareFunctionForOptimization(nub);
test(2, nub); test(2, nub);
...@@ -112,5 +118,6 @@ function kub() { ...@@ -112,5 +118,6 @@ function kub() {
} }
return result; return result;
} }
%PrepareFunctionForOptimization(kub);
test(1, kub); test(1, kub);
...@@ -24,6 +24,7 @@ function bar() { ...@@ -24,6 +24,7 @@ function bar() {
} }
return result; return result;
} }
%PrepareFunctionForOptimization(bar);
test(4005, bar); test(4005, bar);
...@@ -35,6 +36,7 @@ function baz() { ...@@ -35,6 +36,7 @@ function baz() {
} }
return sum; return sum;
} }
%PrepareFunctionForOptimization(baz);
test(2, baz); test(2, baz);
...@@ -46,6 +48,7 @@ function qux() { ...@@ -46,6 +48,7 @@ function qux() {
} }
return result; return result;
} }
%PrepareFunctionForOptimization(qux);
test(1, qux); test(1, qux);
...@@ -60,6 +63,7 @@ function nux() { ...@@ -60,6 +63,7 @@ function nux() {
} }
return result; return result;
} }
%PrepareFunctionForOptimization(nux);
test(1, nux); test(1, nux);
...@@ -78,5 +82,6 @@ function blo() { ...@@ -78,5 +82,6 @@ function blo() {
} }
return result; return result;
} }
%PrepareFunctionForOptimization(blo);
test(4005, blo()); test(4005, blo());
...@@ -18,6 +18,7 @@ function foo(t) { ...@@ -18,6 +18,7 @@ function foo(t) {
} }
return 5; return 5;
} }
%PrepareFunctionForOptimization(foo);
test(5, foo, {x:20}); test(5, foo, {x:20});
...@@ -31,5 +32,6 @@ function bar(t) { ...@@ -31,5 +32,6 @@ function bar(t) {
} }
return sum; return sum;
} }
%PrepareFunctionForOptimization(bar);
test(62, bar, {x:20,y:11}); test(62, bar, {x:20,y:11});
...@@ -11,6 +11,7 @@ function thrower() { ...@@ -11,6 +11,7 @@ function thrower() {
if (x == 5) %OptimizeOsr(1); if (x == 5) %OptimizeOsr(1);
if (x == 10) throw "terminate"; if (x == 10) throw "terminate";
} }
%PrepareFunctionForOptimization(thrower);
%NeverOptimizeFunction(thrower); // Don't want to inline the thrower. %NeverOptimizeFunction(thrower); // Don't want to inline the thrower.
%NeverOptimizeFunction(test); // Don't want to inline the func into test. %NeverOptimizeFunction(test); // Don't want to inline the func into test.
...@@ -25,18 +26,22 @@ function test(func) { ...@@ -25,18 +26,22 @@ function test(func) {
function n1() { function n1() {
while (true) thrower(); while (true) thrower();
} }
%PrepareFunctionForOptimization(n1);
function n2() { function n2() {
while (true) while (true) thrower(); while (true) while (true) thrower();
} }
%PrepareFunctionForOptimization(n2);
function n3() { function n3() {
while (true) while (true) while (true) thrower(); while (true) while (true) while (true) thrower();
} }
%PrepareFunctionForOptimization(n3);
function n4() { function n4() {
while (true) while (true) while (true) while (true) thrower(); while (true) while (true) while (true) while (true) thrower();
} }
%PrepareFunctionForOptimization(n4);
function b1(a) { function b1(a) {
while (true) { while (true) {
...@@ -44,6 +49,7 @@ function b1(a) { ...@@ -44,6 +49,7 @@ function b1(a) {
if (a) break if (a) break
} }
} }
%PrepareFunctionForOptimization(b1);
function b2(a) { function b2(a) {
...@@ -54,6 +60,7 @@ function b2(a) { ...@@ -54,6 +60,7 @@ function b2(a) {
} }
} }
} }
%PrepareFunctionForOptimization(b2);
function b3(a) { function b3(a) {
...@@ -67,6 +74,7 @@ function b3(a) { ...@@ -67,6 +74,7 @@ function b3(a) {
} }
} }
} }
%PrepareFunctionForOptimization(b3);
test(n1); test(n1);
......
...@@ -17,6 +17,7 @@ function foo() { ...@@ -17,6 +17,7 @@ function foo() {
} }
return sum; return sum;
} }
%PrepareFunctionForOptimization(foo);
assertEquals(30, foo()); assertEquals(30, foo());
assertEquals(30, foo()); assertEquals(30, foo());
...@@ -36,6 +37,7 @@ function bar(a) { ...@@ -36,6 +37,7 @@ function bar(a) {
} }
return sum; return sum;
} }
%PrepareFunctionForOptimization(bar);
assertEquals(1, bar(1)); assertEquals(1, bar(1));
assertEquals(1, bar(1)); assertEquals(1, bar(1));
......
...@@ -11,6 +11,7 @@ function mod() { ...@@ -11,6 +11,7 @@ function mod() {
} }
return {blah: i}; return {blah: i};
} }
%PrepareFunctionForOptimization(f0);
function f1(a) { function f1(a) {
for (var i = 0; i < 3; i = i + 1 | 0) { for (var i = 0; i < 3; i = i + 1 | 0) {
...@@ -18,6 +19,7 @@ function mod() { ...@@ -18,6 +19,7 @@ function mod() {
} }
return {blah: i}; return {blah: i};
} }
%PrepareFunctionForOptimization(f1);
function f2(a,b) { function f2(a,b) {
for (var i = 0; i < 3; i = i + 1 | 0) { for (var i = 0; i < 3; i = i + 1 | 0) {
...@@ -25,6 +27,7 @@ function mod() { ...@@ -25,6 +27,7 @@ function mod() {
} }
return {blah: i}; return {blah: i};
} }
%PrepareFunctionForOptimization(f2);
function f3(a,b,c) { function f3(a,b,c) {
for (var i = 0; i < 3; i = i + 1 | 0) { for (var i = 0; i < 3; i = i + 1 | 0) {
...@@ -32,6 +35,7 @@ function mod() { ...@@ -32,6 +35,7 @@ function mod() {
} }
return {blah: i}; return {blah: i};
} }
%PrepareFunctionForOptimization(f3);
function f4(a,b,c,d) { function f4(a,b,c,d) {
for (var i = 0; i < 3; i = i + 1 | 0) { for (var i = 0; i < 3; i = i + 1 | 0) {
...@@ -39,6 +43,7 @@ function mod() { ...@@ -39,6 +43,7 @@ function mod() {
} }
return {blah: i}; return {blah: i};
} }
%PrepareFunctionForOptimization(f4);
function bar() { function bar() {
assertEquals(3, f0().blah); assertEquals(3, f0().blah);
......
...@@ -11,6 +11,7 @@ function mod() { ...@@ -11,6 +11,7 @@ function mod() {
} }
return {blah: i}; return {blah: i};
} }
%PrepareFunctionForOptimization(f0);
function f1(a) { function f1(a) {
for (var i = 0; i < 3; i = i + 1 | 0) { for (var i = 0; i < 3; i = i + 1 | 0) {
...@@ -18,6 +19,7 @@ function mod() { ...@@ -18,6 +19,7 @@ function mod() {
} }
return {blah: i}; return {blah: i};
} }
%PrepareFunctionForOptimization(f1);
function f2(a,b) { function f2(a,b) {
for (var i = 0; i < 3; i = i + 1 | 0) { for (var i = 0; i < 3; i = i + 1 | 0) {
...@@ -25,6 +27,7 @@ function mod() { ...@@ -25,6 +27,7 @@ function mod() {
} }
return {blah: i}; return {blah: i};
} }
%PrepareFunctionForOptimization(f2);
function f3(a,b,c) { function f3(a,b,c) {
for (var i = 0; i < 3; i = i + 1 | 0) { for (var i = 0; i < 3; i = i + 1 | 0) {
...@@ -32,6 +35,7 @@ function mod() { ...@@ -32,6 +35,7 @@ function mod() {
} }
return {blah: i}; return {blah: i};
} }
%PrepareFunctionForOptimization(f3);
function f4(a,b,c,d) { function f4(a,b,c,d) {
for (var i = 0; i < 3; i = i + 1 | 0) { for (var i = 0; i < 3; i = i + 1 | 0) {
...@@ -39,6 +43,7 @@ function mod() { ...@@ -39,6 +43,7 @@ function mod() {
} }
return {blah: i}; return {blah: i};
} }
%PrepareFunctionForOptimization(f4);
function bar() { function bar() {
assertEquals(3, f0().blah); assertEquals(3, f0().blah);
......
...@@ -22,10 +22,12 @@ function gen(w) { // defeat compiler cache. ...@@ -22,10 +22,12 @@ function gen(w) { // defeat compiler cache.
"} f" + num; "} f" + num;
return eval(src); return eval(src);
} }
%PrepareFunctionForOptimization(gen);
function check(x,a,b,c) { function check(x,a,b,c) {
for (var i = 0; i < 3; i++) { for (var i = 0; i < 3; i++) {
var f = gen(i); var f = gen(i);
%PrepareFunctionForOptimization(f);
assertEquals(x, f(a, b, c)); assertEquals(x, f(a, b, c));
} }
} }
......
...@@ -26,6 +26,7 @@ function gen(w) { // defeat compiler cache. ...@@ -26,6 +26,7 @@ function gen(w) { // defeat compiler cache.
function check(x,a,b,c) { function check(x,a,b,c) {
for (var i = 0; i < 3; i++) { for (var i = 0; i < 3; i++) {
var f = gen(i); var f = gen(i);
%PrepareFunctionForOptimization(f);
assertEquals(x, f(a, b, c)); assertEquals(x, f(a, b, c));
} }
} }
......
...@@ -44,6 +44,7 @@ function bar(goal) { ...@@ -44,6 +44,7 @@ function bar(goal) {
} }
return sum; return sum;
} }
%PrepareFunctionForOptimization(bar);
for (var i = 0; i < 13; i++) { for (var i = 0; i < 13; i++) {
%DeoptimizeFunction(bar); %DeoptimizeFunction(bar);
......
...@@ -59,5 +59,6 @@ function gen(i) { ...@@ -59,5 +59,6 @@ function gen(i) {
for (var i = 1; i < 10; i++) { for (var i = 1; i < 10; i++) {
var f = gen(i); var f = gen(i);
%PrepareFunctionForOptimization(f);
assertEquals(1979, f()); assertEquals(1979, f());
} }
...@@ -40,6 +40,7 @@ function f() { ...@@ -40,6 +40,7 @@ function f() {
} }
return sum; return sum;
} }
%PrepareFunctionForOptimization(f);
assertEquals(1450, f()); assertEquals(1450, f());
......
...@@ -19,7 +19,7 @@ function f() { ...@@ -19,7 +19,7 @@ function f() {
return sum; return sum;
} }
%PrepareFunctionForOptimization(f);
assertEquals(15000, f()); assertEquals(15000, f());
assertEquals(15000, f()); assertEquals(15000, f());
assertEquals(15000, f()); assertEquals(15000, f());
...@@ -16,5 +16,6 @@ function f(x) { ...@@ -16,5 +16,6 @@ function f(x) {
} }
return sum; return sum;
} }
%PrepareFunctionForOptimization(f);
assertEquals(50, f(5)); assertEquals(50, f(5));
...@@ -13,6 +13,7 @@ function foo(a) { ...@@ -13,6 +13,7 @@ function foo(a) {
} }
return r; return r;
} }
%PrepareFunctionForOptimization(foo);
function bar(a) { function bar(a) {
for (var i = 0; i < 10; i++) { for (var i = 0; i < 10; i++) {
...@@ -21,6 +22,7 @@ function bar(a) { ...@@ -21,6 +22,7 @@ function bar(a) {
} }
return r; return r;
} }
%PrepareFunctionForOptimization(bar);
function baz(a) { function baz(a) {
for (var i = 0; i < 10; i++) { for (var i = 0; i < 10; i++) {
...@@ -28,6 +30,7 @@ function baz(a) { ...@@ -28,6 +30,7 @@ function baz(a) {
} }
return /\0/; return /\0/;
} }
%PrepareFunctionForOptimization(baz);
function qux(a) { function qux(a) {
for (var i = 0; i < 10; i++) { for (var i = 0; i < 10; i++) {
...@@ -39,6 +42,7 @@ function qux(a) { ...@@ -39,6 +42,7 @@ function qux(a) {
} }
return r; return r;
} }
%PrepareFunctionForOptimization(qux);
function test(f) { function test(f) {
// Test the reference equality of regex's created in OSR'd function. // Test the reference equality of regex's created in OSR'd function.
......
...@@ -15,6 +15,7 @@ function f() { ...@@ -15,6 +15,7 @@ function f() {
} }
return sum; return sum;
} }
%PrepareFunctionForOptimization(f);
for (var i = 0; i < 2; i++) { for (var i = 0; i < 2; i++) {
......
...@@ -19,6 +19,7 @@ function SingleLoop() { ...@@ -19,6 +19,7 @@ function SingleLoop() {
} }
} }
} }
%PrepareFunctionForOptimization(SingleLoop);
// These function could also fail if the exception handlers are not updated at // These function could also fail if the exception handlers are not updated at
...@@ -38,6 +39,7 @@ function EmptyBody() { ...@@ -38,6 +39,7 @@ function EmptyBody() {
a++; a++;
} }
} }
%PrepareFunctionForOptimization(EmptyBody);
function NestedLoops() { function NestedLoops() {
for (var a = 0; a < 2; a++) { for (var a = 0; a < 2; a++) {
...@@ -52,6 +54,7 @@ function NestedLoops() { ...@@ -52,6 +54,7 @@ function NestedLoops() {
} }
} }
} }
%PrepareFunctionForOptimization(NestedLoops);
SingleLoop(); SingleLoop();
......
...@@ -20,5 +20,6 @@ function f(x) { ...@@ -20,5 +20,6 @@ function f(x) {
} }
return sum; return sum;
} }
%PrepareFunctionForOptimization(f);
assertEquals(500, f(5)); assertEquals(500, f(5));
...@@ -35,6 +35,7 @@ function foo() { ...@@ -35,6 +35,7 @@ function foo() {
} }
return result; return result;
} }
%PrepareFunctionForOptimization(foo);
test(1, foo); test(1, foo);
...@@ -54,5 +55,6 @@ function smo() { ...@@ -54,5 +55,6 @@ function smo() {
} }
return result; return result;
} }
%PrepareFunctionForOptimization(smo);
test(11, smo); test(11, smo);
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
} }
} }
%PrepareFunctionForOptimization(g);
g(); g();
})(); })();
...@@ -33,5 +34,6 @@ ...@@ -33,5 +34,6 @@
} }
} }
%PrepareFunctionForOptimization(g);
g(); g();
})(); })();
...@@ -16,4 +16,5 @@ function f() { ...@@ -16,4 +16,5 @@ function f() {
return sum; return sum;
} }
%PrepareFunctionForOptimization(f);
f(); f();
...@@ -13,4 +13,5 @@ function f() { ...@@ -13,4 +13,5 @@ function f() {
return x; return x;
} }
%PrepareFunctionForOptimization(f);
assertEquals(0, f()); assertEquals(0, f());
...@@ -6,12 +6,14 @@ ...@@ -6,12 +6,14 @@
(function() { (function() {
"use asm"; "use asm";
return function() { var f = function() {
for (var i = 0; i < 10; i++) { for (var i = 0; i < 10; i++) {
if (i == 5) { if (i == 5) {
%OptimizeOsr(); %OptimizeOsr();
} }
} }
with (Object()); with (Object());
} };
%PrepareFunctionForOptimization(f);
return f;
})()(); })()();
...@@ -12,4 +12,5 @@ function f() { ...@@ -12,4 +12,5 @@ function f() {
} }
} }
%PrepareFunctionForOptimization(f);
f(); f();
...@@ -13,4 +13,5 @@ function foo() { ...@@ -13,4 +13,5 @@ function foo() {
} }
} }
%PrepareFunctionForOptimization(foo);
foo(); foo();
...@@ -12,4 +12,5 @@ function f(get, ...a) { ...@@ -12,4 +12,5 @@ function f(get, ...a) {
} }
return get(); return get();
} }
%PrepareFunctionForOptimization(f);
assertThrows(f); assertThrows(f);
...@@ -11,6 +11,7 @@ function foo(o) { ...@@ -11,6 +11,7 @@ function foo(o) {
} }
} }
%PrepareFunctionForOptimization(foo);
foo([1]); foo([1]);
foo([1]); foo([1]);
%OptimizeFunctionOnNextCall(foo); %OptimizeFunctionOnNextCall(foo);
......
...@@ -13,6 +13,7 @@ function OSRInsideTry(x) { ...@@ -13,6 +13,7 @@ function OSRInsideTry(x) {
} }
return x + 2; return x + 2;
} }
%PrepareFunctionForOptimization(OSRInsideTry);
assertEquals(24, OSRInsideTry(23)); assertEquals(24, OSRInsideTry(23));
...@@ -25,6 +26,7 @@ function OSRInsideCatch(x) { ...@@ -25,6 +26,7 @@ function OSRInsideCatch(x) {
} }
return x + 2; return x + 2;
} }
%PrepareFunctionForOptimization(OSRInsideCatch);
assertEquals(24, OSRInsideCatch(23)); assertEquals(24, OSRInsideCatch(23));
...@@ -37,6 +39,7 @@ function OSRInsideFinally_Return(x) { ...@@ -37,6 +39,7 @@ function OSRInsideFinally_Return(x) {
} }
return x + 2; return x + 2;
} }
%PrepareFunctionForOptimization(OSRInsideFinally_Return);
assertEquals(24, OSRInsideFinally_Return(23)); assertEquals(24, OSRInsideFinally_Return(23));
...@@ -48,4 +51,5 @@ function OSRInsideFinally_ReThrow(x) { ...@@ -48,4 +51,5 @@ function OSRInsideFinally_ReThrow(x) {
} }
return x + 2; return x + 2;
} }
%PrepareFunctionForOptimization(OSRInsideFinally_ReThrow);
assertThrows("OSRInsideFinally_ReThrow(new Error)", Error); assertThrows("OSRInsideFinally_ReThrow(new Error)", Error);
...@@ -44,6 +44,7 @@ if (!%IsConcurrentRecompilationSupported()) { ...@@ -44,6 +44,7 @@ if (!%IsConcurrentRecompilationSupported()) {
function f1(a, i) { function f1(a, i) {
return a[i] + 0.5; return a[i] + 0.5;
} }
%PrepareFunctionForOptimization(f1);
%PrepareFunctionForOptimization(f1); %PrepareFunctionForOptimization(f1);
var arr = [0.0,,2.5]; var arr = [0.0,,2.5];
......
...@@ -99,6 +99,7 @@ function TestLoadFromConstantFieldOfAPrototype(the_value, other_value) { ...@@ -99,6 +99,7 @@ function TestLoadFromConstantFieldOfAPrototype(the_value, other_value) {
// Ensure O.prototype is in fast mode by loading from its field. // Ensure O.prototype is in fast mode by loading from its field.
function warmup() { return new O().v; } function warmup() { return new O().v; }
%EnsureFeedbackVectorForFunction(warmup);
warmup(); warmup(); warmup(); warmup(); warmup(); warmup();
assertTrue(%HasFastProperties(O.prototype)); assertTrue(%HasFastProperties(O.prototype));
......
...@@ -14,6 +14,7 @@ function foo(i, deopt = false) { ...@@ -14,6 +14,7 @@ function foo(i, deopt = false) {
foo(i - 1, deopt); foo(i - 1, deopt);
} }
} }
%PrepareFunctionForOptimization(foo);
assertEquals(0, %GetDeoptCount(foo)); assertEquals(0, %GetDeoptCount(foo));
......
...@@ -14,6 +14,7 @@ function foo(i, deopt = false) { ...@@ -14,6 +14,7 @@ function foo(i, deopt = false) {
foo(i - 1, deopt); foo(i - 1, deopt);
} }
} }
%PrepareFunctionForOptimization(foo);
%PrepareFunctionForOptimization(foo); %PrepareFunctionForOptimization(foo);
assertEquals(0, %GetDeoptCount(foo)); assertEquals(0, %GetDeoptCount(foo));
......
...@@ -18,6 +18,7 @@ function foo(i, deopt = false, deoptobj = null) { ...@@ -18,6 +18,7 @@ function foo(i, deopt = false, deoptobj = null) {
assertEquals(0, %GetDeoptCount(foo)); assertEquals(0, %GetDeoptCount(foo));
%PrepareFunctionForOptimization(foo);
foo(10); foo(10);
foo(10); foo(10);
%OptimizeFunctionOnNextCall(foo); %OptimizeFunctionOnNextCall(foo);
......
...@@ -75,6 +75,7 @@ function test(a, b, c, d, e, v) { ...@@ -75,6 +75,7 @@ function test(a, b, c, d, e, v) {
assertEquals(24, d); assertEquals(24, d);
assertEquals(37.5, e); assertEquals(37.5, e);
} }
%PrepareFunctionForOptimization(test);
test(10.0, 20.0, 30.0, 40.0, 50.0, 1.5); test(10.0, 20.0, 30.0, 40.0, 50.0, 1.5);
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
function f(x, y) { return x + y; } function f(x, y) { return x + y; }
%PrepareFunctionForOptimization(f);
assertEquals(1, f(0, 1)); assertEquals(1, f(0, 1));
assertEquals(5, f(2, 3)); assertEquals(5, f(2, 3));
%OptimizeFunctionOnNextCall(f); %OptimizeFunctionOnNextCall(f);
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
function div(g) { function div(g) {
return (g/-1) ^ 1 return (g/-1) ^ 1
} }
%PrepareFunctionForOptimization(div);
var kMinInt = 1 << 31; var kMinInt = 1 << 31;
var expected_MinInt = div(kMinInt); var expected_MinInt = div(kMinInt);
var expected_minus_zero = div(0); var expected_minus_zero = div(0);
...@@ -42,6 +42,7 @@ function mul(g) { ...@@ -42,6 +42,7 @@ function mul(g) {
return (g * -1) ^ 1 return (g * -1) ^ 1
} }
%PrepareFunctionForOptimization(mul);
expected_MinInt = mul(kMinInt); expected_MinInt = mul(kMinInt);
expected_minus_zero = mul(0); expected_minus_zero = mul(0);
%OptimizeFunctionOnNextCall(mul); %OptimizeFunctionOnNextCall(mul);
......
...@@ -45,6 +45,7 @@ function test_wrapper() { ...@@ -45,6 +45,7 @@ function test_wrapper() {
} while (--count > 0); } while (--count > 0);
} }
%PrepareFunctionForOptimization(testDoubleConversion4);
testDoubleConversion4(new Array(5)); testDoubleConversion4(new Array(5));
testDoubleConversion4(new Array(5)); // Call twice to make sure that second testDoubleConversion4(new Array(5)); // Call twice to make sure that second
// store is a transition and not // store is a transition and not
...@@ -71,6 +72,7 @@ function test_wrapper() { ...@@ -71,6 +72,7 @@ function test_wrapper() {
} while (--count > 0); } while (--count > 0);
} }
%PrepareFunctionForOptimization(testExactMapHoisting);
testExactMapHoisting(new Array(5)); testExactMapHoisting(new Array(5));
testExactMapHoisting(new Array(5)); // Call twice to make sure that second testExactMapHoisting(new Array(5)); // Call twice to make sure that second
// store is a transition and not // store is a transition and not
...@@ -102,6 +104,7 @@ function test_wrapper() { ...@@ -102,6 +104,7 @@ function test_wrapper() {
} while (--count > 0); } while (--count > 0);
} }
%PrepareFunctionForOptimization(testExactMapHoisting2);
testExactMapHoisting2(new Array(5)); testExactMapHoisting2(new Array(5));
testExactMapHoisting2(new Array(5)); // Call twice to make sure that second testExactMapHoisting2(new Array(5)); // Call twice to make sure that second
// store is a transition and not // store is a transition and not
...@@ -129,6 +132,7 @@ function test_wrapper() { ...@@ -129,6 +132,7 @@ function test_wrapper() {
} while (--count > 0); } while (--count > 0);
} }
%PrepareFunctionForOptimization(testExactMapHoisting3);
var add_transition = new Array(5); var add_transition = new Array(5);
add_transition.foo = 0; add_transition.foo = 0;
add_transition[0] = new Object(); // For FAST_ELEMENT transition to be created add_transition[0] = new Object(); // For FAST_ELEMENT transition to be created
...@@ -155,6 +159,7 @@ function test_wrapper() { ...@@ -155,6 +159,7 @@ function test_wrapper() {
} }
/* /*
%PrepareFunctionForOptimization(testDominatingTransitionHoisting1);
testDominatingTransitionHoisting1(new Array(5)); testDominatingTransitionHoisting1(new Array(5));
testDominatingTransitionHoisting1(new Array(5)); // Call twice to make sure testDominatingTransitionHoisting1(new Array(5)); // Call twice to make sure
// that second store is a // that second store is a
...@@ -180,6 +185,7 @@ function test_wrapper() { ...@@ -180,6 +185,7 @@ function test_wrapper() {
} while (--count > 3); } while (--count > 3);
} }
%PrepareFunctionForOptimization(testHoistingWithSideEffect);
testHoistingWithSideEffect(new Array(5)); testHoistingWithSideEffect(new Array(5));
testHoistingWithSideEffect(new Array(5)); // Call twice to make sure that testHoistingWithSideEffect(new Array(5)); // Call twice to make sure that
// second store is a transition and // second store is a transition and
...@@ -203,6 +209,7 @@ function test_wrapper() { ...@@ -203,6 +209,7 @@ function test_wrapper() {
} while (--count > 3); } while (--count > 3);
} }
%PrepareFunctionForOptimization(testStraightLineDupeElinination);
testStraightLineDupeElinination(new Array(0, 0, 0, 0, 0),0,0,0,0,.5); testStraightLineDupeElinination(new Array(0, 0, 0, 0, 0),0,0,0,0,.5);
testStraightLineDupeElinination(new Array(0, 0, 0, 0, 0),0,0,0,.5,0); testStraightLineDupeElinination(new Array(0, 0, 0, 0, 0),0,0,0,.5,0);
testStraightLineDupeElinination(new Array(0, 0, 0, 0, 0),0,0,.5,0,0); testStraightLineDupeElinination(new Array(0, 0, 0, 0, 0),0,0,.5,0,0);
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
assertUnoptimized(foo); assertUnoptimized(foo);
assertTrue(%HasDictionaryElements(a)); assertTrue(%HasDictionaryElements(a));
%PrepareFunctionForOptimization(foo);
var b = []; var b = [];
foo(b, 1); foo(b, 1);
foo(b, 2); foo(b, 2);
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
function readA(x) { function readA(x) {
return x.a; return x.a;
} }
%PrepareFunctionForOptimization(readA);
var a = new A(); var a = new A();
assertUnoptimized(readA); assertUnoptimized(readA);
readA(a); readA(a); readA(a); readA(a); readA(a); readA(a);
...@@ -26,6 +27,7 @@ ...@@ -26,6 +27,7 @@
b.b = o; b.b = o;
assertEquals(readA(b), o); assertEquals(readA(b), o);
assertUnoptimized(readA); assertUnoptimized(readA);
%PrepareFunctionForOptimization(readA);
%OptimizeFunctionOnNextCall(readA); %OptimizeFunctionOnNextCall(readA);
assertEquals(readA(a), o); assertEquals(readA(a), o);
assertOptimized(readA); assertOptimized(readA);
...@@ -37,6 +39,7 @@ ...@@ -37,6 +39,7 @@
return x.a; return x.a;
} }
assertUnoptimized(readAFromB); assertUnoptimized(readAFromB);
%PrepareFunctionForOptimization(readAFromB);
readAFromB(b); readAFromB(b); readAFromB(b); readAFromB(b); readAFromB(b); readAFromB(b);
%OptimizeFunctionOnNextCall(readAFromB); %OptimizeFunctionOnNextCall(readAFromB);
assertEquals(readAFromB(b), o); assertEquals(readAFromB(b), o);
...@@ -49,6 +52,8 @@ ...@@ -49,6 +52,8 @@
c.a = [1]; c.a = [1];
assertUnoptimized(readA); assertUnoptimized(readA);
assertUnoptimized(readAFromB); assertUnoptimized(readAFromB);
%PrepareFunctionForOptimization(readA);
%PrepareFunctionForOptimization(readAFromB);
assertEquals(readA(a), o); assertEquals(readA(a), o);
assertEquals(readA(b), o); assertEquals(readA(b), o);
assertEquals(readA(c), [1]); assertEquals(readA(c), [1]);
...@@ -77,7 +82,9 @@ ...@@ -77,7 +82,9 @@
A.prototype = {y: 20}; A.prototype = {y: 20};
function B(o) { return o.a.y; } function B(o) { return o.a.y; }
function C() { this.a = new A(); } function C() { this.a = new A(); }
%EnsureFeedbackVectorForFunction(C);
%PrepareFunctionForOptimization(B);
B(new C()); B(new C());
B(new C()); B(new C());
%OptimizeFunctionOnNextCall(B); %OptimizeFunctionOnNextCall(B);
...@@ -88,6 +95,7 @@ ...@@ -88,6 +95,7 @@
assertEquals(10, B(c)); assertEquals(10, B(c));
assertUnoptimized(B); assertUnoptimized(B);
%PrepareFunctionForOptimization(B);
var c = new C(); var c = new C();
%OptimizeFunctionOnNextCall(B); %OptimizeFunctionOnNextCall(B);
assertEquals(20, B(c)); assertEquals(20, B(c));
...@@ -116,6 +124,7 @@ ...@@ -116,6 +124,7 @@
var f2 = new Foo({x: 2}); var f2 = new Foo({x: 2});
var f3 = new Foo({x: 3}); var f3 = new Foo({x: 3});
function readX(f) { return f.x.x; } function readX(f) { return f.x.x; }
%PrepareFunctionForOptimization(readX);
assertEquals(readX(f1), 1); assertEquals(readX(f1), 1);
assertEquals(readX(f2), 2); assertEquals(readX(f2), 2);
assertUnoptimized(readX); assertUnoptimized(readX);
...@@ -123,6 +132,7 @@ ...@@ -123,6 +132,7 @@
assertEquals(readX(f3), 3); assertEquals(readX(f3), 3);
assertOptimized(readX); assertOptimized(readX);
function writeX(f, x) { f.x = x; } function writeX(f, x) { f.x = x; }
%PrepareFunctionForOptimization(writeX);
writeX(f1, {x: 11}); writeX(f1, {x: 11});
writeX(f2, {x: 22}); writeX(f2, {x: 22});
assertUnoptimized(writeX); assertUnoptimized(writeX);
...@@ -146,6 +156,7 @@ ...@@ -146,6 +156,7 @@
var f2 = new Narf(2); var f2 = new Narf(2);
var f3 = new Narf(3); var f3 = new Narf(3);
function baz(f, y) { f.y = y; } function baz(f, y) { f.y = y; }
%PrepareFunctionForOptimization(baz);
baz(f1, {b: 9}); baz(f1, {b: 9});
baz(f2, {b: 9}); baz(f2, {b: 9});
baz(f2, {b: 9}); baz(f2, {b: 9});
...@@ -161,6 +172,7 @@ ...@@ -161,6 +172,7 @@
function readA(o) { return o.x.a; } function readA(o) { return o.x.a; }
var f = new Foo({a:1}); var f = new Foo({a:1});
var b = new Bar({a:2}); var b = new Bar({a:2});
%PrepareFunctionForOptimization(readA);
assertEquals(readA(f), 1); assertEquals(readA(f), 1);
assertEquals(readA(b), 2); assertEquals(readA(b), 2);
assertEquals(readA(f), 1); assertEquals(readA(f), 1);
......
...@@ -9,4 +9,5 @@ function f() { ...@@ -9,4 +9,5 @@ function f() {
if (i == 5) %OptimizeOsr(); if (i == 5) %OptimizeOsr();
} }
} }
%EnsureFeedbackVectorForFunction(f);
f(); f();
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
} }
return 23; return 23;
} }
%PrepareFunctionForOptimization(gen1);
var g = gen1(); var g = gen1();
assertEquals({ value:23, done:true }, g.next()); assertEquals({ value:23, done:true }, g.next());
})(); })();
...@@ -23,6 +24,7 @@ ...@@ -23,6 +24,7 @@
} }
return 23; return 23;
} }
%PrepareFunctionForOptimization(gen2);
var g = gen2(); var g = gen2();
assertEquals({ value:0, done:false }, g.next()); assertEquals({ value:0, done:false }, g.next());
assertEquals({ value:1, done:false }, g.next()); assertEquals({ value:1, done:false }, g.next());
...@@ -38,6 +40,7 @@ ...@@ -38,6 +40,7 @@
} }
return 23; return 23;
} }
%PrepareFunctionForOptimization(gen3);
var g = gen3(); var g = gen3();
assertEquals({ value:0, done:false }, g.next()); assertEquals({ value:0, done:false }, g.next());
assertEquals({ value:1, done:false }, g.next()); assertEquals({ value:1, done:false }, g.next());
...@@ -57,6 +60,7 @@ ...@@ -57,6 +60,7 @@
} }
return 23; return 23;
} }
%PrepareFunctionForOptimization(gen4);
var g = gen4(); var g = gen4();
assertEquals({ value:0, done:false }, g.next()); assertEquals({ value:0, done:false }, g.next());
assertEquals({ value:1, done:false }, g.next()); assertEquals({ value:1, done:false }, g.next());
......
...@@ -10,6 +10,10 @@ function f(b) { ...@@ -10,6 +10,10 @@ function f(b) {
} }
} }
f(0);
assertThrows(() => {f(1)}, ReferenceError);
%PrepareFunctionForOptimization(f);
f(0); f(0);
f(0); f(0);
%OptimizeFunctionOnNextCall(f); %OptimizeFunctionOnNextCall(f);
......
...@@ -15,7 +15,13 @@ class B extends A { ...@@ -15,7 +15,13 @@ class B extends A {
} }
} }
} }
// No feedback case
test = new B(0);
assertThrows(() => {new B(1)}, ReferenceError);
// Ensure Feedback
%PrepareFunctionForOptimization(B);
%EnsureFeedbackVectorForFunction(A);
test = new B(0); test = new B(0);
test = new B(0); test = new B(0);
assertThrows(() => {new B(1)}, ReferenceError); assertThrows(() => {new B(1)}, ReferenceError);
......
...@@ -15,6 +15,10 @@ class B extends A { ...@@ -15,6 +15,10 @@ class B extends A {
} }
} }
test = new B(1);
assertThrows(() => {new B(0)}, ReferenceError);
%PrepareFunctionForOptimization(B);
test = new B(1); test = new B(1);
test = new B(1); test = new B(1);
%OptimizeFunctionOnNextCall(B); %OptimizeFunctionOnNextCall(B);
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
// Flags: --opt --interrupt-budget=100 --allow-natives-syntax // Flags: --opt --interrupt-budget=100 --budget-for-feedback-vector-allocation=10 --allow-natives-syntax
function f() { function f() {
let s = 0; let s = 0;
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
function foo(a, i) { return a[i]; } function foo(a, i) { return a[i]; }
%PrepareFunctionForOptimization(foo);
var a = ['one', , 'three']; var a = ['one', , 'three'];
foo(a, 0); foo(a, 0);
foo(a, 0); foo(a, 0);
......
...@@ -36,6 +36,7 @@ function get(obj, key) { ...@@ -36,6 +36,7 @@ function get(obj, key) {
return obj[key]; return obj[key];
} }
%PrepareFunctionForOptimization(get);
get(o, "foo"); get(o, "foo");
get(o, "foo"); get(o, "foo");
get(o, "foo"); get(o, "foo");
......
...@@ -37,6 +37,7 @@ function get(obj, key) { ...@@ -37,6 +37,7 @@ function get(obj, key) {
return obj[key]; return obj[key];
} }
%PrepareFunctionForOptimization(get);
assertEquals("bar", get(o, s)); assertEquals("bar", get(o, s));
get(o, s); get(o, s);
get(o, s); get(o, s);
......
...@@ -34,6 +34,7 @@ function test_div_no_deopt_minus_zero() { ...@@ -34,6 +34,7 @@ function test_div_no_deopt_minus_zero() {
assertTrue(0 === (Math.floor((zero_in_array[0] | 0) / -1) | 0)); assertTrue(0 === (Math.floor((zero_in_array[0] | 0) / -1) | 0));
} }
%PrepareFunctionForOptimization(test_div_no_deopt_minus_zero);
test_div_no_deopt_minus_zero(); test_div_no_deopt_minus_zero();
test_div_no_deopt_minus_zero(); test_div_no_deopt_minus_zero();
%OptimizeFunctionOnNextCall(test_div_no_deopt_minus_zero); %OptimizeFunctionOnNextCall(test_div_no_deopt_minus_zero);
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
function o1() { function o1() {
} }
%PrepareFunctionForOptimization(o1);
o1(); o1(); o1(); o1();
%OptimizeFunctionOnNextCall(o1); %OptimizeFunctionOnNextCall(o1);
...@@ -45,6 +46,8 @@ function u1() { ...@@ -45,6 +46,8 @@ function u1() {
function u2() { function u2() {
u1(); u1();
} }
%PrepareFunctionForOptimization(u1);
%PrepareFunctionForOptimization(u2);
u1(); u1(); u1(); u1();
u2(); u2(); u2(); u2();
......
...@@ -220,9 +220,11 @@ assertDoesNotThrow(function() { objControl.splice(0, 0, 100, 101, 102); }); ...@@ -220,9 +220,11 @@ assertDoesNotThrow(function() { objControl.splice(0, 0, 100, 101, 102); });
// Verify that crankshaft still does the right thing. // Verify that crankshaft still does the right thing.
obj = [1, 2, 3]; obj = [1, 2, 3];
push_call = function(a) { a.push(1000); return a; } push_call = function(a) { a.push(1000); return a; };
%PrepareFunctionForOptimization(push_call);
// Include a call site that doesn't have a custom built-in. // Include a call site that doesn't have a custom built-in.
var shift_call = function(a) { a.shift(1000); return a; } var shift_call = function(a) { a.shift(1000); return a; };
%PrepareFunctionForOptimization(shift_call);
for (var i = 0; i < 3; i++) { for (var i = 0; i < 3; i++) {
push_call(obj); push_call(obj);
shift_call(obj); shift_call(obj);
......
...@@ -20,7 +20,8 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; ...@@ -20,7 +20,8 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
a.abc = 25; a.abc = 25;
} }
return v; return v;
} };
%EnsureFeedbackVectorForFunction(callback);
a.map(callback); a.map(callback);
}; };
%PrepareFunctionForOptimization(eagerDeoptInCalled); %PrepareFunctionForOptimization(eagerDeoptInCalled);
...@@ -41,7 +42,8 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; ...@@ -41,7 +42,8 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
result += v; result += v;
a.length = (i == 13 && deopt) ? 25 : 27; a.length = (i == 13 && deopt) ? 25 : 27;
return v; return v;
} };
%EnsureFeedbackVectorForFunction(callback);
a.map(callback); a.map(callback);
}; };
%PrepareFunctionForOptimization(eagerDeoptInCalled); %PrepareFunctionForOptimization(eagerDeoptInCalled);
...@@ -65,7 +67,8 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; ...@@ -65,7 +67,8 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
a_noescape.length = 25; a_noescape.length = 25;
} }
return v; return v;
} };
%EnsureFeedbackVectorForFunction(callback);
a_noescape.map(callback); a_noescape.map(callback);
}; };
%PrepareFunctionForOptimization(eagerDeoptInCalled); %PrepareFunctionForOptimization(eagerDeoptInCalled);
...@@ -93,6 +96,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; ...@@ -93,6 +96,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
gc(); gc(); gc(); gc();
return v; return v;
}; };
%EnsureFeedbackVectorForFunction(callback);
%NeverOptimizeFunction(callback); %NeverOptimizeFunction(callback);
b.map(callback); b.map(callback);
}; };
...@@ -117,6 +121,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; ...@@ -117,6 +121,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
} }
return 2 * v; return 2 * v;
}; };
%EnsureFeedbackVectorForFunction(callback);
%NeverOptimizeFunction(callback); %NeverOptimizeFunction(callback);
return b.map(callback); return b.map(callback);
}; };
...@@ -137,7 +142,8 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; ...@@ -137,7 +142,8 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
%DeoptimizeNow(); %DeoptimizeNow();
} }
return v; return v;
} };
%EnsureFeedbackVectorForFunction(callback);
b.map(callback); b.map(callback);
}; };
%PrepareFunctionForOptimization(lazyDeopt); %PrepareFunctionForOptimization(lazyDeopt);
...@@ -161,6 +167,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; ...@@ -161,6 +167,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
} }
return v; return v;
}; };
%EnsureFeedbackVectorForFunction(callback);
%NeverOptimizeFunction(callback); %NeverOptimizeFunction(callback);
b.map(callback); b.map(callback);
}; };
...@@ -186,7 +193,8 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; ...@@ -186,7 +193,8 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
gc(); gc();
} }
return v; return v;
} };
%EnsureFeedbackVectorForFunction(callback);
c.map(callback); c.map(callback);
}; };
%PrepareFunctionForOptimization(lazyDeopt); %PrepareFunctionForOptimization(lazyDeopt);
...@@ -211,7 +219,8 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; ...@@ -211,7 +219,8 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
throw("a"); throw("a");
} }
return v; return v;
} };
%EnsureFeedbackVectorForFunction(callback);
try { try {
c.map(callback); c.map(callback);
} catch (e) { } catch (e) {
...@@ -241,6 +250,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; ...@@ -241,6 +250,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
} }
return v; return v;
}; };
%EnsureFeedbackVectorForFunction(callback);
%NeverOptimizeFunction(callback); %NeverOptimizeFunction(callback);
try { try {
c.map(callback); c.map(callback);
...@@ -270,6 +280,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; ...@@ -270,6 +280,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
} }
return 2 * v; return 2 * v;
}; };
%EnsureFeedbackVectorForFunction(callback);
%NeverOptimizeFunction(callback); %NeverOptimizeFunction(callback);
var result = 0; var result = 0;
try { try {
...@@ -303,6 +314,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; ...@@ -303,6 +314,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
} }
return v; return v;
}; };
%EnsureFeedbackVectorForFunction(callback);
var o = [1,2,3]; var o = [1,2,3];
b.map(callback); b.map(callback);
}; };
...@@ -326,6 +338,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; ...@@ -326,6 +338,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
} }
return v; return v;
}; };
%EnsureFeedbackVectorForFunction(callback);
%NeverOptimizeFunction(callback); %NeverOptimizeFunction(callback);
var o = [1,2,3]; var o = [1,2,3];
b.map(callback); b.map(callback);
...@@ -352,6 +365,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; ...@@ -352,6 +365,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
} }
return v; return v;
}; };
%EnsureFeedbackVectorForFunction(callback);
var o = [1,2,3]; var o = [1,2,3];
b.map(callback); b.map(callback);
}; };
...@@ -375,6 +389,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; ...@@ -375,6 +389,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
} }
return v; return v;
}; };
%EnsureFeedbackVectorForFunction(callback);
a.map(callback); a.map(callback);
}; };
%PrepareFunctionForOptimization(lazyDeopt); %PrepareFunctionForOptimization(lazyDeopt);
...@@ -408,7 +423,8 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; ...@@ -408,7 +423,8 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
// array. // array.
return v; return v;
} }
} };
%EnsureFeedbackVectorForFunction(callback);
return c.map(callback); return c.map(callback);
}; };
%PrepareFunctionForOptimization(to_double); %PrepareFunctionForOptimization(to_double);
...@@ -439,7 +455,8 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; ...@@ -439,7 +455,8 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
// Later, to PACKED_ELEMENTS. // Later, to PACKED_ELEMENTS.
return v + 'hello'; return v + 'hello';
} }
} };
%EnsureFeedbackVectorForFunction(callback);
return c.map(callback); return c.map(callback);
}; };
%PrepareFunctionForOptimization(to_fast); %PrepareFunctionForOptimization(to_fast);
...@@ -460,6 +477,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; ...@@ -460,6 +477,7 @@ var c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
function double_results() { function double_results() {
// TurboFan recognizes the result is a double. // TurboFan recognizes the result is a double.
var callback = v => v + 0.5; var callback = v => v + 0.5;
%EnsureFeedbackVectorForFunction(callback);
return a.map(callback); return a.map(callback);
} }
%PrepareFunctionForOptimization(double_results); %PrepareFunctionForOptimization(double_results);
......
...@@ -43,6 +43,8 @@ function f(x) { ...@@ -43,6 +43,8 @@ function f(x) {
g(); g();
} }
%PrepareFunctionForOptimization(f);
%PrepareFunctionForOptimization(g);
f(); f();
f(); f();
%OptimizeFunctionOnNextCall(f); %OptimizeFunctionOnNextCall(f);
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
for (var i = 0; osr && i < 2; i++) %OptimizeOsr(); for (var i = 0; osr && i < 2; i++) %OptimizeOsr();
return result; return result;
} }
%PrepareFunctionForOptimization(f);
assertEquals("result", f(true, 3, false)); assertEquals("result", f(true, 3, false));
assertEquals("result", f(true, 3, false)); assertEquals("result", f(true, 3, false));
...@@ -58,6 +59,7 @@ ...@@ -58,6 +59,7 @@
function f() { function f() {
return g(void(h() + "")); return g(void(h() + ""));
}; };
%PrepareFunctionForOptimization(f);
f(); f();
%OptimizeFunctionOnNextCall(f); %OptimizeFunctionOnNextCall(f);
......
...@@ -35,6 +35,7 @@ function f(deopt, osr) { ...@@ -35,6 +35,7 @@ function f(deopt, osr) {
return result; return result;
} }
%PrepareFunctionForOptimization(f);
assertEquals("result", f(3, false)); assertEquals("result", f(3, false));
assertEquals("result", f(3, false)); assertEquals("result", f(3, false));
%OptimizeFunctionOnNextCall(f); %OptimizeFunctionOnNextCall(f);
......
...@@ -31,21 +31,25 @@ ...@@ -31,21 +31,25 @@
// should be able to construct a receiver from all optimized stack frames. // should be able to construct a receiver from all optimized stack frames.
function A() { } function A() { }
%EnsureFeedbackVectorForFunction(A);
A.prototype.f = function() { } A.prototype.f = function() { }
function B() { } function B() { }
%EnsureFeedbackVectorForFunction(B);
var o = new A(); var o = new A();
// This function throws if o does not have an f property, and should not be // This function throws if o does not have an f property, and should not be
// inlined. // inlined.
function g() { try { return o.f(); } finally { }} function g() { try { return o.f(); } finally { }}
%EnsureFeedbackVectorForFunction(g);
// This function should be optimized via OSR. // This function should be optimized via OSR.
function h() { function h() {
for (var i = 0; i < 10; i++) %OptimizeOsr(); for (var i = 0; i < 10; i++) %OptimizeOsr();
g(); g();
} }
%PrepareFunctionForOptimization(h);
h(); h();
o = new B(); o = new B();
......
...@@ -31,4 +31,5 @@ function foo () { ...@@ -31,4 +31,5 @@ function foo () {
}; };
} }
%PrepareFunctionForOptimization(foo);
foo(); foo();
...@@ -31,6 +31,7 @@ function mul(x, y) { ...@@ -31,6 +31,7 @@ function mul(x, y) {
return (x * y) | 0; return (x * y) | 0;
} }
%PrepareFunctionForOptimization(mul);
mul(0, 0); mul(0, 0);
mul(0, 0); mul(0, 0);
%OptimizeFunctionOnNextCall(mul); %OptimizeFunctionOnNextCall(mul);
...@@ -41,6 +42,7 @@ function div(x, y) { ...@@ -41,6 +42,7 @@ function div(x, y) {
return (x / y) | 0; return (x / y) | 0;
} }
%PrepareFunctionForOptimization(div);
div(4, 2); div(4, 2);
div(4, 2); div(4, 2);
%OptimizeFunctionOnNextCall(div); %OptimizeFunctionOnNextCall(div);
......
...@@ -35,8 +35,10 @@ function simple_two_args(always_zero, always_undefined) { ...@@ -35,8 +35,10 @@ function simple_two_args(always_zero, always_undefined) {
var always_five = always_undefined || 5; var always_five = always_undefined || 5;
return always_zero * always_five * .5; return always_zero * always_five * .5;
} }
%EnsureFeedbackVectorForFunction(simple_two_args);
%PrepareFunctionForOptimization(simple);
simple(); simple();
simple(); simple();
%OptimizeFunctionOnNextCall(simple); %OptimizeFunctionOnNextCall(simple);
......
...@@ -33,6 +33,7 @@ function f() { ...@@ -33,6 +33,7 @@ function f() {
assertEquals(-1.0, Math.round(-0.5000000000000001)); assertEquals(-1.0, Math.round(-0.5000000000000001));
} }
%PrepareFunctionForOptimization(f);
f(); f();
f(); f();
%OptimizeFunctionOnNextCall(f); %OptimizeFunctionOnNextCall(f);
......
...@@ -55,6 +55,7 @@ function callConstantFunctionOnPrototype(obj) { ...@@ -55,6 +55,7 @@ function callConstantFunctionOnPrototype(obj) {
obj.holderMethod(); obj.holderMethod();
} }
%PrepareFunctionForOptimization(callConstantFunctionOnPrototype);
callConstantFunctionOnPrototype(receiver); callConstantFunctionOnPrototype(receiver);
callConstantFunctionOnPrototype(receiver); callConstantFunctionOnPrototype(receiver);
%OptimizeFunctionOnNextCall(callConstantFunctionOnPrototype); %OptimizeFunctionOnNextCall(callConstantFunctionOnPrototype);
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Flags: --use-osr --allow-natives-syntax --ignition-osr --opt // Flags: --use-osr --allow-natives-syntax --opt
// Flags: --no-always-opt // Flags: --no-always-opt
// Can't OSR with always-opt or in Lite mode. // Can't OSR with always-opt or in Lite mode.
...@@ -50,6 +50,7 @@ function f() { ...@@ -50,6 +50,7 @@ function f() {
} while (false); } while (false);
} }
%PrepareFunctionForOptimization(f);
f(); f();
function g() { function g() {
...@@ -85,4 +86,5 @@ function g() { ...@@ -85,4 +86,5 @@ function g() {
} while (false); } while (false);
} }
%PrepareFunctionForOptimization(g);
g(); g();
...@@ -14,6 +14,7 @@ function Cb(a, trigger) { ...@@ -14,6 +14,7 @@ function Cb(a, trigger) {
} }
return g; return g;
} }
%PrepareFunctionForOptimization(Cb);
var s1 = "long string to make cons string 1"; var s1 = "long string to make cons string 1";
var s2 = "long string to make cons string 2"; var s2 = "long string to make cons string 2";
......
...@@ -33,7 +33,7 @@ if (isNeverOptimizeLiteMode()) { ...@@ -33,7 +33,7 @@ if (isNeverOptimizeLiteMode()) {
x = 42; x = 42;
return f.arguments[0]; return f.arguments[0];
} }
%EnsureFeedbackVectorForFunction(f);
f(0); f(0);
%OptimizeFunctionOnNextCall(f); %OptimizeFunctionOnNextCall(f);
assertEquals(42, f(0)); assertEquals(42, f(0));
......
...@@ -27,6 +27,10 @@ ...@@ -27,6 +27,10 @@
// Flags: --allow-natives-syntax // Flags: --allow-natives-syntax
for (var i = 0; i < 10; i++) { if (i == 5) %OptimizeOsr(); } function f() {
var xl = 4096; for (var i = 0; i < 10; i++) { if (i == 5) %OptimizeOsr(); }
var z = i % xl; var xl = 4096;
var z = i % xl;
}
%PrepareFunctionForOptimization(f);
f();
...@@ -10,6 +10,7 @@ function foo(a) { ...@@ -10,6 +10,7 @@ function foo(a) {
} }
} }
%PrepareFunctionForOptimization(foo);
foo([1,2,3]); foo([1,2,3]);
foo([2,3,4]); foo([2,3,4]);
%OptimizeFunctionOnNextCall(foo); %OptimizeFunctionOnNextCall(foo);
......
...@@ -18,6 +18,7 @@ function foo() { ...@@ -18,6 +18,7 @@ function foo() {
} }
} }
%PrepareFunctionForOptimization(foo);
foo(); foo();
foo(); foo();
%OptimizeFunctionOnNextCall(foo); %OptimizeFunctionOnNextCall(foo);
......
...@@ -10,6 +10,7 @@ function foo(obj) { ...@@ -10,6 +10,7 @@ function foo(obj) {
counter += obj; counter += obj;
return counter; return counter;
} }
%PrepareFunctionForOptimization(foo);
function bar() { function bar() {
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
......
...@@ -43,6 +43,7 @@ Array.prototype.f = function() { ...@@ -43,6 +43,7 @@ Array.prototype.f = function() {
var o1 = {m: 1}; var o1 = {m: 1};
var o2 = {a: 0, m:1}; var o2 = {a: 0, m:1};
%PrepareFunctionForOptimization(callsFReceiver);
var r1 = callsFReceiver(o1); var r1 = callsFReceiver(o1);
callsFReceiver(o1); callsFReceiver(o1);
%OptimizeFunctionOnNextCall(callsFReceiver); %OptimizeFunctionOnNextCall(callsFReceiver);
...@@ -56,6 +57,7 @@ assertEquals(1, r1); ...@@ -56,6 +57,7 @@ assertEquals(1, r1);
assertTrue(r1 === r2); assertTrue(r1 === r2);
assertTrue(r2 === r3); assertTrue(r2 === r3);
%OptimizeFunctionOnNextCall(callsFReceiver);
r1 = callsFReceiver(o1); r1 = callsFReceiver(o1);
callsFReceiver(o1); callsFReceiver(o1);
%OptimizeFunctionOnNextCall(callsFReceiver); %OptimizeFunctionOnNextCall(callsFReceiver);
......
...@@ -23,6 +23,7 @@ function literals_sharing_test(warmup, optimize) { ...@@ -23,6 +23,7 @@ function literals_sharing_test(warmup, optimize) {
// propagated to the next closure. // propagated to the next closure.
assertTrue(%HasDoubleElements(a)); assertTrue(%HasDoubleElements(a));
}; };
%EnsureFeedbackVectorForFunction(closure);
if (optimize) %OptimizeFunctionOnNextCall(closure); if (optimize) %OptimizeFunctionOnNextCall(closure);
closure(); closure();
} }
......
...@@ -9,6 +9,7 @@ function bar(a) { ...@@ -9,6 +9,7 @@ function bar(a) {
return x == undefined; return x == undefined;
} }
%PrepareFunctionForOptimization(bar);
// Make the keyed load be polymorphic on holey smi and holey fast. // Make the keyed load be polymorphic on holey smi and holey fast.
bar([, 2, 3]); bar([, 2, 3]);
bar([, 'two', 'three']); bar([, 'two', 'three']);
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
return 23; return 23;
} while(false) } while(false)
} }
%PrepareFunctionForOptimization(f);
assertEquals(23, f()); assertEquals(23, f());
assertEquals(23, f()); assertEquals(23, f());
})(); })();
...@@ -24,6 +25,7 @@ ...@@ -24,6 +25,7 @@
} while(false) } while(false)
return 999; return 999;
} }
%PrepareFunctionForOptimization(g);
var gen = g(); var gen = g();
assertEquals({ value:23, done:false }, gen.next()); assertEquals({ value:23, done:false }, gen.next());
assertEquals({ value:42, done:false }, gen.next()); assertEquals({ value:42, done:false }, gen.next());
......
...@@ -20,6 +20,7 @@ function f(osr_and_recurse) { ...@@ -20,6 +20,7 @@ function f(osr_and_recurse) {
} }
return 65; return 65;
} }
%PrepareFunctionForOptimization(f);
assertEquals(65, f(false)); assertEquals(65, f(false));
assertEquals(65, f(false)); assertEquals(65, f(false));
assertEquals(42, f(true)); assertEquals(42, f(true));
...@@ -15,6 +15,7 @@ var f = (function() { ...@@ -15,6 +15,7 @@ var f = (function() {
} }
} }
})(); })();
%PrepareFunctionForOptimization(f);
g = (function() { f((Array), counter()); }); g = (function() { f((Array), counter()); });
g(); g();
...@@ -8,6 +8,7 @@ function get(a, i) { ...@@ -8,6 +8,7 @@ function get(a, i) {
return a[i]; return a[i];
} }
%PrepareFunctionForOptimization(get);
get([1,,3], 0); get([1,,3], 0);
get([1,,3], 2); get([1,,3], 2);
%OptimizeFunctionOnNextCall(get); %OptimizeFunctionOnNextCall(get);
......
...@@ -8,6 +8,7 @@ function get(a, i) { ...@@ -8,6 +8,7 @@ function get(a, i) {
return a[i]; return a[i];
} }
%PrepareFunctionForOptimization(get);
get([1,,3], 0); get([1,,3], 0);
get([1,,3], 2); get([1,,3], 2);
%OptimizeFunctionOnNextCall(get); %OptimizeFunctionOnNextCall(get);
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
function foo(x) { function foo(x) {
return Symbol.iterator == x; return Symbol.iterator == x;
} }
%PrepareFunctionForOptimization(foo);
function main() { function main() {
foo(Symbol()); foo(Symbol());
......
...@@ -8,6 +8,7 @@ var o = {}; ...@@ -8,6 +8,7 @@ var o = {};
function foo(s) { return o[s]; } function foo(s) { return o[s]; }
%PrepareFunctionForOptimization(foo);
var s = 'c' + 'c'; var s = 'c' + 'c';
foo(s); foo(s);
foo(s); foo(s);
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
(function() { (function() {
function foo(o) { o["x"] = 1; } function foo(o) { o["x"] = 1; }
%PrepareFunctionForOptimization(foo);
assertThrows(() => foo(undefined)); assertThrows(() => foo(undefined));
assertThrows(() => foo(undefined)); assertThrows(() => foo(undefined));
%OptimizeFunctionOnNextCall(foo); %OptimizeFunctionOnNextCall(foo);
...@@ -17,6 +18,7 @@ ...@@ -17,6 +18,7 @@
(function() { (function() {
function foo(o) { o["x"] = 1; } function foo(o) { o["x"] = 1; }
%PrepareFunctionForOptimization(foo);
assertThrows(() => foo(null)); assertThrows(() => foo(null));
assertThrows(() => foo(null)); assertThrows(() => foo(null));
%OptimizeFunctionOnNextCall(foo); %OptimizeFunctionOnNextCall(foo);
...@@ -27,6 +29,7 @@ ...@@ -27,6 +29,7 @@
(function() { (function() {
function foo(o) { return o["x"]; } function foo(o) { return o["x"]; }
%PrepareFunctionForOptimization(foo);
assertThrows(() => foo(undefined)); assertThrows(() => foo(undefined));
assertThrows(() => foo(undefined)); assertThrows(() => foo(undefined));
%OptimizeFunctionOnNextCall(foo); %OptimizeFunctionOnNextCall(foo);
...@@ -37,6 +40,7 @@ ...@@ -37,6 +40,7 @@
(function() { (function() {
function foo(o) { return o["x"]; } function foo(o) { return o["x"]; }
%PrepareFunctionForOptimization(foo);
assertThrows(() => foo(null)); assertThrows(() => foo(null));
assertThrows(() => foo(null)); assertThrows(() => foo(null));
%OptimizeFunctionOnNextCall(foo); %OptimizeFunctionOnNextCall(foo);
...@@ -47,6 +51,7 @@ ...@@ -47,6 +51,7 @@
(function() { (function() {
function foo(o) { o.x = 1; } function foo(o) { o.x = 1; }
%PrepareFunctionForOptimization(foo);
assertThrows(() => foo(undefined)); assertThrows(() => foo(undefined));
assertThrows(() => foo(undefined)); assertThrows(() => foo(undefined));
%OptimizeFunctionOnNextCall(foo); %OptimizeFunctionOnNextCall(foo);
...@@ -57,6 +62,7 @@ ...@@ -57,6 +62,7 @@
(function() { (function() {
function foo(o) { o.x = 1; } function foo(o) { o.x = 1; }
%PrepareFunctionForOptimization(foo);
assertThrows(() => foo(null)); assertThrows(() => foo(null));
assertThrows(() => foo(null)); assertThrows(() => foo(null));
%OptimizeFunctionOnNextCall(foo); %OptimizeFunctionOnNextCall(foo);
...@@ -67,6 +73,7 @@ ...@@ -67,6 +73,7 @@
(function() { (function() {
function foo(o) { return o.x; } function foo(o) { return o.x; }
%PrepareFunctionForOptimization(foo);
assertThrows(() => foo(undefined)); assertThrows(() => foo(undefined));
assertThrows(() => foo(undefined)); assertThrows(() => foo(undefined));
%OptimizeFunctionOnNextCall(foo); %OptimizeFunctionOnNextCall(foo);
...@@ -77,6 +84,7 @@ ...@@ -77,6 +84,7 @@
(function() { (function() {
function foo(o) { return o.x; } function foo(o) { return o.x; }
%PrepareFunctionForOptimization(foo);
assertThrows(() => foo(null)); assertThrows(() => foo(null));
assertThrows(() => foo(null)); assertThrows(() => foo(null));
%OptimizeFunctionOnNextCall(foo); %OptimizeFunctionOnNextCall(foo);
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
function foo(o) { return o.x; } function foo(o) { return o.x; }
%PrepareFunctionForOptimization(foo);
assertEquals(undefined, foo({})); assertEquals(undefined, foo({}));
assertEquals(undefined, foo(1)); assertEquals(undefined, foo(1));
assertEquals(undefined, foo({})); assertEquals(undefined, foo({}));
......
...@@ -8,6 +8,7 @@ function foo(s) { ...@@ -8,6 +8,7 @@ function foo(s) {
return s[5]; return s[5];
} }
%PrepareFunctionForOptimization(foo);
assertEquals("f", foo("abcdef")); assertEquals("f", foo("abcdef"));
assertEquals(undefined, foo("a")); assertEquals(undefined, foo("a"));
%OptimizeFunctionOnNextCall(foo); %OptimizeFunctionOnNextCall(foo);
...@@ -19,6 +20,7 @@ assertOptimized(foo); ...@@ -19,6 +20,7 @@ assertOptimized(foo);
String.prototype[5] = "5"; String.prototype[5] = "5";
assertEquals("f", foo("abcdef")); assertEquals("f", foo("abcdef"));
%PrepareFunctionForOptimization(foo);
assertEquals("5", foo("a")); assertEquals("5", foo("a"));
%OptimizeFunctionOnNextCall(foo); %OptimizeFunctionOnNextCall(foo);
assertEquals("f", foo("abcdef")); assertEquals("f", foo("abcdef"));
......
...@@ -8,6 +8,7 @@ function foo(s) { ...@@ -8,6 +8,7 @@ function foo(s) {
return s[5]; return s[5];
} }
%PrepareFunctionForOptimization(foo);
assertEquals("f", foo("abcdef")); assertEquals("f", foo("abcdef"));
assertEquals(undefined, foo("a")); assertEquals(undefined, foo("a"));
%OptimizeFunctionOnNextCall(foo); %OptimizeFunctionOnNextCall(foo);
...@@ -23,6 +24,7 @@ String.prototype.__proto__ = new Proxy(String.prototype.__proto__, { ...@@ -23,6 +24,7 @@ String.prototype.__proto__ = new Proxy(String.prototype.__proto__, {
}); });
assertEquals("f", foo("abcdef")); assertEquals("f", foo("abcdef"));
%PrepareFunctionForOptimization(foo);
assertEquals("5", foo("a")); assertEquals("5", foo("a"));
%OptimizeFunctionOnNextCall(foo); %OptimizeFunctionOnNextCall(foo);
assertEquals("f", foo("abcdef")); assertEquals("f", foo("abcdef"));
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment