[test] Add %PrepareForOptimization to more tests

With bytecode flushing and lazy feedback allocation, we need to call
%PrepareForOptimization before we call %OptimizeFunctionOnNextCall,
ideally after declaring the function.

Bug: v8:8801, v8:8394, v8:9183
Change-Id: I6bf119e726426df8527d97546b6ce806112c894d
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1643167
Auto-Submit: Mathias Bynens <mathias@chromium.org>
Reviewed-by: Mythri Alle <mythria@chromium.org>
Commit-Queue: Mathias Bynens <mathias@chromium.org>
Cr-Commit-Position: refs/heads/master@{#61988}
This commit is contained in:
Mathias Bynens 2019-06-04 09:08:55 +02:00 committed by Commit Bot
parent 003473e6fd
commit 61ce45c9e2
14 changed files with 142 additions and 82 deletions

View File

@ -38,6 +38,7 @@ function f() {
return elem2;
}
%PrepareFunctionForOptimization(f);
f(); f(); f();
%OptimizeFunctionOnNextCall(f);
var result = f();
@ -54,6 +55,7 @@ function doubles() {
return elem2;
}
%PrepareFunctionForOptimization(doubles);
doubles(); doubles(); doubles();
%OptimizeFunctionOnNextCall(doubles);
result = doubles();
@ -70,6 +72,7 @@ function doubles_int() {
return elem2;
}
%PrepareFunctionForOptimization(doubles_int);
doubles_int(); doubles_int(); doubles_int();
%OptimizeFunctionOnNextCall(doubles_int);
result = doubles_int();
@ -91,6 +94,7 @@ function branch_int(left) {
return elem2;
}
%PrepareFunctionForOptimization(branch_int);
branch_int(1); branch_int(1); branch_int(1);
%OptimizeFunctionOnNextCall(branch_int);
result = branch_int(1);
@ -110,6 +114,7 @@ function boom() {
return [ a1, a2, a3 ];
}
%PrepareFunctionForOptimization(boom);
boom(); boom(); boom();
%OptimizeFunctionOnNextCall(boom);
boom();

View File

@ -36,6 +36,7 @@
}
var y = invoker(m, selfOf);
%PrepareFunctionForOptimization(y);
function selfOf(c) {
var sssss = c.self_;
@ -67,6 +68,7 @@
return f.apply(deopt(), arguments);
};
%PrepareFunctionForOptimization(XXXXX);
XXXXX();
XXXXX();
XXXXX();

View File

@ -45,6 +45,7 @@ function test_do_not_assert_on_non_int32(vector, base) {
}
return r;
}
%PrepareFunctionForOptimization(test_do_not_assert_on_non_int32);
test_do_not_assert_on_non_int32(v,1);
test_do_not_assert_on_non_int32(v,1);
test_do_not_assert_on_non_int32(v,"a");
@ -86,7 +87,7 @@ function check_test_base(a, base, condition) {
}
}
%PrepareFunctionForOptimization(test_base);
test_base(a, 1, true);
test_base(a, 2, true);
test_base(a, 1, false);
@ -153,6 +154,7 @@ function check_test_minus(base,cond) {
}
}
%PrepareFunctionForOptimization(test_minus);
test_minus(5,true);
test_minus(6,true);
%OptimizeFunctionOnNextCall(test_minus);
@ -190,6 +192,7 @@ function test_phi(a, base, check) {
result += a[index - 1];
return result;
}
%PrepareFunctionForOptimization(test_phi);
var result_phi = 0;
result_phi = test_phi(data_phi, 3, true);
assertEquals(12, result_phi);
@ -218,6 +221,7 @@ function test_composition(a, base0, check) {
return result;
}
%PrepareFunctionForOptimization(test_composition);
var result_composition = 0;
result_composition = test_composition(data_composition_long, 2);
assertEquals(19, result_composition);

View File

@ -32,6 +32,8 @@ function TestNonSmiArrayLength() {
return a.length+1;
}
%PrepareFunctionForOptimization(f);
var a = [];
a.length = 0xFFFF;
assertSame(0x10000, f(a));

View File

@ -131,6 +131,7 @@
return v;
}
%PrepareFunctionForOptimization(f);
var a = [true, true, true, true]
assertEquals(1, f(a, false));
assertEquals(1, f(a, false));

View File

@ -135,7 +135,7 @@
function f(a, i) {
a.push(i);
}
%PrepareFunctionForOptimization(f);
var a = [1,2,3];
a.f = function() { return 10; }
f(a, 4);

View File

@ -42,6 +42,7 @@ v = 0;
function push_wrapper_1(array, value) {
array.push(value);
}
%PrepareFunctionForOptimization(push_wrapper_1);
array = [];
array.__proto__ = my_array_proto;
push_wrapper_1(array, 100);

View File

@ -8,6 +8,8 @@ function push_wrapper(array, value) {
array.push(value);
}
%PrepareFunctionForOptimization(push_wrapper);
// Test that optimization of Array.push() for non-Arrays works correctly.
var object = { x : 8, length: 3 };
object[18] = 5;

