movegroup-chaining.js (5961B)
1 // |jit-test| skip-if: wasmCompileMode() != "ion" 2 3 // This test checks that MoveGroup-chaining/chasing, as implemented in bug 4 // 1944238, works correctly (or at least does not obviously fail). It manages 5 // to cause CodeGenerator::visitGoto to chain together 4 MoveGroups, which is 6 // very unusual (almost all inputs cause chaining of 2 or less). 7 8 let t = ` 9 (module 10 (memory (export "mem") 1) 11 12 (func (export "test") 13 (param $x i32) (param $y i32) (param $n i32) (result i32) 14 (local $a i32) 15 (local $b i32) 16 (local $c i32) 17 (local $d i32) 18 (local $e i32) 19 (local $f i32) 20 (local $g i32) 21 (local $t i32) 22 (local $i i32) 23 (local.set $a (local.get $x)) 24 (local.set $b (local.get $y)) 25 26 (loop $cont 27 (local.set $a (i32.shr_u (local.get $a) (i32.const 1))) 28 (local.set $b (i32.add (i32.const 1) 29 (i32.mul (i32.const 3) (local.get $b)))) 30 ;;;;-begin-1-------------------------------;;;; 31 (if (i32.eq (i32.const 0) (i32.rem_u (local.get $a) (i32.const 2))) 32 (then 33 ;;;;-begin-2-------------------------------;;;; 34 (if (i32.eq (i32.const 0) (i32.rem_u (local.get $a) (i32.const 3))) 35 (then 36 ;;;;-begin-3-------------------------------;;;; 37 (if (i32.eq (i32.const 0) (i32.rem_u (local.get $a) 38 (i32.const 5))) 39 (then 40 ;;;;-begin-4-------------------------------;;;; 41 (if (i32.eq (i32.const 0) (i32.rem_u (local.get $a) 42 (i32.const 7))) 43 (then 44 ;;;;-begin-5-------------------------------;;;; 45 (if (i32.eq (i32.const 0) (i32.rem_u (local.get $a) 46 (i32.const 11))) 47 (then 48 ;;;;-begin-6-------------------------------;;;; 49 (if (i32.eq (i32.const 0) (i32.rem_u (local.get $a) 50 (i32.const 13))) 51 (then 52 ;;;;-begin-7-------------------------------;;;; 53 ;;;;-end-7---------------------------------;;;; 54 (local.set $t (local.get $a)) 55 (local.set $a (local.get $b)) 56 (local.set $b (local.get $c)) 57 (local.set $c (local.get $d)) 58 (local.set $d (local.get $e)) 59 (local.set $e (local.get $f)) 60 (local.set $f (local.get $t)) 61 (local.set $g (local.get $t)) 62 ) 63 ) 64 ;;;;-end-6---------------------------------;;;; 65 (local.set $t (local.get $a)) 66 (local.set $a (local.get $b)) 67 (local.set $b (local.get $c)) 68 (local.set $c (local.get $d)) 69 (local.set $d (local.get $e)) 70 (local.set $e (local.get $f)) 71 (local.set $f (local.get $t)) 72 (local.set $g (local.get $t)) 73 ) 74 ) 75 ;;;;-end-5---------------------------------;;;; 76 (local.set $t (local.get $a)) 77 (local.set $a (local.get $b)) 78 (local.set $b (local.get $c)) 79 (local.set $c (local.get $d)) 80 (local.set $d (local.get $t)) 81 (local.set $e (local.get $f)) 82 (local.set $f (local.get $g)) 83 (local.set $g (local.get $t)) 84 ) 85 ) 86 ;;;;-end-4---------------------------------;;;; 87 (local.set $t (local.get $a)) 88 (local.set $a (local.get $b)) 89 (local.set $b (local.get $t)) 90 (local.set $c (local.get $d)) 91 (local.set $d (local.get $e)) 92 (local.set $e (local.get $f)) 93 (local.set $f (local.get $g)) 94 (local.set $g (local.get $t)) 95 ) 96 ) 97 ;;;;-end-3---------------------------------;;;; 98 (local.set $t (local.get $a)) 99 (local.set $a (local.get $b)) 100 (local.set $b (local.get $e)) 101 (local.set $e (local.get $d)) 102 (local.set $d (local.get $e)) 103 (local.set $c (local.get $f)) 104 (local.set $f (local.get $g)) 105 (local.set $g (local.get $t)) 106 ) 107 ) 108 (local.set $t (local.get $a)) 109 (local.set $a (local.get $b)) 110 (local.set $b (local.get $c)) 111 (local.set $c (local.get $d)) 112 (local.set $d (local.get $e)) 113 (local.set $e (local.get $f)) 114 (local.set $f (local.get $g)) 115 (local.set $g (local.get $t)) 116 ;;;;-end-2---------------------------------;;;; 117 ) 118 ) 119 (local.set $t (local.get $a)) 120 (local.set $a (local.get $b)) 121 (local.set $b (local.get $c)) 122 (local.set $c (local.get $d)) 123 (local.set $d (local.get $e)) 124 (local.set $e (local.get $f)) 125 (local.set $f (local.get $g)) 126 (local.set $g (local.get $t)) 127 ;;;;-end-1---------------------------------;;;; 128 ;; loop control 129 (local.set $i (i32.add (local.get $i) (i32.const 1))) 130 (br_if $cont (i32.lt_u (local.get $i) (local.get $n))) 131 ) 132 133 (local.get $a) 134 ) 135 )`; 136 137 let i = //wasmEvalText(t); 138 new WebAssembly.Instance(new WebAssembly.Module(wasmTextToBinary(t))); 139 140 assertEq(i.exports.test(1, 2, 100), 212332);