Source code

Revision control

Copy as Markdown

Other Tools

// Test branch hinting with nested if.
var imports = { "":{inc() { counter++ }} };
counter = 0;
let module = new WebAssembly.Module(wasmTextToBinary(`(module
(import "" "inc" (func (result i32)))
(func
(result i32)
(@metadata.code.branch_hint "\\00") (if (result i32)
(i32.const 1)
(then
(@metadata.code.branch_hint "\\00") (if (result i32)
(i32.const 2)
(then
(@metadata.code.branch_hint "\\00") (if (result i32)
(i32.const 3)
(then
(@metadata.code.branch_hint "\\00") (if (result i32)
(i32.const 0)
(then (call 0))
(else (i32.const 42))
)
)
(else (call 0))
)
)
(else (call 0))
)
)
(else (call 0))
)
)
(export "run" (func 1))
)`, 42, imports));
assertEq(counter, 0);
assertEq(wasmParsedBranchHints(module), true);
let instance = new WebAssembly.Instance(module, imports);
instance.exports.run(42);
module = new WebAssembly.Module(wasmTextToBinary(`
(module
(func $dummy)
(func (export "nested") (param i32 i32) (result i32)
(if (result i32) (local.get 0)
(then
(if (local.get 1) (then (call $dummy) (block) (nop)))
(if (local.get 1) (then) (else (call $dummy) (block) (nop)))
(@metadata.code.branch_hint "\\01")
(if (result i32) (local.get 1)
(then (call $dummy) (i32.const 9))
(else (call $dummy) (i32.const 10))
)
)
(else
(if (local.get 1) (then (call $dummy) (block) (nop)))
(if (local.get 1) (then) (else (call $dummy) (block) (nop)))
(@metadata.code.branch_hint "\\00")
(if (result i32) (local.get 1)
(then (call $dummy) (i32.const 10))
(else (call $dummy) (i32.const 11))
)
)
)
)
)`));
assertEq(wasmParsedBranchHints(module), true);
instance = new WebAssembly.Instance(module, imports);
instance.exports.nested(2, 5);
// Test that branch hinting can propagate to successor blocks.
module = new WebAssembly.Module(wasmTextToBinary(`
(module
(func (export "main") (param $x i32) (result i32)
(if (result i32)
(i32.gt_s (local.get $x) (i32.const 0))
(then
(@metadata.code.branch_hint "\\00")
(if (result i32)
(i32.eq (local.get $x) (i32.const 1))
(then
(i32.const 10)
)
(else
(if (result i32)
(i32.eq (local.get $x) (i32.const 2))
(then
(i32.const 20)
)
(else
(i32.const 99)
)
)
)
)
)
(else
(i32.const 0)
)
)
)
)`));
assertEq(wasmParsedBranchHints(module), true);
instance = new WebAssembly.Instance(module, imports);
instance.exports.main(2);
// Test that the nested if branch has the correct branch hinting likelyness.
module = new WebAssembly.Module(wasmTextToBinary(`
(module
(func (export "main") (param $x i32) (result i32)
(if (result i32)
(i32.gt_s (local.get $x) (i32.const 0))
(then
(@metadata.code.branch_hint "\\01")
(if (result i32)
(i32.eq (local.get $x) (i32.const 1))
(then
(i32.const 10)
)
(else
(@metadata.code.branch_hint "\\00")
(if (result i32)
(i32.eq (local.get $x) (i32.const 2))
(then
(i32.const 20)
)
(else
(i32.const 99)
)
)
)
)
)
(else
(i32.const 0)
)
)
)
)`));
assertEq(wasmParsedBranchHints(module), true);
instance = new WebAssembly.Instance(module, imports);
instance.exports.main(5);