View File

@ -7,9 +7,12 @@
function push_wrapper(array, value) {
array.push(value);
}
%PrepareFunctionForOptimization(push_wrapper);
function pop_wrapper(array) {
return array.pop();
}
%PrepareFunctionForOptimization(pop_wrapper);
// Test the frzon arrays throw an exception if you try to push to them, both in
// optimized and non-optimized code.

View File

@ -571,7 +571,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
let f = (a,current) => a + current;
let g = function(a) {
return a.reduce(f);
}
};
%PrepareFunctionForOptimization(g);
let a = [1,2,3,4,5,6,7,8,9,10];
g(a); g(a);
let total = g(a);
@ -583,7 +584,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
let f = (a,current) => a + current;
let g = function(a) {
return a.reduce(f);
}
};
%PrepareFunctionForOptimization(g);
let a = [1,2,3,4,5,6,7,8,9,10];
g(a); g(a); g(a);
%OptimizeFunctionOnNextCall(g);
@ -596,7 +598,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
let f = (a,current) => { if (deopt) %DeoptimizeNow(); return a + current; };
let g = function(a) {
return a.reduce(f);
}
};
%PrepareFunctionForOptimization(g);
let a = [1,2,3,4,5,6,7,8,9,10];
g(a); g(a);
let total = g(a);
@ -614,7 +617,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
};
let g = function(a) {
return a.reduce(f);
}
};
%PrepareFunctionForOptimization(g);
let a = [11,22,33,45,56,6,77,84,93,101];
g(a); g(a);
let total = g(a);
@ -633,7 +637,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
};
let g = function() {
return array.reduce(f);
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -657,7 +662,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
};
let g = function() {
return array.reduce(f);
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -675,7 +681,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
(function TriggerReduceRightPreLoopDeopt() {
function f(a) {
a.reduceRight((x) => { return x + 1 });
}
};
%PrepareFunctionForOptimization(f);
f([1,2,]);
f([1,2,]);
%OptimizeFunctionOnNextCall(f);
@ -691,7 +698,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
};
let g = function() {
return array.reduceRight(f);
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -715,7 +723,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
return array.reduce(f);
} catch (e) {
}
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -737,7 +746,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
} catch (e) {
return null;
}
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -768,7 +778,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
} catch (e) {
return null;
}
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -799,7 +810,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
} finally {
if (done) return null;
}
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -831,7 +843,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
} finally {
if (done) return null;
}
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -856,7 +869,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
let array = [1,2,3];
let g = function() {
return array.reduce(f);
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -882,7 +896,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
} catch (e) {
if (done) return null;
}
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -916,7 +931,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
} finally {
if (done) return null;
}
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -939,7 +955,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
let g = function(a) {
count = 0;
return a.reduceRight(f);
}
};
%PrepareFunctionForOptimization(g);
let a = [1,2,3,4,5,6,7,8,9,10];
g(a); g(a);
let total = g(a);
@ -953,7 +970,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
let g = function(a) {
count = 0;
return a.reduceRight(f);
}
};
%PrepareFunctionForOptimization(g);
let a = [1,2,3,4,5,6,7,8,9,10];
g(a); g(a); g(a);
%OptimizeFunctionOnNextCall(g);
@ -966,7 +984,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
let f = (a,current) => { if (deopt) %DeoptimizeNow(); return a + current; };
let g = function(a) {
return a.reduceRight(f);
}
};
%PrepareFunctionForOptimization(g);
let a = [1,2,3,4,5,6,7,8,9,10];
g(a); g(a);
let total = g(a);
@ -984,7 +1003,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
};
let g = function(a) {
return a.reduceRight(f);
}
};
%PrepareFunctionForOptimization(g);
let a = [11,22,33,45,56,6,77,84,93,101];
g(a); g(a);
let total = g(a);
@ -1003,7 +1023,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
};
let g = function() {
return array.reduceRight(f);
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -1027,7 +1048,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
return array.reduceRight(f);
} catch (e) {
}
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -1049,7 +1071,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
} catch (e) {
return null;
}
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -1080,7 +1103,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
} catch (e) {
return null;
}
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -1111,7 +1135,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
} finally {
if (done) return null;
}
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -1143,7 +1168,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
} finally {
if (done) return null;
}
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -1168,7 +1194,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
let array = [1,2,3];
let g = function() {
return array.reduceRight(f);
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -1194,7 +1221,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
} catch (e) {
if (done) return null;
}
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -1228,7 +1256,8 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
} finally {
if (done) return null;
}
}
};
%PrepareFunctionForOptimization(g);
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
@ -1246,71 +1275,76 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
})();
(function ReduceHoleyArrayWithDefaultAccumulator() {
var __v_12258 = new Array(10);
function __f_3253(a) {
let __f_3252 = function(accumulator, currentValue) {
var holey = new Array(10);
function reduce(a) {
let callback = function(accumulator, currentValue) {
return currentValue;
}
return a.reduce(__f_3252, 13);
}
assertEquals(13, __f_3253(__v_12258));
assertEquals(13, __f_3253(__v_12258));
assertEquals(13, __f_3253(__v_12258));
%OptimizeFunctionOnNextCall(__f_3253);
assertEquals(13, __f_3253(__v_12258));
};
return a.reduce(callback, 13);
};
%PrepareFunctionForOptimization(reduce);
assertEquals(13, reduce(holey));
assertEquals(13, reduce(holey));
assertEquals(13, reduce(holey));
%OptimizeFunctionOnNextCall(reduce);
assertEquals(13, reduce(holey));
})();
(function ReduceRightHoleyArrayWithDefaultAccumulator() {
var __v_12258 = new Array(10);
function __f_3253(a) {
let __f_3252 = function(accumulator, currentValue) {
var holey = new Array(10);
function reduce(a) {
let callback = function(accumulator, currentValue) {
return currentValue;
}
return a.reduceRight(__f_3252, 13);
}
assertEquals(13, __f_3253(__v_12258));
assertEquals(13, __f_3253(__v_12258));
assertEquals(13, __f_3253(__v_12258));
%OptimizeFunctionOnNextCall(__f_3253);
assertEquals(13, __f_3253(__v_12258));
};
return a.reduceRight(callback, 13);
};
%PrepareFunctionForOptimization(reduce);
assertEquals(13, reduce(holey));
assertEquals(13, reduce(holey));
assertEquals(13, reduce(holey));
%OptimizeFunctionOnNextCall(reduce);
assertEquals(13, reduce(holey));
})();
(function ReduceHoleyArrayOneElementWithDefaultAccumulator() {
var __v_12258 = new Array(10);
__v_12258[1] = 5;
function __f_3253(a) {
let __f_3252 = function(accumulator, currentValue) {
var holey = new Array(10);
holey[1] = 5;
function reduce(a) {
let callback = function(accumulator, currentValue) {
return currentValue + accumulator;
}
return a.reduce(__f_3252, 13);
}
assertEquals(18, __f_3253(__v_12258));
assertEquals(18, __f_3253(__v_12258));
assertEquals(18, __f_3253(__v_12258));
%OptimizeFunctionOnNextCall(__f_3253);
assertEquals(18, __f_3253(__v_12258));
};
return a.reduce(callback, 13);
};
%PrepareFunctionForOptimization(reduce);
assertEquals(18, reduce(holey));
assertEquals(18, reduce(holey));
assertEquals(18, reduce(holey));
%OptimizeFunctionOnNextCall(reduce);
assertEquals(18, reduce(holey));
})();
(function ReduceRightHoleyArrayOneElementWithDefaultAccumulator() {
var __v_12258 = new Array(10);
__v_12258[1] = 5;
function __f_3253(a) {
let __f_3252 = function(accumulator, currentValue) {
var holey = new Array(10);
holey[1] = 5;
function reduce(a) {
let callback = function(accumulator, currentValue) {
return currentValue + accumulator;
}
return a.reduceRight(__f_3252, 13);
}
assertEquals(18, __f_3253(__v_12258));
assertEquals(18, __f_3253(__v_12258));
assertEquals(18, __f_3253(__v_12258));
%OptimizeFunctionOnNextCall(__f_3253);
assertEquals(18, __f_3253(__v_12258));
};
return a.reduceRight(callback, 13);
};
%PrepareFunctionForOptimization(reduce);
assertEquals(18, reduce(holey));
assertEquals(18, reduce(holey));
assertEquals(18, reduce(holey));
%OptimizeFunctionOnNextCall(reduce);
assertEquals(18, reduce(holey));
})();
(function ReduceMixedHoleyArrays() {
function r(a) {
return a.reduce((acc, i) => {acc[0]});
}
};
%PrepareFunctionForOptimization(r);
r([[0]]);
r([[0]]);
r([0,,]);

View File

@ -12,9 +12,11 @@ var f = (function() {
return foo;
})();
%PrepareFunctionForOptimization(f);
function deopt(f) {
return {
toString : function() {
toString: function() {
%DeoptimizeFunction(f);
return "2";
}

View File

@ -70,6 +70,7 @@ function f(x, len) {
}
}
%PrepareFunctionForOptimization(f);
f(0, 10);
f(0, 10);
%OptimizeFunctionOnNextCall(f);

View File

@ -10,13 +10,15 @@ function __f_2(o) {
return o.field.b.x;
}
%PrepareFunctionForOptimization(__f_2);
try {
%OptimizeFunctionOnNextCall(__f_2);
__v_1 = __f_2();
} catch(e) { }
} catch (e) { }
function __f_3() { __f_3(/./.test()); };
try {
__f_3();
} catch(e) { }
__f_3();
} catch (e) { }

View File

@ -12,6 +12,7 @@ function __f_17(__v_16, base) {
__v_16[base + 1] = 1;
__v_16[base + 4] = base + 4;
}
%PrepareFunctionForOptimization(__f_17);
__f_17(__v_16, true);
__f_17(__v_16, 14);
%OptimizeFunctionOnNextCall(__f_17);