Source code

Revision control

Copy as Markdown

Other Tools

// Move a nested if out of line.
let module = new WebAssembly.Module(wasmTextToBinary(`
(module
(type (;0;) (func))
(type (;1;) (func (param i32) (result i32)))
(type (;2;) (func (result i32)))
(func $__wasm_nullptr (type 0)
unreachable)
(func $main (type 2) (result i32)
(local i32 i32 i32 i32)
i32.const 0
local.tee 2
local.set 3
loop
local.get 2
i32.const 50000
i32.eq
(@metadata.code.branch_hint "\\00") if
i32.const 1
local.set 3
end
local.get 2
i32.const 1
i32.add
local.tee 2
i32.const 100000
i32.ne
(@metadata.code.branch_hint "\\01") br_if 0 (;@1;)
end
local.get 3)
(table (;0;) 1 1 funcref)
(memory (;0;) 17 128)
(global (;0;) (mut i32) (i32.const 42))
(export "memory" (memory 0))
(export "_main" (func $main))
(elem (;0;) (i32.const 0) func $__wasm_nullptr)
(type (;0;) (func (param i32)))
)`));
assertEq(wasmParsedBranchHints(module), true);
let instance = new WebAssembly.Instance(module);
instance.exports._main(10);
// A loop with unlikely blocks in the middle.
let m = new WebAssembly.Module(wasmTextToBinary(`
(module
(type (;0;) (func (param i32)))
(memory (;0;) 1 1)
(func $test (param i32)
(local i32)
loop
local.get 1
local.get 0
i32.const 1
i32.sub
i32.eq
(@metadata.code.branch_hint "\\00")
if
local.get 1
call $test
end
local.get 1
local.get 0
i32.const 2
i32.sub
i32.eq
(@metadata.code.branch_hint "\\00")
if
local.get 1
call $test
end
local.get 1
i32.const 1
i32.add
local.tee 1
local.get 0
i32.lt_u
br_if 0
end
return
)
(export "test" (func $test))
)`));
assertEq(wasmParsedBranchHints(m), true);
instance = new WebAssembly.Instance(m);
instance.exports.test(10);