v8/test/js-perf-test/Array/for-each.js
Mike Stanton fb922b1764 [TurboFan] Allow unreliable maps in array builtins
We don't currently inline array builtins if we detect any side effects
between the load of the receiver map and the call to the builtin.
The introduction of a map check allows us to be more permissive.

Bug: v8:7250
Change-Id: I6b3f9243f6506eff45c0d727c47a7e8cb8765640
Reviewed-on: https://chromium-review.googlesource.com/849005
Commit-Queue: Michael Stanton <mvstanton@chromium.org>
Reviewed-by: Tobias Tebbi <tebbi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#50620}
2018-01-16 14:01:29 +00:00

63 lines
1.9 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.
(() => {
function Naive() {
let index = -1;
const length = array == null ? 0 : array.length;
for (let index = 0; index < length; index++) {
const value = array[index];
if (func(value, index, array)) {
result = value;
break;
}
}
}
function NaiveSetup() {
// Prime Naive with polymorphic cases.
array = [1, 2, 3];
Naive();
Naive();
array = [3.4]; Naive();
array = new Array(10); array[0] = 'hello'; Naive();
SmiSetup();
delete array[1];
}
// Make sure we inline the callback, pick up all possible TurboFan
// optimizations.
function RunOptFast(multiple) {
// Use of variable multiple in the callback function forces
// context creation without escape analysis.
//
// Also, the arrow function requires inlining based on
// SharedFunctionInfo.
result = array.forEach((v, i, a) => v === `value ${multiple}`);
}
// Don't optimize because I want to optimize RunOptFast with a parameter
// to be used in the callback.
%NeverOptimizeFunction(OptFast);
function OptFast() { RunOptFast(max_index); }
function side_effect(a) { return a; }
%NeverOptimizeFunction(side_effect);
function OptUnreliable() {
result = array.forEach(func, side_effect(array));
}
DefineHigherOrderTests([
"NaiveForEachReplacement", Naive, NaiveSetup, v => v === max_index,
"DoubleForEach", mc("forEach"), DoubleSetup, v => v === max_index + 0.5,
"SmiForEach", mc("forEach"), SmiSetup, v => v === max_index,
"FastForEach", mc("forEach"), FastSetup, v => v === `value ${max_index}`,
"GenericForEach", mc("forEach", true), ObjectSetup, v => v === max_index,
"OptFastForEach", OptFast, FastSetup, undefined,
"OptUnreliableForEach", OptUnreliable, FastSetup, v => v === `value ${max_index}`
]);
})();