diff options
Diffstat (limited to '')
-rw-r--r-- | js/xpconnect/tests/unit/test_wasm_tailcalls_profiler.js | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/js/xpconnect/tests/unit/test_wasm_tailcalls_profiler.js b/js/xpconnect/tests/unit/test_wasm_tailcalls_profiler.js new file mode 100644 index 0000000000..64f29b9510 --- /dev/null +++ b/js/xpconnect/tests/unit/test_wasm_tailcalls_profiler.js @@ -0,0 +1,122 @@ +Services.prefs.setBoolPref("javascript.options.wasm_tail_calls", true); +registerCleanupFunction(() => { + Services.prefs.clearUserPref("javascript.options.wasm_tail_calls"); +}); + +// The tests runs code in tight loop with the profiler enabled. It is testing +// behavoir of MacroAssembler::wasmCollapseFrameXXXX methods. +// It is not guarantee 100% hit since the profiler probes stacks every 1ms, +// but it will happen often enough. +add_task(async () => { + await Services.profiler.StartProfiler(10, 1, ["js"], ["GeckoMain"]); + Assert.ok(Services.profiler.IsActive()); + +/* Wasm module that is tested: +(module + (func $f (param i64 i64 i64 i64 i64 i64 i64 i64 i64) + local.get 0 + i64.eqz + br_if 0 + local.get 0 + return_call $g + ) + (func $g (param i64) + local.get 0 + i64.const 1 + i64.sub + i64.const 2 + i64.const 6 + i64.const 3 + i64.const 4 + i64.const 1 + i64.const 2 + i64.const 6 + i64.const 3 + return_call $f + ) + (func (export "run") + i64.const 0x100000 + call $g + ) +) +*/ + + const b = new Uint8Array([ + 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x14, 0x03, 0x60, + 0x09, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x00, 0x60, + 0x01, 0x7e, 0x00, 0x60, 0x00, 0x00, 0x03, 0x04, 0x03, 0x00, 0x01, 0x02, + 0x07, 0x07, 0x01, 0x03, 0x72, 0x75, 0x6e, 0x00, 0x02, 0x0a, 0x31, 0x03, + 0x0b, 0x00, 0x20, 0x00, 0x50, 0x0d, 0x00, 0x20, 0x00, 0x12, 0x01, 0x0b, + 0x19, 0x00, 0x20, 0x00, 0x42, 0x01, 0x7d, 0x42, 0x02, 0x42, 0x06, 0x42, + 0x03, 0x42, 0x04, 0x42, 0x01, 0x42, 0x02, 0x42, 0x06, 0x42, 0x03, 0x12, + 0x00, 0x0b, 0x09, 0x00, 0x42, 0x80, 0x80, 0xc0, 0x00, 0x10, 0x01, 0x0b + ]); + const ins = new WebAssembly.Instance(new WebAssembly.Module(b)); + for (var i = 0; i < 100; i++) { + ins.exports.run(); + } + + Assert.ok(true, "Done"); + await Services.profiler.StopProfiler(); +}); + +add_task(async () => { + await Services.profiler.StartProfiler(10, 1, ["js"], ["GeckoMain"]); + Assert.ok(Services.profiler.IsActive()); + +/* Wasm modules that are tested: +(module (func (export "t"))) + +(module + (import "" "t" (func $g)) + (table $t 1 1 funcref) + + (func $f (return_call_indirect $t (i32.const 0))) + (func (export "run") (param i64) + loop + local.get 0 + i64.eqz + br_if 1 + call $f + local.get 0 + i64.const 1 + i64.sub + local.set 0 + br 0 + end + ) + (elem (i32.const 0) $g) +) +*/ + const b0 = new Uint8Array([ + 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0x60, + 0x00, 0x00, 0x03, 0x02, 0x01, 0x00, 0x07, 0x05, 0x01, 0x01, 0x74, 0x00, + 0x00, 0x0a, 0x04, 0x01, 0x02, 0x00, 0x0b + ]); + const ins0 = new WebAssembly.Instance(new WebAssembly.Module(b0)); + const b = new Uint8Array([ + 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x02, 0x60, + 0x00, 0x00, 0x60, 0x01, 0x7e, 0x00, 0x02, 0x06, 0x01, 0x00, 0x01, 0x74, + 0x00, 0x00, 0x03, 0x03, 0x02, 0x00, 0x01, 0x04, 0x05, 0x01, 0x70, 0x01, + 0x01, 0x01, 0x07, 0x07, 0x01, 0x03, 0x72, 0x75, 0x6e, 0x00, 0x02, 0x09, + 0x07, 0x01, 0x00, 0x41, 0x00, 0x0b, 0x01, 0x00, 0x0a, 0x1f, 0x02, 0x07, + 0x00, 0x41, 0x00, 0x13, 0x00, 0x00, 0x0b, 0x15, 0x00, 0x03, 0x40, 0x20, + 0x00, 0x50, 0x0d, 0x01, 0x10, 0x01, 0x20, 0x00, 0x42, 0x01, 0x7d, 0x21, + 0x00, 0x0c, 0x00, 0x0b, 0x0b + ]); + const ins = new WebAssembly.Instance(new WebAssembly.Module(b), {"": {t: ins0.exports.t,},}); + for (var i = 0; i < 100; i++) { + ins.exports.run(0x100000n); + } + + Assert.ok(true, "Done"); + await Services.profiler.StopProfiler(); +}); + +/** + * All the tests are implemented with add_task, this starts them automatically. + */ +function run_test() { + do_get_profile(); + run_next_test(); +} |