Source code

Revision control

Copy as Markdown

Other Tools

// |jit-test| skip-if: wasmCompileMode() != "ion"
// This test checks that MoveGroup-chaining/chasing, as implemented in bug
// 1944238, works correctly (or at least does not obviously fail). It manages
// to cause CodeGenerator::visitGoto to chain together 4 MoveGroups, which is
// very unusual (almost all inputs cause chaining of 2 or less).
let t = `
(module
(memory (export "mem") 1)
(func (export "test")
(param $x i32) (param $y i32) (param $n i32) (result i32)
(local $a i32)
(local $b i32)
(local $c i32)
(local $d i32)
(local $e i32)
(local $f i32)
(local $g i32)
(local $t i32)
(local $i i32)
(local.set $a (local.get $x))
(local.set $b (local.get $y))
(loop $cont
(local.set $a (i32.shr_u (local.get $a) (i32.const 1)))
(local.set $b (i32.add (i32.const 1)
(i32.mul (i32.const 3) (local.get $b))))
;;;;-begin-1-------------------------------;;;;
(if (i32.eq (i32.const 0) (i32.rem_u (local.get $a) (i32.const 2)))
(then
;;;;-begin-2-------------------------------;;;;
(if (i32.eq (i32.const 0) (i32.rem_u (local.get $a) (i32.const 3)))
(then
;;;;-begin-3-------------------------------;;;;
(if (i32.eq (i32.const 0) (i32.rem_u (local.get $a)
(i32.const 5)))
(then
;;;;-begin-4-------------------------------;;;;
(if (i32.eq (i32.const 0) (i32.rem_u (local.get $a)
(i32.const 7)))
(then
;;;;-begin-5-------------------------------;;;;
(if (i32.eq (i32.const 0) (i32.rem_u (local.get $a)
(i32.const 11)))
(then
;;;;-begin-6-------------------------------;;;;
(if (i32.eq (i32.const 0) (i32.rem_u (local.get $a)
(i32.const 13)))
(then
;;;;-begin-7-------------------------------;;;;
;;;;-end-7---------------------------------;;;;
(local.set $t (local.get $a))
(local.set $a (local.get $b))
(local.set $b (local.get $c))
(local.set $c (local.get $d))
(local.set $d (local.get $e))
(local.set $e (local.get $f))
(local.set $f (local.get $t))
(local.set $g (local.get $t))
)
)
;;;;-end-6---------------------------------;;;;
(local.set $t (local.get $a))
(local.set $a (local.get $b))
(local.set $b (local.get $c))
(local.set $c (local.get $d))
(local.set $d (local.get $e))
(local.set $e (local.get $f))
(local.set $f (local.get $t))
(local.set $g (local.get $t))
)
)
;;;;-end-5---------------------------------;;;;
(local.set $t (local.get $a))
(local.set $a (local.get $b))
(local.set $b (local.get $c))
(local.set $c (local.get $d))
(local.set $d (local.get $t))
(local.set $e (local.get $f))
(local.set $f (local.get $g))
(local.set $g (local.get $t))
)
)
;;;;-end-4---------------------------------;;;;
(local.set $t (local.get $a))
(local.set $a (local.get $b))
(local.set $b (local.get $t))
(local.set $c (local.get $d))
(local.set $d (local.get $e))
(local.set $e (local.get $f))
(local.set $f (local.get $g))
(local.set $g (local.get $t))
)
)
;;;;-end-3---------------------------------;;;;
(local.set $t (local.get $a))
(local.set $a (local.get $b))
(local.set $b (local.get $e))
(local.set $e (local.get $d))
(local.set $d (local.get $e))
(local.set $c (local.get $f))
(local.set $f (local.get $g))
(local.set $g (local.get $t))
)
)
(local.set $t (local.get $a))
(local.set $a (local.get $b))
(local.set $b (local.get $c))
(local.set $c (local.get $d))
(local.set $d (local.get $e))
(local.set $e (local.get $f))
(local.set $f (local.get $g))
(local.set $g (local.get $t))
;;;;-end-2---------------------------------;;;;
)
)
(local.set $t (local.get $a))
(local.set $a (local.get $b))
(local.set $b (local.get $c))
(local.set $c (local.get $d))
(local.set $d (local.get $e))
(local.set $e (local.get $f))
(local.set $f (local.get $g))
(local.set $g (local.get $t))
;;;;-end-1---------------------------------;;;;
;; loop control
(local.set $i (i32.add (local.get $i) (i32.const 1)))
(br_if $cont (i32.lt_u (local.get $i) (local.get $n)))
)
(local.get $a)
)
)`;
let i = //wasmEvalText(t);
new WebAssembly.Instance(new WebAssembly.Module(wasmTextToBinary(t)));
assertEq(i.exports.test(1, 2, 100), 212332);