df32131b3e
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}
59 lines
2.4 KiB
JavaScript
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;
|
|
}
|