v8/test/mjsunit/wasm/multiple-code-spaces.js
Clemens Backes df32131b3e [wasm] Speed up multiple-code-spaces test
TurboFan generates significantly less code than Liftoff for this test,
and depending on timing it can happen that we need to generate thousands
of functions, which takes some time and occasionally runs into timeouts.
Thus disable tier-up for this test, such that we stick with the much
longer Liftoff code, and reach the four separate code spaces quicker.

R=ahaas@chromium.org

Change-Id: I8e9a0cb466c1bdfef29aceeb5dd31aa96d05b70b
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2352490
Reviewed-by: Andreas Haas <ahaas@chromium.org>
Commit-Queue: Clemens Backes <clemensb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#69369}
2020-08-13 08:51:03 +00:00

59 lines
2.4 KiB
JavaScript

// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Flags: --allow-natives-syntax --randomize-all-allocations
// Flags: --wasm-max-initial-code-space-reservation=1
// Disable tier-up, to reduce execution time of this test (Liftoff generates
// much bigger code, thus reaches the four code spaces much faster).
// Flags: --no-wasm-tier-up
load('test/mjsunit/wasm/wasm-module-builder.js');
// Instantiate bigger modules, until at least four separate code spaces have
// been allocated.
// Each function calls through many of the previous functions to execute the
// jump table(s) sufficiently.
let num_functions = 50;
while (true) {
print(`Trying ${num_functions} functions...`);
if (num_functions > 1e6) {
throw new Error('We should have hit four code spaces by now');
}
const builder = new WasmModuleBuilder();
builder.addMemory(1, 1, false);
builder.addFunction('f0', kSig_i_i).addBody([kExprLocalGet, 0]);
// Generate some code per function to fill the code space.
// Each function contains a number of loads that will not be executed
// (inside an "if (i == 0)" block). They increase the code size a bit so we
// do not need too many functions.
// Each function f<n> with argument {i} then calls f<n/10> with argument
// {i + 1} and returns whatever that function returns.
const body_template = [
kExprLocalGet, 0, kExprI32Eqz, kExprIf, kWasmStmt, // if (i == 0)
kExprLocalGet, 0 // get i
];
for (let i = 0; i < 1000; ++i) body_template.push(kExprI32LoadMem, 0, 0);
body_template.push(
kExprDrop, kExprEnd, // end if
kExprLocalGet, 0, kExprI32Const, 1, kExprI32Add, // i + 1
kExprCallFunction // call f<?>
);
for (let i = 1; i < num_functions; ++i) {
const body = body_template.slice();
body.push(...wasmSignedLeb(Math.floor(i / 10)));
builder.addFunction('f' + i, kSig_i_i).addBody(body);
}
builder.addExport('f', num_functions - 1);
const instance = builder.instantiate();
let expected = 17;
for (let i = num_functions - 1; i > 0; i = Math.floor(i / 10)) ++expected;
assertEquals(expected, instance.exports.f(17));
const num_code_spaces = %WasmNumCodeSpaces(instance);
print(`--> ${num_code_spaces} code spaces.`);
if (num_code_spaces >= 4) break;
num_functions *= 2;
}