// |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 );
Messung V0.5 in Prozent C=90 H=95 G=92
¤ Dauer der Verarbeitung: 0.3 Sekunden
¤
*© Formatika GbR, Deutschland