Source code
Revision control
Copy as Markdown
Other Tools
// |jit-test| test-also=--setpref=wasm_unroll_loops=true
// Loop unrolling test: 2 exiting values, 1 exit target => can be unrolled.
// `a` and `b` are swapped every iteration and correct unrolling depends on
// the phi nodes being treated as parallel assignments.
let t = `
(module
(func (export "f1") (param $limit i32) (result i64)
(local $a i64)
(local $b i64)
(local $tmp i64)
(local $x i32)
(local.set $a (i64.const 12345))
(local.set $b (i64.const 67890))
(loop $cont
;; swap a and b
(local.set $tmp (local.get $a))
(local.set $a (local.get $b))
(local.set $b (local.get $tmp))
;; x = x + 1
(local.set $x (i32.add (local.get $x) (i32.const 1)))
;;
(br_if $cont (i32.lt_u (local.get $x) (local.get $limit)))
)
(i64.sub (local.get $a) (local.get $b))
)
)`;
let i = new WebAssembly.Instance(new WebAssembly.Module(wasmTextToBinary(t)));
assertEq(i.exports.f1(100), -55545n);
assertEq(i.exports.f1(101), 55545n);