| ;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. |
| ;; NOTE: This test was ported using port_test.py and could be cleaned up. |
| |
| ;; RUN: foreach %s %t wasm-opt --flatten --simplify-locals-nonesting --souperify --enable-threads -S -o - | filecheck %s |
| |
| (module |
| ;; CHECK: (type $func.0 (func (param i32 i32) (result i32))) |
| |
| ;; CHECK: (type $func.1 (func (param i32) (result i32))) |
| |
| ;; CHECK: (type $func.2 (func (param i32))) |
| |
| ;; CHECK: (type $func.3 (func (param i32 i32 i32) (result i32))) |
| |
| ;; CHECK: (type $func.4 (func (result i32))) |
| |
| ;; CHECK: (type $func.5 (func (param i32 i32))) |
| |
| ;; CHECK: (type $func.6 (func (result f64))) |
| |
| ;; CHECK: (type $func.7 (func (param i64 i64 i64) (result i32))) |
| |
| ;; CHECK: (type $func.8 (func)) |
| |
| ;; CHECK: (type $func.9 (func (param i32 i32 i32 i32))) |
| |
| ;; CHECK: (type $func.10 (func (param i64 i64 i64) (result i64))) |
| |
| ;; CHECK: (type $func.11 (func (param i64 i64 i32 f32))) |
| |
| ;; CHECK: (type $func.12 (func (param i32 i32 i32 i32 i32) (result i32))) |
| |
| ;; CHECK: (memory $0 (shared 1 1)) |
| (memory $0 (shared 1 1)) |
| ;; Figure 1a from the Souper paper https://arxiv.org/pdf/1711.04422.pdf |
| ;; CHECK: (export "replaced-print-internal" (func $56)) |
| |
| ;; CHECK: (func $figure-1a (param $a i64) (param $x i64) (param $y i64) (result i32) |
| ;; CHECK-NEXT: (local $i i32) |
| ;; CHECK-NEXT: (local $j i32) |
| ;; CHECK-NEXT: (local $r i32) |
| ;; CHECK-NEXT: (local $6 i64) |
| ;; CHECK-NEXT: (local $7 i64) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i64) |
| ;; CHECK-NEXT: (local $10 i64) |
| ;; CHECK-NEXT: (local $11 i32) |
| ;; CHECK-NEXT: (local $12 i32) |
| ;; CHECK-NEXT: (local $13 i32) |
| ;; CHECK-NEXT: (local $14 i32) |
| ;; CHECK-NEXT: (local $15 i32) |
| ;; CHECK-NEXT: (local $16 i32) |
| ;; CHECK-NEXT: (local $17 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $12 |
| ;; CHECK-NEXT: (i64.eq |
| ;; CHECK-NEXT: (local.get $a) |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $13 |
| ;; CHECK-NEXT: (i64.ne |
| ;; CHECK-NEXT: (local.get $a) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $15 |
| ;; CHECK-NEXT: (i32.and |
| ;; CHECK-NEXT: (local.get $12) |
| ;; CHECK-NEXT: (local.get $13) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $15) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $16) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $figure-1a (param $a i64) (param $x i64) (param $y i64) (result i32) |
| (local $i i32) |
| (local $j i32) |
| (local $r i32) |
| (local.set $i |
| (i64.eq |
| (local.get $a) |
| (local.get $x) |
| ) |
| ) |
| (local.set $j |
| (i64.ne |
| (local.get $a) |
| (local.get $y) |
| ) |
| ) |
| (local.set $r |
| (i32.and |
| (local.get $i) |
| (local.get $j) |
| ) |
| ) |
| (return (local.get $r)) |
| ) |
| ;; Figure 1b, with a potential path condition |
| ;; CHECK: (func $figure-1b (param $a i64) (param $x i64) (param $y i64) (result i32) |
| ;; CHECK-NEXT: (local $i i32) |
| ;; CHECK-NEXT: (local $j i32) |
| ;; CHECK-NEXT: (local $r i32) |
| ;; CHECK-NEXT: (local $6 i64) |
| ;; CHECK-NEXT: (local $7 i64) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i64) |
| ;; CHECK-NEXT: (local $10 i64) |
| ;; CHECK-NEXT: (local $11 i32) |
| ;; CHECK-NEXT: (local $12 i64) |
| ;; CHECK-NEXT: (local $13 i64) |
| ;; CHECK-NEXT: (local $14 i32) |
| ;; CHECK-NEXT: (local $15 i32) |
| ;; CHECK-NEXT: (local $16 i32) |
| ;; CHECK-NEXT: (local $17 i32) |
| ;; CHECK-NEXT: (local $18 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $8 |
| ;; CHECK-NEXT: (i64.lt_s |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $8) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block $block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $15 |
| ;; CHECK-NEXT: (i64.eq |
| ;; CHECK-NEXT: (local.get $a) |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $16 |
| ;; CHECK-NEXT: (i64.ne |
| ;; CHECK-NEXT: (local.get $a) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $18 |
| ;; CHECK-NEXT: (i32.and |
| ;; CHECK-NEXT: (local.get $15) |
| ;; CHECK-NEXT: (local.get $16) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $18) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| (func $figure-1b (param $a i64) (param $x i64) (param $y i64) (result i32) |
| (local $i i32) |
| (local $j i32) |
| (local $r i32) |
| (if |
| (i64.lt_s |
| (local.get $x) |
| (local.get $y) |
| ) |
| (block |
| (local.set $i |
| (i64.eq |
| (local.get $a) |
| (local.get $x) |
| ) |
| ) |
| (local.set $j |
| (i64.ne |
| (local.get $a) |
| (local.get $y) |
| ) |
| ) |
| (local.set $r |
| (i32.and |
| (local.get $i) |
| (local.get $j) |
| ) |
| ) |
| (return (local.get $r)) |
| ) |
| (unreachable) |
| ) |
| ) |
| ;; Figure 3, simplified to an if |
| ;; CHECK: (func $figure-3-if (param $x i32) (result i32) |
| ;; CHECK-NEXT: (local $1 i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $2 |
| ;; CHECK-NEXT: (i32.and |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $2) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $8 |
| ;; CHECK-NEXT: (i32.and |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $8) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $9) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $figure-3-if (param $x i32) (result i32) |
| (if |
| (i32.and |
| (local.get $x) |
| (i32.const 1) |
| ) |
| (local.set $x |
| (i32.add |
| (local.get $x) |
| (i32.const 1) |
| ) |
| ) |
| (local.set $x |
| (i32.add |
| (local.get $x) |
| (i32.const 2) |
| ) |
| ) |
| ) |
| (return |
| (i32.and |
| (local.get $x) |
| (i32.const 1) |
| ) |
| ) |
| ) |
| ;; CHECK: (func $send-i32 (param $0 i32) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| (func $send-i32 (param i32)) |
| ;; flipping of greater than/or equals ops, which are not in Souper IR |
| ;; CHECK: (func $flips |
| ;; CHECK-NEXT: (local $x i32) |
| ;; CHECK-NEXT: (local $y i32) |
| ;; CHECK-NEXT: (local $z i64) |
| ;; CHECK-NEXT: (local $w i64) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (local $11 i32) |
| ;; CHECK-NEXT: (local $12 i32) |
| ;; CHECK-NEXT: (local $13 i32) |
| ;; CHECK-NEXT: (local $14 i32) |
| ;; CHECK-NEXT: (local $15 i32) |
| ;; CHECK-NEXT: (local $16 i64) |
| ;; CHECK-NEXT: (local $17 i64) |
| ;; CHECK-NEXT: (local $18 i32) |
| ;; CHECK-NEXT: (local $19 i64) |
| ;; CHECK-NEXT: (local $20 i64) |
| ;; CHECK-NEXT: (local $21 i32) |
| ;; CHECK-NEXT: (local $22 i64) |
| ;; CHECK-NEXT: (local $23 i64) |
| ;; CHECK-NEXT: (local $24 i32) |
| ;; CHECK-NEXT: (local $25 i64) |
| ;; CHECK-NEXT: (local $26 i64) |
| ;; CHECK-NEXT: (local $27 i32) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.ge_s |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.ge_u |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.gt_s |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.gt_u |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $18 |
| ;; CHECK-NEXT: (i64.ge_s |
| ;; CHECK-NEXT: (local.get $z) |
| ;; CHECK-NEXT: (local.get $w) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (call $send-i32 |
| ;; CHECK-NEXT: (local.get $18) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $21 |
| ;; CHECK-NEXT: (i64.ge_u |
| ;; CHECK-NEXT: (local.get $z) |
| ;; CHECK-NEXT: (local.get $w) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (call $send-i32 |
| ;; CHECK-NEXT: (local.get $21) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $24 |
| ;; CHECK-NEXT: (i64.gt_s |
| ;; CHECK-NEXT: (local.get $z) |
| ;; CHECK-NEXT: (local.get $w) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (call $send-i32 |
| ;; CHECK-NEXT: (local.get $24) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $27 |
| ;; CHECK-NEXT: (i64.gt_u |
| ;; CHECK-NEXT: (local.get $z) |
| ;; CHECK-NEXT: (local.get $w) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (call $send-i32 |
| ;; CHECK-NEXT: (local.get $27) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $flips |
| (local $x i32) |
| (local $y i32) |
| (local $z i64) |
| (local $w i64) |
| (local.set $x (i32.ge_s (local.get $x) (local.get $y))) |
| (local.set $x (i32.ge_u (local.get $x) (local.get $y))) |
| (local.set $x (i32.gt_s (local.get $x) (local.get $y))) |
| (local.set $x (i32.gt_u (local.get $x) (local.get $y))) |
| (call $send-i32 (i64.ge_s (local.get $z) (local.get $w))) |
| (call $send-i32 (i64.ge_u (local.get $z) (local.get $w))) |
| (call $send-i32 (i64.gt_s (local.get $z) (local.get $w))) |
| (call $send-i32 (i64.gt_u (local.get $z) (local.get $w))) |
| ) |
| ;; CHECK: (func $various-conditions-1 (param $x i32) |
| ;; CHECK-NEXT: (local $1 i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $various-conditions-1 (param $x i32) |
| (if |
| (local.get $x) |
| (local.set $x |
| (i32.add |
| (local.get $x) |
| (i32.const 1) |
| ) |
| ) |
| ) |
| ) |
| ;; CHECK: (func $various-conditions-2 (param $x i32) |
| ;; CHECK-NEXT: (local $1 i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $2 |
| ;; CHECK-NEXT: (i32.lt_s |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $2) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.sub |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $various-conditions-2 (param $x i32) |
| (if |
| (i32.lt_s |
| (local.get $x) |
| (i32.const 0) |
| ) |
| (local.set $x |
| (i32.sub |
| (local.get $x) |
| (i32.const 2) |
| ) |
| ) |
| ) |
| ) |
| ;; CHECK: (func $various-conditions-3 (param $x i32) |
| ;; CHECK-NEXT: (local $1 i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local.set $1 |
| ;; CHECK-NEXT: (i32.reinterpret_f32 |
| ;; CHECK-NEXT: (f32.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $1) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.sub |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 4) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $various-conditions-3 (param $x i32) |
| (if |
| (i32.reinterpret_f32 (f32.const 0)) |
| (local.set $x |
| (i32.sub |
| (local.get $x) |
| (i32.const 4) |
| ) |
| ) |
| ) |
| ) |
| ;; CHECK: (func $various-conditions-4 (param $x i32) |
| ;; CHECK-NEXT: (local $1 i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| (func $various-conditions-4 (param $x i32) |
| (if |
| (unreachable) |
| (local.set $x |
| (i32.add |
| (local.get $x) |
| (i32.const 3) |
| ) |
| ) |
| ) |
| ) |
| ;; CHECK: (func $unaries (param $x i32) (param $y i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (local $11 i32) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $3 |
| ;; CHECK-NEXT: (i32.eqz |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $3) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $5 |
| ;; CHECK-NEXT: (i32.ctz |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $7 |
| ;; CHECK-NEXT: (i32.clz |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $9 |
| ;; CHECK-NEXT: (i32.popcnt |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $10 |
| ;; CHECK-NEXT: (i32.sub |
| ;; CHECK-NEXT: (local.get $7) |
| ;; CHECK-NEXT: (local.get $9) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $5) |
| ;; CHECK-NEXT: (local.get $10) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $unaries (param $x i32) (param $y i32) |
| (if |
| (i32.eqz |
| (local.get $x) |
| ) |
| (local.set $x |
| (i32.add |
| (i32.ctz |
| (local.get $y) |
| ) |
| (i32.sub |
| (i32.clz |
| (local.get $x) |
| ) |
| (i32.popcnt |
| (local.get $y) |
| ) |
| ) |
| ) |
| ) |
| ) |
| ) |
| ;; CHECK: (func $unary-condition (param $x i32) |
| ;; CHECK-NEXT: (local $1 i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $2 |
| ;; CHECK-NEXT: (i32.gt_u |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $3 |
| ;; CHECK-NEXT: (i32.ctz |
| ;; CHECK-NEXT: (local.get $2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $3) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $unary-condition (param $x i32) |
| (if |
| (i32.ctz |
| (i32.gt_u |
| (local.get $x) |
| (i32.const 1) |
| ) |
| ) |
| (local.set $x |
| (i32.add |
| (local.get $x) |
| (i32.const 2) |
| ) |
| ) |
| ) |
| ) |
| ;; CHECK: (func $unary-condition-2 (param $x i32) |
| ;; CHECK-NEXT: (local $1 i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $2 |
| ;; CHECK-NEXT: (i32.gt_u |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $3 |
| ;; CHECK-NEXT: (i32.eqz |
| ;; CHECK-NEXT: (local.get $2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $3) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $unary-condition-2 (param $x i32) |
| (if |
| (i32.eqz |
| (i32.gt_u |
| (local.get $x) |
| (i32.const 1) |
| ) |
| ) |
| (local.set $x |
| (i32.add |
| (local.get $x) |
| (i32.const 2) |
| ) |
| ) |
| ) |
| ) |
| ;; CHECK: (func $if-else-cond (param $x i32) (result i32) |
| ;; CHECK-NEXT: (local $1 i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $2 |
| ;; CHECK-NEXT: (i32.lt_s |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $2) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $8 |
| ;; CHECK-NEXT: (i32.and |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $8) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $9) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $if-else-cond (param $x i32) (result i32) |
| (if |
| (i32.lt_s |
| (local.get $x) |
| (i32.const 1) |
| ) |
| (local.set $x |
| (i32.add |
| (local.get $x) |
| (i32.const 1) |
| ) |
| ) |
| (local.set $x |
| (i32.add |
| (local.get $x) |
| (i32.const 2) |
| ) |
| ) |
| ) |
| (return |
| (i32.and |
| (local.get $x) |
| (i32.const 1) |
| ) |
| ) |
| ) |
| ;; CHECK: (func $trivial-ret (result i32) |
| ;; CHECK-NEXT: (local $0 i32) |
| ;; CHECK-NEXT: (local.set $0 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $trivial-ret (result i32) |
| (i32.add |
| (i32.const 0) |
| (i32.const 1) |
| ) |
| ) |
| ;; CHECK: (func $trivial-const (result i32) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $trivial-const (result i32) |
| (i32.const 0) |
| ) |
| ;; CHECK: (func $trivial-const-block (result i32) |
| ;; CHECK-NEXT: (local $0 i32) |
| ;; CHECK-NEXT: (local $1 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $1 |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $trivial-const-block (result i32) |
| (nop) |
| (i32.const 0) |
| ) |
| ;; CHECK: (func $bad-phi-value (result i32) |
| ;; CHECK-NEXT: (local $0 i32) |
| ;; CHECK-NEXT: (local $1 i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $1 |
| ;; CHECK-NEXT: (i32.load |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $1 |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $1) |
| ;; CHECK-NEXT: (local.set $3 |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $3 |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $bad-phi-value (result i32) |
| (if (result i32) |
| (if (result i32) |
| (i32.const 1) |
| (i32.load |
| (i32.const 0) |
| ) |
| (i32.const 0) |
| ) |
| (i32.const 0) |
| (i32.const 1) |
| ) |
| ) |
| ;; CHECK: (func $bad-phi-value-2 (param $x i32) (result i32) |
| ;; CHECK-NEXT: (local $1 i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $2 |
| ;; CHECK-NEXT: (i32.load |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $2 |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $2) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $bad-phi-value-2 (param $x i32) (result i32) |
| (if |
| (if (result i32) |
| (i32.const 1) |
| (i32.load |
| (i32.const 0) |
| ) |
| (i32.const 0) |
| ) |
| (local.set $x (i32.const 1)) |
| (local.set $x (i32.const 2)) |
| ) |
| (local.get $x) |
| ) |
| ;; CHECK: (func $select (param $x i32) (result i32) |
| ;; CHECK-NEXT: (local $1 i32) |
| ;; CHECK-NEXT: (local.set $1 |
| ;; CHECK-NEXT: (select |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: (i32.const 3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| (func $select (param $x i32) (result i32) |
| (return |
| (select |
| (i32.const 1) |
| (i32.const 2) |
| (i32.const 3) |
| ) |
| ) |
| ) |
| ;; CHECK: (func $select-2 (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $4 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $6 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $8 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $9 |
| ;; CHECK-NEXT: (select |
| ;; CHECK-NEXT: (local.get $4) |
| ;; CHECK-NEXT: (local.get $6) |
| ;; CHECK-NEXT: (local.get $8) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $9) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| (func $select-2 (param $x i32) (param $y i32) (result i32) |
| (return |
| (select |
| (i32.add |
| (local.get $x) |
| (local.get $y) |
| ) |
| (i32.add |
| (local.get $x) |
| (i32.const 1) |
| ) |
| (i32.add |
| (i32.const 2) |
| (local.get $y) |
| ) |
| ) |
| ) |
| ) |
| ;; CHECK: (func $block-phi-1 (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block $out |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $out |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $10 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $10) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $block-phi-1 (param $x i32) (param $y i32) (result i32) |
| (block $out |
| (local.set $x |
| (i32.add |
| (local.get $x) |
| (i32.const 1) |
| ) |
| ) |
| (br_if $out (local.get $y)) |
| (local.set $x |
| (i32.add |
| (local.get $x) |
| (i32.const 2) |
| ) |
| ) |
| ) |
| (i32.add |
| (local.get $x) |
| (i32.const 3) |
| ) |
| ) |
| ;; CHECK: (func $block-phi-2 (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block $out |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $out |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $6 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $6) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $block-phi-2 (param $x i32) (param $y i32) (result i32) |
| (block $out |
| (local.set $x |
| (i32.const 1) |
| ) |
| (br_if $out (local.get $y)) |
| (local.set $x |
| (i32.const 2) |
| ) |
| ) |
| (i32.add |
| (local.get $x) |
| (i32.const 3) |
| ) |
| ) |
| ;; CHECK: (func $zero_init-phi-bad_type (result f64) |
| ;; CHECK-NEXT: (local $x f64) |
| ;; CHECK-NEXT: (local $1 f64) |
| ;; CHECK-NEXT: (local $2 f64) |
| ;; CHECK-NEXT: (local $3 f64) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (f64.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $zero_init-phi-bad_type (result f64) |
| (local $x f64) |
| (if |
| (i32.const 0) |
| (local.set $x |
| (f64.const 1) |
| ) |
| ) |
| (local.get $x) |
| ) |
| ;; CHECK: (func $phi-bad-type (result f64) |
| ;; CHECK-NEXT: (local $0 f64) |
| ;; CHECK-NEXT: (local $1 f64) |
| ;; CHECK-NEXT: (local $2 f64) |
| ;; CHECK-NEXT: (local $3 f64) |
| ;; CHECK-NEXT: (block $label$1 |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: (local.set $0 |
| ;; CHECK-NEXT: (f64.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $0 |
| ;; CHECK-NEXT: (f64.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $phi-bad-type (result f64) |
| (block $label$1 (result f64) |
| (if (result f64) |
| (i32.const 0) |
| (f64.const 0) |
| (f64.const 1) |
| ) |
| ) |
| ) |
| ;; CHECK: (func $phi-one-side-i1 (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $i i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (local $11 i32) |
| ;; CHECK-NEXT: (local $12 i32) |
| ;; CHECK-NEXT: (local $13 i32) |
| ;; CHECK-NEXT: (local $14 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $5 |
| ;; CHECK-NEXT: (i32.le_s |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $5) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $i |
| ;; CHECK-NEXT: (i32.eq |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $i |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $i) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $phi-one-side-i1 (param $x i32) (param $y i32) (result i32) |
| (local $i i32) |
| (if |
| (i32.le_s |
| (local.get $x) |
| (local.get $y) |
| ) |
| (local.set $i |
| (i32.eq |
| (local.get $x) |
| (local.get $y) |
| ) |
| ) |
| (local.set $i |
| (i32.add |
| (local.get $x) |
| (local.get $y) |
| ) |
| ) |
| ) |
| (local.get $i) |
| ) |
| ;; CHECK: (func $call (result i32) |
| ;; CHECK-NEXT: (local $0 i32) |
| ;; CHECK-NEXT: (local $1 i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local.set $0 |
| ;; CHECK-NEXT: (call $call) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $1 |
| ;; CHECK-NEXT: (call $call) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $2 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $0) |
| ;; CHECK-NEXT: (local.get $1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $3 |
| ;; CHECK-NEXT: (call $call) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $4 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (i32.const 10) |
| ;; CHECK-NEXT: (local.get $3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $5 |
| ;; CHECK-NEXT: (i32.mul |
| ;; CHECK-NEXT: (local.get $2) |
| ;; CHECK-NEXT: (local.get $4) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $5) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| (func $call (result i32) |
| (return |
| (i32.mul |
| (i32.add |
| (call $call) |
| (call $call) |
| ) |
| (i32.add |
| (i32.const 10) |
| (call $call) |
| ) |
| ) |
| ) |
| ) |
| ;; CHECK: (func $in-unreachable-1 (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block $block |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $5) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $in-unreachable-1 (param $x i32) (param $y i32) (result i32) |
| (if |
| (local.get $x) |
| (block |
| (local.set $x |
| (i32.const 1) |
| ) |
| (return (local.get $x)) |
| ) |
| (local.set $x |
| (i32.const 2) |
| ) |
| ) |
| ;; no phi here! |
| (return |
| (local.get $x) |
| ) |
| ) |
| ;; CHECK: (func $in-unreachable-2 (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block $block |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $4) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $in-unreachable-2 (param $x i32) (param $y i32) (result i32) |
| (if |
| (local.get $x) |
| (block |
| (local.set $x |
| (i32.const 1) |
| ) |
| (unreachable) |
| ) |
| (local.set $x |
| (i32.const 2) |
| ) |
| ) |
| ;; no phi here! |
| (return |
| (local.get $x) |
| ) |
| ) |
| ;; CHECK: (func $in-unreachable-3 (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block $out |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block $block |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br $out) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $5) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $in-unreachable-3 (param $x i32) (param $y i32) (result i32) |
| (block $out |
| (if |
| (local.get $x) |
| (block |
| (local.set $x |
| (i32.const 1) |
| ) |
| (br $out) |
| ) |
| (local.set $x |
| (i32.const 2) |
| ) |
| ) |
| ;; no phi here! |
| (return |
| (local.get $x) |
| ) |
| ) |
| (return |
| (local.get $x) |
| ) |
| ) |
| ;; CHECK: (func $in-unreachable-4 (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block $out |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block $block |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br_table $out $out $out |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $5) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $in-unreachable-4 (param $x i32) (param $y i32) (result i32) |
| (block $out |
| (if |
| (local.get $x) |
| (block |
| (local.set $x |
| (i32.const 1) |
| ) |
| (br_table $out $out $out (i32.const 1)) |
| ) |
| (local.set $x |
| (i32.const 2) |
| ) |
| ) |
| ;; no phi here! |
| (return |
| (local.get $x) |
| ) |
| ) |
| (return |
| (local.get $x) |
| ) |
| ) |
| ;; CHECK: (func $in-unreachable-br_if (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block $out |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (block $block |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $out |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $6) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $in-unreachable-br_if (param $x i32) (param $y i32) (result i32) |
| (block $out |
| (if |
| (local.get $x) |
| (block |
| (local.set $x |
| (i32.const 1) |
| ) |
| (br_if $out |
| (local.get $x) |
| ) |
| ) |
| (local.set $x |
| (i32.const 2) |
| ) |
| ) |
| ;; there *IS* a phi here since it was a br_if |
| (return |
| (local.get $x) |
| ) |
| ) |
| (return |
| (local.get $x) |
| ) |
| ) |
| ;; CHECK: (func $in-unreachable-big (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (block $label$1 |
| ;; CHECK-NEXT: (block $label$2 |
| ;; CHECK-NEXT: (block $label$3 |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $2) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $0) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block $block |
| ;; CHECK-NEXT: (local.set $1 |
| ;; CHECK-NEXT: (i32.const -8531) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br $label$3) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block $block3 |
| ;; CHECK-NEXT: (local.set $1 |
| ;; CHECK-NEXT: (i32.const -8531) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br $label$1) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br $label$2) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $6 |
| ;; CHECK-NEXT: (i32.load |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (drop |
| ;; CHECK-NEXT: (local.get $6) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br $label$1) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (i32.store16 |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: (local.get $1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (i32.store16 |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: (i32.const -8531) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $in-unreachable-big (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) |
| (block $label$1 |
| (block $label$2 |
| (block $label$3 |
| (if |
| (local.get $2) |
| (if |
| (local.get $0) |
| (block |
| (local.set $1 |
| (i32.const -8531) |
| ) |
| (br $label$3) |
| ) |
| (block |
| (local.set $1 |
| (i32.const -8531) |
| ) |
| (br $label$1) |
| ) |
| ) |
| ) |
| (br $label$2) |
| ) |
| (drop |
| (i32.load |
| (i32.const 0) |
| ) |
| ) |
| (br $label$1) |
| ) |
| (i32.store16 |
| (i32.const 1) |
| (local.get $1) |
| ) |
| (unreachable) |
| ) |
| (i32.store16 |
| (i32.const 0) |
| (i32.const -8531) |
| ) |
| ) |
| ;; CHECK: (func $in-unreachable-operations (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (block $block |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| (func $in-unreachable-operations (param $x i32) (param $y i32) (result i32) |
| (block |
| (unreachable) |
| (if |
| (local.get $x) |
| (local.set $x |
| (i32.const 1) |
| ) |
| (local.set $x |
| (i32.const 2) |
| ) |
| ) |
| (return |
| (local.get $x) |
| ) |
| ) |
| ) |
| ;; CHECK: (func $merge-with-one-less (param $var$0 i32) (result i32) |
| ;; CHECK-NEXT: (local $1 i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block $label$1 |
| ;; CHECK-NEXT: (block $label$2 |
| ;; CHECK-NEXT: (block $label$3 |
| ;; CHECK-NEXT: (block $label$4 |
| ;; CHECK-NEXT: (block $label$5 |
| ;; CHECK-NEXT: (local.set $1 |
| ;; CHECK-NEXT: (i32.load |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br_table $label$5 $label$4 $label$3 $label$2 |
| ;; CHECK-NEXT: (local.get $1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br $label$1) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $var$0 |
| ;; CHECK-NEXT: (i32.const 8) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $3 |
| ;; CHECK-NEXT: (i32.load |
| ;; CHECK-NEXT: (local.get $var$0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (f64.store |
| ;; CHECK-NEXT: (local.get $3) |
| ;; CHECK-NEXT: (f64.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br $label$1) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (i32.store |
| ;; CHECK-NEXT: (local.get $var$0) |
| ;; CHECK-NEXT: (i32.const 16) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $6 |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $6) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $merge-with-one-less (param $var$0 i32) (result i32) |
| (block $label$1 |
| (block $label$2 |
| (block $label$3 |
| (block $label$4 |
| (block $label$5 |
| (br_table $label$5 $label$4 $label$3 $label$2 |
| (i32.load |
| (i32.const 1) |
| ) |
| ) |
| ) |
| (unreachable) |
| ) |
| (br $label$1) |
| ) |
| (f64.store |
| (i32.load |
| (local.tee $var$0 |
| (i32.const 8) |
| ) |
| ) |
| (f64.const 0) |
| ) |
| (br $label$1) |
| ) |
| (unreachable) |
| ) |
| (i32.store |
| (local.get $var$0) |
| (i32.const 16) |
| ) |
| (i32.const 1) |
| ) |
| ;; CHECK: (func $deep (param $x i32) (result i32) |
| ;; CHECK-NEXT: (local $1 i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (local $11 i32) |
| ;; CHECK-NEXT: (local $12 i32) |
| ;; CHECK-NEXT: (local $13 i32) |
| ;; CHECK-NEXT: (local $14 i32) |
| ;; CHECK-NEXT: (local $15 i32) |
| ;; CHECK-NEXT: (local $16 i32) |
| ;; CHECK-NEXT: (local $17 i32) |
| ;; CHECK-NEXT: (local $18 i32) |
| ;; CHECK-NEXT: (local $19 i32) |
| ;; CHECK-NEXT: (local $20 i32) |
| ;; CHECK-NEXT: (local $21 i32) |
| ;; CHECK-NEXT: (local $22 i32) |
| ;; CHECK-NEXT: (local $23 i32) |
| ;; CHECK-NEXT: (local $24 i32) |
| ;; CHECK-NEXT: (local $25 i32) |
| ;; CHECK-NEXT: (local $26 i32) |
| ;; CHECK-NEXT: (local $27 i32) |
| ;; CHECK-NEXT: (local $28 i32) |
| ;; CHECK-NEXT: (local $29 i32) |
| ;; CHECK-NEXT: (local $30 i32) |
| ;; CHECK-NEXT: (local $31 i32) |
| ;; CHECK-NEXT: (local $32 i32) |
| ;; CHECK-NEXT: (local $33 i32) |
| ;; CHECK-NEXT: (local $34 i32) |
| ;; CHECK-NEXT: (local $35 i32) |
| ;; CHECK-NEXT: (local $36 i32) |
| ;; CHECK-NEXT: (local $37 i32) |
| ;; CHECK-NEXT: (local $38 i32) |
| ;; CHECK-NEXT: (local $39 i32) |
| ;; CHECK-NEXT: (local $40 i32) |
| ;; CHECK-NEXT: (local $41 i32) |
| ;; CHECK-NEXT: (local $42 i32) |
| ;; CHECK-NEXT: (local $43 i32) |
| ;; CHECK-NEXT: (local $44 i32) |
| ;; CHECK-NEXT: (local $45 i32) |
| ;; CHECK-NEXT: (local $46 i32) |
| ;; CHECK-NEXT: (local $47 i32) |
| ;; CHECK-NEXT: (local $48 i32) |
| ;; CHECK-NEXT: (local $49 i32) |
| ;; CHECK-NEXT: (local $50 i32) |
| ;; CHECK-NEXT: (local $51 i32) |
| ;; CHECK-NEXT: (local $52 i32) |
| ;; CHECK-NEXT: (local $53 i32) |
| ;; CHECK-NEXT: (local $54 i32) |
| ;; CHECK-NEXT: (local $55 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.xor |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.mul |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.xor |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.mul |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.xor |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.mul |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.xor |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.mul |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.xor |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.mul |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.xor |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.mul |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.xor |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.mul |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.xor |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.mul |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.xor |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.mul |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.xor |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.mul |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.xor |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.mul |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.xor |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.mul |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.xor |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.mul |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1234) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $deep (param $x i32) (result i32) |
| (local.set $x (i32.xor (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.mul (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.xor (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.mul (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.xor (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.mul (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.xor (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.mul (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.xor (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.mul (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.xor (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.mul (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.xor (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.mul (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.xor (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.mul (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.xor (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.mul (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.xor (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.mul (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.xor (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.mul (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.xor (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.mul (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.xor (local.get $x) (i32.const 1234))) |
| (local.set $x (i32.mul (local.get $x) (i32.const 1234))) |
| (local.get $x) |
| ) |
| ;; CHECK: (func $two-pcs (param $x i64) (param $y i64) (param $t i64) (result i64) |
| ;; CHECK-NEXT: (local $3 i64) |
| ;; CHECK-NEXT: (local $4 i64) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i64) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i64) |
| ;; CHECK-NEXT: (local $9 i64) |
| ;; CHECK-NEXT: (local $10 i64) |
| ;; CHECK-NEXT: (local $11 i64) |
| ;; CHECK-NEXT: (local $12 i64) |
| ;; CHECK-NEXT: (local $13 i64) |
| ;; CHECK-NEXT: (local $14 i64) |
| ;; CHECK-NEXT: (local $15 i32) |
| ;; CHECK-NEXT: (local $16 i64) |
| ;; CHECK-NEXT: (local $17 i64) |
| ;; CHECK-NEXT: (local $18 i64) |
| ;; CHECK-NEXT: (local $19 i64) |
| ;; CHECK-NEXT: (local $20 i64) |
| ;; CHECK-NEXT: (local $21 i64) |
| ;; CHECK-NEXT: (local $22 i64) |
| ;; CHECK-NEXT: (local $23 i64) |
| ;; CHECK-NEXT: (local $24 i64) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $5 |
| ;; CHECK-NEXT: (i64.lt_s |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $5) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $7 |
| ;; CHECK-NEXT: (i64.eqz |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $7) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $t |
| ;; CHECK-NEXT: (i64.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $t |
| ;; CHECK-NEXT: (i64.sub |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $15 |
| ;; CHECK-NEXT: (i64.eqz |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $15) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $t |
| ;; CHECK-NEXT: (i64.mul |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $t |
| ;; CHECK-NEXT: (i64.div_s |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $t) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $23) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $two-pcs (param $x i64) (param $y i64) (param $t i64) (result i64) |
| (if |
| (i64.lt_s |
| (local.get $x) |
| (local.get $y) |
| ) |
| (if |
| (i64.eqz |
| (local.get $x) |
| ) |
| (local.set $t |
| (i64.add |
| (local.get $x) |
| (local.get $y) |
| ) |
| ) |
| (local.set $t |
| (i64.sub |
| (local.get $x) |
| (local.get $y) |
| ) |
| ) |
| ) |
| (if |
| (i64.eqz |
| (local.get $y) |
| ) |
| (local.set $t |
| (i64.mul |
| (local.get $x) |
| (local.get $y) |
| ) |
| ) |
| (local.set $t |
| (i64.div_s |
| (local.get $x) |
| (local.get $y) |
| ) |
| ) |
| ) |
| ) |
| (return (local.get $t)) |
| ) |
| ;; CHECK: (func $loop-1 (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (loop $loopy |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $4 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $4) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $5) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $loop-1 (param $x i32) (param $y i32) (result i32) |
| (local.set $x (i32.const 1)) |
| (local.set $y (i32.const 2)) |
| (loop $loopy |
| ) |
| ;; neither needed a phi |
| (return (i32.add (local.get $x) (local.get $y))) |
| ) |
| ;; CHECK: (func $loop-2 (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (loop $loopy |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: (i32.const 4) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $8 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $8) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $9) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $loop-2 (param $x i32) (param $y i32) (result i32) |
| (local.set $x (i32.const 1)) |
| (local.set $y (i32.const 2)) |
| (loop $loopy |
| (local.set $x (i32.add (local.get $x) (i32.const 3))) |
| (local.set $y (i32.add (local.get $y) (i32.const 4))) |
| ) |
| ;; neither needed a phi |
| (return (i32.add (local.get $x) (local.get $y))) |
| ) |
| ;; CHECK: (func $loop-3 (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (local $11 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (loop $loopy |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: (i32.const 4) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $loopy |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $9 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $9) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $10) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $loop-3 (param $x i32) (param $y i32) (result i32) |
| (local.set $x (i32.const 1)) |
| (local.set $y (i32.const 2)) |
| (loop $loopy |
| (local.set $x (i32.add (local.get $x) (i32.const 3))) |
| (local.set $y (i32.add (local.get $y) (i32.const 4))) |
| (br_if $loopy (local.get $y)) |
| ) |
| ;; both needed |
| (return (i32.add (local.get $x) (local.get $y))) |
| ) |
| ;; CHECK: (func $loop-4 (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (loop $loopy |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $loopy |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $7 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $7) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $8) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $loop-4 (param $x i32) (param $y i32) (result i32) |
| (local.set $x (i32.const 1)) |
| (local.set $y (i32.const 2)) |
| (loop $loopy |
| (local.set $x (i32.add (local.get $x) (i32.const 3))) |
| (br_if $loopy (local.get $y)) |
| ) |
| ;; only x needed a phi |
| (return (i32.add (local.get $x) (local.get $y))) |
| ) |
| ;; CHECK: (func $loop-5 (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (loop $loopy |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $loopy |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $7 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $7) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $8) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $loop-5 (param $x i32) (param $y i32) (result i32) |
| (local.set $x (i32.const 1)) |
| (local.set $y (i32.const 2)) |
| (loop $loopy |
| (local.set $x (i32.add (local.get $x) (i32.const 3))) |
| (local.set $y (i32.const 2)) ;; same value |
| (br_if $loopy (local.get $y)) |
| ) |
| ;; only x needed a phi |
| (return (i32.add (local.get $x) (local.get $y))) |
| ) |
| ;; CHECK: (func $loop-6 (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (loop $loopy |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $loopy |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $8 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $8) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $9) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $loop-6 (param $x i32) (param $y i32) (result i32) |
| (local.set $x (i32.const 1)) |
| (local.set $y (i32.const 2)) |
| (loop $loopy |
| (local.set $x (i32.add (local.get $x) (i32.const 3))) |
| (local.set $y (local.get $y)) ;; same value |
| (br_if $loopy (local.get $y)) |
| ) |
| ;; only x needed a phi |
| (return (i32.add (local.get $x) (local.get $y))) |
| ) |
| ;; CHECK: (func $loop-7 (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (loop $loopy |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.const 5) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $loopy |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $7 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $7) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $8) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $loop-7 (param $x i32) (param $y i32) (result i32) |
| (local.set $x (i32.const 1)) |
| (local.set $y (i32.const 2)) |
| (loop $loopy |
| (local.set $x (i32.add (local.get $x) (i32.const 3))) |
| (local.set $y (i32.const 5)) ;; different! |
| (br_if $loopy (local.get $y)) |
| ) |
| ;; y changed but we don't need a phi for it |
| (return (i32.add (local.get $x) (local.get $y))) |
| ) |
| ;; CHECK: (func $loop-8 (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $z i32) |
| ;; CHECK-NEXT: (local $w i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (local $11 i32) |
| ;; CHECK-NEXT: (local $12 i32) |
| ;; CHECK-NEXT: (local $13 i32) |
| ;; CHECK-NEXT: (local $14 i32) |
| ;; CHECK-NEXT: (local $15 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (loop $loopy |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $z |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $w |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.const 4) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $loopy |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $9 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $12 |
| ;; CHECK-NEXT: (i32.sub |
| ;; CHECK-NEXT: (local.get $z) |
| ;; CHECK-NEXT: (local.get $w) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $13 |
| ;; CHECK-NEXT: (i32.mul |
| ;; CHECK-NEXT: (local.get $9) |
| ;; CHECK-NEXT: (local.get $12) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $13) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $14) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $loop-8 (param $x i32) (param $y i32) (result i32) |
| (local $z i32) |
| (local $w i32) |
| (local.set $x (i32.const 1)) |
| (local.set $y (i32.const 2)) |
| (loop $loopy |
| (local.set $z (local.get $x)) |
| (local.set $w (local.get $y)) |
| (local.set $x (i32.const 1)) ;; same! |
| (local.set $y (i32.const 4)) ;; different! |
| (br_if $loopy (local.get $y)) |
| ) |
| ;; x is always 3, and y needs a phi. |
| ;; each is also copied to another local, which we need |
| ;; to handle properly |
| (return |
| (i32.mul |
| (i32.add |
| (local.get $x) |
| (local.get $y) |
| ) |
| (i32.sub |
| (local.get $z) |
| (local.get $w) |
| ) |
| ) |
| ) |
| ) |
| ;; CHECK: (func $loop-9 (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $t i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (local $11 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (loop $loopy |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $t |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (local.get $t) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $loopy |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $9 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $9) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $10) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $loop-9 (param $x i32) (param $y i32) (result i32) |
| (local $t i32) |
| (local.set $x (i32.const 1)) |
| (local.set $y (i32.const 2)) |
| (loop $loopy |
| (local.set $t (local.get $x)) |
| (local.set $x (local.get $y)) |
| (local.set $y (local.get $t)) |
| (br_if $loopy (local.get $t)) |
| ) |
| ;; x and y swapped, so both need phis |
| (return (i32.add (local.get $x) (local.get $y))) |
| ) |
| ;; CHECK: (func $loop-10 (param $x i32) (param $y i32) (result i32) |
| ;; CHECK-NEXT: (local $t i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (local $11 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (loop $loopy |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $t |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (local.get $t) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $loopy |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $9 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $9) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $10) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $loop-10 (param $x i32) (param $y i32) (result i32) |
| (local $t i32) |
| (local.set $x (i32.const 1)) |
| (local.set $y (i32.const 1)) |
| (loop $loopy ;; we swap the values. but we need a deeper analysis to figure that out... |
| (local.set $t (local.get $x)) |
| (local.set $x (local.get $y)) |
| (local.set $y (local.get $t)) |
| (br_if $loopy (local.get $t)) |
| ) |
| ;; x and y swapped, but the same constant was swapped |
| (return (i32.add (local.get $x) (local.get $y))) |
| ) |
| ;; CHECK: (func $loop-multicond-1 (param $x i32) (param $y i32) (param $z i32) (result i32) |
| ;; CHECK-NEXT: (local $t i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (local $11 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $z |
| ;; CHECK-NEXT: (i32.const 3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (loop $loopy |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 4) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $loopy |
| ;; CHECK-NEXT: (local.get $t) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.const 5) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $loopy |
| ;; CHECK-NEXT: (local.get $t) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $z |
| ;; CHECK-NEXT: (i32.const 6) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $9 |
| ;; CHECK-NEXT: (select |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: (local.get $z) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $9) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $10) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $loop-multicond-1 (param $x i32) (param $y i32) (param $z i32) (result i32) |
| (local $t i32) |
| (local.set $x (i32.const 1)) |
| (local.set $y (i32.const 2)) |
| (local.set $z (i32.const 3)) |
| (loop $loopy |
| (local.set $x (i32.const 4)) |
| (br_if $loopy (local.get $t)) |
| (local.set $y (i32.const 5)) |
| (br_if $loopy (local.get $t)) |
| (local.set $z (i32.const 6)) |
| ) |
| (return (select (local.get $x) (local.get $y) (local.get $z))) |
| ) |
| ;; CHECK: (func $loop-multicond-2 (param $x i32) (param $y i32) (param $z i32) (result i32) |
| ;; CHECK-NEXT: (local $t i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (local $11 i32) |
| ;; CHECK-NEXT: (local $12 i32) |
| ;; CHECK-NEXT: (local $13 i32) |
| ;; CHECK-NEXT: (local $14 i32) |
| ;; CHECK-NEXT: (local $15 i32) |
| ;; CHECK-NEXT: (local $16 i32) |
| ;; CHECK-NEXT: (local $17 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $z |
| ;; CHECK-NEXT: (i32.const 3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (loop $loopy |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 4) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $loopy |
| ;; CHECK-NEXT: (local.get $t) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: (i32.const 5) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $loopy |
| ;; CHECK-NEXT: (local.get $t) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $z |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $z) |
| ;; CHECK-NEXT: (i32.const 6) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $15 |
| ;; CHECK-NEXT: (select |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: (local.get $z) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $15) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $16) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $loop-multicond-2 (param $x i32) (param $y i32) (param $z i32) (result i32) |
| (local $t i32) |
| (local.set $x (i32.const 1)) |
| (local.set $y (i32.const 2)) |
| (local.set $z (i32.const 3)) |
| (loop $loopy |
| (local.set $x (i32.add (local.get $x) (i32.const 4))) |
| (br_if $loopy (local.get $t)) |
| (local.set $y (i32.add (local.get $y) (i32.const 5))) |
| (br_if $loopy (local.get $t)) |
| (local.set $z (i32.add (local.get $z) (i32.const 6))) |
| ) |
| (return (select (local.get $x) (local.get $y) (local.get $z))) |
| ) |
| ;; CHECK: (func $loop-block-1 (param $x i32) (param $y i32) (param $z i32) (result i32) |
| ;; CHECK-NEXT: (local $t i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (local $11 i32) |
| ;; CHECK-NEXT: (local $12 i32) |
| ;; CHECK-NEXT: (local $13 i32) |
| ;; CHECK-NEXT: (local $14 i32) |
| ;; CHECK-NEXT: (local $15 i32) |
| ;; CHECK-NEXT: (local $16 i32) |
| ;; CHECK-NEXT: (local $17 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $z |
| ;; CHECK-NEXT: (i32.const 3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (loop $loopy |
| ;; CHECK-NEXT: (block $out |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 4) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $out |
| ;; CHECK-NEXT: (local.get $t) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: (i32.const 5) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $out |
| ;; CHECK-NEXT: (local.get $t) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $z |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $z) |
| ;; CHECK-NEXT: (i32.const 6) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br $loopy) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $15 |
| ;; CHECK-NEXT: (select |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: (local.get $z) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $15) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $16) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $loop-block-1 (param $x i32) (param $y i32) (param $z i32) (result i32) |
| (local $t i32) |
| (local.set $x (i32.const 1)) |
| (local.set $y (i32.const 2)) |
| (local.set $z (i32.const 3)) |
| (loop $loopy |
| (block $out |
| (local.set $x (i32.add (local.get $x) (i32.const 4))) |
| (br_if $out (local.get $t)) |
| (local.set $y (i32.add (local.get $y) (i32.const 5))) |
| (br_if $out (local.get $t)) |
| (local.set $z (i32.add (local.get $z) (i32.const 6))) |
| (br $loopy) |
| ) |
| ) |
| (return (select (local.get $x) (local.get $y) (local.get $z))) |
| ) |
| ;; CHECK: (func $loop-block-2 (param $x i32) (param $y i32) (param $z i32) (result i32) |
| ;; CHECK-NEXT: (local $t i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (local $11 i32) |
| ;; CHECK-NEXT: (local $12 i32) |
| ;; CHECK-NEXT: (local $13 i32) |
| ;; CHECK-NEXT: (local $14 i32) |
| ;; CHECK-NEXT: (local $15 i32) |
| ;; CHECK-NEXT: (local $16 i32) |
| ;; CHECK-NEXT: (local $17 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $z |
| ;; CHECK-NEXT: (i32.const 3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (block $out |
| ;; CHECK-NEXT: (loop $loopy |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 4) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $out |
| ;; CHECK-NEXT: (local.get $t) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $y |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: (i32.const 5) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $out |
| ;; CHECK-NEXT: (local.get $t) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $z |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $z) |
| ;; CHECK-NEXT: (i32.const 6) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br $loopy) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $15 |
| ;; CHECK-NEXT: (select |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $y) |
| ;; CHECK-NEXT: (local.get $z) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $15) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $16) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $loop-block-2 (param $x i32) (param $y i32) (param $z i32) (result i32) |
| (local $t i32) |
| (local.set $x (i32.const 1)) |
| (local.set $y (i32.const 2)) |
| (local.set $z (i32.const 3)) |
| (block $out |
| (loop $loopy |
| (local.set $x (i32.add (local.get $x) (i32.const 4))) |
| (br_if $out (local.get $t)) |
| (local.set $y (i32.add (local.get $y) (i32.const 5))) |
| (br_if $out (local.get $t)) |
| (local.set $z (i32.add (local.get $z) (i32.const 6))) |
| (br $loopy) |
| ) |
| ) |
| (return (select (local.get $x) (local.get $y) (local.get $z))) |
| ) |
| ;; CHECK: (func $bad-phi-type (param $var$0 i64) (param $var$1 i64) (param $var$2 i32) (param $var$3 f32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 f64) |
| ;; CHECK-NEXT: (local $9 f64) |
| ;; CHECK-NEXT: (local $10 f64) |
| ;; CHECK-NEXT: (local $11 f64) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $var$2) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (loop $label$2 |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block $label$3 |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $6 |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $6) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $label$2 |
| ;; CHECK-NEXT: (local.get $var$2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $10 |
| ;; CHECK-NEXT: (f64.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (drop |
| ;; CHECK-NEXT: (local.get $10) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $bad-phi-type (param $var$0 i64) (param $var$1 i64) (param $var$2 i32) (param $var$3 f32) |
| (if |
| (local.get $var$2) |
| (drop |
| (loop $label$2 (result f64) |
| (if |
| (block $label$3 (result i32) |
| (if |
| (i32.const 0) |
| (unreachable) |
| ) |
| (nop) |
| (i32.const 0) |
| ) |
| (unreachable) |
| ) |
| (br_if $label$2 |
| (local.get $var$2) |
| ) |
| (f64.const 0) |
| ) |
| ) |
| ) |
| ) |
| ;; CHECK: (func $loop-unreachable |
| ;; CHECK-NEXT: (local $var$0 i32) |
| ;; CHECK-NEXT: (local $var$1 f64) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (local $11 f64) |
| ;; CHECK-NEXT: (local $12 f64) |
| ;; CHECK-NEXT: (local $13 f64) |
| ;; CHECK-NEXT: (loop $label$1 |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block $label$2 |
| ;; CHECK-NEXT: (block $label$3 |
| ;; CHECK-NEXT: (block $label$4 |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (i32.const 1337) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (loop $label$6 |
| ;; CHECK-NEXT: (block $label$7 |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $6 |
| ;; CHECK-NEXT: (local.get $var$0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br_if $label$7 |
| ;; CHECK-NEXT: (i32.const 65535) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (drop |
| ;; CHECK-NEXT: (local.get $6) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $6 |
| ;; CHECK-NEXT: (local.get $var$0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br_if $label$7 |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (drop |
| ;; CHECK-NEXT: (local.get $6) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $label$6 |
| ;; CHECK-NEXT: (local.get $6) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br $label$1) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| (func $loop-unreachable |
| (local $var$0 i32) |
| (local $var$1 f64) |
| (loop $label$1 |
| (local.set $var$1 |
| (block $label$2 (result f64) |
| (block $label$3 |
| (local.set $var$0 |
| (block $label$4 (result i32) |
| (if |
| (i32.const 1337) |
| (unreachable) |
| ) |
| (local.get $var$0) |
| ) |
| ) |
| (loop $label$6 |
| (br_if $label$6 |
| (block $label$7 (result i32) |
| (drop |
| (br_if $label$7 |
| (local.get $var$0) |
| (i32.const 65535) |
| ) |
| ) |
| (drop |
| (br_if $label$7 |
| (local.get $var$0) |
| (i32.const 0) |
| ) |
| ) |
| (unreachable) |
| ) |
| ) |
| ) |
| ) |
| (local.get $var$1) |
| ) |
| ) |
| (br $label$1) |
| ) |
| ) |
| ;; CHECK: (func $phi-value-turns-bad (result f64) |
| ;; CHECK-NEXT: (local $var$0 i32) |
| ;; CHECK-NEXT: (local $var$1 i32) |
| ;; CHECK-NEXT: (local $var$2 f32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (local $11 i32) |
| ;; CHECK-NEXT: (local $12 f32) |
| ;; CHECK-NEXT: (local $13 f32) |
| ;; CHECK-NEXT: (local $14 f32) |
| ;; CHECK-NEXT: (local $15 f32) |
| ;; CHECK-NEXT: (local $16 f64) |
| ;; CHECK-NEXT: (local $17 f64) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $var$0 |
| ;; CHECK-NEXT: (i32.atomic.rmw16.sub_u offset=22 |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $var$0) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block $block |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (loop $label$3 |
| ;; CHECK-NEXT: (block $label$4 |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $6 |
| ;; CHECK-NEXT: (local.get $var$0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br_if $label$4 |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $6 |
| ;; CHECK-NEXT: (i32.clz |
| ;; CHECK-NEXT: (local.get $6) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $6) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $14 |
| ;; CHECK-NEXT: (f32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $16) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $phi-value-turns-bad (result f64) |
| (local $var$0 i32) |
| (local $var$1 i32) |
| (local $var$2 f32) |
| (local.set $var$2 |
| (if (result f32) |
| (local.tee $var$0 |
| (i32.atomic.rmw16.sub_u offset=22 |
| (i32.const 0) |
| (i32.const 0) |
| ) |
| ) |
| (unreachable) |
| (block (result f32) |
| (if |
| (loop $label$3 (result i32) |
| (block $label$4 (result i32) |
| (i32.clz |
| (br_if $label$4 |
| (local.get $var$0) |
| (i32.const 1) |
| ) |
| ) |
| ) |
| ) |
| (nop) |
| ) |
| (f32.const 1) |
| ) |
| ) |
| ) |
| (unreachable) |
| ) |
| ;; CHECK: (func $multi-use (param $x i32) (result i32) |
| ;; CHECK-NEXT: (local $temp i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $temp |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $8 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $temp) |
| ;; CHECK-NEXT: (local.get $temp) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $8) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $multi-use (param $x i32) (result i32) |
| (local $temp i32) |
| (local.set $temp (i32.add (local.get $x) (i32.const 1))) |
| (i32.add (local.get $temp) (local.get $temp)) |
| ) |
| ;; CHECK: (func $multi-use-2 (param $x i32) (result i32) |
| ;; CHECK-NEXT: (local $temp i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $temp |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.mul |
| ;; CHECK-NEXT: (local.get $temp) |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $10 |
| ;; CHECK-NEXT: (i32.sub |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (local.get $temp) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $10) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $multi-use-2 (param $x i32) (result i32) |
| (local $temp i32) |
| (local.set $temp (i32.add (local.get $x) (i32.const 1))) |
| (local.set $x (i32.mul (local.get $temp) (i32.const 2))) |
| (i32.sub (local.get $x) (local.get $temp)) |
| ) |
| ;; CHECK: (func $many-single-uses-with-param (param $x i32) (result i32) |
| ;; CHECK-NEXT: (local $1 i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $2 |
| ;; CHECK-NEXT: (i32.mul |
| ;; CHECK-NEXT: (i32.const 10) |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $4 |
| ;; CHECK-NEXT: (i32.ctz |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $5 |
| ;; CHECK-NEXT: (i32.sub |
| ;; CHECK-NEXT: (local.get $4) |
| ;; CHECK-NEXT: (i32.const 20) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $6 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $2) |
| ;; CHECK-NEXT: (local.get $5) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $7 |
| ;; CHECK-NEXT: (i32.eqz |
| ;; CHECK-NEXT: (local.get $6) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $7) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| (func $many-single-uses-with-param (param $x i32) (result i32) |
| (return |
| (i32.eqz |
| (i32.add |
| (i32.mul |
| (i32.const 10) |
| (local.get $x) |
| ) |
| (i32.sub |
| (i32.ctz |
| (local.get $x) |
| ) |
| (i32.const 20) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (func "replaced-print-internal" (param $var$0 i32) |
| (local $var$1 i32) |
| (local $var$2 i32) |
| (local $var$3 i32) |
| (if |
| (local.tee $var$0 |
| (i32.add |
| (local.get $var$0) |
| (i32.const -7) |
| ) |
| ) |
| (block $label$2 |
| (block $label$3 |
| (local.set $var$1 |
| (local.get $var$0) |
| ) |
| (br_if $label$3 |
| (local.tee $var$3 |
| (i32.const 12) |
| ) |
| ) |
| (unreachable) |
| ) |
| (br_if $label$2 |
| (i32.eqz |
| (local.get $var$1) |
| ) |
| ) |
| (if |
| (i32.ne |
| (i32.load |
| (i32.const 0) |
| ) |
| (local.get $var$0) |
| ) |
| (unreachable) |
| ) |
| (unreachable) |
| ) |
| ) |
| ) |
| ;; CHECK: (func $56 (param $var$0 i32) |
| ;; CHECK-NEXT: (local $var$1 i32) |
| ;; CHECK-NEXT: (local $var$2 i32) |
| ;; CHECK-NEXT: (local $var$3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (local $11 i32) |
| ;; CHECK-NEXT: (local $12 i32) |
| ;; CHECK-NEXT: (local $13 i32) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $var$0 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $var$0) |
| ;; CHECK-NEXT: (i32.const -7) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $var$0) |
| ;; CHECK-NEXT: (block $label$2 |
| ;; CHECK-NEXT: (block $label$3 |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $var$1 |
| ;; CHECK-NEXT: (local.get $var$0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $8 |
| ;; CHECK-NEXT: (i32.const 12) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br_if $label$3 |
| ;; CHECK-NEXT: (local.get $8) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $10 |
| ;; CHECK-NEXT: (i32.eqz |
| ;; CHECK-NEXT: (local.get $var$1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br_if $label$2 |
| ;; CHECK-NEXT: (local.get $10) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (local.set $11 |
| ;; CHECK-NEXT: (i32.load |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $13 |
| ;; CHECK-NEXT: (i32.ne |
| ;; CHECK-NEXT: (local.get $11) |
| ;; CHECK-NEXT: (local.get $var$0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $13) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| |
| ;; CHECK: (func $multiple-uses-to-non-expression (param $x i32) |
| ;; CHECK-NEXT: (local $temp i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $x |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 10) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (i32.store |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $6 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $x) |
| ;; CHECK-NEXT: (i32.const 20) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (i32.store |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: (local.get $6) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $multiple-uses-to-non-expression (param $x i32) |
| (local $temp i32) |
| (local.set $x |
| (i32.add |
| (local.get $x) |
| (i32.const 10) |
| ) |
| ) |
| (i32.store |
| (i32.const 1) |
| (local.get $x) ;; x+10 has two uses! |
| ) |
| (i32.store |
| (i32.const 2) |
| (i32.add |
| (local.get $x) |
| (i32.const 20) |
| ) |
| ) |
| ) |
| ;; CHECK: (func $nested-phi-forwarding (param $var$0 i32) (result i32) |
| ;; CHECK-NEXT: (local $var$1 i32) |
| ;; CHECK-NEXT: (local $var$2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block $label$1 |
| ;; CHECK-NEXT: (block $label$2 |
| ;; CHECK-NEXT: (loop $label$3 |
| ;; CHECK-NEXT: (block $label$4 |
| ;; CHECK-NEXT: (block $label$5 |
| ;; CHECK-NEXT: (block $label$6 |
| ;; CHECK-NEXT: (block $label$7 |
| ;; CHECK-NEXT: (block $label$8 |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_table $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$8 $label$2 $label$2 $label$2 $label$6 $label$2 $label$2 $label$7 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$5 $label$4 |
| ;; CHECK-NEXT: (local.get $var$0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $var$1 |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br $label$4) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br $label$1) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $var$2 |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br_if $label$3 |
| ;; CHECK-NEXT: (local.get $var$2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (block $label$9 |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $6 |
| ;; CHECK-NEXT: (i32.or |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: (local.get $var$1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br_if $label$9 |
| ;; CHECK-NEXT: (local.get $6) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (i32.store offset=176 |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: (local.get $var$2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $9 |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $9) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $nested-phi-forwarding (param $var$0 i32) (result i32) |
| (local $var$1 i32) |
| (local $var$2 i32) |
| (block $label$1 |
| (block $label$2 |
| (loop $label$3 |
| (block $label$4 |
| (block $label$5 |
| (block $label$6 |
| (block $label$7 |
| (block $label$8 |
| (br_table $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$8 $label$2 $label$2 $label$2 $label$6 $label$2 $label$2 $label$7 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$2 $label$5 $label$4 |
| (local.get $var$0) |
| ) |
| ) |
| (local.set $var$1 |
| (i32.const 1) |
| ) |
| ) |
| (br $label$4) |
| ) |
| (unreachable) |
| ) |
| (br $label$1) |
| ) |
| (br_if $label$3 |
| (local.tee $var$2 |
| (i32.const 1) |
| ) |
| ) |
| ) |
| ) |
| (block $label$9 |
| (br_if $label$9 |
| (i32.or |
| (i32.const 1) |
| (local.get $var$1) |
| ) |
| ) |
| ) |
| (unreachable) |
| ) |
| (i32.store offset=176 |
| (i32.const 0) |
| (local.get $var$2) |
| ) |
| (i32.const 0) |
| ) |
| ;; CHECK: (func $zext-numGets (param $var$0 i32) (param $var$1 i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (block $label$1 |
| ;; CHECK-NEXT: (local.set $2 |
| ;; CHECK-NEXT: (i32.load |
| ;; CHECK-NEXT: (i32.const -8) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $3 |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br_if $label$1 |
| ;; CHECK-NEXT: (local.get $2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (drop |
| ;; CHECK-NEXT: (local.get $3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $5 |
| ;; CHECK-NEXT: (i32.load |
| ;; CHECK-NEXT: (i32.const -16) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $3 |
| ;; CHECK-NEXT: (i32.eqz |
| ;; CHECK-NEXT: (local.get $5) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $8 |
| ;; CHECK-NEXT: (i32.ctz |
| ;; CHECK-NEXT: (local.get $3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $8) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $zext-numGets (param $var$0 i32) (param $var$1 i32) |
| (if |
| (i32.ctz |
| (block $label$1 (result i32) |
| (drop |
| (br_if $label$1 |
| (i32.const 1) |
| (i32.load |
| (i32.const -8) |
| ) |
| ) |
| ) |
| (i32.eqz |
| (i32.load |
| (i32.const -16) |
| ) |
| ) |
| ) |
| ) |
| (unreachable) |
| ) |
| ) |
| ;; CHECK: (func $zext-numGets-hasAnotherUse (param $var$0 i32) (param $var$1 i32) |
| ;; CHECK-NEXT: (local $temp i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (local $11 i32) |
| ;; CHECK-NEXT: (block $label$1 |
| ;; CHECK-NEXT: (local.set $3 |
| ;; CHECK-NEXT: (i32.load |
| ;; CHECK-NEXT: (i32.const -8) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $4 |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br_if $label$1 |
| ;; CHECK-NEXT: (local.get $3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (drop |
| ;; CHECK-NEXT: (local.get $4) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $6 |
| ;; CHECK-NEXT: (i32.load |
| ;; CHECK-NEXT: (i32.const -16) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $temp |
| ;; CHECK-NEXT: (i32.eqz |
| ;; CHECK-NEXT: (local.get $6) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (drop |
| ;; CHECK-NEXT: (local.get $temp) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $4 |
| ;; CHECK-NEXT: (local.get $temp) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $11 |
| ;; CHECK-NEXT: (i32.ctz |
| ;; CHECK-NEXT: (local.get $4) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $11) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $zext-numGets-hasAnotherUse (param $var$0 i32) (param $var$1 i32) |
| (local $temp i32) |
| (if |
| (i32.ctz |
| (block $label$1 (result i32) |
| (drop |
| (br_if $label$1 |
| (i32.const 1) |
| (i32.load |
| (i32.const -8) |
| ) |
| ) |
| ) |
| (local.set $temp |
| (i32.eqz |
| (i32.load |
| (i32.const -16) |
| ) |
| ) |
| ) |
| (drop |
| (local.get $temp) |
| ) |
| (local.get $temp) |
| ) |
| ) |
| (unreachable) |
| ) |
| ) |
| ;; CHECK: (func $flipped-needs-right-origin (param $var$0 i32) (result i32) |
| ;; CHECK-NEXT: (local $var$1 i32) |
| ;; CHECK-NEXT: (local $2 i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block $label$1 |
| ;; CHECK-NEXT: (local.set $2 |
| ;; CHECK-NEXT: (i32.load |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br_if $label$1 |
| ;; CHECK-NEXT: (local.get $2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $var$1 |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $4 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $var$1) |
| ;; CHECK-NEXT: (i32.const 4) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $5 |
| ;; CHECK-NEXT: (i32.gt_s |
| ;; CHECK-NEXT: (i32.const 3) |
| ;; CHECK-NEXT: (local.get $4) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $5) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $7 |
| ;; CHECK-NEXT: (i32.const 5) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $7) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $flipped-needs-right-origin (param $var$0 i32) (result i32) |
| (local $var$1 i32) |
| (block $label$1 |
| (br_if $label$1 |
| (i32.load |
| (i32.const 1) |
| ) |
| ) |
| (local.set $var$1 |
| (i32.const 2) |
| ) |
| ) |
| (if |
| (i32.gt_s |
| (i32.const 3) |
| (i32.add |
| (local.get $var$1) |
| (i32.const 4) |
| ) |
| ) |
| (unreachable) |
| ) |
| (i32.const 5) |
| ) |
| ;; CHECK: (func $non-expr-nodes-may-have-multiple-uses-too-its-the-ORIGIN (param $var$0 i32) (param $var$1 i32) (param $var$2 i32) (result i32) |
| ;; CHECK-NEXT: (local $3 i32) |
| ;; CHECK-NEXT: (local $4 i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (local $8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $var$1 |
| ;; CHECK-NEXT: (i32.gt_u |
| ;; CHECK-NEXT: (local.get $var$1) |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (i32.store |
| ;; CHECK-NEXT: (local.get $var$1) |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $7 |
| ;; CHECK-NEXT: (i32.sub |
| ;; CHECK-NEXT: (i32.const 4) |
| ;; CHECK-NEXT: (local.get $var$1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (i32.store offset=8 |
| ;; CHECK-NEXT: (i32.const 3) |
| ;; CHECK-NEXT: (local.get $7) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $8) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $non-expr-nodes-may-have-multiple-uses-too-its-the-ORIGIN (param $var$0 i32) (param $var$1 i32) (param $var$2 i32) (result i32) |
| (i32.store |
| (local.tee $var$1 |
| (i32.gt_u |
| (local.get $var$1) |
| (i32.const 1) |
| ) |
| ) |
| (i32.const 2) |
| ) |
| (i32.store offset=8 |
| (i32.const 3) |
| (i32.sub |
| (i32.const 4) |
| (local.get $var$1) |
| ) |
| ) |
| (unreachable) |
| ) |
| ;; CHECK: (func $loop-of-set-connections (param $var$0 i32) (param $var$1 i32) (param $var$2 i32) (param $var$3 i32) (param $var$4 i32) (result i32) |
| ;; CHECK-NEXT: (local $5 i32) |
| ;; CHECK-NEXT: (local $6 i32) |
| ;; CHECK-NEXT: (local $7 i32) |
| ;; CHECK-NEXT: (loop $label$1 |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (block $block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $var$2 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br $label$1) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (br $label$1) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| (func $loop-of-set-connections (param $var$0 i32) (param $var$1 i32) (param $var$2 i32) (param $var$3 i32) (param $var$4 i32) (result i32) |
| (loop $label$1 |
| (if |
| (i32.const 0) |
| (block |
| (local.set $var$2 |
| (i32.add |
| (i32.const 0) |
| (i32.const 1) |
| ) |
| ) |
| (br $label$1) |
| ) |
| ) |
| (local.set $var$3 |
| (local.get $var$2) |
| ) |
| (local.set $var$2 |
| (local.get $var$3) |
| ) |
| (br $label$1) |
| ) |
| ) |
| ;; CHECK: (func $conditions-in-conditions (param $var$0 i32) (param $var$1 i32) (param $var$2 i32) (result i32) |
| ;; CHECK-NEXT: (local $var$3 i32) |
| ;; CHECK-NEXT: (local $var$4 i32) |
| ;; CHECK-NEXT: (local $var$5 i32) |
| ;; CHECK-NEXT: (local $var$6 i32) |
| ;; CHECK-NEXT: (local $var$7 i32) |
| ;; CHECK-NEXT: (local $var$8 i32) |
| ;; CHECK-NEXT: (local $9 i32) |
| ;; CHECK-NEXT: (local $10 i32) |
| ;; CHECK-NEXT: (local $11 i32) |
| ;; CHECK-NEXT: (local $12 i32) |
| ;; CHECK-NEXT: (local $13 i32) |
| ;; CHECK-NEXT: (local $14 i32) |
| ;; CHECK-NEXT: (local $15 i32) |
| ;; CHECK-NEXT: (local $16 i32) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (local.set $var$1 |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: (loop $label$2 |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $var$1) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $var$3 |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $var$1 |
| ;; CHECK-NEXT: (i32.sub |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: (local.get $var$3) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (br_if $label$2 |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (block |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (if |
| ;; CHECK-NEXT: (local.get $var$1) |
| ;; CHECK-NEXT: (local.set $var$3 |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (local.set $14 |
| ;; CHECK-NEXT: (i32.add |
| ;; CHECK-NEXT: (local.get $var$3) |
| ;; CHECK-NEXT: (i32.const 16) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (i32.store |
| ;; CHECK-NEXT: (i32.const 8) |
| ;; CHECK-NEXT: (local.get $14) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (i32.store |
| ;; CHECK-NEXT: (i32.const 8) |
| ;; CHECK-NEXT: (i32.const 64) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: (unreachable) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (return |
| ;; CHECK-NEXT: (local.get $15) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $conditions-in-conditions (param $var$0 i32) (param $var$1 i32) (param $var$2 i32) (result i32) |
| (local $var$3 i32) |
| (local $var$4 i32) |
| (local $var$5 i32) |
| (local $var$6 i32) |
| (local $var$7 i32) |
| (local $var$8 i32) |
| (local.set $var$1 |
| (i32.const 1) |
| ) |
| (if |
| (i32.const 0) |
| (loop $label$2 |
| (if |
| (local.get $var$1) |
| (nop) |
| ) |
| (local.set $var$1 |
| (i32.sub |
| (i32.const 0) |
| (local.tee $var$3 |
| (i32.const 1) |
| ) |
| ) |
| ) |
| (br_if $label$2 |
| (i32.const 0) |
| ) |
| ) |
| ) |
| (if |
| (local.get $var$1) |
| (local.set $var$3 |
| (i32.const 1) |
| ) |
| ) |
| (i32.store |
| (i32.const 8) |
| (i32.add |
| (local.get $var$3) |
| (i32.const 16) |
| ) |
| ) |
| (i32.store |
| (i32.const 8) |
| (i32.const 64) |
| ) |
| (unreachable) |
| ) |
| ) |