v8/test/js-perf-test/Array/map.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

64 lines
1.9 KiB
JavaScript

// Copyright 2017 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 NaiveMap() {
let index = -1
const length = array == null ? 0 : array.length
const result = new Array(length)
while (++index < length) {
result[index] = func(array[index], index, array)
}
return result
}
function NaiveMapSetup() {
// Prime NaiveMap with polymorphic cases.
array = [1, 2, 3];
NaiveMap();
NaiveMap();
array = [3.4]; NaiveMap();
array = new Array(10); array[0] = 'hello'; NaiveMap();
SmiSetup();
delete array[1];
}
// Make sure we inline the callback, pick up all possible TurboFan
// optimizations.
function RunOptFastMap(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.map((v, i, a) => v + ' ' + multiple);
}
// Don't optimize because I want to optimize RunOptFastMap with a parameter
// to be used in the callback.
%NeverOptimizeFunction(OptFastMap);
function OptFastMap() { RunOptFastMap(3); }
function side_effect(a) { return a; }
%NeverOptimizeFunction(side_effect);
function OptUnreliableMap() {
result = array.map(func, side_effect(array));
}
DefineHigherOrderTests([
// name, test function, setup function, user callback
"NaiveMapReplacement", NaiveMap, NaiveMapSetup, v => v,
"SmiMap", mc("map"), SmiSetup, v => v,
"DoubleMap", mc("map"), DoubleSetup, v => v,
"FastMap", mc("map"), FastSetup, v => v,
"SmallSmiToDoubleMap", mc("map"), SmiSetup, v => v + 0.5,
"SmallSmiToFastMap", mc("map"), SmiSetup, v => "hi" + v,
"GenericMap", mc("map", true), ObjectSetup, v => v,
"OptFastMap", OptFastMap, FastSetup, undefined,
"OptUnreliableMap", OptUnreliableMap, FastSetup, v => v
]);
})();