diff options
author | Thomas Lively <7121787+tlively@users.noreply.github.com> | 2021-07-12 17:37:47 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-12 17:37:47 -0700 |
commit | d22bc1c5dc2685b2c3f9ee004197da249c2b416e (patch) | |
tree | 7dbc246d468e91c1a2602e64fb8c0df3b1a54156 | |
parent | 58ce30422a24f44dcac6f5d1b6950d900582f0f2 (diff) | |
download | binaryen-d22bc1c5dc2685b2c3f9ee004197da249c2b416e.tar.gz binaryen-d22bc1c5dc2685b2c3f9ee004197da249c2b416e.tar.bz2 binaryen-d22bc1c5dc2685b2c3f9ee004197da249c2b416e.zip |
Port test/passes/flatten* to lit (#3971)
25 files changed, 16797 insertions, 19582 deletions
diff --git a/test/lit/passes/flatten_all-features.wast b/test/lit/passes/flatten_all-features.wast new file mode 100644 index 000000000..5e8cfe25c --- /dev/null +++ b/test/lit/passes/flatten_all-features.wast @@ -0,0 +1,3538 @@ +;; 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 --all-features -S -o - | filecheck %s + +(module + ;; CHECK: (type $2 (func (result i32))) + + ;; CHECK: (type $1 (func)) + + ;; CHECK: (type $ii (func (param i32 i32))) + (type $ii (func (param i32 i32))) + (type $1 (func)) + (type $2 (func (result i32))) + ;; CHECK: (type $3 (func (param i32) (result i32))) + (type $3 (func (param i32) (result i32))) + ;; CHECK: (type $none_=>_f32 (func (result f32))) + + ;; CHECK: (type $4 (func (param i64 i64) (result i64))) + (type $4 (func (param i64 i64) (result i64))) + ;; CHECK: (type $none_=>_anyref (func (result anyref))) + + ;; CHECK: (global $x (mut i32) (i32.const 0)) + (global $x (mut i32) (i32.const 0)) + (table 1 1 funcref) + (elem (i32.const 0) $call-me) + ;; CHECK: (memory $0 10) + (memory $0 10) + ;; CHECK: (table $0 1 1 funcref) + + ;; CHECK: (elem (i32.const 0) $call-me) + + ;; CHECK: (func $a1 + ;; 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: (drop + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $a1 + (drop (i32.add (i32.const 0) (i32.const 1))) + ) + ;; CHECK: (func $a2 (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 $a2 (result i32) + (i32.add (i32.const 0) (i32.const 1)) + ) + ;; CHECK: (func $a3 (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (local $2 i32) + ;; CHECK-NEXT: (block $block + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $a3 (result i32) + (i32.add + (i32.const 0) + (block (result i32) + (i32.const 1) + ) + ) + ) + ;; CHECK: (func $a4 + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (local $2 i32) + ;; CHECK-NEXT: (block $block + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $a4 + (drop + (i32.add + (i32.const 0) + (block (result i32) + (i32.const 1) + ) + ) + ) + ) + ;; CHECK: (func $a5 (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 $block + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $block0 + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $a5 (result i32) + (i32.add + (block (result i32) + (i32.const 0) + ) + (block (result i32) + (i32.const 1) + ) + ) + ) + ;; CHECK: (func $a6 (result i32) + ;; CHECK-NEXT: (local $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: (local $6 i32) + ;; CHECK-NEXT: (local $7 i32) + ;; CHECK-NEXT: (block $block + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $block1 + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $a6 (result i32) + (local $x i32) + (i32.add + (block (result i32) + (local.tee $x + (i32.const 0) + ) + ) + (block (result i32) + (local.tee $x + (i32.const 1) + ) + ) + ) + ) + ;; CHECK: (func $a7 (result i32) + ;; CHECK-NEXT: (local $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: (local $6 i32) + ;; CHECK-NEXT: (local $7 i32) + ;; CHECK-NEXT: (local $8 i32) + ;; CHECK-NEXT: (local $9 i32) + ;; CHECK-NEXT: (block $block + ;; CHECK-NEXT: (block $block2 + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $block3 + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $9 + ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $9) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $a7 (result i32) + (local $x i32) + (block (result i32) + (i32.add + (block (result i32) + (local.tee $x + (i32.const 0) + ) + ) + (block (result i32) + (local.tee $x + (i32.const 1) + ) + ) + ) + ) + ) + ;; CHECK: (func $a8 (result i32) + ;; CHECK-NEXT: (local $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: (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 $outer + ;; CHECK-NEXT: (block $inner + ;; CHECK-NEXT: (block $block + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (i32.const -1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $inner) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $outer) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $block4 + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $outer) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $9 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $9) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $10 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $a8 (result i32) + (local $x i32) + (block $outer (result i32) + (block $inner (result i32) + (i32.add + (block (result i32) + (br $inner + (i32.const -1) + ) + (br $outer + (i32.const 0) + ) + (i32.const 1) + ) + (block (result i32) + (br $outer + (i32.const 2) + ) + (local.tee $x + (i32.const 3) + ) + ) + ) + ) + ) + ) + ;; CHECK: (func $a9 (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 $6 i32) + ;; CHECK-NEXT: (loop $outer + ;; CHECK-NEXT: (loop $inner + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br_if $outer + ;; CHECK-NEXT: (i32.const -1) + ;; CHECK-NEXT: ) + ;; 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: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $a9 (result i32) + (loop $outer (result i32) + (loop $inner (result i32) + (br_if $outer (i32.const -1)) + (i32.add + (i32.const 0) + (i32.const 1) + ) + ) + ) + ) + ;; CHECK: (func $a10 (result i32) + ;; CHECK-NEXT: (local $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: (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 $outer + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $outer + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $outer + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $outer + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.const 7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $outer + ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $9 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $9) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (i32.const 8) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $outer) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $10 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $a10 (result i32) + (local $x i32) + (block $outer (result i32) + (drop (br_if $outer (i32.const 0) (i32.const 1))) + (drop (br_if $outer (local.tee $x (i32.const 2)) (i32.const 3))) + (drop (br_if $outer (i32.const 4) (local.tee $x (i32.const 5)))) + (drop (br_if $outer (local.tee $x (i32.const 6)) (local.tee $x (i32.const 7)))) + (br $outer (i32.const 8)) + ) + ) + ;; CHECK: (func $a11 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $a11 + (if (i32.const 0) + (drop (i32.const 1)) + ) + ) + ;; CHECK: (func $a12 (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $a12 (result i32) + (if (result i32) (i32.const 0) + (i32.const 1) + (i32.const 2) + ) + ) + ;; CHECK: (func $a13 (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 $x + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_table $x + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $a13 (result i32) + (block $x i32 + (if i32 + (br_table $x (i32.const 2) (i32.const 0)) + (i32.const 0) + (i32.const 1) + ) + ) + ) + ;; CHECK: (func $a14 (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (local $2 i32) + ;; CHECK-NEXT: (block $block + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_table $block + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $a14 (result i32) + (block i32 + (select + (i32.const 0) (i32.const 1) (br_table 0 (i32.const 7) (i32.const 1)) + ) + ) + ) + ;; CHECK: (func $a15 + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $1 f32) + ;; CHECK-NEXT: (local $2 f32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.load16_u + ;; CHECK-NEXT: (i32.const 53) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $label$3 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (func $a15 + (if + (i32.load16_u + (i32.const 53) + ) + (unreachable) + (drop + (block $label$3 (result f32) + (unreachable) + ) + ) + ) + ) + ;; CHECK: (func $a16 (result i32) + ;; CHECK-NEXT: (local $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: (local $6 i32) + ;; CHECK-NEXT: (local $7 i32) + ;; CHECK-NEXT: (block $label$1 + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $label$2 + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $label$1 + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $a16 (result i32) + (local $x i32) + (block $label$1 (result i32) + (drop + (br_if $label$1 + (local.tee $x ;; set here, then it is undone later, but this value is used, not the contents of $x! + (i32.const 1) + ) + (i32.eqz ;; 0 into 1, so take the br_if + (block $label$2 (result i32) + (local.set $x + (i32.const 0) ;; undo the above tee + ) + (i32.const 0) + ) + ) + ) + ) + (i32.const 0) + ) + ) + ;; CHECK: (func $a17 (result f32) + ;; CHECK-NEXT: (local $var$0 f32) + ;; CHECK-NEXT: (local $1 f32) + ;; CHECK-NEXT: (local $2 f32) + ;; CHECK-NEXT: (local $3 f32) + ;; CHECK-NEXT: (local $4 f32) + ;; CHECK-NEXT: (local $5 f32) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $var$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $var$0 + ;; CHECK-NEXT: (f32.const -137438953472) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $var$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $var$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (f32.max + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $a17 (result f32) + (local $var$0 f32) + (f32.max + (local.get $var$0) + (select + (local.tee $var$0 + (f32.const -137438953472) + ) + (local.get $var$0) + (i32.const 0) + ) + ) + ) + ;; CHECK: (func $a18 (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (block $label$1 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $label$1 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.load + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $a18 (result i32) + (block $label$1 (result i32) + (i32.load16_s + (drop ;; an unreachable drop. one we move its contents outside, it should stay unreachable + (br_if $label$1 + (i32.const 1) + (unreachable) + ) + ) + ) + ) + ) + ;; CHECK: (func $a19 (result f32) + ;; CHECK-NEXT: (block $label$0 + ;; CHECK-NEXT: (block $label$1 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (f32.const 4289944320) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 65535) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (func $a19 (result f32) + (block $label$0 + (block $label$1 + (drop + (select + (unreachable) ;; move this out, so it happens before the return + (return + (f32.const 4289944320) + ) + (i32.const 65535) + ) + ) + ) + ) + ) + ;; CHECK: (func $call-me (param $0 i32) (param $1 i32) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: ) + (func $call-me (param $0 i32) (param $1 i32) + (nop) + ) + ;; CHECK: (func $code-to-kill + ;; CHECK-NEXT: (local $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: (local $6 i32) + ;; CHECK-NEXT: (block $out + ;; CHECK-NEXT: (br $out) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_table $out $out $out $out + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (call $code-to-kill) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $out1 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $out3 + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $out4 + ;; CHECK-NEXT: (br_table $out4 $out4 $out4 $out4 + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $out5 + ;; CHECK-NEXT: (br_if $out5 + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block4 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $out8 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $out9 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $out11 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $out13 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $out15 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $out16 + ;; CHECK-NEXT: (block $in + ;; CHECK-NEXT: (br_if $out16 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block11 + ;; CHECK-NEXT: (block $out18 + ;; CHECK-NEXT: (block $in19 + ;; CHECK-NEXT: (br_if $in19 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $out20 + ;; CHECK-NEXT: (block $in21 + ;; CHECK-NEXT: (br_table $out20 $in21 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $out22 + ;; CHECK-NEXT: (block $in23 + ;; CHECK-NEXT: (br_table $in23 $out22 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block13 + ;; CHECK-NEXT: (block $out25 + ;; CHECK-NEXT: (block $in26 + ;; CHECK-NEXT: (br_table $in26 $in26 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block15 + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 42) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (loop $loop-in18 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $out29 + ;; CHECK-NEXT: (loop $in30 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br_if $out29 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block20 + ;; CHECK-NEXT: (loop $in32 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br_if $in32 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (call $call-me + ;; CHECK-NEXT: (i32.const 123) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (call $call-me + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (call $call-me + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const -1) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (call_indirect $0 (type $ii) + ;; CHECK-NEXT: (i32.const 123) + ;; CHECK-NEXT: (i32.const 456) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const -2) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (call_indirect $0 (type $ii) + ;; CHECK-NEXT: (i32.const 139) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const -3) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (call_indirect $0 (type $ii) + ;; CHECK-NEXT: (i32.const 246) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const -4) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (call_indirect $0 (type $ii) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 22) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.load + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 33) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.store + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 44) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.store + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 55) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.store + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 66) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 77) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 88) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 99) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 100) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const 123) + ;; CHECK-NEXT: (i32.const 456) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 101) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const 123) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 456) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 102) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 123) + ;; CHECK-NEXT: (i32.const 456) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1337) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $code-to-kill + (local $x i32) + (block $out + (br $out) + (drop + (i32.const 0) + ) + (if + (i32.const 1) + (drop + (i32.const 2) + ) + ) + (br_table $out $out $out $out + (i32.const 3) + ) + (call $code-to-kill) + ) + (if + (i32.const 0) + (block $out1 + (unreachable) + (drop + (i32.const 0) + ) + ) + ) + (if + (i32.const 0) + (block $out3 + (return) + (drop + (i32.const 0) + ) + ) + ) + (block $out4 + (br_table $out4 $out4 $out4 $out4 + (i32.const 4) + ) + (drop + (i32.const 0) + ) + ) + (block $out5 + (br_if $out5 + (i32.const 3) + ) + (drop + (i32.const 0) + ) + ) + (if + (i32.const 0) + (block $block4 + (if + (i32.const 0) + (block $out8 + (unreachable) + (drop + (i32.const 0) + ) + ) + (block $out9 + (unreachable) + (drop + (i32.const 0) + ) + ) + ) + (drop + (i32.const 0) + ) + ) + ) + (if + (i32.const 0) + (drop + (block $out11 (result i32) + (br $out11 + (unreachable) + ) + (drop + (i32.const 0) + ) + (unreachable) + ) + ) + ) + (if + (i32.const 0) + (drop + (block $out13 (result i32) + (br_if $out13 + (unreachable) + (i32.const 0) + ) + (drop + (i32.const 0) + ) + (unreachable) + ) + ) + ) + (if + (i32.const 0) + (drop + (block $out15 (result i32) + (br_if $out15 + (unreachable) + (unreachable) + ) + (drop + (i32.const 0) + ) + (unreachable) + ) + ) + ) + (block $out16 + (block $in + (br_if $out16 + (i32.const 1) + ) + ) + (unreachable) + ) + (if + (i32.const 0) + (block $block11 + (block $out18 + (block $in19 + (br_if $in19 + (i32.const 1) + ) + ) + (unreachable) + ) + (drop + (i32.const 10) + ) + ) + ) + (block $out20 + (block $in21 + (br_table $out20 $in21 + (i32.const 1) + ) + ) + (unreachable) + ) + (block $out22 + (block $in23 + (br_table $in23 $out22 + (i32.const 1) + ) + ) + (unreachable) + ) + (if + (i32.const 0) + (block $block13 + (block $out25 + (block $in26 + (br_table $in26 $in26 + (i32.const 1) + ) + ) + (unreachable) + ) + (drop + (i32.const 10) + ) + ) + ) + (if + (i32.const 0) + (block $block15 + (drop + (i32.const 10) + ) + (drop + (i32.const 42) + ) + (unreachable) + (return + (unreachable) + ) + (unreachable) + (return) + ) + ) + (if + (i32.const 0) + (loop $loop-in18 + (unreachable) + ) + ) + (block $out29 + (loop $in30 + (br_if $out29 + (i32.const 1) + ) + (unreachable) + ) + ) + (if + (i32.const 0) + (block $block20 + (loop $in32 + (br_if $in32 + (i32.const 1) + ) + (unreachable) + ) + (drop + (i32.const 10) + ) + ) + ) + (if + (i32.const 1) + (call $call-me + (i32.const 123) + (unreachable) + ) + ) + (if + (i32.const 2) + (call $call-me + (unreachable) + (i32.const 0) + ) + ) + (if + (i32.const 3) + (call $call-me + (unreachable) + (unreachable) + ) + ) + (if + (i32.const -1) + (call_indirect (type $ii) + (i32.const 123) + (i32.const 456) + (unreachable) + ) + ) + (if + (i32.const -2) + (call_indirect (type $ii) + (i32.const 139) + (unreachable) + (i32.const 0) + ) + ) + (if + (i32.const -3) + (call_indirect (type $ii) + (i32.const 246) + (unreachable) + (unreachable) + ) + ) + (if + (i32.const -4) + (call_indirect (type $ii) + (unreachable) + (unreachable) + (unreachable) + ) + ) + (if + (i32.const 11) + (local.set $x + (unreachable) + ) + ) + (if + (i32.const 22) + (drop + (i32.load + (unreachable) + ) + ) + ) + (if + (i32.const 33) + (i32.store + (i32.const 0) + (unreachable) + ) + ) + (if + (i32.const 44) + (i32.store + (unreachable) + (i32.const 0) + ) + ) + (if + (i32.const 55) + (i32.store + (unreachable) + (unreachable) + ) + ) + (if + (i32.const 66) + (drop + (i32.eqz + (unreachable) + ) + ) + ) + (if + (i32.const 77) + (drop + (i32.add + (unreachable) + (i32.const 0) + ) + ) + ) + (if + (i32.const 88) + (drop + (i32.add + (i32.const 0) + (unreachable) + ) + ) + ) + (if + (i32.const 99) + (i32.add + (unreachable) + (unreachable) + ) + ) + (if + (i32.const 100) + (drop + (select + (i32.const 123) + (i32.const 456) + (unreachable) + ) + ) + ) + (if + (i32.const 101) + (drop + (select + (i32.const 123) + (unreachable) + (i32.const 456) + ) + ) + ) + (if + (i32.const 102) + (drop + (select + (unreachable) + (i32.const 123) + (i32.const 456) + ) + ) + ) + (drop + (i32.const 1337) + ) + ) + ;; CHECK: (func $killer + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1000) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (func $killer (type $1) + (unreachable) + (drop + (i32.const 1000) + ) + ) + ;; CHECK: (func $target + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2000) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $target (type $1) + (drop + (i32.const 2000) + ) + ) + ;; CHECK: (func $typed-block-none-then-unreachable (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (block $top-typed + ;; CHECK-NEXT: (block $switch$0 + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (br $switch$0) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $typed-block-none-then-unreachable (type $2) (result i32) + (block $top-typed (result i32) + (block $switch$0 + (return + (i32.const 0) + ) + (br $switch$0) + ) + (return + (i32.const 1) + ) + ) + ) + ;; CHECK: (func $typed-block-remove-br-changes-type (param $$$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: (block + ;; CHECK-NEXT: (block $switch$7 + ;; CHECK-NEXT: (block $switch-default$10 + ;; CHECK-NEXT: (block $switch-case$9 + ;; CHECK-NEXT: (block $switch-case$8 + ;; CHECK-NEXT: (br_table $switch-case$9 $switch-case$8 $switch-default$10 + ;; CHECK-NEXT: (i32.const -1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $$$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (br $switch$7) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $$$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $typed-block-remove-br-changes-type (type $3) (param $$$0 i32) (result i32) + (block $switch$7 + (block $switch-default$10 + (block $switch-case$9 + (block $switch-case$8 + (br_table $switch-case$9 $switch-case$8 $switch-default$10 + (i32.const -1) + ) + ) + ) + (return + (local.get $$$0) + ) + (br $switch$7) + ) + (return + (local.get $$$0) + ) + ) + (return + (i32.const 0) + ) + ) + ;; CHECK: (func $global + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (global.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (global.set $x + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (func $global (type $1) + (unreachable) + (drop + (global.get $x) + ) + (global.set $x + (i32.const 1) + ) + ) + ;; CHECK: (func $ret (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $ret (type $2) (result i32) + (return + (i32.const 0) + ) + (nop) + (i32.const 0) + ) + ;; CHECK: (func $unreachable-br (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (block $out + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $out) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $unreachable-br (type $2) (result i32) + (block $out (result i32) + (br $out + (br $out + (i32.const 0) + ) + ) + ) + ) + ;; CHECK: (func $unreachable-br-loop (result i32) + ;; CHECK-NEXT: (loop $out + ;; CHECK-NEXT: (br $out) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (func $unreachable-br-loop (type $2) (result i32) + (loop $out + (br $out) + ) + ) + ;; CHECK: (func $unreachable-block-ends-switch (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (block $label$0 + ;; CHECK-NEXT: (block $label$3 + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (br_table $label$3 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 19) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $unreachable-block-ends-switch (type $2) (result i32) + (block $label$0 (result i32) + (block $label$3 + (nop) + (br_table $label$3 + (unreachable) + ) + (unreachable) + ) + (i32.const 19) + ) + ) + ;; CHECK: (func $unreachable-block-ends-br_if (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (block $label$0 + ;; CHECK-NEXT: (block $label$2 + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (br_if $label$2 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 19) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $unreachable-block-ends-br_if (result i32) + (block $label$0 (result i32) + (block $label$2 + (nop) + (br_if $label$2 + (unreachable) + ) + (unreachable) + ) + (i32.const 19) + ) + ) + ;; CHECK: (func $unreachable-brs-3 (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (block $label$0 + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 18) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $label$0) + ;; CHECK-NEXT: (memory.grow + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 21) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $unreachable-brs-3 (result i32) + (block $label$0 (result i32) + (br $label$0 + (memory.grow + (br $label$0 + (i32.const 18) + ) + ) + ) + (i32.const 21) + ) + ) + ;; CHECK: (func $unreachable-brs-4 (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: (block $label$0 + ;; CHECK-NEXT: (block $label$1 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (i32.const 4104) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $label$0 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $label$0) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (i32.const 16) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $unreachable-brs-4 (param $var$0 i32) (result i32) + (i32.add + (i32.const 1) + (block $label$0 (result i32) + (br $label$0 + (block $label$1 (result i32) + (drop + (br_if $label$0 + (i32.const 4104) + (unreachable) + ) + ) + (i32.const 4) + ) + ) + (i32.const 16) + ) + ) + ) + ;; CHECK: (func $call-unreach (param $var$0 i64) (param $var$1 i64) (result i64) + ;; CHECK-NEXT: (local $2 i64) + ;; CHECK-NEXT: (local $3 i64) + ;; CHECK-NEXT: (local $4 i32) + ;; CHECK-NEXT: (local $5 i64) + ;; CHECK-NEXT: (local $6 i64) + ;; CHECK-NEXT: (local $7 i64) + ;; 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 i64) + ;; CHECK-NEXT: (local $16 i64) + ;; CHECK-NEXT: (local $17 i64) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $var$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (i64.eqz + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $label$0 + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $var$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $16 + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $label$1 + ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (local.get $var$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $9 + ;; CHECK-NEXT: (i64.sub + ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: (i64.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $block + ;; CHECK-NEXT: (local.set $10 + ;; CHECK-NEXT: (local.get $var$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (local.set $11 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $12 + ;; CHECK-NEXT: (local.get $11) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $13 + ;; CHECK-NEXT: (local.get $12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i64.mul + ;; CHECK-NEXT: (local.get $13) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $call-unreach + ;; CHECK-NEXT: (local.get $9) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $15 + ;; CHECK-NEXT: (local.get $14) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $16 + ;; CHECK-NEXT: (local.get $15) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $17 + ;; CHECK-NEXT: (local.get $16) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $17) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $call-unreach (param $var$0 i64) (param $var$1 i64) (result i64) + (local $2 i64) + (if (result i64) + (i64.eqz + (local.get $var$0) + ) + (block $label$0 (result i64) + (local.get $var$1) + ) + (block $label$1 (result i64) + (call $call-unreach + (i64.sub + (local.get $var$0) + (i64.const 1) + ) + (i64.mul + (block $block (result i64) + (local.set $2 + (local.get $var$0) + ) + (nop) + (local.get $2) + ) + (unreachable) + ) + ) + ) + ) + ) + + ;; flatten-specific + ;; CHECK: (func $test-flatten + ;; 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 $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: (block $out + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $out) + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (br $out) + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (br_table $out $out $out $out + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block $block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $in + ;; CHECK-NEXT: (block $switch-in + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_table $in $switch-in $in + ;; CHECK-NEXT: (i32.const 777) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $in) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $9 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $9) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $loop-in + ;; CHECK-NEXT: (local.set $10 + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $11 + ;; CHECK-NEXT: (local.get $10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $12 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (local.get $11) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: (local.set $13 + ;; CHECK-NEXT: (i32.const 7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $13 + ;; CHECK-NEXT: (i32.const 8) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $14 + ;; CHECK-NEXT: (local.get $13) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $15 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (local.get $14) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $15) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $16 + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const 9) + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $16) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $out) + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (br $out) + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const 9) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (br $out) + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const 9) + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: (local.set $17 + ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $17 + ;; CHECK-NEXT: (i32.const 13) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $18 + ;; CHECK-NEXT: (local.get $17) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $19 + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (local.get $18) + ;; CHECK-NEXT: (i32.const 9) + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $19) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: (local.set $20 + ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $20 + ;; CHECK-NEXT: (i32.const 13) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $21 + ;; CHECK-NEXT: (local.get $20) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $22 + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const 9) + ;; CHECK-NEXT: (local.get $21) + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $22) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: (local.set $23 + ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $23 + ;; CHECK-NEXT: (i32.const 13) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $24 + ;; CHECK-NEXT: (local.get $23) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $25 + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const 9) + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: (local.get $24) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $25) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: (local.set $26 + ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $26 + ;; CHECK-NEXT: (i32.const 13) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $27 + ;; CHECK-NEXT: (local.get $26) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 15) + ;; CHECK-NEXT: (local.set $28 + ;; CHECK-NEXT: (i32.const 16) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $28 + ;; CHECK-NEXT: (i32.const 17) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $29 + ;; CHECK-NEXT: (local.get $28) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $30 + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (local.get $27) + ;; CHECK-NEXT: (i32.const 14) + ;; CHECK-NEXT: (local.get $29) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $30) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: (local.set $31 + ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $31 + ;; CHECK-NEXT: (i32.const 7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $32 + ;; CHECK-NEXT: (local.get $31) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $32) + ;; CHECK-NEXT: (local.set $35 + ;; CHECK-NEXT: (i32.const 8) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 9) + ;; CHECK-NEXT: (local.set $33 + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $33 + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $34 + ;; CHECK-NEXT: (local.get $33) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $35 + ;; CHECK-NEXT: (local.get $34) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $36 + ;; CHECK-NEXT: (local.get $35) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $36) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $temp + ;; CHECK-NEXT: (local.set $37 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $temp + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $38 + ;; CHECK-NEXT: (local.get $37) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $37 + ;; CHECK-NEXT: (local.get $38) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $39 + ;; CHECK-NEXT: (local.get $37) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $39) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $test-flatten + (block $out + (drop (i32.add (i32.const 1) (i32.const 2))) + (drop (i32.add (i32.const 1) (br $out))) + (drop (i32.add (br $out) (i32.const 1))) + (drop (i32.add (i32.const 1) (br_table $out $out $out $out (i32.const 3)))) + (drop (i32.add (i32.const 1) + (block (result i32) + (drop (i32.const 2)) + (drop (i32.const 3)) + (i32.const 4) + ) + )) + (drop (i32.add (i32.const 1) + (block $in (result i32) + (drop + (block $switch-in (result i32) + (br_table $in $switch-in $in (i32.const 2) (i32.const 777)) + ) + ) + (br $in (i32.const 3)) + (i32.const 4) + ) + )) + (drop (i32.add (i32.const 1) + (loop (result i32) + (i32.const 5) + ) + )) + (drop (i32.add (i32.const 1) + (if (result i32) + (i32.const 6) + (i32.const 7) + (i32.const 8) + ) + )) + (drop + (select + (i32.const 9) + (i32.const 10) + (i32.const 11) + ) + ) + (drop + (select + (br $out) + (i32.const 10) + (i32.const 11) + ) + ) + (drop + (select + (i32.const 9) + (br $out) + (i32.const 11) + ) + ) + (drop + (select + (i32.const 9) + (i32.const 10) + (br $out) + ) + ) + (drop + (select + (if (result i32) + (i32.const 11) + (i32.const 12) + (i32.const 13) + ) + (i32.const 9) + (i32.const 10) + ) + ) + (drop + (select + (i32.const 9) + (if (result i32) + (i32.const 11) + (i32.const 12) + (i32.const 13) + ) + (i32.const 10) + ) + ) + (drop + (select + (i32.const 9) + (i32.const 10) + (if (result i32) + (i32.const 11) + (i32.const 12) + (i32.const 13) + ) + ) + ) + (drop + (select + (if (result i32) + (i32.const 11) + (i32.const 12) + (i32.const 13) + ) + (i32.const 14) + (if (result i32) + (i32.const 15) + (i32.const 16) + (i32.const 17) + ) + ) + ) + (drop (i32.add (i32.const 1) (return))) + (drop (i32.add (i32.const 1) (unreachable))) + (drop + (if (result i32) + (if (result i32) + (i32.const 5) + (i32.const 6) + (i32.const 7) + ) + (i32.const 8) + (if (result i32) + (i32.const 9) + (i32.const 10) + (i32.const 11) + ) + ) + ) + (drop + (block $temp (result i32) + (br_if $temp + (i32.const 1) + (i32.const 2) + ) + ) + ) + ) + ) + ;; CHECK: (func $flatten-return-value (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $flatten-return-value (result i32) + (drop (i32.add (i32.const 1) (return (i32.const 2)))) + (i32.const 3) + ) + ;; CHECK: (func $unbug + ;; CHECK-NEXT: (local $12 i32) + ;; CHECK-NEXT: (local $432 i32) + ;; CHECK-NEXT: (local $430 i32) + ;; CHECK-NEXT: (local $431 i32) + ;; CHECK-NEXT: (local $9 i32) + ;; CHECK-NEXT: (local $5 i32) + ;; CHECK-NEXT: (local $433 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: (block $block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (local.get $12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: (i32.const 65535) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: (block $block44 + ;; CHECK-NEXT: (block $label$78 + ;; CHECK-NEXT: (local.set $430 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $9 + ;; CHECK-NEXT: (local.get $430) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $432 + ;; CHECK-NEXT: (local.get $9) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $block45 + ;; CHECK-NEXT: (block $label$79 + ;; CHECK-NEXT: (local.set $10 + ;; CHECK-NEXT: (local.get $9) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $11 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $12 + ;; CHECK-NEXT: (local.get $12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $13 + ;; CHECK-NEXT: (i32.mul + ;; CHECK-NEXT: (local.get $12) + ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $14 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $11) + ;; CHECK-NEXT: (local.get $13) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $15 + ;; CHECK-NEXT: (i32.load16_u offset=2 + ;; CHECK-NEXT: (local.get $14) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $16 + ;; CHECK-NEXT: (i32.lt_u + ;; CHECK-NEXT: (local.get $10) + ;; CHECK-NEXT: (local.get $15) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $431 + ;; CHECK-NEXT: (local.get $16) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $17 + ;; CHECK-NEXT: (local.get $431) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $432 + ;; CHECK-NEXT: (local.get $17) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $433 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $18 + ;; CHECK-NEXT: (local.get $432) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $19 + ;; CHECK-NEXT: (local.get $433) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $20 + ;; CHECK-NEXT: (i32.xor + ;; CHECK-NEXT: (local.get $18) + ;; CHECK-NEXT: (local.get $19) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $21 + ;; CHECK-NEXT: (local.get $20) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $22 + ;; CHECK-NEXT: (local.get $21) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $22) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $unbug + (local $12 i32) + (local $432 i32) + (local $430 i32) + (local $431 i32) + (local $9 i32) + (local $5 i32) + (local $433 i32) + (drop + (block (result i32) + (if + (i32.eq + (local.get $12) + (i32.const 65535) + ) + (block + (block $label$78 + (local.set $430 + (i32.const 0) + ) + ) + (local.set $432 + (local.get $430) + ) + ) + (block + (block $label$79 + (local.set $431 + (i32.lt_u + (local.get $9) + (i32.load16_u offset=2 + (i32.add + (local.get $5) + (i32.mul + (local.get $12) + (i32.const 12) + ) + ) + ) + ) + ) + ) + (local.set $432 + (local.get $431) + ) + ) + ) + (local.set $433 + (i32.const 1) + ) + (i32.xor + (local.get $432) + (local.get $433) + ) + ) + ) + ) + ;; CHECK: (func $outer-block-typed (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: (block $block + ;; CHECK-NEXT: (block $label$0 + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (i32.const 16) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $outer-block-typed (type $3) (param $var$0 i32) (result i32) + (block (result i32) + (i32.add + (i32.const 1) + (block $label$0 (result i32) + (i32.const 16) + ) + ) + ) + ) + ;; CHECK: (func $nested-br_if-with-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: (local $5 i32) + ;; CHECK-NEXT: (local $6 i32) + ;; CHECK-NEXT: (block $label$0 + ;; CHECK-NEXT: (block $block + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $label$0 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $nested-br_if-with-value (result i32) + (local $0 i32) + (block $label$0 (result i32) + (drop + (br_if $label$0 + (i32.const 0) + (block (result i32) + (local.get $0) + ) + ) + ) + (i32.const 1) + ) + ) + ;; CHECK: (func $switch-unreachable + ;; CHECK-NEXT: (block $label$3 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (br_table $label$3 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $switch-unreachable + (block $label$3 + (br_table $label$3 + (unreachable) + ) + ) + ) + ;; CHECK: (func $br_if_order (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: (block $outer + ;; CHECK-NEXT: (block $inner + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $outer + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $block + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (i32.const -16) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (call $br_if_order + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $inner + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $9 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $9) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $br_if_order (param $x i32) (result i32) + (block $outer (result i32) + (block $inner (result i32) + (br_if $inner + (br_if $outer + (i32.const 0) + (i32.const 1) + ) + (call $br_if_order + (block (result i32) + (i32.const -16) + ) + ) + ) + ) + ) + ) + ;; CHECK: (func $tees (param $x i32) (param $y i32) + ;; CHECK-NEXT: (local $2 i32) + ;; CHECK-NEXT: (local $3 i32) + ;; CHECK-NEXT: (local $4 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $y + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (func $tees (param $x i32) (param $y i32) + (drop (local.tee $x (i32.const 1))) + (drop (local.tee $x (unreachable))) + (drop (local.tee $y (local.tee $x (i32.const 2)))) + ) + ;; CHECK: (func $return (param $x i32) (result i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (i32.sub + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (func $return (param $x i32) (result i32) + (return (i32.sub (i32.const 1) (i32.const 2))) + ) + + ;; subtypes + + ;; br_if leaves a value on the stack if not taken, which later can be the last + ;; element of the enclosing innermost block and flow out. So in case br_if + ;; targets an outer branch whose return type is a supertype of the br_if's + ;; value type, we need the value to be set into two locals: one with the outer + ;; block's type, and one with its value type. + ;; CHECK: (func $subtype (result anyref) + ;; CHECK-NEXT: (local $0 externref) + ;; CHECK-NEXT: (local $1 anyref) + ;; CHECK-NEXT: (local $2 externref) + ;; CHECK-NEXT: (local $3 externref) + ;; CHECK-NEXT: (local $4 externref) + ;; CHECK-NEXT: (local $5 externref) + ;; CHECK-NEXT: (local $6 externref) + ;; CHECK-NEXT: (local $7 anyref) + ;; CHECK-NEXT: (block $label0 + ;; CHECK-NEXT: (block $block + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (ref.null extern) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (ref.null extern) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $label0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $subtype (result anyref) + (local $0 externref) + (block $label0 (result anyref) + (block (result externref) + (local.tee $0 + (br_if $label0 + (ref.null extern) + (i32.const 0) + ) + ) + ) + ) + ) +) +(module + ;; CHECK: (type $i64_f32_=>_none (func (param i64 f32))) + + ;; CHECK: (type $none_=>_i32 (func (result i32))) + + ;; CHECK: (export "test" (func $1)) + + ;; CHECK: (func $0 (param $0 i64) (param $1 f32) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: ) + (func $0 (param $0 i64) (param $1 f32) + (nop) + ) + (func "test" (result i32) + (call $0 + (unreachable) ;; the unreachable should be handled properly, and not be + ;; reordered with the return + (return + (i32.const -111) + ) + ) + ) +) +;; non-nullable temp vars we add must be handled properly, as non-nullable +;; locals are not allowed +;; CHECK: (func $1 (result i32) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: (return +;; CHECK-NEXT: (i32.const -111) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (call $0 +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +(module + ;; CHECK: (type $none_=>_none (func)) + (type $none_=>_none (func)) + ;; CHECK: (type $none_=>_funcref (func (result funcref))) + + ;; CHECK: (func $0 (result funcref) + ;; CHECK-NEXT: (local $0 (ref null $none_=>_none)) + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (ref.as_non_null + ;; CHECK-NEXT: (ref.null $none_=>_none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (ref.as_non_null + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $0 (result funcref) + (ref.as_non_null + (ref.null $none_=>_none) + ) + ) +) diff --git a/test/passes/flatten_dfo_O3_enable-threads.wast b/test/lit/passes/flatten_dfo_O3_enable-threads.wast index e6e136b68..297f9c2c0 100644 --- a/test/passes/flatten_dfo_O3_enable-threads.wast +++ b/test/lit/passes/flatten_dfo_O3_enable-threads.wast @@ -1,4 +1,20 @@ +;; 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 --dfo -O3 --enable-threads -S -o - | filecheck %s + (module + ;; CHECK: (type $none_=>_none (func)) + + ;; CHECK: (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $i64_i32_=>_f64 (func (param i64 i32) (result f64))) + + ;; CHECK: (type $f64_=>_f64 (func (param f64) (result f64))) + + ;; CHECK: (type $none_=>_i32 (func (result i32))) + + ;; CHECK: (memory $0 (shared 1 1)) (memory $0 (shared 1 1)) (func "one" (loop $label$2 @@ -201,3 +217,56 @@ ) ) +;; CHECK: (export "one" (func $0)) + +;; CHECK: (export "two" (func $1)) + +;; CHECK: (export "use-var" (func $2)) + +;; CHECK: (export "bad1" (func $3)) + +;; CHECK: (export "only-dfo" (func $4)) + +;; CHECK: (export "dfo-tee-get" (func $5)) + +;; CHECK: (func $0 (; has Stack IR ;) +;; CHECK-NEXT: (block $label$3 +;; CHECK-NEXT: (br_if $label$3 +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (i32.const 3060) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) + +;; CHECK: (func $1 (; has Stack IR ;) (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) + +;; CHECK: (func $2 (; has Stack IR ;) (param $0 i64) (param $1 i32) (result f64) +;; CHECK-NEXT: (loop $label$8 +;; CHECK-NEXT: (br_if $label$8 +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) + +;; CHECK: (func $3 (; has Stack IR ;) +;; CHECK-NEXT: (i32.store +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const -16384) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $4 (; has Stack IR ;) (param $0 f64) (result f64) +;; CHECK-NEXT: (local $1 i32) +;; CHECK-NEXT: (loop $label$1 +;; CHECK-NEXT: (br $label$1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $5 (; has Stack IR ;) (result i32) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) diff --git a/test/lit/passes/flatten_i64-to-i32-lowering.wast b/test/lit/passes/flatten_i64-to-i32-lowering.wast new file mode 100644 index 000000000..e507ae8b2 --- /dev/null +++ b/test/lit/passes/flatten_i64-to-i32-lowering.wast @@ -0,0 +1,667 @@ +;; 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 --i64-to-i32-lowering -S -o - | filecheck %s + +(module + (memory 1 1) + ;; CHECK: (type $none_=>_i32 (func (result i32))) + + ;; CHECK: (type $none_=>_i64 (func (result i64))) + + ;; CHECK: (type $none_=>_none (func)) + + ;; CHECK: (import "env" "func" (func $import (result i64))) + (import "env" "func" (func $import (result i64))) + ;; CHECK: (global $i64toi32_i32$HIGH_BITS (mut i32) (i32.const 0)) + + ;; CHECK: (memory $0 1 1) + + ;; CHECK: (func $defined (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $0$hi i32) + ;; CHECK-NEXT: (local $i64toi32_i32$0 i32) + ;; CHECK-NEXT: (local $i64toi32_i32$1 i32) + ;; CHECK-NEXT: (local $i64toi32_i32$2 i32) + ;; CHECK-NEXT: (local $i64toi32_i32$3 i32) + ;; CHECK-NEXT: (local $i64toi32_i32$4 i32) + ;; CHECK-NEXT: (local $i64toi32_i32$5 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$2 + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $i64toi32_i32$3 + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $i64toi32_i32$4 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $i64toi32_i32$2) + ;; CHECK-NEXT: (local.get $i64toi32_i32$3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $i64toi32_i32$5 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $i64toi32_i32$0) + ;; CHECK-NEXT: (local.get $i64toi32_i32$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.lt_u + ;; CHECK-NEXT: (local.get $i64toi32_i32$4) + ;; CHECK-NEXT: (local.get $i64toi32_i32$3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $i64toi32_i32$5 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $i64toi32_i32$5) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $i64toi32_i32$4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $0$hi + ;; CHECK-NEXT: (local.get $i64toi32_i32$5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $i64toi32_i32$2 + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$5 + ;; CHECK-NEXT: (local.get $0$hi) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (global.set $i64toi32_i32$HIGH_BITS + ;; CHECK-NEXT: (local.get $i64toi32_i32$5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $i64toi32_i32$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $defined (result i64) + (i64.add (i64.const 1) (i64.const 2)) + ) + ;; CHECK: (func $unreachable-select-i64 (result i32) + ;; CHECK-NEXT: (local $i64toi32_i32$0 i32) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (func $unreachable-select-i64 (result i64) + (select + (i64.const 1) + (unreachable) + (i32.const 2) + ) + ) + ;; CHECK: (func $unreachable-select-i64-b (result i32) + ;; CHECK-NEXT: (local $i64toi32_i32$0 i32) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (func $unreachable-select-i64-b (result i64) + (select + (unreachable) + (i64.const 3) + (i32.const 4) + ) + ) + ;; CHECK: (func $unreachable-select-i64-c (result i32) + ;; CHECK-NEXT: (local $i64toi32_i32$0 i32) + ;; CHECK-NEXT: (local $i64toi32_i32$1 i32) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (func $unreachable-select-i64-c (result i64) + (select + (i64.const 5) + (i64.const 6) + (unreachable) + ) + ) + ;; CHECK: (func $mem + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $0$hi i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (local $1$hi i32) + ;; CHECK-NEXT: (local $2 i32) + ;; CHECK-NEXT: (local $2$hi i32) + ;; CHECK-NEXT: (local $3 i32) + ;; CHECK-NEXT: (local $3$hi i32) + ;; CHECK-NEXT: (local $4 i32) + ;; CHECK-NEXT: (local $4$hi i32) + ;; CHECK-NEXT: (local $i64toi32_i32$0 i32) + ;; CHECK-NEXT: (local $i64toi32_i32$1 i32) + ;; CHECK-NEXT: (local $i64toi32_i32$2 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$2 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.load + ;; CHECK-NEXT: (local.get $i64toi32_i32$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (i32.load offset=4 + ;; CHECK-NEXT: (local.get $i64toi32_i32$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $i64toi32_i32$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $0$hi + ;; CHECK-NEXT: (local.get $i64toi32_i32$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (local.get $0$hi) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$2 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (i32.load + ;; CHECK-NEXT: (local.get $i64toi32_i32$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.load offset=4 + ;; CHECK-NEXT: (local.get $i64toi32_i32$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $i64toi32_i32$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1$hi + ;; CHECK-NEXT: (local.get $i64toi32_i32$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (local.get $1$hi) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$2 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.load align=2 + ;; CHECK-NEXT: (local.get $i64toi32_i32$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (i32.load offset=4 align=2 + ;; CHECK-NEXT: (local.get $i64toi32_i32$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $i64toi32_i32$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2$hi + ;; CHECK-NEXT: (local.get $i64toi32_i32$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (local.get $2$hi) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$2 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (i32.load align=1 + ;; CHECK-NEXT: (local.get $i64toi32_i32$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.load offset=4 align=1 + ;; CHECK-NEXT: (local.get $i64toi32_i32$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $i64toi32_i32$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3$hi + ;; CHECK-NEXT: (local.get $i64toi32_i32$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (local.get $3$hi) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$2 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.load + ;; CHECK-NEXT: (local.get $i64toi32_i32$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (i32.load offset=4 + ;; CHECK-NEXT: (local.get $i64toi32_i32$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $i64toi32_i32$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4$hi + ;; CHECK-NEXT: (local.get $i64toi32_i32$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (local.get $4$hi) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.store + ;; CHECK-NEXT: (local.get $i64toi32_i32$0) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.store offset=4 + ;; CHECK-NEXT: (local.get $i64toi32_i32$0) + ;; CHECK-NEXT: (local.get $i64toi32_i32$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.store + ;; CHECK-NEXT: (local.get $i64toi32_i32$0) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.store offset=4 + ;; CHECK-NEXT: (local.get $i64toi32_i32$0) + ;; CHECK-NEXT: (local.get $i64toi32_i32$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.store align=2 + ;; CHECK-NEXT: (local.get $i64toi32_i32$0) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.store offset=4 align=2 + ;; CHECK-NEXT: (local.get $i64toi32_i32$0) + ;; CHECK-NEXT: (local.get $i64toi32_i32$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.store align=1 + ;; CHECK-NEXT: (local.get $i64toi32_i32$0) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.store offset=4 align=1 + ;; CHECK-NEXT: (local.get $i64toi32_i32$0) + ;; CHECK-NEXT: (local.get $i64toi32_i32$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $i64toi32_i32$0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.store + ;; CHECK-NEXT: (local.get $i64toi32_i32$0) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $i64toi32_i32$1 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.store offset=4 + ;; CHECK-NEXT: (local.get $i64toi32_i32$0) + ;; CHECK-NEXT: (local.get $i64toi32_i32$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $mem + (drop (i64.load align=8 (i32.const 0))) + (drop (i64.load align=4 (i32.const 0))) + (drop (i64.load align=2 (i32.const 0))) + (drop (i64.load align=1 (i32.const 0))) + (drop (i64.load (i32.const 0))) + (i64.store align=8 (i32.const 0) (i64.const 1)) + (i64.store align=4 (i32.const 0) (i64.const 2)) + (i64.store align=2 (i32.const 0) (i64.const 3)) + (i64.store align=1 (i32.const 0) (i64.const 4)) + (i64.store (i32.const 0) (i64.const 5)) + ) +) +(module + ;; CHECK: (type $none_=>_none (func)) + + ;; CHECK: (type $i32_i32_=>_none (func (param i32 i32))) + + ;; CHECK: (global $f (mut i32) (i32.const -1412567121)) + (global $f (mut i64) (i64.const 0x12345678ABCDEFAF)) + ;; CHECK: (global $g (mut i32) (global.get $f)) + (global $g (mut i64) (global.get $f)) + ;; CHECK: (global $f$hi (mut i32) (i32.const 305419896)) + + ;; CHECK: (global $g$hi (mut i32) (global.get $f$hi)) + + ;; CHECK: (global $i64toi32_i32$HIGH_BITS (mut i32) (i32.const 0)) + + ;; CHECK: (export "exp" (func $1)) + + ;; CHECK: (export "unreach" (func $2)) + + ;; CHECK: (func $call (param $0 i32) (param $0$hi i32) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: ) + (func $call (param i64)) + (func "exp" + (call $call (global.get $f)) + (global.set $f (i64.const 0x1122334455667788)) + ) + (func "unreach" + (global.set $f + (block $label$1 (result i64) + (unreachable) + ) + ) + ) +) +;; CHECK: (func $1 +;; CHECK-NEXT: (local $0 i32) +;; CHECK-NEXT: (local $0$hi i32) +;; CHECK-NEXT: (local $i64toi32_i32$0 i32) +;; CHECK-NEXT: (block +;; CHECK-NEXT: (local.set $0 +;; CHECK-NEXT: (block (result i32) +;; CHECK-NEXT: (local.set $i64toi32_i32$0 +;; CHECK-NEXT: (global.get $f$hi) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (global.get $f) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (local.set $0$hi +;; CHECK-NEXT: (local.get $i64toi32_i32$0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (call $call +;; CHECK-NEXT: (block (result i32) +;; CHECK-NEXT: (local.set $i64toi32_i32$0 +;; CHECK-NEXT: (local.get $0$hi) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (local.get $i64toi32_i32$0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (block +;; CHECK-NEXT: (global.set $f +;; CHECK-NEXT: (block (result i32) +;; CHECK-NEXT: (local.set $i64toi32_i32$0 +;; CHECK-NEXT: (i32.const 287454020) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1432778632) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (global.set $f$hi +;; CHECK-NEXT: (local.get $i64toi32_i32$0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $2 +;; CHECK-NEXT: (local $0 i32) +;; CHECK-NEXT: (local $0$hi i32) +;; CHECK-NEXT: (local $1 i32) +;; CHECK-NEXT: (local $1$hi i32) +;; CHECK-NEXT: (local $i64toi32_i32$0 i32) +;; CHECK-NEXT: (block $label$1 +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (block +;; CHECK-NEXT: (local.set $1 +;; CHECK-NEXT: (block (result i32) +;; CHECK-NEXT: (local.set $i64toi32_i32$0 +;; CHECK-NEXT: (local.get $0$hi) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (local.set $1$hi +;; CHECK-NEXT: (local.get $i64toi32_i32$0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (block +;; CHECK-NEXT: (global.set $f +;; CHECK-NEXT: (block (result i32) +;; CHECK-NEXT: (local.set $i64toi32_i32$0 +;; CHECK-NEXT: (local.get $1$hi) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (global.set $f$hi +;; CHECK-NEXT: (local.get $i64toi32_i32$0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +(module + ;; CHECK: (type $i32_i32_=>_none (func (param i32 i32))) + + ;; CHECK: (type $none_=>_none (func)) + + ;; CHECK: (global $f (mut i32) (i32.const -1412567121)) + (global $f (mut i64) (i64.const 0x12345678ABCDEFAF)) + ;; CHECK: (global $g (mut i32) (global.get $f)) + (global $g (mut i64) (global.get $f)) + ;; CHECK: (global $f$hi (mut i32) (i32.const 305419896)) + + ;; CHECK: (global $g$hi (mut i32) (global.get $f$hi)) + + ;; CHECK: (global $i64toi32_i32$HIGH_BITS (mut i32) (i32.const 0)) + + ;; CHECK: (export "exp" (func $1)) + + ;; CHECK: (func $call (param $0 i32) (param $0$hi i32) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: ) + (func $call (param i64)) + (func "exp" + (call $call (global.get $f)) + (global.set $f (i64.const 0x1122334455667788)) + ) +) +;; CHECK: (func $1 +;; CHECK-NEXT: (local $0 i32) +;; CHECK-NEXT: (local $0$hi i32) +;; CHECK-NEXT: (local $i64toi32_i32$0 i32) +;; CHECK-NEXT: (block +;; CHECK-NEXT: (local.set $0 +;; CHECK-NEXT: (block (result i32) +;; CHECK-NEXT: (local.set $i64toi32_i32$0 +;; CHECK-NEXT: (global.get $f$hi) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (global.get $f) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (local.set $0$hi +;; CHECK-NEXT: (local.get $i64toi32_i32$0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (call $call +;; CHECK-NEXT: (block (result i32) +;; CHECK-NEXT: (local.set $i64toi32_i32$0 +;; CHECK-NEXT: (local.get $0$hi) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (local.get $i64toi32_i32$0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (block +;; CHECK-NEXT: (global.set $f +;; CHECK-NEXT: (block (result i32) +;; CHECK-NEXT: (local.set $i64toi32_i32$0 +;; CHECK-NEXT: (i32.const 287454020) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1432778632) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (global.set $f$hi +;; CHECK-NEXT: (local.get $i64toi32_i32$0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +(module + (type $i64_f64_i32_=>_none (func (param i64 f64 i32))) + ;; CHECK: (type $none_=>_none (func)) + + ;; CHECK: (global $i64toi32_i32$HIGH_BITS (mut i32) (i32.const 0)) + + ;; CHECK: (table $0 37 funcref) + (table $0 37 funcref) + ;; CHECK: (func $0 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f64.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const -32768) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 20) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (func $0 + (call_indirect (type $i64_f64_i32_=>_none) + (unreachable) + (f64.const 1) + (i32.const -32768) + (i32.const 20) + ) + ) +) diff --git a/test/lit/passes/flatten_local-cse_Os.wast b/test/lit/passes/flatten_local-cse_Os.wast new file mode 100644 index 000000000..1f315cd2c --- /dev/null +++ b/test/lit/passes/flatten_local-cse_Os.wast @@ -0,0 +1,71 @@ +;; 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 --local-cse -Os -S -o - | filecheck %s + +(module + ;; testcase from AssemblyScript + (func "div16_internal" (param $0 i32) (param $1 i32) (result i32) + (i32.add + (i32.xor + (i32.shr_s + (i32.shl + (local.get $0) + (i32.const 16) + ) + (i32.const 16) + ) + (i32.shr_s + (i32.shl + (local.get $1) + (i32.const 16) + ) + (i32.const 16) + ) + ) + (i32.xor + (i32.shr_s + (i32.shl + (local.get $0) + (i32.const 16) + ) + (i32.const 16) + ) + (i32.shr_s + (i32.shl + (local.get $1) + (i32.const 16) + ) + (i32.const 16) + ) + ) + ) + ) +) +;; CHECK: (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) + +;; CHECK: (export "div16_internal" (func $0)) + +;; CHECK: (func $0 (; has Stack IR ;) (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.tee $0 +;; CHECK-NEXT: (i32.xor +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) diff --git a/test/lit/passes/flatten_local-cse_all-features.wast b/test/lit/passes/flatten_local-cse_all-features.wast new file mode 100644 index 000000000..243c8a96c --- /dev/null +++ b/test/lit/passes/flatten_local-cse_all-features.wast @@ -0,0 +1,1139 @@ +;; 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 --local-cse --all-features -S -o - | filecheck %s + +(module + (memory 100 100) + ;; CHECK: (type $none_=>_none (func)) + + ;; CHECK: (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) + + ;; CHECK: (type $i32_=>_i32 (func (param i32) (result i32))) + + ;; CHECK: (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $f64_f64_i32_=>_f32 (func (param f64 f64 i32) (result f32))) + + ;; CHECK: (memory $0 100 100) + + ;; CHECK: (func $basics + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (local $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: (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.set $2 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; 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: (drop + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $9 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $10 + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $11 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $12 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $13 + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $basics) + ;; CHECK-NEXT: (local.set $14 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $15 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $16 + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.const 100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $17 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $18 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $19 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $19) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $basics + (local $x i32) + (local $y i32) + (drop + (i32.add (i32.const 1) (i32.const 2)) + ) + (drop + (i32.add (i32.const 1) (i32.const 2)) + ) + (if (i32.const 0) (nop)) + (drop ;; we can't do this yet, non-linear + (i32.add (i32.const 1) (i32.const 2)) + ) + (drop + (i32.add (local.get $x) (local.get $y)) + ) + (drop + (i32.add (local.get $x) (local.get $y)) + ) + (drop + (i32.add (local.get $x) (local.get $y)) + ) + (call $basics) ;; side effects, but no matter for our locals + (drop + (i32.add (local.get $x) (local.get $y)) + ) + (local.set $x (i32.const 100)) + (drop ;; x was changed! + (i32.add (local.get $x) (local.get $y)) + ) + ) + ;; CHECK: (func $recursive1 + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (local $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.set $2 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $recursive1 + (local $x i32) + (local $y i32) + (drop + (i32.add + (i32.const 1) + (i32.add + (i32.const 2) + (i32.const 3) + ) + ) + ) + (drop + (i32.add + (i32.const 1) + (i32.add + (i32.const 2) + (i32.const 3) + ) + ) + ) + (drop + (i32.add + (i32.const 2) + (i32.const 3) + ) + ) + ) + ;; CHECK: (func $recursive2 + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (local $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.set $2 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $recursive2 + (local $x i32) + (local $y i32) + (drop + (i32.add + (i32.const 1) + (i32.add + (i32.const 2) + (i32.const 3) + ) + ) + ) + (drop + (i32.add + (i32.const 2) + (i32.const 3) + ) + ) + (drop + (i32.add + (i32.const 1) + (i32.add + (i32.const 2) + (i32.const 3) + ) + ) + ) + ) + ;; CHECK: (func $self + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (local $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.set $2 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $self + (local $x i32) + (local $y i32) + (drop + (i32.add + (i32.add + (i32.const 2) + (i32.const 3) + ) + (i32.add + (i32.const 2) + (i32.const 3) + ) + ) + ) + (drop + (i32.add + (i32.const 2) + (i32.const 3) + ) + ) + ) + ;; CHECK: (func $loads + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.load + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (i32.load + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $loads + (drop + (i32.load (i32.const 10)) + ) + (drop + (i32.load (i32.const 10)) ;; implicit traps, sad + ) + ) + ;; CHECK: (func $8 (param $var$0 i32) (result 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: (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: (block $label$0 + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $var$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $var$1) + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $var$2 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $var$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (local.get $var$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (i32.load + ;; CHECK-NEXT: (local.get $var$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $var$2 + ;; CHECK-NEXT: (i32.const 74) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $9 + ;; CHECK-NEXT: (local.get $var$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $10 + ;; CHECK-NEXT: (i32.xor + ;; CHECK-NEXT: (local.get $var$2) + ;; CHECK-NEXT: (i32.const -1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $11 + ;; CHECK-NEXT: (i32.and + ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: (local.get $10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.store + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: (local.get $11) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $12 + ;; CHECK-NEXT: (local.get $var$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $13 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $var$1 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $14 + ;; CHECK-NEXT: (local.get $var$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $15 + ;; CHECK-NEXT: (local.get $var$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $16 + ;; CHECK-NEXT: (i32.load + ;; CHECK-NEXT: (local.get $var$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $17 + ;; CHECK-NEXT: (local.get $var$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $18 + ;; CHECK-NEXT: (i32.and + ;; CHECK-NEXT: (local.get $var$2) + ;; CHECK-NEXT: (i32.const 8) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $19 + ;; CHECK-NEXT: (i32.or + ;; CHECK-NEXT: (local.get $16) + ;; CHECK-NEXT: (local.get $18) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.store + ;; CHECK-NEXT: (local.get $var$1) + ;; CHECK-NEXT: (local.get $19) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $20 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $21 + ;; CHECK-NEXT: (local.get $20) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $20) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $8 (param $var$0 i32) (result i32) + (local $var$1 i32) + (local $var$2 i32) + (local $var$3 i32) + (block $label$0 (result i32) + (i32.store + (local.tee $var$2 + (i32.add + (local.get $var$1) + (i32.const 4) + ) + ) + (i32.and + (i32.load + (local.get $var$2) + ) + (i32.xor + (local.tee $var$2 + (i32.const 74) + ) + (i32.const -1) + ) + ) + ) + (i32.store + (local.tee $var$1 + (i32.add + (local.get $var$1) + (i32.const 4) + ) + ) + (i32.or + (i32.load + (local.get $var$1) + ) + (i32.and + (local.get $var$2) + (i32.const 8) + ) + ) + ) + (i32.const 0) + ) + ) + ;; CHECK: (func $loop1 (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: (block + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $y + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $y + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $loop1 (param $x i32) (param $y i32) (result i32) + (local.set $x (local.get $y)) + (local.set $y (local.get $x)) + (local.set $x (local.get $y)) + (local.set $y (local.get $x)) + (return (local.get $y)) + ) + ;; CHECK: (func $loop2 (param $x i32) (param $y i32) (param $z 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: (local $10 i32) + ;; CHECK-NEXT: (local $11 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $z) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $y + ;; CHECK-NEXT: (local.get $z) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $z + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (local.get $z) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $y + ;; CHECK-NEXT: (local.get $z) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $z + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $9 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $11 + ;; CHECK-NEXT: (local.get $10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $loop2 (param $x i32) (param $y i32) (param $z i32) (result i32) + (local.set $x (local.get $y)) + (local.set $y (local.get $z)) + (local.set $z (local.get $x)) + (local.set $x (local.get $y)) + (local.set $y (local.get $z)) + (local.set $z (local.get $x)) + (return (local.get $x)) + ) + ;; CHECK: (func $loop3 (param $x i32) (param $y i32) (param $z 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: (local $10 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $z) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $y + ;; CHECK-NEXT: (local.get $z) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $z + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $y + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $z + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $10 + ;; CHECK-NEXT: (local.get $9) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $9) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $loop3 (param $x i32) (param $y i32) (param $z i32) (result i32) + (local.set $x (local.get $y)) + (local.set $y (local.get $z)) + (local.set $z (local.get $y)) + (local.set $y (local.get $z)) + (local.set $z (local.get $y)) + (return (local.get $y)) + ) + ;; CHECK: (func $handle-removing (param $var$0 f64) (param $var$1 f64) (param $var$2 i32) (result f32) + ;; CHECK-NEXT: (local $3 i32) + ;; CHECK-NEXT: (local $4 i32) + ;; CHECK-NEXT: (local $5 i32) + ;; CHECK-NEXT: (local $6 f32) + ;; CHECK-NEXT: (local $7 f32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $var$2 + ;; CHECK-NEXT: (i32.const 32767) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $var$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $var$2 + ;; CHECK-NEXT: (i32.const 1024) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $var$2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: (local.get $var$2) + ;; CHECK-NEXT: (i32.const -2147483648) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $var$2 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (f32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $handle-removing (param $var$0 f64) (param $var$1 f64) (param $var$2 i32) (result f32) + (local.set $var$2 + (select + (local.tee $var$2 + (i32.const 32767) + ) + (local.tee $var$2 + (i32.const 1024) + ) + (i32.const -2147483648) + ) + ) + (f32.const 1) + ) +) +;; a testcase that fails if we don't handle equivalent local canonicalization properly +(module + ;; CHECK: (type $2 (func (param i64 f32 i32))) + + ;; CHECK: (type $0 (func)) + (type $0 (func)) + ;; CHECK: (type $1 (func (param i32 f64) (result i32))) + (type $1 (func (param i32 f64) (result i32))) + (type $2 (func (param i64 f32 i32))) + ;; CHECK: (global $global$0 (mut i32) (i32.const 10)) + (global $global$0 (mut i32) (i32.const 10)) + (table 23 23 funcref) + ;; CHECK: (table $0 23 23 funcref) + + ;; CHECK: (export "func_1_invoker" (func $1)) + (export "func_1_invoker" (func $1)) + ;; CHECK: (export "func_6" (func $2)) + (export "func_6" (func $2)) + ;; CHECK: (func $0 (param $var$0 i64) (param $var$1 f32) (param $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: (block $label$1 + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (i32.const 128) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $label$1 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $label$1 + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (i32.const -14051) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: (global.set $global$0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $0 (; 0 ;) (type $2) (param $var$0 i64) (param $var$1 f32) (param $var$2 i32) + (if + (block $label$1 (result i32) + (drop + (br_if $label$1 + (i32.const 0) + (br_if $label$1 + (i32.const 128) + (i32.const 0) + ) + ) + ) + (i32.const -14051) + ) + (global.set $global$0 + (i32.const 0) + ) + ) + ) + ;; CHECK: (func $1 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (i64.const 1125899906842624) + ;; CHECK-NEXT: (f32.const -nan:0x7fc91a) + ;; CHECK-NEXT: (i32.const -46) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $1 (; 1 ;) (type $0) + (call $0 + (i64.const 1125899906842624) + (f32.const -nan:0x7fc91a) + (i32.const -46) + ) + ) + ;; CHECK: (func $2 (param $var$0 i32) (param $var$1 f64) (result i32) + ;; CHECK-NEXT: (local $2 i32) + ;; CHECK-NEXT: (local $3 i32) + ;; CHECK-NEXT: (local $4 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (global.get $global$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $2 (; 2 ;) (type $1) (param $var$0 i32) (param $var$1 f64) (result i32) + (if + (global.get $global$0) + (unreachable) + ) + (i32.const 0) + ) +) +(module + ;; CHECK: (type $i32_=>_none (func (param i32))) + + ;; CHECK: (import "env" "out" (func $out (param i32))) + (import "env" "out" (func $out (param i32))) + ;; CHECK: (func $each-pass-must-clear (param $var$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.set $1 + ;; CHECK-NEXT: (local.get $var$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.get $var$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $out + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $var$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $out + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $each-pass-must-clear (param $var$0 i32) + (call $out + (i32.eqz + (local.get $var$0) + ) + ) + (call $out + (i32.eqz + (local.get $var$0) + ) + ) + ) +) +(module + ;; CHECK: (type $none_=>_i64 (func (result i64))) + + ;; CHECK: (type $none_=>_none (func)) + + ;; CHECK: (global $glob (mut i32) (i32.const 1)) + (global $glob (mut i32) (i32.const 1)) + ;; CHECK: (func $i64-shifts (result i64) + ;; CHECK-NEXT: (local $temp i64) + ;; CHECK-NEXT: (local $1 i64) + ;; CHECK-NEXT: (local $2 i64) + ;; CHECK-NEXT: (local $3 i64) + ;; CHECK-NEXT: (local $4 i64) + ;; CHECK-NEXT: (local $5 i64) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (i64.add + ;; CHECK-NEXT: (i64.const 1) + ;; CHECK-NEXT: (i64.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $temp + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $temp + ;; CHECK-NEXT: (i64.const 9999) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $temp + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $temp) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $temp) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $temp) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $temp) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $i64-shifts (result i64) + (local $temp i64) + (local.set $temp + (i64.add + (i64.const 1) + (i64.const 2) + ) + ) + (local.set $temp + (i64.const 9999) + ) + (local.set $temp + (i64.add + (i64.const 1) + (i64.const 2) + ) + ) + (local.get $temp) + ) + ;; CHECK: (func $global + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (local $y i32) + ;; CHECK-NEXT: (local $2 i32) + ;; CHECK-NEXT: (local $3 i32) + ;; CHECK-NEXT: (local $4 i32) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (global.get $glob) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $y + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $y + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $global + (local $x i32) + (local $y i32) + (local.set $x (global.get $glob)) + (local.set $y (global.get $glob)) + (local.set $y (global.get $glob)) + ) +) + +(module + ;; After --flatten, there will be a series of chain copies between multiple + ;; locals, but some of the locals will be funcref type and others anyref + ;; type. We cannot make locals of different types a common subexpression. + ;; CHECK: (type $none_=>_anyref (func (result anyref))) + + ;; CHECK: (type $none_=>_none (func)) + + ;; CHECK: (func $subtype-test (result anyref) + ;; CHECK-NEXT: (local $0 funcref) + ;; CHECK-NEXT: (local $1 funcref) + ;; CHECK-NEXT: (local $2 anyref) + ;; CHECK-NEXT: (local $3 anyref) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (loop $label$1 + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (ref.null func) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $subtype-test (result anyref) + (nop) + (loop $label$1 (result funcref) + (ref.null func) + ) + ) + + ;; CHECK: (func $test + ;; CHECK-NEXT: (local $0 anyref) + ;; CHECK-NEXT: (local $1 funcref) + ;; CHECK-NEXT: (local $2 funcref) + ;; CHECK-NEXT: (block $label$1 + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (ref.null func) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (ref.null func) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $test + (local $0 anyref) + (drop + (block $label$1 (result funcref) + (local.set $0 + (ref.null func) + ) + ;; After --flatten, this will be assigned to a local of funcref type. After + ;; --local-cse, even if we set (ref.null func) to local $0 above, this + ;; should not be replaced with $0, because it is of type anyref. + (ref.null func) + ) + ) + ) +) diff --git a/test/lit/passes/flatten_rereloop.wast b/test/lit/passes/flatten_rereloop.wast new file mode 100644 index 000000000..436fc930c --- /dev/null +++ b/test/lit/passes/flatten_rereloop.wast @@ -0,0 +1,1975 @@ +;; 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 --rereloop -S -o - | filecheck %s + +(module + (memory 1) + ;; CHECK: (type $none_=>_none (func)) + + ;; CHECK: (type $none_=>_i32 (func (result i32))) + + ;; CHECK: (type $none_=>_f64 (func (result f64))) + + ;; CHECK: (type $i32_=>_none (func (param i32))) + + ;; CHECK: (type $i32_=>_f32 (func (param i32) (result f32))) + + ;; CHECK: (type $none_=>_f32 (func (result f32))) + + ;; CHECK: (global $global (mut i32) (i32.const 0)) + (global $global (mut i32) (i32.const 0)) + ;; CHECK: (memory $0 1) + + ;; CHECK: (func $0 (result f64) + ;; CHECK-NEXT: (local $0 f64) + ;; CHECK-NEXT: (local $1 f64) + ;; CHECK-NEXT: (local $2 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (f64.const -nan:0xfffffd63e4e5a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $0 (result f64) + (if + (i32.const 0) + (loop $label$2 + (unreachable) + ) + ) + (f64.const -nan:0xfffffd63e4e5a) + ) + ;; CHECK: (func $1 (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (local $2 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block$6$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $switch$1$leave + ;; CHECK-NEXT: (block $switch$1$default + ;; CHECK-NEXT: (block $switch$1$case$4 + ;; CHECK-NEXT: (br_table $switch$1$case$4 $switch$1$case$4 $switch$1$default + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$6$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $switch$6$leave + ;; CHECK-NEXT: (block $switch$6$default + ;; CHECK-NEXT: (block $switch$6$case$3 + ;; CHECK-NEXT: (br_table $switch$6$case$3 $switch$6$default + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (func $1 (result i32) + (block $label$8 + (block $label$9 + (block $label$16 + (block $label$18 + (block $label$19 + (br_table $label$18 $label$16 $label$19 + (i32.const 0) + ) + ) + (br_table $label$9 $label$8 + (i32.const 1) + ) + ) + (unreachable) + ) + (unreachable) + ) + (unreachable) + ) + (i32.const 2) + ) + ;; CHECK: (func $skip-empty + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (block $block$2$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$2$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $skip-empty + (block $a1 + (block $a2 + (block $a3 + (block $a4 + (br $a4) + ) + (br $a3) + ) + (br $a2) + ) + (br $a1) + ) + ) + ;; CHECK: (func $skip-empty-2 + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (block $block$5$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$5$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block$4$break + ;; CHECK-NEXT: (call $skip-empty) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$4$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block$2$break + ;; CHECK-NEXT: (call $skip-empty) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$2$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $skip-empty-2 + (block $a1 + (block $a2 + (block $a3 + (block $a4 + (br $a4) + ) + (call $skip-empty) + (br $a3) + ) + (call $skip-empty) + (br $a2) + ) + (br $a1) + ) + ) + ;; CHECK: (func $skip-empty-3 + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (block $block$5$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$5$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block$4$break + ;; CHECK-NEXT: (call $skip-empty) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$4$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block$2$break + ;; CHECK-NEXT: (call $skip-empty) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$2$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $skip-empty-3 + (block $a1 + (block $a2 + (block $a3 + (block $a4 + (nop) + (br $a4) + (nop) + ) + (nop) + (call $skip-empty) + (nop) + (br $a3) + ) + (nop) + (call $skip-empty) + (nop) + (br $a2) + ) + (br $a1) + ) + ) + ;; CHECK: (func $skip-empty-4 (param $x i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (local $2 i32) + ;; CHECK-NEXT: (block $block$2$break + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$2$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $skip-empty-4 (param $x i32) + (block $a1 + (block $a2 + (block $a3 + (block $a4 + (br_table $a1 $a2 $a3 $a4 $a1 $a2 $a3 $a4 (local.get $x)) + ) + (br $a3) + ) + (br $a2) + ) + (br $a1) + ) + ) + ;; CHECK: (func $skipping (param $0 i32) (result f32) + ;; CHECK-NEXT: (local $1 f32) + ;; CHECK-NEXT: (local $2 f32) + ;; CHECK-NEXT: (local $3 f32) + ;; CHECK-NEXT: (local $4 f32) + ;; CHECK-NEXT: (local $5 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (f32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $skipping (param $0 i32) (result f32) + (if + (i32.const 0) + (unreachable) + ) ;; branches joining here lead to skip opportunities + (loop $label$2 (result f32) + (f32.const 1) + ) + ) + ;; CHECK: (func $merging + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $merging + (if + (i32.const 0) + (return) + ;; no else, but the else ends up with a return too, and we can merge them + ) + ) + ;; CHECK: (func $unswitch + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (block $block$2$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$2$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $unswitch + (block $label$1 + (br_table $label$1 $label$1 + (i32.const 0) + ) + ) + ) + ;; CHECK: (func $skip-only-empty + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (block $block$3$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (global.set $global + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$3$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $block$3$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $skip-only-empty + (if + (i32.const 1) + (global.set $global + (i32.const 0) + ) + ) + ) + ;; CHECK: (func $skip-only-one-branch-out (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (local $2 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $skip-only-one-branch-out (result i32) + (block $label$1 + (nop) + ) + (if + (i32.const 1) + (unreachable) ;; blocks a path through + ) + (i32.const 0) + ) + ;; CHECK: (func $multipass-for-skips (result f32) + ;; CHECK-NEXT: (local $0 f32) + ;; CHECK-NEXT: (local $1 f32) + ;; CHECK-NEXT: (local $2 f32) + ;; CHECK-NEXT: (local $3 f32) + ;; CHECK-NEXT: (local $4 i32) + ;; CHECK-NEXT: (block $block$7$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $0 + ;; CHECK-NEXT: (f32.const 9223372036854775808) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$7$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (f32.const 65505) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$7$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $multipass-for-skips (result f32) + (if (result f32) + (i32.const 0) + (block (result f32) + (block $label$2 + (br_if $label$2 + (i32.const 536870912) + ) + ) + (f32.const 9223372036854775808) + ) + (f32.const 65505) + ) + ) + ;; CHECK: (func $branch-merge-vs-replace + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $branch-merge-vs-replace + (if + (i32.const 0) + (unreachable) + ) + ) + ;; CHECK: (func $unswitch-amount + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (block $block$2$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const -23) + ;; CHECK-NEXT: (br $block$2$break) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block$6$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $switch$4$leave + ;; CHECK-NEXT: (block $switch$4$default + ;; CHECK-NEXT: (block $switch$4$case$2 + ;; CHECK-NEXT: (br_table $switch$4$case$2 $switch$4$default + ;; CHECK-NEXT: (i32.const 44064) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$2$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$6$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $unswitch-amount + (block $label$1 + (if + (i32.const -23) + (nop) + (block + (block $label$4 + (br_table $label$1 $label$4 + (i32.const 44064) + ) + ) + (unreachable) + ) + ) + ) + ) +) +;; manual TODO: merge branches, all the parts +(module + ;; CHECK: (type $3 (func (param i32))) + + ;; CHECK: (type $0 (func)) + (type $0 (func)) + ;; CHECK: (type $2 (func (param i32) (result i32))) + + ;; CHECK: (type $1 (func (result i32))) + (type $1 (func (result i32))) + (type $2 (func (param i32) (result i32))) + (type $3 (func (param i32))) + ;; CHECK: (func $trivial + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + (func $trivial (; 0 ;) (type $0) + (nop) + ) + ;; CHECK: (func $trivial2 + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $trivial) + ;; CHECK-NEXT: (call $trivial) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $trivial2 (; 1 ;) (type $0) + (block + (call $trivial) + (nop) + (call $trivial) + (nop) + ) + (nop) + ) + ;; CHECK: (func $return-void + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + (func $return-void (; 2 ;) (type $0) + (return) + (unreachable) + ) + ;; CHECK: (func $return-val (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (local $2 i32) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $return-val (; 3 ;) (type $1) (result i32) + (return + (i32.const 1) + ) + (unreachable) + ) + ;; CHECK: (func $ifs (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: (block + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $9 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $9) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $10 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $11 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $11) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $ifs (; 4 ;) (type $2) (param $x i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (block + (block + (local.set $1 + (local.get $x) + ) + (if + (local.get $1) + (block + (block + (local.set $2 + (local.get $x) + ) + (if + (local.get $2) + (block + (return + (i32.const 2) + ) + (unreachable) + ) + (block + (return + (i32.const 3) + ) + (unreachable) + ) + ) + ) + (unreachable) + ) + ) + ) + (nop) + (block + (local.set $3 + (local.get $x) + ) + (if + (local.get $3) + (block + (return + (i32.const 4) + ) + (unreachable) + ) + ) + ) + (nop) + (return + (i32.const 5) + ) + (unreachable) + ) + (local.set $5 + (local.get $4) + ) + (return + (local.get $5) + ) + ) + ;; CHECK: (func $loops (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: (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 $block$21$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: (loop $shape$2$continue + ;; CHECK-NEXT: (call $trivial) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $shape$2$continue) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $block$21$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block$24$break + ;; CHECK-NEXT: (loop $shape$4$continue + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $trivial) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: (br $shape$4$continue) + ;; CHECK-NEXT: (br $block$24$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block$2$break + ;; CHECK-NEXT: (loop $shape$6$continue + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $trivial) + ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $9 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $9) + ;; CHECK-NEXT: (br $shape$6$continue) + ;; CHECK-NEXT: (br $block$2$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $loops (; 5 ;) (type $3) (param $x i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (block + (block + (local.set $1 + (local.get $x) + ) + (if + (local.get $1) + (block + (loop $top + (block + (call $trivial) + (nop) + (br $top) + (unreachable) + ) + (unreachable) + ) + (unreachable) + ) + ) + ) + (nop) + (loop $top2 + (block + (call $trivial) + (nop) + (local.set $2 + (local.get $x) + ) + (br_if $top2 + (local.get $2) + ) + (nop) + ) + (nop) + ) + (nop) + (loop $top3 + (block + (call $trivial) + (nop) + (block + (local.set $3 + (local.get $x) + ) + (if + (local.get $3) + (block + (br $top3) + (unreachable) + ) + ) + ) + (nop) + ) + (nop) + ) + (nop) + ) + (nop) + ) + ;; CHECK: (func $br-out (param $x i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (block $block$2$break + ;; CHECK-NEXT: (call $br-out + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$2$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $br-out (; 6 ;) (type $3) (param $x i32) + (block $out + (call $br-out + (i32.const 5) + ) + (nop) + (br $out) + (unreachable) + ) + (nop) + ) + ;; CHECK: (func $unreachable (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: (local $6 i32) + ;; CHECK-NEXT: (local $7 i32) + ;; CHECK-NEXT: (block $block$4$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: (br $block$4$break) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block$2$break + ;; CHECK-NEXT: (call $unreachable + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$2$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $unreachable + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $unreachable + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $unreachable (; 7 ;) (type $3) (param $x i32) + (local $1 i32) + (local $2 i32) + (block + (block + (local.set $1 + (local.get $x) + ) + (if + (local.get $1) + (block + (block + (local.set $2 + (local.get $x) + ) + (if + (local.get $2) + (block + (block $block + (call $unreachable + (i32.const 1) + ) + (nop) + (unreachable) + (unreachable) + (call $unreachable + (i32.const 2) + ) + (nop) + ) + (unreachable) + ) + (block + (block $block4 + (call $unreachable + (i32.const 3) + ) + (nop) + (return) + (unreachable) + (call $unreachable + (i32.const 4) + ) + (nop) + ) + (unreachable) + ) + ) + ) + (unreachable) + ) + ) + ) + (nop) + (block $out + (call $unreachable + (i32.const 5) + ) + (nop) + (br $out) + (unreachable) + (call $unreachable + (i32.const 6) + ) + (nop) + ) + (nop) + ) + (nop) + ) + ;; CHECK: (func $empty-blocks (param $x i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (block $block$2$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$2$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $empty-blocks (; 8 ;) (type $3) (param $x i32) + (block + (block $block + ) + (nop) + (block $block5 + ) + (nop) + ) + (nop) + ) + ;; CHECK: (func $before-and-after (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: (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: (block $block$4$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $7 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $7) + ;; CHECK-NEXT: (br $block$4$break) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$4$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block$8$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 8) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$8$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block$10$break + ;; CHECK-NEXT: (loop $shape$4$continue + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 9) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $8 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $8) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $9 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $9) + ;; CHECK-NEXT: (br $shape$4$continue) + ;; CHECK-NEXT: (br $block$10$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block$11$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $10 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $11 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $11) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$11$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $block$11$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block$15$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 13) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $12 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $13 + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $13) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 14) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$15$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 15) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$15$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block$21$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $14 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $14) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $15 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $15) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 16) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$21$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $block$21$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block$28$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 17) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 18) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 19) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 20) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 21) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 22) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$28$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block$30$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 23) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 24) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$30$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $before-and-after + ;; CHECK-NEXT: (i32.const 25) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $before-and-after (; 9 ;) (type $3) (param $x i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (block + (call $before-and-after + (i32.const 1) + ) + (nop) + (block $block + (call $before-and-after + (i32.const 2) + ) + (nop) + ) + (nop) + (call $before-and-after + (i32.const 3) + ) + (nop) + (block $out + (call $before-and-after + (i32.const 4) + ) + (nop) + (local.set $1 + (local.get $x) + ) + (br_if $out + (local.get $1) + ) + (nop) + (call $before-and-after + (i32.const 5) + ) + (nop) + ) + (nop) + (call $before-and-after + (i32.const 6) + ) + (nop) + (loop $loop-in + (nop) + ) + (nop) + (call $before-and-after + (i32.const 7) + ) + (nop) + (loop $top + (nop) + ) + (nop) + (call $before-and-after + (i32.const 8) + ) + (nop) + (loop $top2 + (block + (call $before-and-after + (i32.const 9) + ) + (nop) + (local.set $2 + (local.get $x) + ) + (br_if $top2 + (local.get $2) + ) + (nop) + (call $before-and-after + (i32.const 10) + ) + (nop) + ) + (nop) + ) + (nop) + (call $before-and-after + (i32.const 11) + ) + (nop) + (block + (local.set $3 + (local.get $x) + ) + (if + (local.get $3) + (block + (call $before-and-after + (i32.const 12) + ) + (nop) + ) + ) + ) + (nop) + (call $before-and-after + (i32.const 13) + ) + (nop) + (block + (local.set $4 + (local.get $x) + ) + (if + (local.get $4) + (block + (call $before-and-after + (i32.const 14) + ) + (nop) + ) + (block + (call $before-and-after + (i32.const 15) + ) + (nop) + ) + ) + ) + (nop) + (block + (local.set $5 + (local.get $x) + ) + (if + (local.get $5) + (block + (block $block8 + (call $before-and-after + (i32.const 16) + ) + (nop) + ) + (nop) + ) + ) + ) + (nop) + (call $before-and-after + (i32.const 17) + ) + (nop) + (block $block9 + (call $before-and-after + (i32.const 18) + ) + (nop) + (block $block10 + (call $before-and-after + (i32.const 19) + ) + (nop) + ) + (nop) + (call $before-and-after + (i32.const 20) + ) + (nop) + ) + (nop) + (call $before-and-after + (i32.const 21) + ) + (nop) + (block $block11 + (block $block12 + (call $before-and-after + (i32.const 22) + ) + (nop) + ) + (nop) + ) + (nop) + (call $before-and-after + (i32.const 23) + ) + (nop) + (block $no1 + (block $no2 + (call $before-and-after + (i32.const 24) + ) + (nop) + ) + (nop) + ) + (nop) + (call $before-and-after + (i32.const 25) + ) + (nop) + ) + (nop) + ) + ;; CHECK: (func $switch (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: (local $6 i32) + ;; CHECK-NEXT: (local $7 i32) + ;; CHECK-NEXT: (block $block$3$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$3$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $block$9$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $switch + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $switch$3$leave + ;; CHECK-NEXT: (block $switch$3$default + ;; CHECK-NEXT: (block $switch$3$case$9 + ;; CHECK-NEXT: (br_table $switch$3$case$9 $switch$3$case$9 $switch$3$case$9 $switch$3$default + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$9$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $switch + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$9$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $switch + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $switch (; 10 ;) (type $3) (param $x i32) + (local $1 i32) + (local $2 i32) + (block $out + (block $a + (local.set $1 + (local.get $x) + ) + (br_table $a $a + (local.get $1) + ) + (unreachable) + ) + (nop) + (call $switch + (i32.const 1) + ) + (nop) + (block $b + (block $c + (local.set $2 + (local.get $x) + ) + (br_table $b $b $b $c + (local.get $2) + ) + (unreachable) + ) + (nop) + (call $switch + (i32.const 2) + ) + (nop) + ) + (nop) + (call $switch + (i32.const 3) + ) + (nop) + ) + (nop) + ) + ;; CHECK: (func $no-return + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (block $block$6$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$6$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$6$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $no-return (; 11 ;) (type $0) + (if + (i32.const 1) + (block + (drop + (i32.const 2) + ) + (nop) + ) + (block + (drop + (i32.const 3) + ) + (nop) + ) + ) + (nop) + ) + ;; CHECK: (func $if-br-wat (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: (local $6 i32) + ;; CHECK-NEXT: (local $7 i32) + ;; CHECK-NEXT: (block $block$3$break + ;; CHECK-NEXT: (block $block$4$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $if-br-wat + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $3 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $4 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $if-br-wat + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$4$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $2 + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $6 + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $6) + ;; CHECK-NEXT: (br $block$3$break) + ;; CHECK-NEXT: (br $block$4$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $if-br-wat + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br $block$3$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $if-br-wat + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $if-br-wat (; 12 ;) (type $3) (param $x i32) + (local $1 i32) + (local $2 i32) + (block + (call $if-br-wat + (i32.const 0) + ) + (nop) + (block $label$2 + (block + (local.set $1 + (local.get $x) + ) + (if + (local.get $1) + (block + (call $if-br-wat + (i32.const 1) + ) + (nop) + ) + (block + (block + (local.set $2 + (local.get $x) + ) + (if + (local.get $2) + (block + (br $label$2) + (unreachable) + ) + ) + ) + (nop) + ) + ) + ) + (nop) + (call $if-br-wat + (i32.const 2) + ) + (nop) + ) + (nop) + (call $if-br-wat + (i32.const 3) + ) + (nop) + ) + (nop) + ) + ;; CHECK: (func $switcher-to-nowhere (param $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: (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: (local.set $4 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $1 + ;; CHECK-NEXT: (local.get $4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $5 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $switch$1$leave + ;; CHECK-NEXT: (block $switch$1$default + ;; CHECK-NEXT: (block $switch$1$case$4 + ;; CHECK-NEXT: (block $switch$1$case$5 + ;; CHECK-NEXT: (br_table $switch$1$case$5 $switch$1$case$4 $switch$1$default + ;; CHECK-NEXT: (local.get $5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (func $switcher-to-nowhere (; 13 ;) (type $2) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (block + (block $switch + (block $switch-case0 + (block $switch-case + (local.set $1 + (local.get $0) + ) + (br_table $switch-case $switch-case0 $switch + (local.get $1) + ) + (unreachable) + ) + (nop) + (return + (i32.const 1) + ) + (unreachable) + ) + (nop) + (return + (i32.const 2) + ) + (unreachable) + ) + (nop) + (return + (i32.const 3) + ) + (unreachable) + ) + (local.set $3 + (local.get $2) + ) + (return + (local.get $3) + ) + ) +) diff --git a/test/passes/flatten_simplify-locals-nonesting_dfo_O3.wast b/test/lit/passes/flatten_simplify-locals-nonesting_dfo_O3.wast index 0de6200c7..e8f3eaf30 100644 --- a/test/passes/flatten_simplify-locals-nonesting_dfo_O3.wast +++ b/test/lit/passes/flatten_simplify-locals-nonesting_dfo_O3.wast @@ -1,3 +1,8 @@ +;; 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 --dfo -O3 -S -o - | filecheck %s + (module (memory 1) (func "if-select" @@ -111,3 +116,56 @@ ) ) +;; CHECK: (type $none_=>_none (func)) + +;; CHECK: (type $none_=>_f64 (func (result f64))) + +;; CHECK: (type $i32_f64_f64_=>_i32 (func (param i32 f64 f64) (result i32))) + +;; CHECK: (type $i64_=>_none (func (param i64))) + +;; CHECK: (type $f64_=>_i32 (func (param f64) (result i32))) + +;; CHECK: (export "if-select" (func $0)) + +;; CHECK: (export "unreachable-body-update-zext" (func $1)) + +;; CHECK: (export "ssa-const" (func $2)) + +;; CHECK: (export "if-nothing" (func $3)) + +;; CHECK: (export "only-dfo" (func $4)) + +;; CHECK: (func $0 (; has Stack IR ;) +;; CHECK-NEXT: (nop) +;; CHECK-NEXT: ) + +;; CHECK: (func $1 (; has Stack IR ;) (result f64) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) + +;; CHECK: (func $2 (; has Stack IR ;) (param $0 i32) (param $1 f64) (param $2 f64) (result i32) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) + +;; CHECK: (func $3 (; has Stack IR ;) (param $0 i64) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) + +;; CHECK: (func $4 (; has Stack IR ;) (param $0 f64) (result i32) +;; CHECK-NEXT: (local $1 i32) +;; CHECK-NEXT: (loop $label$1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.eqz +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (block +;; CHECK-NEXT: (local.set $1 +;; CHECK-NEXT: (i32.const -2147483648) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (br $label$1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const -2766) +;; CHECK-NEXT: ) diff --git a/test/lit/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.wast b/test/lit/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.wast new file mode 100644 index 000000000..dbc1a1719 --- /dev/null +++ b/test/lit/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.wast @@ -0,0 +1,4606 @@ +;; 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-single-use --enable-threads -S -o - | filecheck %s + +(module + ;; CHECK: (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $i32_=>_i32 (func (param i32) (result i32))) + + ;; CHECK: (type $i32_=>_none (func (param i32))) + + ;; CHECK: (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) + + ;; CHECK: (type $none_=>_i32 (func (result i32))) + + ;; CHECK: (type $i32_i32_=>_none (func (param i32 i32))) + + ;; CHECK: (type $none_=>_f64 (func (result f64))) + + ;; CHECK: (type $i64_i64_i64_=>_i32 (func (param i64 i64 i64) (result i32))) + + ;; CHECK: (type $none_=>_none (func)) + + ;; CHECK: (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) + + ;; CHECK: (type $i64_i64_i64_=>_i64 (func (param i64 i64 i64) (result i64))) + + ;; CHECK: (type $i64_i64_i32_f32_=>_none (func (param i64 i64 i32 f32))) + + ;; CHECK: (type $i32_i32_i32_i32_i32_=>_i32 (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 $55)) + + ;; 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) + ) + ) + ) + ;; 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 $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: (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: ) + (func $flips + (local $x i32) + (local $y i32) + (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))) + ) + ;; 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 $55 (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) + ) +) diff --git a/test/lit/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.wast b/test/lit/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.wast new file mode 100644 index 000000000..f28bd954b --- /dev/null +++ b/test/lit/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.wast @@ -0,0 +1,4674 @@ +;; 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 $i32_i32_=>_i32 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $i32_=>_i32 (func (param i32) (result i32))) + + ;; CHECK: (type $i32_=>_none (func (param i32))) + + ;; CHECK: (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) + + ;; CHECK: (type $none_=>_i32 (func (result i32))) + + ;; CHECK: (type $i32_i32_=>_none (func (param i32 i32))) + + ;; CHECK: (type $none_=>_f64 (func (result f64))) + + ;; CHECK: (type $i64_i64_i64_=>_i32 (func (param i64 i64 i64) (result i32))) + + ;; CHECK: (type $none_=>_none (func)) + + ;; CHECK: (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) + + ;; CHECK: (type $i64_i64_i64_=>_i64 (func (param i64 i64 i64) (result i64))) + + ;; CHECK: (type $i64_i64_i32_f32_=>_none (func (param i64 i64 i32 f32))) + + ;; CHECK: (type $i32_i32_i32_i32_i32_=>_i32 (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) + ) +) diff --git a/test/passes/flatten_all-features.txt b/test/passes/flatten_all-features.txt deleted file mode 100644 index 517392d8c..000000000 --- a/test/passes/flatten_all-features.txt +++ /dev/null @@ -1,2462 +0,0 @@ -(module - (type $2 (func (result i32))) - (type $1 (func)) - (type $ii (func (param i32 i32))) - (type $3 (func (param i32) (result i32))) - (type $none_=>_f32 (func (result f32))) - (type $4 (func (param i64 i64) (result i64))) - (type $none_=>_anyref (func (result anyref))) - (global $x (mut i32) (i32.const 0)) - (memory $0 10) - (table $0 1 1 funcref) - (elem (i32.const 0) $call-me) - (func $a1 - (local $0 i32) - (local.set $0 - (i32.add - (i32.const 0) - (i32.const 1) - ) - ) - (drop - (local.get $0) - ) - ) - (func $a2 (result i32) - (local $0 i32) - (local.set $0 - (i32.add - (i32.const 0) - (i32.const 1) - ) - ) - (return - (local.get $0) - ) - ) - (func $a3 (result i32) - (local $0 i32) - (local $1 i32) - (local $2 i32) - (block $block - (local.set $0 - (i32.const 1) - ) - ) - (local.set $1 - (local.get $0) - ) - (local.set $2 - (i32.add - (i32.const 0) - (local.get $1) - ) - ) - (return - (local.get $2) - ) - ) - (func $a4 - (local $0 i32) - (local $1 i32) - (local $2 i32) - (block $block - (local.set $0 - (i32.const 1) - ) - ) - (local.set $1 - (local.get $0) - ) - (local.set $2 - (i32.add - (i32.const 0) - (local.get $1) - ) - ) - (drop - (local.get $2) - ) - ) - (func $a5 (result i32) - (local $0 i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (block $block - (local.set $0 - (i32.const 0) - ) - ) - (local.set $1 - (local.get $0) - ) - (block $block0 - (local.set $2 - (i32.const 1) - ) - ) - (local.set $3 - (local.get $2) - ) - (local.set $4 - (i32.add - (local.get $1) - (local.get $3) - ) - ) - (return - (local.get $4) - ) - ) - (func $a6 (result i32) - (local $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (block $block - (local.set $x - (i32.const 0) - ) - (local.set $1 - (local.get $x) - ) - (local.set $2 - (local.get $1) - ) - ) - (local.set $3 - (local.get $2) - ) - (block $block1 - (local.set $x - (i32.const 1) - ) - (local.set $4 - (local.get $x) - ) - (local.set $5 - (local.get $4) - ) - ) - (local.set $6 - (local.get $5) - ) - (local.set $7 - (i32.add - (local.get $3) - (local.get $6) - ) - ) - (return - (local.get $7) - ) - ) - (func $a7 (result i32) - (local $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (block $block - (block $block2 - (local.set $x - (i32.const 0) - ) - (local.set $1 - (local.get $x) - ) - (local.set $2 - (local.get $1) - ) - ) - (local.set $3 - (local.get $2) - ) - (block $block3 - (local.set $x - (i32.const 1) - ) - (local.set $4 - (local.get $x) - ) - (local.set $5 - (local.get $4) - ) - ) - (local.set $6 - (local.get $5) - ) - (local.set $7 - (i32.add - (local.get $3) - (local.get $6) - ) - ) - (local.set $8 - (local.get $7) - ) - ) - (local.set $9 - (local.get $8) - ) - (return - (local.get $9) - ) - ) - (func $a8 (result i32) - (local $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (block $outer - (block $inner - (block $block - (local.set $1 - (i32.const -1) - ) - (br $inner) - (unreachable) - (local.set $2 - (i32.const 0) - ) - (br $outer) - (unreachable) - (local.set $3 - (i32.const 1) - ) - ) - (local.set $4 - (local.get $3) - ) - (block $block4 - (local.set $2 - (i32.const 2) - ) - (br $outer) - (unreachable) - (local.set $x - (i32.const 3) - ) - (local.set $5 - (local.get $x) - ) - (local.set $6 - (local.get $5) - ) - ) - (local.set $7 - (local.get $6) - ) - (local.set $8 - (i32.add - (local.get $4) - (local.get $7) - ) - ) - (local.set $1 - (local.get $8) - ) - ) - (local.set $9 - (local.get $1) - ) - (local.set $2 - (local.get $9) - ) - ) - (local.set $10 - (local.get $2) - ) - (return - (local.get $10) - ) - ) - (func $a9 (result i32) - (local $0 i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (loop $outer - (loop $inner - (block - (br_if $outer - (i32.const -1) - ) - (local.set $0 - (i32.add - (i32.const 0) - (i32.const 1) - ) - ) - (local.set $1 - (local.get $0) - ) - ) - (local.set $2 - (local.get $1) - ) - (local.set $3 - (local.get $2) - ) - ) - (local.set $4 - (local.get $3) - ) - (local.set $5 - (local.get $4) - ) - ) - (local.set $6 - (local.get $5) - ) - (return - (local.get $6) - ) - ) - (func $a10 (result i32) - (local $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (block $outer - (local.set $1 - (i32.const 0) - ) - (br_if $outer - (i32.const 1) - ) - (local.set $2 - (local.get $1) - ) - (drop - (local.get $2) - ) - (local.set $x - (i32.const 2) - ) - (local.set $3 - (local.get $x) - ) - (local.set $1 - (local.get $3) - ) - (br_if $outer - (i32.const 3) - ) - (local.set $4 - (local.get $1) - ) - (drop - (local.get $4) - ) - (local.set $x - (i32.const 5) - ) - (local.set $5 - (local.get $x) - ) - (local.set $1 - (i32.const 4) - ) - (br_if $outer - (local.get $5) - ) - (local.set $6 - (local.get $1) - ) - (drop - (local.get $6) - ) - (local.set $x - (i32.const 6) - ) - (local.set $7 - (local.get $x) - ) - (local.set $x - (i32.const 7) - ) - (local.set $8 - (local.get $x) - ) - (local.set $1 - (local.get $7) - ) - (br_if $outer - (local.get $8) - ) - (local.set $9 - (local.get $1) - ) - (drop - (local.get $9) - ) - (local.set $1 - (i32.const 8) - ) - (br $outer) - (unreachable) - ) - (local.set $10 - (local.get $1) - ) - (return - (local.get $10) - ) - ) - (func $a11 - (if - (i32.const 0) - (drop - (i32.const 1) - ) - ) - ) - (func $a12 (result i32) - (local $0 i32) - (local $1 i32) - (if - (i32.const 0) - (local.set $0 - (i32.const 1) - ) - (local.set $0 - (i32.const 2) - ) - ) - (local.set $1 - (local.get $0) - ) - (return - (local.get $1) - ) - ) - (func $a13 (result i32) - (local $0 i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (block $x - (block - (local.set $0 - (i32.const 2) - ) - (local.set $1 - (local.get $0) - ) - (br_table $x - (i32.const 0) - ) - (if - (unreachable) - (local.set $2 - (i32.const 0) - ) - (local.set $2 - (i32.const 1) - ) - ) - ) - (local.set $3 - (local.get $2) - ) - (local.set $1 - (local.get $3) - ) - ) - (local.set $4 - (local.get $1) - ) - (return - (local.get $4) - ) - ) - (func $a14 (result i32) - (local $0 i32) - (local $1 i32) - (local $2 i32) - (block $block - (local.set $0 - (i32.const 7) - ) - (local.set $1 - (local.get $0) - ) - (br_table $block - (i32.const 1) - ) - (select - (i32.const 0) - (i32.const 1) - (unreachable) - ) - (unreachable) - ) - (local.set $2 - (local.get $1) - ) - (return - (local.get $2) - ) - ) - (func $a15 - (local $0 i32) - (local $1 f32) - (local $2 f32) - (block - (local.set $0 - (i32.load16_u - (i32.const 53) - ) - ) - (if - (local.get $0) - (block - (unreachable) - (unreachable) - ) - (block - (block $label$3 - (unreachable) - (unreachable) - ) - (local.set $2 - (local.get $1) - ) - (drop - (local.get $2) - ) - ) - ) - ) - (unreachable) - ) - (func $a16 (result i32) - (local $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (block $label$1 - (local.set $x - (i32.const 1) - ) - (local.set $1 - (local.get $x) - ) - (block $label$2 - (local.set $x - (i32.const 0) - ) - (local.set $2 - (i32.const 0) - ) - ) - (local.set $3 - (local.get $2) - ) - (local.set $4 - (i32.eqz - (local.get $3) - ) - ) - (local.set $5 - (local.get $1) - ) - (br_if $label$1 - (local.get $4) - ) - (local.set $6 - (local.get $5) - ) - (drop - (local.get $6) - ) - (local.set $5 - (i32.const 0) - ) - ) - (local.set $7 - (local.get $5) - ) - (return - (local.get $7) - ) - ) - (func $a17 (result f32) - (local $var$0 f32) - (local $1 f32) - (local $2 f32) - (local $3 f32) - (local $4 f32) - (local $5 f32) - (local.set $1 - (local.get $var$0) - ) - (local.set $var$0 - (f32.const -137438953472) - ) - (local.set $2 - (local.get $var$0) - ) - (local.set $3 - (local.get $var$0) - ) - (local.set $4 - (select - (local.get $2) - (local.get $3) - (i32.const 0) - ) - ) - (local.set $5 - (f32.max - (local.get $1) - (local.get $4) - ) - ) - (return - (local.get $5) - ) - ) - (func $a18 (result i32) - (local $0 i32) - (local $1 i32) - (block $label$1 - (unreachable) - (local.set $0 - (i32.const 1) - ) - (br_if $label$1 - (unreachable) - ) - (unreachable) - (drop - (unreachable) - ) - (i32.load - (unreachable) - ) - (unreachable) - ) - (local.set $1 - (local.get $0) - ) - (return - (local.get $1) - ) - ) - (func $a19 (result f32) - (block $label$0 - (block $label$1 - (unreachable) - (return - (f32.const 4289944320) - ) - (select - (unreachable) - (unreachable) - (i32.const 65535) - ) - (drop - (unreachable) - ) - (unreachable) - ) - (unreachable) - ) - (unreachable) - ) - (func $call-me (param $0 i32) (param $1 i32) - (nop) - ) - (func $code-to-kill - (local $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (block $out - (br $out) - (unreachable) - (drop - (i32.const 0) - ) - (if - (i32.const 1) - (drop - (i32.const 2) - ) - ) - (br_table $out $out $out $out - (i32.const 3) - ) - (unreachable) - (call $code-to-kill) - ) - (if - (i32.const 0) - (block - (block $out1 - (unreachable) - (unreachable) - (drop - (i32.const 0) - ) - ) - (unreachable) - ) - ) - (if - (i32.const 0) - (block - (block $out3 - (return) - (unreachable) - (drop - (i32.const 0) - ) - ) - (unreachable) - ) - ) - (block $out4 - (br_table $out4 $out4 $out4 $out4 - (i32.const 4) - ) - (unreachable) - (drop - (i32.const 0) - ) - ) - (block $out5 - (br_if $out5 - (i32.const 3) - ) - (drop - (i32.const 0) - ) - ) - (if - (i32.const 0) - (block - (block $block4 - (if - (i32.const 0) - (block - (block $out8 - (unreachable) - (unreachable) - (drop - (i32.const 0) - ) - ) - (unreachable) - ) - (block - (block $out9 - (unreachable) - (unreachable) - (drop - (i32.const 0) - ) - ) - (unreachable) - ) - ) - (unreachable) - (drop - (i32.const 0) - ) - ) - (unreachable) - ) - ) - (if - (i32.const 0) - (block - (block $out11 - (unreachable) - (unreachable) - (unreachable) - (drop - (i32.const 0) - ) - (unreachable) - (unreachable) - ) - (local.set $2 - (local.get $1) - ) - (drop - (local.get $2) - ) - ) - ) - (if - (i32.const 0) - (block - (block $out13 - (unreachable) - (unreachable) - (unreachable) - (drop - (i32.const 0) - ) - (unreachable) - (unreachable) - ) - (local.set $4 - (local.get $3) - ) - (drop - (local.get $4) - ) - ) - ) - (if - (i32.const 0) - (block - (block $out15 - (unreachable) - (unreachable) - (unreachable) - (unreachable) - (drop - (i32.const 0) - ) - (unreachable) - (unreachable) - ) - (local.set $6 - (local.get $5) - ) - (drop - (local.get $6) - ) - ) - ) - (block $out16 - (block $in - (br_if $out16 - (i32.const 1) - ) - ) - (unreachable) - (unreachable) - ) - (if - (i32.const 0) - (block - (block $block11 - (block $out18 - (block $in19 - (br_if $in19 - (i32.const 1) - ) - ) - (unreachable) - (unreachable) - ) - (unreachable) - (drop - (i32.const 10) - ) - ) - (unreachable) - ) - ) - (block $out20 - (block $in21 - (br_table $out20 $in21 - (i32.const 1) - ) - (unreachable) - ) - (unreachable) - (unreachable) - ) - (block $out22 - (block $in23 - (br_table $in23 $out22 - (i32.const 1) - ) - (unreachable) - ) - (unreachable) - (unreachable) - ) - (if - (i32.const 0) - (block - (block $block13 - (block $out25 - (block $in26 - (br_table $in26 $in26 - (i32.const 1) - ) - (unreachable) - ) - (unreachable) - (unreachable) - ) - (unreachable) - (drop - (i32.const 10) - ) - ) - (unreachable) - ) - ) - (if - (i32.const 0) - (block - (block $block15 - (drop - (i32.const 10) - ) - (drop - (i32.const 42) - ) - (unreachable) - (unreachable) - (unreachable) - (return - (unreachable) - ) - (unreachable) - (unreachable) - (unreachable) - (return) - (unreachable) - ) - (unreachable) - ) - ) - (if - (i32.const 0) - (block - (loop $loop-in18 - (unreachable) - (unreachable) - ) - (unreachable) - ) - ) - (block $out29 - (loop $in30 - (block - (br_if $out29 - (i32.const 1) - ) - (unreachable) - (unreachable) - ) - (unreachable) - ) - (unreachable) - ) - (if - (i32.const 0) - (block - (block $block20 - (loop $in32 - (block - (br_if $in32 - (i32.const 1) - ) - (unreachable) - (unreachable) - ) - (unreachable) - ) - (unreachable) - (drop - (i32.const 10) - ) - ) - (unreachable) - ) - ) - (if - (i32.const 1) - (block - (unreachable) - (call $call-me - (i32.const 123) - (unreachable) - ) - (unreachable) - ) - ) - (if - (i32.const 2) - (block - (unreachable) - (call $call-me - (unreachable) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.const 3) - (block - (unreachable) - (unreachable) - (call $call-me - (unreachable) - (unreachable) - ) - (unreachable) - ) - ) - (if - (i32.const -1) - (block - (unreachable) - (call_indirect $0 (type $ii) - (i32.const 123) - (i32.const 456) - (unreachable) - ) - (unreachable) - ) - ) - (if - (i32.const -2) - (block - (unreachable) - (call_indirect $0 (type $ii) - (i32.const 139) - (unreachable) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.const -3) - (block - (unreachable) - (unreachable) - (call_indirect $0 (type $ii) - (i32.const 246) - (unreachable) - (unreachable) - ) - (unreachable) - ) - ) - (if - (i32.const -4) - (block - (unreachable) - (unreachable) - (unreachable) - (call_indirect $0 (type $ii) - (unreachable) - (unreachable) - (unreachable) - ) - (unreachable) - ) - ) - (if - (i32.const 11) - (block - (unreachable) - (unreachable) - (unreachable) - ) - ) - (if - (i32.const 22) - (block - (unreachable) - (i32.load - (unreachable) - ) - (drop - (unreachable) - ) - (unreachable) - ) - ) - (if - (i32.const 33) - (block - (unreachable) - (i32.store - (i32.const 0) - (unreachable) - ) - (unreachable) - ) - ) - (if - (i32.const 44) - (block - (unreachable) - (i32.store - (unreachable) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.const 55) - (block - (unreachable) - (unreachable) - (i32.store - (unreachable) - (unreachable) - ) - (unreachable) - ) - ) - (if - (i32.const 66) - (block - (unreachable) - (i32.eqz - (unreachable) - ) - (drop - (unreachable) - ) - (unreachable) - ) - ) - (if - (i32.const 77) - (block - (unreachable) - (i32.add - (unreachable) - (i32.const 0) - ) - (drop - (unreachable) - ) - (unreachable) - ) - ) - (if - (i32.const 88) - (block - (unreachable) - (i32.add - (i32.const 0) - (unreachable) - ) - (drop - (unreachable) - ) - (unreachable) - ) - ) - (if - (i32.const 99) - (block - (unreachable) - (unreachable) - (i32.add - (unreachable) - (unreachable) - ) - (unreachable) - ) - ) - (if - (i32.const 100) - (block - (unreachable) - (select - (i32.const 123) - (i32.const 456) - (unreachable) - ) - (drop - (unreachable) - ) - (unreachable) - ) - ) - (if - (i32.const 101) - (block - (unreachable) - (select - (i32.const 123) - (unreachable) - (i32.const 456) - ) - (drop - (unreachable) - ) - (unreachable) - ) - ) - (if - (i32.const 102) - (block - (unreachable) - (select - (unreachable) - (i32.const 123) - (i32.const 456) - ) - (drop - (unreachable) - ) - (unreachable) - ) - ) - (drop - (i32.const 1337) - ) - ) - (func $killer - (block - (unreachable) - (unreachable) - (drop - (i32.const 1000) - ) - ) - (unreachable) - ) - (func $target - (drop - (i32.const 2000) - ) - ) - (func $typed-block-none-then-unreachable (result i32) - (local $0 i32) - (local $1 i32) - (block $top-typed - (block $switch$0 - (return - (i32.const 0) - ) - (unreachable) - (br $switch$0) - (unreachable) - ) - (return - (i32.const 1) - ) - (unreachable) - ) - (local.set $1 - (local.get $0) - ) - (return - (local.get $1) - ) - ) - (func $typed-block-remove-br-changes-type (param $$$0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (block - (block $switch$7 - (block $switch-default$10 - (block $switch-case$9 - (block $switch-case$8 - (br_table $switch-case$9 $switch-case$8 $switch-default$10 - (i32.const -1) - ) - (unreachable) - ) - ) - (local.set $1 - (local.get $$$0) - ) - (return - (local.get $1) - ) - (unreachable) - (br $switch$7) - (unreachable) - ) - (local.set $2 - (local.get $$$0) - ) - (return - (local.get $2) - ) - (unreachable) - ) - (return - (i32.const 0) - ) - (unreachable) - ) - (local.set $4 - (local.get $3) - ) - (return - (local.get $4) - ) - ) - (func $global - (local $0 i32) - (block - (unreachable) - (unreachable) - (local.set $0 - (global.get $x) - ) - (drop - (local.get $0) - ) - (global.set $x - (i32.const 1) - ) - ) - (unreachable) - ) - (func $ret (result i32) - (local $0 i32) - (local $1 i32) - (block - (return - (i32.const 0) - ) - (unreachable) - (nop) - (local.set $0 - (i32.const 0) - ) - ) - (local.set $1 - (local.get $0) - ) - (return - (local.get $1) - ) - ) - (func $unreachable-br (result i32) - (local $0 i32) - (local $1 i32) - (block $out - (local.set $0 - (i32.const 0) - ) - (br $out) - (unreachable) - (unreachable) - ) - (local.set $1 - (local.get $0) - ) - (return - (local.get $1) - ) - ) - (func $unreachable-br-loop (result i32) - (loop $out - (br $out) - (unreachable) - ) - (unreachable) - ) - (func $unreachable-block-ends-switch (result i32) - (local $0 i32) - (local $1 i32) - (block $label$0 - (block $label$3 - (nop) - (unreachable) - (br_table $label$3 - (unreachable) - ) - (unreachable) - (unreachable) - (unreachable) - ) - (local.set $0 - (i32.const 19) - ) - ) - (local.set $1 - (local.get $0) - ) - (return - (local.get $1) - ) - ) - (func $unreachable-block-ends-br_if (result i32) - (local $0 i32) - (local $1 i32) - (block $label$0 - (block $label$2 - (nop) - (unreachable) - (br_if $label$2 - (unreachable) - ) - (unreachable) - (unreachable) - (unreachable) - ) - (local.set $0 - (i32.const 19) - ) - ) - (local.set $1 - (local.get $0) - ) - (return - (local.get $1) - ) - ) - (func $unreachable-brs-3 (result i32) - (local $0 i32) - (local $1 i32) - (block $label$0 - (local.set $0 - (i32.const 18) - ) - (br $label$0) - (memory.grow - (unreachable) - ) - (unreachable) - (unreachable) - (local.set $0 - (i32.const 21) - ) - ) - (local.set $1 - (local.get $0) - ) - (return - (local.get $1) - ) - ) - (func $unreachable-brs-4 (param $var$0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (block $label$0 - (block $label$1 - (unreachable) - (local.set $1 - (i32.const 4104) - ) - (br_if $label$0 - (unreachable) - ) - (unreachable) - (drop - (unreachable) - ) - (unreachable) - (local.set $2 - (i32.const 4) - ) - ) - (local.set $3 - (local.get $2) - ) - (local.set $1 - (local.get $3) - ) - (br $label$0) - (unreachable) - (local.set $1 - (i32.const 16) - ) - ) - (local.set $4 - (local.get $1) - ) - (local.set $5 - (i32.add - (i32.const 1) - (local.get $4) - ) - ) - (return - (local.get $5) - ) - ) - (func $call-unreach (param $var$0 i64) (param $var$1 i64) (result i64) - (local $2 i64) - (local $3 i64) - (local $4 i32) - (local $5 i64) - (local $6 i64) - (local $7 i64) - (local $8 i64) - (local $9 i64) - (local $10 i64) - (local $11 i64) - (local $12 i64) - (local $13 i64) - (local $14 i64) - (local $15 i64) - (local $16 i64) - (local $17 i64) - (block - (local.set $3 - (local.get $var$0) - ) - (local.set $4 - (i64.eqz - (local.get $3) - ) - ) - (if - (local.get $4) - (block - (block $label$0 - (local.set $5 - (local.get $var$1) - ) - (local.set $6 - (local.get $5) - ) - ) - (local.set $7 - (local.get $6) - ) - (local.set $16 - (local.get $7) - ) - ) - (block - (block $label$1 - (local.set $8 - (local.get $var$0) - ) - (local.set $9 - (i64.sub - (local.get $8) - (i64.const 1) - ) - ) - (block $block - (local.set $10 - (local.get $var$0) - ) - (local.set $2 - (local.get $10) - ) - (nop) - (local.set $11 - (local.get $2) - ) - (local.set $12 - (local.get $11) - ) - ) - (local.set $13 - (local.get $12) - ) - (unreachable) - (i64.mul - (local.get $13) - (unreachable) - ) - (call $call-unreach - (local.get $9) - (unreachable) - ) - (unreachable) - ) - (local.set $15 - (local.get $14) - ) - (local.set $16 - (local.get $15) - ) - ) - ) - ) - (local.set $17 - (local.get $16) - ) - (return - (local.get $17) - ) - ) - (func $test-flatten - (local $0 i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (local $17 i32) - (local $18 i32) - (local $19 i32) - (local $20 i32) - (local $21 i32) - (local $22 i32) - (local $23 i32) - (local $24 i32) - (local $25 i32) - (local $26 i32) - (local $27 i32) - (local $28 i32) - (local $29 i32) - (local $30 i32) - (local $31 i32) - (local $32 i32) - (local $33 i32) - (local $34 i32) - (local $35 i32) - (local $36 i32) - (local $37 i32) - (local $38 i32) - (local $39 i32) - (block $out - (local.set $0 - (i32.add - (i32.const 1) - (i32.const 2) - ) - ) - (drop - (local.get $0) - ) - (br $out) - (i32.add - (i32.const 1) - (unreachable) - ) - (drop - (unreachable) - ) - (unreachable) - (br $out) - (i32.add - (unreachable) - (i32.const 1) - ) - (drop - (unreachable) - ) - (unreachable) - (br_table $out $out $out $out - (i32.const 3) - ) - (i32.add - (i32.const 1) - (unreachable) - ) - (drop - (unreachable) - ) - (unreachable) - (block $block - (drop - (i32.const 2) - ) - (drop - (i32.const 3) - ) - (local.set $1 - (i32.const 4) - ) - ) - (local.set $2 - (local.get $1) - ) - (local.set $3 - (i32.add - (i32.const 1) - (local.get $2) - ) - ) - (drop - (local.get $3) - ) - (block $in - (block $switch-in - (local.set $4 - (i32.const 2) - ) - (local.set $5 - (local.get $4) - ) - (local.set $6 - (local.get $4) - ) - (br_table $in $switch-in $in - (i32.const 777) - ) - (unreachable) - ) - (local.set $7 - (local.get $6) - ) - (drop - (local.get $7) - ) - (local.set $5 - (i32.const 3) - ) - (br $in) - (unreachable) - (local.set $5 - (i32.const 4) - ) - ) - (local.set $8 - (local.get $5) - ) - (local.set $9 - (i32.add - (i32.const 1) - (local.get $8) - ) - ) - (drop - (local.get $9) - ) - (loop $loop-in - (local.set $10 - (i32.const 5) - ) - ) - (local.set $11 - (local.get $10) - ) - (local.set $12 - (i32.add - (i32.const 1) - (local.get $11) - ) - ) - (drop - (local.get $12) - ) - (if - (i32.const 6) - (local.set $13 - (i32.const 7) - ) - (local.set $13 - (i32.const 8) - ) - ) - (local.set $14 - (local.get $13) - ) - (local.set $15 - (i32.add - (i32.const 1) - (local.get $14) - ) - ) - (drop - (local.get $15) - ) - (local.set $16 - (select - (i32.const 9) - (i32.const 10) - (i32.const 11) - ) - ) - (drop - (local.get $16) - ) - (br $out) - (select - (unreachable) - (i32.const 10) - (i32.const 11) - ) - (drop - (unreachable) - ) - (unreachable) - (br $out) - (select - (i32.const 9) - (unreachable) - (i32.const 11) - ) - (drop - (unreachable) - ) - (unreachable) - (br $out) - (select - (i32.const 9) - (i32.const 10) - (unreachable) - ) - (drop - (unreachable) - ) - (unreachable) - (if - (i32.const 11) - (local.set $17 - (i32.const 12) - ) - (local.set $17 - (i32.const 13) - ) - ) - (local.set $18 - (local.get $17) - ) - (local.set $19 - (select - (local.get $18) - (i32.const 9) - (i32.const 10) - ) - ) - (drop - (local.get $19) - ) - (if - (i32.const 11) - (local.set $20 - (i32.const 12) - ) - (local.set $20 - (i32.const 13) - ) - ) - (local.set $21 - (local.get $20) - ) - (local.set $22 - (select - (i32.const 9) - (local.get $21) - (i32.const 10) - ) - ) - (drop - (local.get $22) - ) - (if - (i32.const 11) - (local.set $23 - (i32.const 12) - ) - (local.set $23 - (i32.const 13) - ) - ) - (local.set $24 - (local.get $23) - ) - (local.set $25 - (select - (i32.const 9) - (i32.const 10) - (local.get $24) - ) - ) - (drop - (local.get $25) - ) - (if - (i32.const 11) - (local.set $26 - (i32.const 12) - ) - (local.set $26 - (i32.const 13) - ) - ) - (local.set $27 - (local.get $26) - ) - (if - (i32.const 15) - (local.set $28 - (i32.const 16) - ) - (local.set $28 - (i32.const 17) - ) - ) - (local.set $29 - (local.get $28) - ) - (local.set $30 - (select - (local.get $27) - (i32.const 14) - (local.get $29) - ) - ) - (drop - (local.get $30) - ) - (return) - (i32.add - (i32.const 1) - (unreachable) - ) - (drop - (unreachable) - ) - (unreachable) - (unreachable) - (i32.add - (i32.const 1) - (unreachable) - ) - (drop - (unreachable) - ) - (unreachable) - (block - (if - (i32.const 5) - (local.set $31 - (i32.const 6) - ) - (local.set $31 - (i32.const 7) - ) - ) - (local.set $32 - (local.get $31) - ) - (if - (local.get $32) - (local.set $35 - (i32.const 8) - ) - (block - (if - (i32.const 9) - (local.set $33 - (i32.const 10) - ) - (local.set $33 - (i32.const 11) - ) - ) - (local.set $34 - (local.get $33) - ) - (local.set $35 - (local.get $34) - ) - ) - ) - ) - (local.set $36 - (local.get $35) - ) - (drop - (local.get $36) - ) - (block $temp - (local.set $37 - (i32.const 1) - ) - (br_if $temp - (i32.const 2) - ) - (local.set $38 - (local.get $37) - ) - (local.set $37 - (local.get $38) - ) - ) - (local.set $39 - (local.get $37) - ) - (drop - (local.get $39) - ) - ) - ) - (func $flatten-return-value (result i32) - (local $0 i32) - (local $1 i32) - (block - (return - (i32.const 2) - ) - (i32.add - (i32.const 1) - (unreachable) - ) - (drop - (unreachable) - ) - (unreachable) - (local.set $0 - (i32.const 3) - ) - ) - (local.set $1 - (local.get $0) - ) - (return - (local.get $1) - ) - ) - (func $unbug - (local $12 i32) - (local $432 i32) - (local $430 i32) - (local $431 i32) - (local $9 i32) - (local $5 i32) - (local $433 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (local $17 i32) - (local $18 i32) - (local $19 i32) - (local $20 i32) - (local $21 i32) - (local $22 i32) - (block $block - (block - (local.set $7 - (local.get $12) - ) - (local.set $8 - (i32.eq - (local.get $7) - (i32.const 65535) - ) - ) - (if - (local.get $8) - (block $block44 - (block $label$78 - (local.set $430 - (i32.const 0) - ) - ) - (local.set $9 - (local.get $430) - ) - (local.set $432 - (local.get $9) - ) - ) - (block $block45 - (block $label$79 - (local.set $10 - (local.get $9) - ) - (local.set $11 - (local.get $5) - ) - (local.set $12 - (local.get $12) - ) - (local.set $13 - (i32.mul - (local.get $12) - (i32.const 12) - ) - ) - (local.set $14 - (i32.add - (local.get $11) - (local.get $13) - ) - ) - (local.set $15 - (i32.load16_u offset=2 - (local.get $14) - ) - ) - (local.set $16 - (i32.lt_u - (local.get $10) - (local.get $15) - ) - ) - (local.set $431 - (local.get $16) - ) - ) - (local.set $17 - (local.get $431) - ) - (local.set $432 - (local.get $17) - ) - ) - ) - ) - (local.set $433 - (i32.const 1) - ) - (local.set $18 - (local.get $432) - ) - (local.set $19 - (local.get $433) - ) - (local.set $20 - (i32.xor - (local.get $18) - (local.get $19) - ) - ) - (local.set $21 - (local.get $20) - ) - ) - (local.set $22 - (local.get $21) - ) - (drop - (local.get $22) - ) - ) - (func $outer-block-typed (param $var$0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (block $block - (block $label$0 - (local.set $1 - (i32.const 16) - ) - ) - (local.set $2 - (local.get $1) - ) - (local.set $3 - (i32.add - (i32.const 1) - (local.get $2) - ) - ) - (local.set $4 - (local.get $3) - ) - ) - (local.set $5 - (local.get $4) - ) - (return - (local.get $5) - ) - ) - (func $nested-br_if-with-value (result i32) - (local $0 i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (block $label$0 - (block $block - (local.set $1 - (local.get $0) - ) - (local.set $2 - (local.get $1) - ) - ) - (local.set $3 - (local.get $2) - ) - (local.set $4 - (i32.const 0) - ) - (br_if $label$0 - (local.get $3) - ) - (local.set $5 - (local.get $4) - ) - (drop - (local.get $5) - ) - (local.set $4 - (i32.const 1) - ) - ) - (local.set $6 - (local.get $4) - ) - (return - (local.get $6) - ) - ) - (func $switch-unreachable - (block $label$3 - (unreachable) - (br_table $label$3 - (unreachable) - ) - (unreachable) - ) - ) - (func $br_if_order (param $x i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (block $outer - (block $inner - (local.set $1 - (i32.const 0) - ) - (br_if $outer - (i32.const 1) - ) - (local.set $2 - (local.get $1) - ) - (block $block - (local.set $3 - (i32.const -16) - ) - ) - (local.set $4 - (local.get $3) - ) - (local.set $5 - (call $br_if_order - (local.get $4) - ) - ) - (local.set $6 - (local.get $2) - ) - (br_if $inner - (local.get $5) - ) - (local.set $7 - (local.get $6) - ) - (local.set $6 - (local.get $7) - ) - ) - (local.set $8 - (local.get $6) - ) - (local.set $1 - (local.get $8) - ) - ) - (local.set $9 - (local.get $1) - ) - (return - (local.get $9) - ) - ) - (func $tees (param $x i32) (param $y i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $2 - (local.get $x) - ) - (drop - (local.get $2) - ) - (unreachable) - (unreachable) - (drop - (unreachable) - ) - (unreachable) - (local.set $x - (i32.const 2) - ) - (local.set $3 - (local.get $x) - ) - (local.set $y - (local.get $3) - ) - (local.set $4 - (local.get $y) - ) - (drop - (local.get $4) - ) - ) - (unreachable) - ) - (func $return (param $x i32) (result i32) - (local $1 i32) - (local.set $1 - (i32.sub - (i32.const 1) - (i32.const 2) - ) - ) - (return - (local.get $1) - ) - (unreachable) - ) - (func $subtype (result anyref) - (local $0 externref) - (local $1 anyref) - (local $2 externref) - (local $3 externref) - (local $4 externref) - (local $5 externref) - (local $6 externref) - (local $7 anyref) - (block $label0 - (block $block - (local.set $1 - (ref.null extern) - ) - (local.set $2 - (ref.null extern) - ) - (br_if $label0 - (i32.const 0) - ) - (local.set $3 - (local.get $2) - ) - (local.set $0 - (local.get $3) - ) - (local.set $4 - (local.get $0) - ) - (local.set $5 - (local.get $4) - ) - ) - (local.set $6 - (local.get $5) - ) - (local.set $1 - (local.get $6) - ) - ) - (local.set $7 - (local.get $1) - ) - (return - (local.get $7) - ) - ) -) -(module - (type $i64_f32_=>_none (func (param i64 f32))) - (type $none_=>_i32 (func (result i32))) - (export "test" (func $1)) - (func $0 (param $0 i64) (param $1 f32) - (nop) - ) - (func $1 (result i32) - (unreachable) - (return - (i32.const -111) - ) - (call $0 - (unreachable) - (unreachable) - ) - (unreachable) - ) -) -(module - (type $none_=>_none (func)) - (type $none_=>_funcref (func (result funcref))) - (func $0 (result funcref) - (local $0 (ref null $none_=>_none)) - (local.set $0 - (ref.as_non_null - (ref.null $none_=>_none) - ) - ) - (return - (ref.as_non_null - (local.get $0) - ) - ) - ) -) diff --git a/test/passes/flatten_all-features.wast b/test/passes/flatten_all-features.wast deleted file mode 100644 index 874e91572..000000000 --- a/test/passes/flatten_all-features.wast +++ /dev/null @@ -1,1067 +0,0 @@ -(module - (type $ii (func (param i32 i32))) - (type $1 (func)) - (type $2 (func (result i32))) - (type $3 (func (param i32) (result i32))) - (type $4 (func (param i64 i64) (result i64))) - (global $x (mut i32) (i32.const 0)) - (table 1 1 funcref) - (elem (i32.const 0) $call-me) - (memory $0 10) - (func $a1 - (drop (i32.add (i32.const 0) (i32.const 1))) - ) - (func $a2 (result i32) - (i32.add (i32.const 0) (i32.const 1)) - ) - (func $a3 (result i32) - (i32.add - (i32.const 0) - (block (result i32) - (i32.const 1) - ) - ) - ) - (func $a4 - (drop - (i32.add - (i32.const 0) - (block (result i32) - (i32.const 1) - ) - ) - ) - ) - (func $a5 (result i32) - (i32.add - (block (result i32) - (i32.const 0) - ) - (block (result i32) - (i32.const 1) - ) - ) - ) - (func $a6 (result i32) - (local $x i32) - (i32.add - (block (result i32) - (local.tee $x - (i32.const 0) - ) - ) - (block (result i32) - (local.tee $x - (i32.const 1) - ) - ) - ) - ) - (func $a7 (result i32) - (local $x i32) - (block (result i32) - (i32.add - (block (result i32) - (local.tee $x - (i32.const 0) - ) - ) - (block (result i32) - (local.tee $x - (i32.const 1) - ) - ) - ) - ) - ) - (func $a8 (result i32) - (local $x i32) - (block $outer (result i32) - (block $inner (result i32) - (i32.add - (block (result i32) - (br $inner - (i32.const -1) - ) - (br $outer - (i32.const 0) - ) - (i32.const 1) - ) - (block (result i32) - (br $outer - (i32.const 2) - ) - (local.tee $x - (i32.const 3) - ) - ) - ) - ) - ) - ) - (func $a9 (result i32) - (loop $outer (result i32) - (loop $inner (result i32) - (br_if $outer (i32.const -1)) - (i32.add - (i32.const 0) - (i32.const 1) - ) - ) - ) - ) - (func $a10 (result i32) - (local $x i32) - (block $outer (result i32) - (drop (br_if $outer (i32.const 0) (i32.const 1))) - (drop (br_if $outer (local.tee $x (i32.const 2)) (i32.const 3))) - (drop (br_if $outer (i32.const 4) (local.tee $x (i32.const 5)))) - (drop (br_if $outer (local.tee $x (i32.const 6)) (local.tee $x (i32.const 7)))) - (br $outer (i32.const 8)) - ) - ) - (func $a11 - (if (i32.const 0) - (drop (i32.const 1)) - ) - ) - (func $a12 (result i32) - (if (result i32) (i32.const 0) - (i32.const 1) - (i32.const 2) - ) - ) - (func $a13 (result i32) - (block $x i32 - (if i32 - (br_table $x (i32.const 2) (i32.const 0)) - (i32.const 0) - (i32.const 1) - ) - ) - ) - (func $a14 (result i32) - (block i32 - (select - (i32.const 0) (i32.const 1) (br_table 0 (i32.const 7) (i32.const 1)) - ) - ) - ) - (func $a15 - (if - (i32.load16_u - (i32.const 53) - ) - (unreachable) - (drop - (block $label$3 (result f32) - (unreachable) - ) - ) - ) - ) - (func $a16 (result i32) - (local $x i32) - (block $label$1 (result i32) - (drop - (br_if $label$1 - (local.tee $x ;; set here, then it is undone later, but this value is used, not the contents of $x! - (i32.const 1) - ) - (i32.eqz ;; 0 into 1, so take the br_if - (block $label$2 (result i32) - (local.set $x - (i32.const 0) ;; undo the above tee - ) - (i32.const 0) - ) - ) - ) - ) - (i32.const 0) - ) - ) - (func $a17 (result f32) - (local $var$0 f32) - (f32.max - (local.get $var$0) - (select - (local.tee $var$0 - (f32.const -137438953472) - ) - (local.get $var$0) - (i32.const 0) - ) - ) - ) - (func $a18 (result i32) - (block $label$1 (result i32) - (i32.load16_s - (drop ;; an unreachable drop. one we move its contents outside, it should stay unreachable - (br_if $label$1 - (i32.const 1) - (unreachable) - ) - ) - ) - ) - ) - (func $a19 (result f32) - (block $label$0 - (block $label$1 - (drop - (select - (unreachable) ;; move this out, so it happens before the return - (return - (f32.const 4289944320) - ) - (i32.const 65535) - ) - ) - ) - ) - ) - (func $call-me (param $0 i32) (param $1 i32) - (nop) - ) - (func $code-to-kill - (local $x i32) - (block $out - (br $out) - (drop - (i32.const 0) - ) - (if - (i32.const 1) - (drop - (i32.const 2) - ) - ) - (br_table $out $out $out $out - (i32.const 3) - ) - (call $code-to-kill) - ) - (if - (i32.const 0) - (block $out1 - (unreachable) - (drop - (i32.const 0) - ) - ) - ) - (if - (i32.const 0) - (block $out3 - (return) - (drop - (i32.const 0) - ) - ) - ) - (block $out4 - (br_table $out4 $out4 $out4 $out4 - (i32.const 4) - ) - (drop - (i32.const 0) - ) - ) - (block $out5 - (br_if $out5 - (i32.const 3) - ) - (drop - (i32.const 0) - ) - ) - (if - (i32.const 0) - (block $block4 - (if - (i32.const 0) - (block $out8 - (unreachable) - (drop - (i32.const 0) - ) - ) - (block $out9 - (unreachable) - (drop - (i32.const 0) - ) - ) - ) - (drop - (i32.const 0) - ) - ) - ) - (if - (i32.const 0) - (drop - (block $out11 (result i32) - (br $out11 - (unreachable) - ) - (drop - (i32.const 0) - ) - (unreachable) - ) - ) - ) - (if - (i32.const 0) - (drop - (block $out13 (result i32) - (br_if $out13 - (unreachable) - (i32.const 0) - ) - (drop - (i32.const 0) - ) - (unreachable) - ) - ) - ) - (if - (i32.const 0) - (drop - (block $out15 (result i32) - (br_if $out15 - (unreachable) - (unreachable) - ) - (drop - (i32.const 0) - ) - (unreachable) - ) - ) - ) - (block $out16 - (block $in - (br_if $out16 - (i32.const 1) - ) - ) - (unreachable) - ) - (if - (i32.const 0) - (block $block11 - (block $out18 - (block $in19 - (br_if $in19 - (i32.const 1) - ) - ) - (unreachable) - ) - (drop - (i32.const 10) - ) - ) - ) - (block $out20 - (block $in21 - (br_table $out20 $in21 - (i32.const 1) - ) - ) - (unreachable) - ) - (block $out22 - (block $in23 - (br_table $in23 $out22 - (i32.const 1) - ) - ) - (unreachable) - ) - (if - (i32.const 0) - (block $block13 - (block $out25 - (block $in26 - (br_table $in26 $in26 - (i32.const 1) - ) - ) - (unreachable) - ) - (drop - (i32.const 10) - ) - ) - ) - (if - (i32.const 0) - (block $block15 - (drop - (i32.const 10) - ) - (drop - (i32.const 42) - ) - (unreachable) - (return - (unreachable) - ) - (unreachable) - (return) - ) - ) - (if - (i32.const 0) - (loop $loop-in18 - (unreachable) - ) - ) - (block $out29 - (loop $in30 - (br_if $out29 - (i32.const 1) - ) - (unreachable) - ) - ) - (if - (i32.const 0) - (block $block20 - (loop $in32 - (br_if $in32 - (i32.const 1) - ) - (unreachable) - ) - (drop - (i32.const 10) - ) - ) - ) - (if - (i32.const 1) - (call $call-me - (i32.const 123) - (unreachable) - ) - ) - (if - (i32.const 2) - (call $call-me - (unreachable) - (i32.const 0) - ) - ) - (if - (i32.const 3) - (call $call-me - (unreachable) - (unreachable) - ) - ) - (if - (i32.const -1) - (call_indirect (type $ii) - (i32.const 123) - (i32.const 456) - (unreachable) - ) - ) - (if - (i32.const -2) - (call_indirect (type $ii) - (i32.const 139) - (unreachable) - (i32.const 0) - ) - ) - (if - (i32.const -3) - (call_indirect (type $ii) - (i32.const 246) - (unreachable) - (unreachable) - ) - ) - (if - (i32.const -4) - (call_indirect (type $ii) - (unreachable) - (unreachable) - (unreachable) - ) - ) - (if - (i32.const 11) - (local.set $x - (unreachable) - ) - ) - (if - (i32.const 22) - (drop - (i32.load - (unreachable) - ) - ) - ) - (if - (i32.const 33) - (i32.store - (i32.const 0) - (unreachable) - ) - ) - (if - (i32.const 44) - (i32.store - (unreachable) - (i32.const 0) - ) - ) - (if - (i32.const 55) - (i32.store - (unreachable) - (unreachable) - ) - ) - (if - (i32.const 66) - (drop - (i32.eqz - (unreachable) - ) - ) - ) - (if - (i32.const 77) - (drop - (i32.add - (unreachable) - (i32.const 0) - ) - ) - ) - (if - (i32.const 88) - (drop - (i32.add - (i32.const 0) - (unreachable) - ) - ) - ) - (if - (i32.const 99) - (i32.add - (unreachable) - (unreachable) - ) - ) - (if - (i32.const 100) - (drop - (select - (i32.const 123) - (i32.const 456) - (unreachable) - ) - ) - ) - (if - (i32.const 101) - (drop - (select - (i32.const 123) - (unreachable) - (i32.const 456) - ) - ) - ) - (if - (i32.const 102) - (drop - (select - (unreachable) - (i32.const 123) - (i32.const 456) - ) - ) - ) - (drop - (i32.const 1337) - ) - ) - (func $killer (type $1) - (unreachable) - (drop - (i32.const 1000) - ) - ) - (func $target (type $1) - (drop - (i32.const 2000) - ) - ) - (func $typed-block-none-then-unreachable (type $2) (result i32) - (block $top-typed (result i32) - (block $switch$0 - (return - (i32.const 0) - ) - (br $switch$0) - ) - (return - (i32.const 1) - ) - ) - ) - (func $typed-block-remove-br-changes-type (type $3) (param $$$0 i32) (result i32) - (block $switch$7 - (block $switch-default$10 - (block $switch-case$9 - (block $switch-case$8 - (br_table $switch-case$9 $switch-case$8 $switch-default$10 - (i32.const -1) - ) - ) - ) - (return - (local.get $$$0) - ) - (br $switch$7) - ) - (return - (local.get $$$0) - ) - ) - (return - (i32.const 0) - ) - ) - (func $global (type $1) - (unreachable) - (drop - (global.get $x) - ) - (global.set $x - (i32.const 1) - ) - ) - (func $ret (type $2) (result i32) - (return - (i32.const 0) - ) - (nop) - (i32.const 0) - ) - (func $unreachable-br (type $2) (result i32) - (block $out (result i32) - (br $out - (br $out - (i32.const 0) - ) - ) - ) - ) - (func $unreachable-br-loop (type $2) (result i32) - (loop $out - (br $out) - ) - ) - (func $unreachable-block-ends-switch (type $2) (result i32) - (block $label$0 (result i32) - (block $label$3 - (nop) - (br_table $label$3 - (unreachable) - ) - (unreachable) - ) - (i32.const 19) - ) - ) - (func $unreachable-block-ends-br_if (result i32) - (block $label$0 (result i32) - (block $label$2 - (nop) - (br_if $label$2 - (unreachable) - ) - (unreachable) - ) - (i32.const 19) - ) - ) - (func $unreachable-brs-3 (result i32) - (block $label$0 (result i32) - (br $label$0 - (memory.grow - (br $label$0 - (i32.const 18) - ) - ) - ) - (i32.const 21) - ) - ) - (func $unreachable-brs-4 (param $var$0 i32) (result i32) - (i32.add - (i32.const 1) - (block $label$0 (result i32) - (br $label$0 - (block $label$1 (result i32) - (drop - (br_if $label$0 - (i32.const 4104) - (unreachable) - ) - ) - (i32.const 4) - ) - ) - (i32.const 16) - ) - ) - ) - (func $call-unreach (param $var$0 i64) (param $var$1 i64) (result i64) - (local $2 i64) - (if (result i64) - (i64.eqz - (local.get $var$0) - ) - (block $label$0 (result i64) - (local.get $var$1) - ) - (block $label$1 (result i64) - (call $call-unreach - (i64.sub - (local.get $var$0) - (i64.const 1) - ) - (i64.mul - (block $block (result i64) - (local.set $2 - (local.get $var$0) - ) - (nop) - (local.get $2) - ) - (unreachable) - ) - ) - ) - ) - ) - - ;; flatten-specific - (func $test-flatten - (block $out - (drop (i32.add (i32.const 1) (i32.const 2))) - (drop (i32.add (i32.const 1) (br $out))) - (drop (i32.add (br $out) (i32.const 1))) - (drop (i32.add (i32.const 1) (br_table $out $out $out $out (i32.const 3)))) - (drop (i32.add (i32.const 1) - (block (result i32) - (drop (i32.const 2)) - (drop (i32.const 3)) - (i32.const 4) - ) - )) - (drop (i32.add (i32.const 1) - (block $in (result i32) - (drop - (block $switch-in (result i32) - (br_table $in $switch-in $in (i32.const 2) (i32.const 777)) - ) - ) - (br $in (i32.const 3)) - (i32.const 4) - ) - )) - (drop (i32.add (i32.const 1) - (loop (result i32) - (i32.const 5) - ) - )) - (drop (i32.add (i32.const 1) - (if (result i32) - (i32.const 6) - (i32.const 7) - (i32.const 8) - ) - )) - (drop - (select - (i32.const 9) - (i32.const 10) - (i32.const 11) - ) - ) - (drop - (select - (br $out) - (i32.const 10) - (i32.const 11) - ) - ) - (drop - (select - (i32.const 9) - (br $out) - (i32.const 11) - ) - ) - (drop - (select - (i32.const 9) - (i32.const 10) - (br $out) - ) - ) - (drop - (select - (if (result i32) - (i32.const 11) - (i32.const 12) - (i32.const 13) - ) - (i32.const 9) - (i32.const 10) - ) - ) - (drop - (select - (i32.const 9) - (if (result i32) - (i32.const 11) - (i32.const 12) - (i32.const 13) - ) - (i32.const 10) - ) - ) - (drop - (select - (i32.const 9) - (i32.const 10) - (if (result i32) - (i32.const 11) - (i32.const 12) - (i32.const 13) - ) - ) - ) - (drop - (select - (if (result i32) - (i32.const 11) - (i32.const 12) - (i32.const 13) - ) - (i32.const 14) - (if (result i32) - (i32.const 15) - (i32.const 16) - (i32.const 17) - ) - ) - ) - (drop (i32.add (i32.const 1) (return))) - (drop (i32.add (i32.const 1) (unreachable))) - (drop - (if (result i32) - (if (result i32) - (i32.const 5) - (i32.const 6) - (i32.const 7) - ) - (i32.const 8) - (if (result i32) - (i32.const 9) - (i32.const 10) - (i32.const 11) - ) - ) - ) - (drop - (block $temp (result i32) - (br_if $temp - (i32.const 1) - (i32.const 2) - ) - ) - ) - ) - ) - (func $flatten-return-value (result i32) - (drop (i32.add (i32.const 1) (return (i32.const 2)))) - (i32.const 3) - ) - (func $unbug - (local $12 i32) - (local $432 i32) - (local $430 i32) - (local $431 i32) - (local $9 i32) - (local $5 i32) - (local $433 i32) - (drop - (block (result i32) - (if - (i32.eq - (local.get $12) - (i32.const 65535) - ) - (block - (block $label$78 - (local.set $430 - (i32.const 0) - ) - ) - (local.set $432 - (local.get $430) - ) - ) - (block - (block $label$79 - (local.set $431 - (i32.lt_u - (local.get $9) - (i32.load16_u offset=2 - (i32.add - (local.get $5) - (i32.mul - (local.get $12) - (i32.const 12) - ) - ) - ) - ) - ) - ) - (local.set $432 - (local.get $431) - ) - ) - ) - (local.set $433 - (i32.const 1) - ) - (i32.xor - (local.get $432) - (local.get $433) - ) - ) - ) - ) - (func $outer-block-typed (type $3) (param $var$0 i32) (result i32) - (block (result i32) - (i32.add - (i32.const 1) - (block $label$0 (result i32) - (i32.const 16) - ) - ) - ) - ) - (func $nested-br_if-with-value (result i32) - (local $0 i32) - (block $label$0 (result i32) - (drop - (br_if $label$0 - (i32.const 0) - (block (result i32) - (local.get $0) - ) - ) - ) - (i32.const 1) - ) - ) - (func $switch-unreachable - (block $label$3 - (br_table $label$3 - (unreachable) - ) - ) - ) - (func $br_if_order (param $x i32) (result i32) - (block $outer (result i32) - (block $inner (result i32) - (br_if $inner - (br_if $outer - (i32.const 0) - (i32.const 1) - ) - (call $br_if_order - (block (result i32) - (i32.const -16) - ) - ) - ) - ) - ) - ) - (func $tees (param $x i32) (param $y i32) - (drop (local.tee $x (i32.const 1))) - (drop (local.tee $x (unreachable))) - (drop (local.tee $y (local.tee $x (i32.const 2)))) - ) - (func $return (param $x i32) (result i32) - (return (i32.sub (i32.const 1) (i32.const 2))) - ) - - ;; subtypes - - ;; br_if leaves a value on the stack if not taken, which later can be the last - ;; element of the enclosing innermost block and flow out. So in case br_if - ;; targets an outer branch whose return type is a supertype of the br_if's - ;; value type, we need the value to be set into two locals: one with the outer - ;; block's type, and one with its value type. - (func $subtype (result anyref) - (local $0 externref) - (block $label0 (result anyref) - (block (result externref) - (local.tee $0 - (br_if $label0 - (ref.null extern) - (i32.const 0) - ) - ) - ) - ) - ) -) -(module - (func $0 (param $0 i64) (param $1 f32) - (nop) - ) - (func "test" (result i32) - (call $0 - (unreachable) ;; the unreachable should be handled properly, and not be - ;; reordered with the return - (return - (i32.const -111) - ) - ) - ) -) -;; non-nullable temp vars we add must be handled properly, as non-nullable -;; locals are not allowed -(module - (type $none_=>_none (func)) - (func $0 (result funcref) - (ref.as_non_null - (ref.null $none_=>_none) - ) - ) -) diff --git a/test/passes/flatten_dfo_O3_enable-threads.txt b/test/passes/flatten_dfo_O3_enable-threads.txt deleted file mode 100644 index 7e4f01c1a..000000000 --- a/test/passes/flatten_dfo_O3_enable-threads.txt +++ /dev/null @@ -1,50 +0,0 @@ -(module - (type $none_=>_none (func)) - (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) - (type $i64_i32_=>_f64 (func (param i64 i32) (result f64))) - (type $f64_=>_f64 (func (param f64) (result f64))) - (type $none_=>_i32 (func (result i32))) - (memory $0 (shared 1 1)) - (export "one" (func $0)) - (export "two" (func $1)) - (export "use-var" (func $2)) - (export "bad1" (func $3)) - (export "only-dfo" (func $4)) - (export "dfo-tee-get" (func $5)) - (func $0 (; has Stack IR ;) - (block $label$3 - (br_if $label$3 - (i32.load - (i32.const 3060) - ) - ) - ) - (unreachable) - ) - (func $1 (; has Stack IR ;) (param $0 i32) (param $1 i32) (result i32) - (i32.const 0) - ) - (func $2 (; has Stack IR ;) (param $0 i64) (param $1 i32) (result f64) - (loop $label$8 - (br_if $label$8 - (local.get $1) - ) - ) - (unreachable) - ) - (func $3 (; has Stack IR ;) - (i32.store - (i32.const 1) - (i32.const -16384) - ) - ) - (func $4 (; has Stack IR ;) (param $0 f64) (result f64) - (local $1 i32) - (loop $label$1 - (br $label$1) - ) - ) - (func $5 (; has Stack IR ;) (result i32) - (i32.const 1) - ) -) diff --git a/test/passes/flatten_i64-to-i32-lowering.txt b/test/passes/flatten_i64-to-i32-lowering.txt deleted file mode 100644 index 6204fc73a..000000000 --- a/test/passes/flatten_i64-to-i32-lowering.txt +++ /dev/null @@ -1,572 +0,0 @@ -(module - (type $none_=>_i32 (func (result i32))) - (type $none_=>_i64 (func (result i64))) - (type $none_=>_none (func)) - (import "env" "func" (func $import (result i64))) - (global $i64toi32_i32$HIGH_BITS (mut i32) (i32.const 0)) - (memory $0 1 1) - (func $defined (result i32) - (local $0 i32) - (local $0$hi i32) - (local $i64toi32_i32$0 i32) - (local $i64toi32_i32$1 i32) - (local $i64toi32_i32$2 i32) - (local $i64toi32_i32$3 i32) - (local $i64toi32_i32$4 i32) - (local $i64toi32_i32$5 i32) - (block - (local.set $0 - (block (result i32) - (local.set $i64toi32_i32$2 - (block (result i32) - (local.set $i64toi32_i32$0 - (i32.const 0) - ) - (i32.const 1) - ) - ) - (local.set $i64toi32_i32$3 - (block (result i32) - (local.set $i64toi32_i32$1 - (i32.const 0) - ) - (i32.const 2) - ) - ) - (local.set $i64toi32_i32$4 - (i32.add - (local.get $i64toi32_i32$2) - (local.get $i64toi32_i32$3) - ) - ) - (local.set $i64toi32_i32$5 - (i32.add - (local.get $i64toi32_i32$0) - (local.get $i64toi32_i32$1) - ) - ) - (if - (i32.lt_u - (local.get $i64toi32_i32$4) - (local.get $i64toi32_i32$3) - ) - (local.set $i64toi32_i32$5 - (i32.add - (local.get $i64toi32_i32$5) - (i32.const 1) - ) - ) - ) - (local.get $i64toi32_i32$4) - ) - ) - (local.set $0$hi - (local.get $i64toi32_i32$5) - ) - ) - (block - (local.set $i64toi32_i32$2 - (block (result i32) - (local.set $i64toi32_i32$5 - (local.get $0$hi) - ) - (local.get $0) - ) - ) - (global.set $i64toi32_i32$HIGH_BITS - (local.get $i64toi32_i32$5) - ) - (return - (local.get $i64toi32_i32$2) - ) - ) - ) - (func $unreachable-select-i64 (result i32) - (local $i64toi32_i32$0 i32) - (unreachable) - (block - (drop - (block (result i32) - (local.set $i64toi32_i32$0 - (i32.const 0) - ) - (i32.const 1) - ) - ) - (unreachable) - (drop - (i32.const 2) - ) - ) - (unreachable) - ) - (func $unreachable-select-i64-b (result i32) - (local $i64toi32_i32$0 i32) - (unreachable) - (block - (unreachable) - (drop - (block (result i32) - (local.set $i64toi32_i32$0 - (i32.const 0) - ) - (i32.const 3) - ) - ) - (drop - (i32.const 4) - ) - ) - (unreachable) - ) - (func $unreachable-select-i64-c (result i32) - (local $i64toi32_i32$0 i32) - (local $i64toi32_i32$1 i32) - (unreachable) - (block - (drop - (block (result i32) - (local.set $i64toi32_i32$0 - (i32.const 0) - ) - (i32.const 5) - ) - ) - (drop - (block (result i32) - (local.set $i64toi32_i32$1 - (i32.const 0) - ) - (i32.const 6) - ) - ) - (unreachable) - ) - (unreachable) - ) - (func $mem - (local $0 i32) - (local $0$hi i32) - (local $1 i32) - (local $1$hi i32) - (local $2 i32) - (local $2$hi i32) - (local $3 i32) - (local $3$hi i32) - (local $4 i32) - (local $4$hi i32) - (local $i64toi32_i32$0 i32) - (local $i64toi32_i32$1 i32) - (local $i64toi32_i32$2 i32) - (block - (local.set $0 - (block (result i32) - (local.set $i64toi32_i32$2 - (i32.const 0) - ) - (local.set $i64toi32_i32$0 - (i32.load - (local.get $i64toi32_i32$2) - ) - ) - (local.set $i64toi32_i32$1 - (i32.load offset=4 - (local.get $i64toi32_i32$2) - ) - ) - (local.get $i64toi32_i32$0) - ) - ) - (local.set $0$hi - (local.get $i64toi32_i32$1) - ) - ) - (drop - (block (result i32) - (local.set $i64toi32_i32$1 - (local.get $0$hi) - ) - (local.get $0) - ) - ) - (block - (local.set $1 - (block (result i32) - (local.set $i64toi32_i32$2 - (i32.const 0) - ) - (local.set $i64toi32_i32$1 - (i32.load - (local.get $i64toi32_i32$2) - ) - ) - (local.set $i64toi32_i32$0 - (i32.load offset=4 - (local.get $i64toi32_i32$2) - ) - ) - (local.get $i64toi32_i32$1) - ) - ) - (local.set $1$hi - (local.get $i64toi32_i32$0) - ) - ) - (drop - (block (result i32) - (local.set $i64toi32_i32$0 - (local.get $1$hi) - ) - (local.get $1) - ) - ) - (block - (local.set $2 - (block (result i32) - (local.set $i64toi32_i32$2 - (i32.const 0) - ) - (local.set $i64toi32_i32$0 - (i32.load align=2 - (local.get $i64toi32_i32$2) - ) - ) - (local.set $i64toi32_i32$1 - (i32.load offset=4 align=2 - (local.get $i64toi32_i32$2) - ) - ) - (local.get $i64toi32_i32$0) - ) - ) - (local.set $2$hi - (local.get $i64toi32_i32$1) - ) - ) - (drop - (block (result i32) - (local.set $i64toi32_i32$1 - (local.get $2$hi) - ) - (local.get $2) - ) - ) - (block - (local.set $3 - (block (result i32) - (local.set $i64toi32_i32$2 - (i32.const 0) - ) - (local.set $i64toi32_i32$1 - (i32.load align=1 - (local.get $i64toi32_i32$2) - ) - ) - (local.set $i64toi32_i32$0 - (i32.load offset=4 align=1 - (local.get $i64toi32_i32$2) - ) - ) - (local.get $i64toi32_i32$1) - ) - ) - (local.set $3$hi - (local.get $i64toi32_i32$0) - ) - ) - (drop - (block (result i32) - (local.set $i64toi32_i32$0 - (local.get $3$hi) - ) - (local.get $3) - ) - ) - (block - (local.set $4 - (block (result i32) - (local.set $i64toi32_i32$2 - (i32.const 0) - ) - (local.set $i64toi32_i32$0 - (i32.load - (local.get $i64toi32_i32$2) - ) - ) - (local.set $i64toi32_i32$1 - (i32.load offset=4 - (local.get $i64toi32_i32$2) - ) - ) - (local.get $i64toi32_i32$0) - ) - ) - (local.set $4$hi - (local.get $i64toi32_i32$1) - ) - ) - (drop - (block (result i32) - (local.set $i64toi32_i32$1 - (local.get $4$hi) - ) - (local.get $4) - ) - ) - (block - (local.set $i64toi32_i32$0 - (i32.const 0) - ) - (i32.store - (local.get $i64toi32_i32$0) - (block (result i32) - (local.set $i64toi32_i32$1 - (i32.const 0) - ) - (i32.const 1) - ) - ) - (i32.store offset=4 - (local.get $i64toi32_i32$0) - (local.get $i64toi32_i32$1) - ) - ) - (block - (local.set $i64toi32_i32$0 - (i32.const 0) - ) - (i32.store - (local.get $i64toi32_i32$0) - (block (result i32) - (local.set $i64toi32_i32$1 - (i32.const 0) - ) - (i32.const 2) - ) - ) - (i32.store offset=4 - (local.get $i64toi32_i32$0) - (local.get $i64toi32_i32$1) - ) - ) - (block - (local.set $i64toi32_i32$0 - (i32.const 0) - ) - (i32.store align=2 - (local.get $i64toi32_i32$0) - (block (result i32) - (local.set $i64toi32_i32$1 - (i32.const 0) - ) - (i32.const 3) - ) - ) - (i32.store offset=4 align=2 - (local.get $i64toi32_i32$0) - (local.get $i64toi32_i32$1) - ) - ) - (block - (local.set $i64toi32_i32$0 - (i32.const 0) - ) - (i32.store align=1 - (local.get $i64toi32_i32$0) - (block (result i32) - (local.set $i64toi32_i32$1 - (i32.const 0) - ) - (i32.const 4) - ) - ) - (i32.store offset=4 align=1 - (local.get $i64toi32_i32$0) - (local.get $i64toi32_i32$1) - ) - ) - (block - (local.set $i64toi32_i32$0 - (i32.const 0) - ) - (i32.store - (local.get $i64toi32_i32$0) - (block (result i32) - (local.set $i64toi32_i32$1 - (i32.const 0) - ) - (i32.const 5) - ) - ) - (i32.store offset=4 - (local.get $i64toi32_i32$0) - (local.get $i64toi32_i32$1) - ) - ) - ) -) -(module - (type $none_=>_none (func)) - (type $i32_i32_=>_none (func (param i32 i32))) - (global $f (mut i32) (i32.const -1412567121)) - (global $g (mut i32) (global.get $f)) - (global $f$hi (mut i32) (i32.const 305419896)) - (global $g$hi (mut i32) (global.get $f$hi)) - (global $i64toi32_i32$HIGH_BITS (mut i32) (i32.const 0)) - (export "exp" (func $1)) - (export "unreach" (func $2)) - (func $call (param $0 i32) (param $0$hi i32) - (nop) - ) - (func $1 - (local $0 i32) - (local $0$hi i32) - (local $i64toi32_i32$0 i32) - (block - (local.set $0 - (block (result i32) - (local.set $i64toi32_i32$0 - (global.get $f$hi) - ) - (global.get $f) - ) - ) - (local.set $0$hi - (local.get $i64toi32_i32$0) - ) - ) - (call $call - (block (result i32) - (local.set $i64toi32_i32$0 - (local.get $0$hi) - ) - (local.get $0) - ) - (local.get $i64toi32_i32$0) - ) - (block - (global.set $f - (block (result i32) - (local.set $i64toi32_i32$0 - (i32.const 287454020) - ) - (i32.const 1432778632) - ) - ) - (global.set $f$hi - (local.get $i64toi32_i32$0) - ) - ) - ) - (func $2 - (local $0 i32) - (local $0$hi i32) - (local $1 i32) - (local $1$hi i32) - (local $i64toi32_i32$0 i32) - (block $label$1 - (unreachable) - (unreachable) - ) - (block - (local.set $1 - (block (result i32) - (local.set $i64toi32_i32$0 - (local.get $0$hi) - ) - (local.get $0) - ) - ) - (local.set $1$hi - (local.get $i64toi32_i32$0) - ) - ) - (block - (global.set $f - (block (result i32) - (local.set $i64toi32_i32$0 - (local.get $1$hi) - ) - (local.get $1) - ) - ) - (global.set $f$hi - (local.get $i64toi32_i32$0) - ) - ) - ) -) -(module - (type $i32_i32_=>_none (func (param i32 i32))) - (type $none_=>_none (func)) - (global $f (mut i32) (i32.const -1412567121)) - (global $g (mut i32) (global.get $f)) - (global $f$hi (mut i32) (i32.const 305419896)) - (global $g$hi (mut i32) (global.get $f$hi)) - (global $i64toi32_i32$HIGH_BITS (mut i32) (i32.const 0)) - (export "exp" (func $1)) - (func $call (param $0 i32) (param $0$hi i32) - (nop) - ) - (func $1 - (local $0 i32) - (local $0$hi i32) - (local $i64toi32_i32$0 i32) - (block - (local.set $0 - (block (result i32) - (local.set $i64toi32_i32$0 - (global.get $f$hi) - ) - (global.get $f) - ) - ) - (local.set $0$hi - (local.get $i64toi32_i32$0) - ) - ) - (call $call - (block (result i32) - (local.set $i64toi32_i32$0 - (local.get $0$hi) - ) - (local.get $0) - ) - (local.get $i64toi32_i32$0) - ) - (block - (global.set $f - (block (result i32) - (local.set $i64toi32_i32$0 - (i32.const 287454020) - ) - (i32.const 1432778632) - ) - ) - (global.set $f$hi - (local.get $i64toi32_i32$0) - ) - ) - ) -) -(module - (type $none_=>_none (func)) - (global $i64toi32_i32$HIGH_BITS (mut i32) (i32.const 0)) - (table $0 37 funcref) - (func $0 - (unreachable) - (block - (unreachable) - (drop - (f64.const 1) - ) - (drop - (i32.const -32768) - ) - (drop - (i32.const 20) - ) - ) - (unreachable) - ) -) diff --git a/test/passes/flatten_i64-to-i32-lowering.wast b/test/passes/flatten_i64-to-i32-lowering.wast deleted file mode 100644 index 52627c9d4..000000000 --- a/test/passes/flatten_i64-to-i32-lowering.wast +++ /dev/null @@ -1,77 +0,0 @@ -(module - (memory 1 1) - (import "env" "func" (func $import (result i64))) - (func $defined (result i64) - (i64.add (i64.const 1) (i64.const 2)) - ) - (func $unreachable-select-i64 (result i64) - (select - (i64.const 1) - (unreachable) - (i32.const 2) - ) - ) - (func $unreachable-select-i64-b (result i64) - (select - (unreachable) - (i64.const 3) - (i32.const 4) - ) - ) - (func $unreachable-select-i64-c (result i64) - (select - (i64.const 5) - (i64.const 6) - (unreachable) - ) - ) - (func $mem - (drop (i64.load align=8 (i32.const 0))) - (drop (i64.load align=4 (i32.const 0))) - (drop (i64.load align=2 (i32.const 0))) - (drop (i64.load align=1 (i32.const 0))) - (drop (i64.load (i32.const 0))) - (i64.store align=8 (i32.const 0) (i64.const 1)) - (i64.store align=4 (i32.const 0) (i64.const 2)) - (i64.store align=2 (i32.const 0) (i64.const 3)) - (i64.store align=1 (i32.const 0) (i64.const 4)) - (i64.store (i32.const 0) (i64.const 5)) - ) -) -(module - (global $f (mut i64) (i64.const 0x12345678ABCDEFAF)) - (global $g (mut i64) (global.get $f)) - (func $call (param i64)) - (func "exp" - (call $call (global.get $f)) - (global.set $f (i64.const 0x1122334455667788)) - ) - (func "unreach" - (global.set $f - (block $label$1 (result i64) - (unreachable) - ) - ) - ) -) -(module - (global $f (mut i64) (i64.const 0x12345678ABCDEFAF)) - (global $g (mut i64) (global.get $f)) - (func $call (param i64)) - (func "exp" - (call $call (global.get $f)) - (global.set $f (i64.const 0x1122334455667788)) - ) -) -(module - (type $i64_f64_i32_=>_none (func (param i64 f64 i32))) - (table $0 37 funcref) - (func $0 - (call_indirect (type $i64_f64_i32_=>_none) - (unreachable) - (f64.const 1) - (i32.const -32768) - (i32.const 20) - ) - ) -) diff --git a/test/passes/flatten_local-cse_Os.txt b/test/passes/flatten_local-cse_Os.txt deleted file mode 100644 index 13a9ae1a8..000000000 --- a/test/passes/flatten_local-cse_Os.txt +++ /dev/null @@ -1,27 +0,0 @@ -(module - (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) - (export "div16_internal" (func $0)) - (func $0 (; has Stack IR ;) (param $0 i32) (param $1 i32) (result i32) - (i32.add - (local.tee $0 - (i32.xor - (i32.shr_s - (i32.shl - (local.get $0) - (i32.const 16) - ) - (i32.const 16) - ) - (i32.shr_s - (i32.shl - (local.get $1) - (i32.const 16) - ) - (i32.const 16) - ) - ) - ) - (local.get $0) - ) - ) -) diff --git a/test/passes/flatten_local-cse_Os.wast b/test/passes/flatten_local-cse_Os.wast deleted file mode 100644 index 7017bcfb6..000000000 --- a/test/passes/flatten_local-cse_Os.wast +++ /dev/null @@ -1,39 +0,0 @@ -(module - ;; testcase from AssemblyScript - (func "div16_internal" (param $0 i32) (param $1 i32) (result i32) - (i32.add - (i32.xor - (i32.shr_s - (i32.shl - (local.get $0) - (i32.const 16) - ) - (i32.const 16) - ) - (i32.shr_s - (i32.shl - (local.get $1) - (i32.const 16) - ) - (i32.const 16) - ) - ) - (i32.xor - (i32.shr_s - (i32.shl - (local.get $0) - (i32.const 16) - ) - (i32.const 16) - ) - (i32.shr_s - (i32.shl - (local.get $1) - (i32.const 16) - ) - (i32.const 16) - ) - ) - ) - ) -) diff --git a/test/passes/flatten_local-cse_all-features.txt b/test/passes/flatten_local-cse_all-features.txt deleted file mode 100644 index be7d1363d..000000000 --- a/test/passes/flatten_local-cse_all-features.txt +++ /dev/null @@ -1,815 +0,0 @@ -(module - (type $none_=>_none (func)) - (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) - (type $i32_=>_i32 (func (param i32) (result i32))) - (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) - (type $f64_f64_i32_=>_f32 (func (param f64 f64 i32) (result f32))) - (memory $0 100 100) - (func $basics - (local $x i32) - (local $y i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (local $17 i32) - (local $18 i32) - (local $19 i32) - (local.set $2 - (i32.add - (i32.const 1) - (i32.const 2) - ) - ) - (drop - (local.get $2) - ) - (local.set $3 - (local.get $2) - ) - (drop - (local.get $2) - ) - (if - (i32.const 0) - (nop) - ) - (local.set $4 - (i32.add - (i32.const 1) - (i32.const 2) - ) - ) - (drop - (local.get $4) - ) - (local.set $5 - (local.get $x) - ) - (local.set $6 - (local.get $y) - ) - (local.set $7 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (drop - (local.get $7) - ) - (local.set $8 - (local.get $x) - ) - (local.set $9 - (local.get $y) - ) - (local.set $10 - (local.get $7) - ) - (drop - (local.get $7) - ) - (local.set $11 - (local.get $x) - ) - (local.set $12 - (local.get $y) - ) - (local.set $13 - (local.get $7) - ) - (drop - (local.get $7) - ) - (call $basics) - (local.set $14 - (local.get $x) - ) - (local.set $15 - (local.get $y) - ) - (local.set $16 - (local.get $7) - ) - (drop - (local.get $7) - ) - (local.set $x - (i32.const 100) - ) - (local.set $17 - (local.get $x) - ) - (local.set $18 - (local.get $y) - ) - (local.set $19 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (drop - (local.get $19) - ) - ) - (func $recursive1 - (local $x i32) - (local $y i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local.set $2 - (i32.add - (i32.const 2) - (i32.const 3) - ) - ) - (local.set $3 - (i32.add - (i32.const 1) - (local.get $2) - ) - ) - (drop - (local.get $3) - ) - (local.set $4 - (local.get $2) - ) - (local.set $5 - (local.get $3) - ) - (drop - (local.get $3) - ) - (local.set $6 - (local.get $2) - ) - (drop - (local.get $2) - ) - ) - (func $recursive2 - (local $x i32) - (local $y i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local.set $2 - (i32.add - (i32.const 2) - (i32.const 3) - ) - ) - (local.set $3 - (i32.add - (i32.const 1) - (local.get $2) - ) - ) - (drop - (local.get $3) - ) - (local.set $4 - (local.get $2) - ) - (drop - (local.get $2) - ) - (local.set $5 - (local.get $2) - ) - (local.set $6 - (local.get $3) - ) - (drop - (local.get $3) - ) - ) - (func $self - (local $x i32) - (local $y i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local.set $2 - (i32.add - (i32.const 2) - (i32.const 3) - ) - ) - (local.set $3 - (local.get $2) - ) - (local.set $4 - (i32.add - (local.get $2) - (local.get $2) - ) - ) - (drop - (local.get $4) - ) - (local.set $5 - (local.get $2) - ) - (drop - (local.get $2) - ) - ) - (func $loads - (local $0 i32) - (local $1 i32) - (local.set $0 - (i32.load - (i32.const 10) - ) - ) - (drop - (local.get $0) - ) - (local.set $1 - (i32.load - (i32.const 10) - ) - ) - (drop - (local.get $1) - ) - ) - (func $8 (param $var$0 i32) (result i32) - (local $var$1 i32) - (local $var$2 i32) - (local $var$3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (local $17 i32) - (local $18 i32) - (local $19 i32) - (local $20 i32) - (local $21 i32) - (block $label$0 - (local.set $4 - (local.get $var$1) - ) - (local.set $5 - (i32.add - (local.get $var$1) - (i32.const 4) - ) - ) - (local.set $var$2 - (local.get $5) - ) - (local.set $6 - (local.get $var$2) - ) - (local.set $7 - (local.get $var$2) - ) - (local.set $8 - (i32.load - (local.get $var$2) - ) - ) - (local.set $var$2 - (i32.const 74) - ) - (local.set $9 - (local.get $var$2) - ) - (local.set $10 - (i32.xor - (local.get $var$2) - (i32.const -1) - ) - ) - (local.set $11 - (i32.and - (local.get $8) - (local.get $10) - ) - ) - (i32.store - (local.get $5) - (local.get $11) - ) - (local.set $12 - (local.get $var$1) - ) - (local.set $13 - (local.get $5) - ) - (local.set $var$1 - (local.get $5) - ) - (local.set $14 - (local.get $var$1) - ) - (local.set $15 - (local.get $var$1) - ) - (local.set $16 - (i32.load - (local.get $var$1) - ) - ) - (local.set $17 - (local.get $var$2) - ) - (local.set $18 - (i32.and - (local.get $var$2) - (i32.const 8) - ) - ) - (local.set $19 - (i32.or - (local.get $16) - (local.get $18) - ) - ) - (i32.store - (local.get $var$1) - (local.get $19) - ) - (local.set $20 - (i32.const 0) - ) - ) - (local.set $21 - (local.get $20) - ) - (return - (local.get $20) - ) - ) - (func $loop1 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (block - (local.set $2 - (local.get $y) - ) - (local.set $x - (local.get $y) - ) - (local.set $3 - (local.get $x) - ) - (local.set $y - (local.get $x) - ) - (local.set $4 - (local.get $x) - ) - (local.set $x - (local.get $x) - ) - (local.set $5 - (local.get $x) - ) - (local.set $y - (local.get $x) - ) - (local.set $6 - (local.get $x) - ) - (return - (local.get $x) - ) - (unreachable) - ) - (local.set $8 - (local.get $7) - ) - (return - (local.get $7) - ) - ) - (func $loop2 (param $x i32) (param $y i32) (param $z i32) (result i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (block - (local.set $3 - (local.get $y) - ) - (local.set $x - (local.get $y) - ) - (local.set $4 - (local.get $z) - ) - (local.set $y - (local.get $z) - ) - (local.set $5 - (local.get $x) - ) - (local.set $z - (local.get $x) - ) - (local.set $6 - (local.get $y) - ) - (local.set $x - (local.get $y) - ) - (local.set $7 - (local.get $z) - ) - (local.set $y - (local.get $z) - ) - (local.set $8 - (local.get $x) - ) - (local.set $z - (local.get $x) - ) - (local.set $9 - (local.get $x) - ) - (return - (local.get $x) - ) - (unreachable) - ) - (local.set $11 - (local.get $10) - ) - (return - (local.get $10) - ) - ) - (func $loop3 (param $x i32) (param $y i32) (param $z i32) (result i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (block - (local.set $3 - (local.get $y) - ) - (local.set $x - (local.get $y) - ) - (local.set $4 - (local.get $z) - ) - (local.set $y - (local.get $z) - ) - (local.set $5 - (local.get $y) - ) - (local.set $z - (local.get $y) - ) - (local.set $6 - (local.get $y) - ) - (local.set $y - (local.get $y) - ) - (local.set $7 - (local.get $y) - ) - (local.set $z - (local.get $y) - ) - (local.set $8 - (local.get $y) - ) - (return - (local.get $y) - ) - (unreachable) - ) - (local.set $10 - (local.get $9) - ) - (return - (local.get $9) - ) - ) - (func $handle-removing (param $var$0 f64) (param $var$1 f64) (param $var$2 i32) (result f32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 f32) - (local $7 f32) - (block - (local.set $var$2 - (i32.const 32767) - ) - (local.set $3 - (local.get $var$2) - ) - (local.set $var$2 - (i32.const 1024) - ) - (local.set $4 - (local.get $var$2) - ) - (local.set $5 - (select - (local.get $3) - (local.get $var$2) - (i32.const -2147483648) - ) - ) - (local.set $var$2 - (local.get $5) - ) - (local.set $6 - (f32.const 1) - ) - ) - (local.set $7 - (local.get $6) - ) - (return - (local.get $6) - ) - ) -) -(module - (type $2 (func (param i64 f32 i32))) - (type $0 (func)) - (type $1 (func (param i32 f64) (result i32))) - (global $global$0 (mut i32) (i32.const 10)) - (table $0 23 23 funcref) - (export "func_1_invoker" (func $1)) - (export "func_6" (func $2)) - (func $0 (param $var$0 i64) (param $var$1 f32) (param $var$2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (block $label$1 - (local.set $3 - (i32.const 128) - ) - (br_if $label$1 - (i32.const 0) - ) - (local.set $4 - (local.get $3) - ) - (local.set $3 - (i32.const 0) - ) - (br_if $label$1 - (local.get $4) - ) - (local.set $5 - (local.get $3) - ) - (drop - (local.get $3) - ) - (local.set $3 - (i32.const -14051) - ) - ) - (local.set $6 - (local.get $3) - ) - (if - (local.get $3) - (global.set $global$0 - (i32.const 0) - ) - ) - ) - (func $1 - (call $0 - (i64.const 1125899906842624) - (f32.const -nan:0x7fc91a) - (i32.const -46) - ) - ) - (func $2 (param $var$0 i32) (param $var$1 f64) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (block - (block - (local.set $2 - (global.get $global$0) - ) - (if - (local.get $2) - (block - (unreachable) - (unreachable) - ) - ) - ) - (local.set $3 - (i32.const 0) - ) - ) - (local.set $4 - (local.get $3) - ) - (return - (local.get $3) - ) - ) -) -(module - (type $i32_=>_none (func (param i32))) - (import "env" "out" (func $out (param i32))) - (func $each-pass-must-clear (param $var$0 i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local.set $1 - (local.get $var$0) - ) - (local.set $2 - (i32.eqz - (local.get $var$0) - ) - ) - (call $out - (local.get $2) - ) - (local.set $3 - (local.get $var$0) - ) - (local.set $4 - (local.get $2) - ) - (call $out - (local.get $2) - ) - ) -) -(module - (type $none_=>_i64 (func (result i64))) - (type $none_=>_none (func)) - (global $glob (mut i32) (i32.const 1)) - (func $i64-shifts (result i64) - (local $temp i64) - (local $1 i64) - (local $2 i64) - (local $3 i64) - (local $4 i64) - (local $5 i64) - (block - (local.set $1 - (i64.add - (i64.const 1) - (i64.const 2) - ) - ) - (local.set $temp - (local.get $1) - ) - (local.set $temp - (i64.const 9999) - ) - (local.set $2 - (local.get $1) - ) - (local.set $temp - (local.get $1) - ) - (local.set $3 - (local.get $temp) - ) - (local.set $4 - (local.get $temp) - ) - ) - (local.set $5 - (local.get $temp) - ) - (return - (local.get $temp) - ) - ) - (func $global - (local $x i32) - (local $y i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local.set $2 - (global.get $glob) - ) - (local.set $x - (local.get $2) - ) - (local.set $3 - (local.get $x) - ) - (local.set $y - (local.get $x) - ) - (local.set $4 - (local.get $x) - ) - (local.set $y - (local.get $x) - ) - ) -) -(module - (type $none_=>_anyref (func (result anyref))) - (type $none_=>_none (func)) - (func $subtype-test (result anyref) - (local $0 funcref) - (local $1 funcref) - (local $2 anyref) - (local $3 anyref) - (block - (nop) - (loop $label$1 - (local.set $0 - (ref.null func) - ) - ) - (local.set $1 - (local.get $0) - ) - (local.set $2 - (local.get $0) - ) - ) - (local.set $3 - (local.get $2) - ) - (return - (local.get $2) - ) - ) - (func $test - (local $0 anyref) - (local $1 funcref) - (local $2 funcref) - (block $label$1 - (local.set $0 - (ref.null func) - ) - (local.set $1 - (ref.null func) - ) - ) - (local.set $2 - (local.get $1) - ) - (drop - (local.get $1) - ) - ) -) diff --git a/test/passes/flatten_local-cse_all-features.wast b/test/passes/flatten_local-cse_all-features.wast deleted file mode 100644 index 660f56c1e..000000000 --- a/test/passes/flatten_local-cse_all-features.wast +++ /dev/null @@ -1,316 +0,0 @@ -(module - (memory 100 100) - (func $basics - (local $x i32) - (local $y i32) - (drop - (i32.add (i32.const 1) (i32.const 2)) - ) - (drop - (i32.add (i32.const 1) (i32.const 2)) - ) - (if (i32.const 0) (nop)) - (drop ;; we can't do this yet, non-linear - (i32.add (i32.const 1) (i32.const 2)) - ) - (drop - (i32.add (local.get $x) (local.get $y)) - ) - (drop - (i32.add (local.get $x) (local.get $y)) - ) - (drop - (i32.add (local.get $x) (local.get $y)) - ) - (call $basics) ;; side effects, but no matter for our locals - (drop - (i32.add (local.get $x) (local.get $y)) - ) - (local.set $x (i32.const 100)) - (drop ;; x was changed! - (i32.add (local.get $x) (local.get $y)) - ) - ) - (func $recursive1 - (local $x i32) - (local $y i32) - (drop - (i32.add - (i32.const 1) - (i32.add - (i32.const 2) - (i32.const 3) - ) - ) - ) - (drop - (i32.add - (i32.const 1) - (i32.add - (i32.const 2) - (i32.const 3) - ) - ) - ) - (drop - (i32.add - (i32.const 2) - (i32.const 3) - ) - ) - ) - (func $recursive2 - (local $x i32) - (local $y i32) - (drop - (i32.add - (i32.const 1) - (i32.add - (i32.const 2) - (i32.const 3) - ) - ) - ) - (drop - (i32.add - (i32.const 2) - (i32.const 3) - ) - ) - (drop - (i32.add - (i32.const 1) - (i32.add - (i32.const 2) - (i32.const 3) - ) - ) - ) - ) - (func $self - (local $x i32) - (local $y i32) - (drop - (i32.add - (i32.add - (i32.const 2) - (i32.const 3) - ) - (i32.add - (i32.const 2) - (i32.const 3) - ) - ) - ) - (drop - (i32.add - (i32.const 2) - (i32.const 3) - ) - ) - ) - (func $loads - (drop - (i32.load (i32.const 10)) - ) - (drop - (i32.load (i32.const 10)) ;; implicit traps, sad - ) - ) - (func $8 (param $var$0 i32) (result i32) - (local $var$1 i32) - (local $var$2 i32) - (local $var$3 i32) - (block $label$0 (result i32) - (i32.store - (local.tee $var$2 - (i32.add - (local.get $var$1) - (i32.const 4) - ) - ) - (i32.and - (i32.load - (local.get $var$2) - ) - (i32.xor - (local.tee $var$2 - (i32.const 74) - ) - (i32.const -1) - ) - ) - ) - (i32.store - (local.tee $var$1 - (i32.add - (local.get $var$1) - (i32.const 4) - ) - ) - (i32.or - (i32.load - (local.get $var$1) - ) - (i32.and - (local.get $var$2) - (i32.const 8) - ) - ) - ) - (i32.const 0) - ) - ) - (func $loop1 (param $x i32) (param $y i32) (result i32) - (local.set $x (local.get $y)) - (local.set $y (local.get $x)) - (local.set $x (local.get $y)) - (local.set $y (local.get $x)) - (return (local.get $y)) - ) - (func $loop2 (param $x i32) (param $y i32) (param $z i32) (result i32) - (local.set $x (local.get $y)) - (local.set $y (local.get $z)) - (local.set $z (local.get $x)) - (local.set $x (local.get $y)) - (local.set $y (local.get $z)) - (local.set $z (local.get $x)) - (return (local.get $x)) - ) - (func $loop3 (param $x i32) (param $y i32) (param $z i32) (result i32) - (local.set $x (local.get $y)) - (local.set $y (local.get $z)) - (local.set $z (local.get $y)) - (local.set $y (local.get $z)) - (local.set $z (local.get $y)) - (return (local.get $y)) - ) - (func $handle-removing (param $var$0 f64) (param $var$1 f64) (param $var$2 i32) (result f32) - (local.set $var$2 - (select - (local.tee $var$2 - (i32.const 32767) - ) - (local.tee $var$2 - (i32.const 1024) - ) - (i32.const -2147483648) - ) - ) - (f32.const 1) - ) -) -;; a testcase that fails if we don't handle equivalent local canonicalization properly -(module - (type $0 (func)) - (type $1 (func (param i32 f64) (result i32))) - (type $2 (func (param i64 f32 i32))) - (global $global$0 (mut i32) (i32.const 10)) - (table 23 23 funcref) - (export "func_1_invoker" (func $1)) - (export "func_6" (func $2)) - (func $0 (; 0 ;) (type $2) (param $var$0 i64) (param $var$1 f32) (param $var$2 i32) - (if - (block $label$1 (result i32) - (drop - (br_if $label$1 - (i32.const 0) - (br_if $label$1 - (i32.const 128) - (i32.const 0) - ) - ) - ) - (i32.const -14051) - ) - (global.set $global$0 - (i32.const 0) - ) - ) - ) - (func $1 (; 1 ;) (type $0) - (call $0 - (i64.const 1125899906842624) - (f32.const -nan:0x7fc91a) - (i32.const -46) - ) - ) - (func $2 (; 2 ;) (type $1) (param $var$0 i32) (param $var$1 f64) (result i32) - (if - (global.get $global$0) - (unreachable) - ) - (i32.const 0) - ) -) -(module - (import "env" "out" (func $out (param i32))) - (func $each-pass-must-clear (param $var$0 i32) - (call $out - (i32.eqz - (local.get $var$0) - ) - ) - (call $out - (i32.eqz - (local.get $var$0) - ) - ) - ) -) -(module - (global $glob (mut i32) (i32.const 1)) - (func $i64-shifts (result i64) - (local $temp i64) - (local.set $temp - (i64.add - (i64.const 1) - (i64.const 2) - ) - ) - (local.set $temp - (i64.const 9999) - ) - (local.set $temp - (i64.add - (i64.const 1) - (i64.const 2) - ) - ) - (local.get $temp) - ) - (func $global - (local $x i32) - (local $y i32) - (local.set $x (global.get $glob)) - (local.set $y (global.get $glob)) - (local.set $y (global.get $glob)) - ) -) - -(module - ;; After --flatten, there will be a series of chain copies between multiple - ;; locals, but some of the locals will be funcref type and others anyref - ;; type. We cannot make locals of different types a common subexpression. - (func $subtype-test (result anyref) - (nop) - (loop $label$1 (result funcref) - (ref.null func) - ) - ) - - (func $test - (local $0 anyref) - (drop - (block $label$1 (result funcref) - (local.set $0 - (ref.null func) - ) - ;; After --flatten, this will be assigned to a local of funcref type. After - ;; --local-cse, even if we set (ref.null func) to local $0 above, this - ;; should not be replaced with $0, because it is of type anyref. - (ref.null func) - ) - ) - ) -) diff --git a/test/passes/flatten_rereloop.txt b/test/passes/flatten_rereloop.txt deleted file mode 100644 index 99a2a88d1..000000000 --- a/test/passes/flatten_rereloop.txt +++ /dev/null @@ -1,1182 +0,0 @@ -(module - (type $none_=>_none (func)) - (type $none_=>_i32 (func (result i32))) - (type $none_=>_f64 (func (result f64))) - (type $i32_=>_none (func (param i32))) - (type $i32_=>_f32 (func (param i32) (result f32))) - (type $none_=>_f32 (func (result f32))) - (global $global (mut i32) (i32.const 0)) - (memory $0 1) - (func $0 (result f64) - (local $0 f64) - (local $1 f64) - (local $2 i32) - (block - ) - (if - (i32.const 0) - (block - (unreachable) - ) - (block - (block - (local.set $0 - (f64.const -nan:0xfffffd63e4e5a) - ) - (local.set $1 - (local.get $0) - ) - (return - (local.get $1) - ) - ) - ) - ) - ) - (func $1 (result i32) - (local $0 i32) - (local $1 i32) - (local $2 i32) - (block - (block $block$6$break - (block - ) - (block $switch$1$leave - (block $switch$1$default - (block $switch$1$case$4 - (br_table $switch$1$case$4 $switch$1$case$4 $switch$1$default - (i32.const 0) - ) - ) - (block - (block - (unreachable) - ) - ) - ) - (block - (br $block$6$break) - ) - ) - ) - (block - (block - ) - (block $switch$6$leave - (block $switch$6$default - (block $switch$6$case$3 - (br_table $switch$6$case$3 $switch$6$default - (i32.const 1) - ) - ) - (block - (block - (unreachable) - ) - ) - ) - (block - (block - (block - (local.set $0 - (i32.const 2) - ) - (local.set $1 - (local.get $0) - ) - (return - (local.get $1) - ) - ) - ) - ) - ) - ) - ) - (unreachable) - ) - (func $skip-empty - (local $0 i32) - (block $block$2$break - (block - ) - (block - (br $block$2$break) - ) - ) - (block - (return) - ) - ) - (func $skip-empty-2 - (local $0 i32) - (block $block$5$break - (block - ) - (block - (br $block$5$break) - ) - ) - (block - (block $block$4$break - (call $skip-empty) - (block - (br $block$4$break) - ) - ) - (block - (block $block$2$break - (call $skip-empty) - (block - (br $block$2$break) - ) - ) - (block - (return) - ) - ) - ) - ) - (func $skip-empty-3 - (local $0 i32) - (block $block$5$break - (block - ) - (block - (br $block$5$break) - ) - ) - (block - (block $block$4$break - (call $skip-empty) - (block - (br $block$4$break) - ) - ) - (block - (block $block$2$break - (call $skip-empty) - (block - (br $block$2$break) - ) - ) - (block - (return) - ) - ) - ) - ) - (func $skip-empty-4 (param $x i32) - (local $1 i32) - (local $2 i32) - (block $block$2$break - (local.set $1 - (local.get $x) - ) - (block - (br $block$2$break) - ) - ) - (block - (return) - ) - ) - (func $skipping (param $0 i32) (result f32) - (local $1 f32) - (local $2 f32) - (local $3 f32) - (local $4 f32) - (local $5 i32) - (block - ) - (if - (i32.const 0) - (block - (unreachable) - ) - (block - (block - (local.set $1 - (f32.const 1) - ) - (local.set $2 - (local.get $1) - ) - (local.set $3 - (local.get $2) - ) - (local.set $4 - (local.get $3) - ) - (return - (local.get $4) - ) - ) - ) - ) - ) - (func $merging - (local $0 i32) - (block - (block - ) - (return) - ) - ) - (func $unswitch - (local $0 i32) - (block $block$2$break - (block - ) - (block - (br $block$2$break) - ) - ) - (block - (return) - ) - ) - (func $skip-only-empty - (local $0 i32) - (block $block$3$break - (block - ) - (if - (i32.const 1) - (block - (global.set $global - (i32.const 0) - ) - (block - (br $block$3$break) - ) - ) - (br $block$3$break) - ) - ) - (block - (return) - ) - ) - (func $skip-only-one-branch-out (result i32) - (local $0 i32) - (local $1 i32) - (local $2 i32) - (block - (block - ) - (block - ) - ) - (if - (i32.const 1) - (block - (unreachable) - ) - (block - (block - (local.set $0 - (i32.const 0) - ) - (local.set $1 - (local.get $0) - ) - (return - (local.get $1) - ) - ) - ) - ) - ) - (func $multipass-for-skips (result f32) - (local $0 f32) - (local $1 f32) - (local $2 f32) - (local $3 f32) - (local $4 i32) - (block $block$7$break - (block - ) - (if - (i32.const 0) - (block - (block - (local.set $0 - (f32.const 9223372036854775808) - ) - (block - (local.set $1 - (local.get $0) - ) - (local.set $2 - (local.get $1) - ) - ) - ) - (block - (br $block$7$break) - ) - ) - (block - (local.set $2 - (f32.const 65505) - ) - (block - (br $block$7$break) - ) - ) - ) - ) - (block - (block - (local.set $3 - (local.get $2) - ) - (return - (local.get $3) - ) - ) - ) - ) - (func $branch-merge-vs-replace - (local $0 i32) - (block - ) - (if - (i32.const 0) - (block - (unreachable) - ) - (block - (return) - ) - ) - ) - (func $unswitch-amount - (local $0 i32) - (block $block$2$break - (block - ) - (if - (i32.const -23) - (br $block$2$break) - (block - (block $block$6$break - (block - ) - (block $switch$4$leave - (block $switch$4$default - (block $switch$4$case$2 - (br_table $switch$4$case$2 $switch$4$default - (i32.const 44064) - ) - ) - (block - (br $block$2$break) - ) - ) - (block - (br $block$6$break) - ) - ) - ) - (block - (unreachable) - ) - ) - ) - ) - (block - (return) - ) - ) -) -(module - (type $3 (func (param i32))) - (type $0 (func)) - (type $2 (func (param i32) (result i32))) - (type $1 (func (result i32))) - (func $trivial - (local $0 i32) - (return) - ) - (func $trivial2 - (local $0 i32) - (block - (block - (call $trivial) - (call $trivial) - ) - (return) - ) - ) - (func $return-void - (local $0 i32) - (return) - ) - (func $return-val (result i32) - (local $0 i32) - (local $1 i32) - (local $2 i32) - (return - (i32.const 1) - ) - ) - (func $ifs (param $x i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (block - (local.set $6 - (local.get $x) - ) - (local.set $1 - (local.get $6) - ) - (local.set $7 - (local.get $1) - ) - ) - (if - (local.get $7) - (block - (block - (local.set $8 - (local.get $x) - ) - (local.set $2 - (local.get $8) - ) - (local.set $9 - (local.get $2) - ) - ) - (if - (local.get $9) - (block - (return - (i32.const 2) - ) - ) - (block - (return - (i32.const 3) - ) - ) - ) - ) - (block - (block - (local.set $10 - (local.get $x) - ) - (local.set $3 - (local.get $10) - ) - (local.set $11 - (local.get $3) - ) - ) - (if - (local.get $11) - (block - (return - (i32.const 4) - ) - ) - (block - (return - (i32.const 5) - ) - ) - ) - ) - ) - ) - (func $loops (param $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (block $block$21$break - (block - (local.set $4 - (local.get $x) - ) - (local.set $1 - (local.get $4) - ) - (local.set $5 - (local.get $1) - ) - ) - (if - (local.get $5) - (loop $shape$2$continue - (call $trivial) - (block - (br $shape$2$continue) - ) - ) - (br $block$21$break) - ) - ) - (block - (block $block$24$break - (loop $shape$4$continue - (block - (call $trivial) - (local.set $6 - (local.get $x) - ) - (local.set $2 - (local.get $6) - ) - (local.set $7 - (local.get $2) - ) - ) - (if - (local.get $7) - (br $shape$4$continue) - (br $block$24$break) - ) - ) - ) - (block - (block $block$2$break - (loop $shape$6$continue - (block - (call $trivial) - (local.set $8 - (local.get $x) - ) - (local.set $3 - (local.get $8) - ) - (local.set $9 - (local.get $3) - ) - ) - (if - (local.get $9) - (br $shape$6$continue) - (br $block$2$break) - ) - ) - ) - (block - (return) - ) - ) - ) - ) - (func $br-out (param $x i32) - (local $1 i32) - (block $block$2$break - (call $br-out - (i32.const 5) - ) - (block - (br $block$2$break) - ) - ) - (block - (return) - ) - ) - (func $unreachable (param $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (block $block$4$break - (block - (local.set $3 - (local.get $x) - ) - (local.set $1 - (local.get $3) - ) - (local.set $4 - (local.get $1) - ) - ) - (if - (local.get $4) - (br $block$4$break) - (block - (block $block$2$break - (call $unreachable - (i32.const 5) - ) - (block - (br $block$2$break) - ) - ) - (block - (return) - ) - ) - ) - ) - (block - (block - (local.set $5 - (local.get $x) - ) - (local.set $2 - (local.get $5) - ) - (local.set $6 - (local.get $2) - ) - ) - (if - (local.get $6) - (block - (block - (call $unreachable - (i32.const 1) - ) - (unreachable) - ) - ) - (block - (block - (call $unreachable - (i32.const 3) - ) - (return) - ) - ) - ) - ) - ) - (func $empty-blocks (param $x i32) - (local $1 i32) - (block $block$2$break - (block - ) - (block - (br $block$2$break) - ) - ) - (block - (return) - ) - ) - (func $before-and-after (param $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (block $block$4$break - (block - (block - (call $before-and-after - (i32.const 1) - ) - (call $before-and-after - (i32.const 2) - ) - ) - (block - (call $before-and-after - (i32.const 3) - ) - (call $before-and-after - (i32.const 4) - ) - (local.set $6 - (local.get $x) - ) - (local.set $1 - (local.get $6) - ) - (local.set $7 - (local.get $1) - ) - ) - ) - (if - (local.get $7) - (br $block$4$break) - (block - (call $before-and-after - (i32.const 5) - ) - (block - (br $block$4$break) - ) - ) - ) - ) - (block - (block $block$8$break - (block - (block - (call $before-and-after - (i32.const 6) - ) - (call $before-and-after - (i32.const 7) - ) - ) - (call $before-and-after - (i32.const 8) - ) - ) - (block - (br $block$8$break) - ) - ) - (block - (block $block$10$break - (loop $shape$4$continue - (block - (call $before-and-after - (i32.const 9) - ) - (local.set $8 - (local.get $x) - ) - (local.set $2 - (local.get $8) - ) - (local.set $9 - (local.get $2) - ) - ) - (if - (local.get $9) - (br $shape$4$continue) - (br $block$10$break) - ) - ) - ) - (block - (block $block$11$break - (block - (call $before-and-after - (i32.const 10) - ) - (block - (call $before-and-after - (i32.const 11) - ) - (local.set $10 - (local.get $x) - ) - (local.set $3 - (local.get $10) - ) - (local.set $11 - (local.get $3) - ) - ) - ) - (if - (local.get $11) - (block - (call $before-and-after - (i32.const 12) - ) - (block - (br $block$11$break) - ) - ) - (br $block$11$break) - ) - ) - (block - (block $block$15$break - (block - (call $before-and-after - (i32.const 13) - ) - (local.set $12 - (local.get $x) - ) - (local.set $4 - (local.get $12) - ) - (local.set $13 - (local.get $4) - ) - ) - (if - (local.get $13) - (block - (call $before-and-after - (i32.const 14) - ) - (block - (br $block$15$break) - ) - ) - (block - (call $before-and-after - (i32.const 15) - ) - (block - (br $block$15$break) - ) - ) - ) - ) - (block - (block $block$21$break - (block - (local.set $14 - (local.get $x) - ) - (local.set $5 - (local.get $14) - ) - (local.set $15 - (local.get $5) - ) - ) - (if - (local.get $15) - (block - (call $before-and-after - (i32.const 16) - ) - (block - (br $block$21$break) - ) - ) - (br $block$21$break) - ) - ) - (block - (block $block$28$break - (block - (block - (block - (call $before-and-after - (i32.const 17) - ) - (call $before-and-after - (i32.const 18) - ) - (call $before-and-after - (i32.const 19) - ) - ) - (call $before-and-after - (i32.const 20) - ) - ) - (block - (call $before-and-after - (i32.const 21) - ) - (call $before-and-after - (i32.const 22) - ) - ) - ) - (block - (br $block$28$break) - ) - ) - (block - (block $block$30$break - (block - (call $before-and-after - (i32.const 23) - ) - (call $before-and-after - (i32.const 24) - ) - ) - (block - (br $block$30$break) - ) - ) - (block - (block - (call $before-and-after - (i32.const 25) - ) - (return) - ) - ) - ) - ) - ) - ) - ) - ) - ) - ) - (func $switch (param $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (block $block$3$break - (block - (local.set $3 - (local.get $x) - ) - (local.set $1 - (local.get $3) - ) - (local.set $4 - (local.get $1) - ) - ) - (block - (br $block$3$break) - ) - ) - (block - (block $block$9$break - (block - (call $switch - (i32.const 1) - ) - (local.set $5 - (local.get $x) - ) - (local.set $2 - (local.get $5) - ) - (local.set $6 - (local.get $2) - ) - ) - (block $switch$3$leave - (block $switch$3$default - (block $switch$3$case$9 - (br_table $switch$3$case$9 $switch$3$case$9 $switch$3$case$9 $switch$3$default - (local.get $6) - ) - ) - (block - (br $block$9$break) - ) - ) - (block - (block - (call $switch - (i32.const 2) - ) - (block - (br $block$9$break) - ) - ) - ) - ) - ) - (block - (block - (call $switch - (i32.const 3) - ) - (return) - ) - ) - ) - ) - (func $no-return - (local $0 i32) - (block $block$6$break - (block - ) - (if - (i32.const 1) - (block - (drop - (i32.const 2) - ) - (block - (br $block$6$break) - ) - ) - (block - (drop - (i32.const 3) - ) - (block - (br $block$6$break) - ) - ) - ) - ) - (block - (return) - ) - ) - (func $if-br-wat (param $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (block $block$3$break - (block $block$4$break - (block - (call $if-br-wat - (i32.const 0) - ) - (local.set $3 - (local.get $x) - ) - (local.set $1 - (local.get $3) - ) - (local.set $4 - (local.get $1) - ) - ) - (if - (local.get $4) - (block - (call $if-br-wat - (i32.const 1) - ) - (block - (br $block$4$break) - ) - ) - (block - (block - (local.set $5 - (local.get $x) - ) - (local.set $2 - (local.get $5) - ) - (local.set $6 - (local.get $2) - ) - ) - (if - (local.get $6) - (br $block$3$break) - (br $block$4$break) - ) - ) - ) - ) - (block - (call $if-br-wat - (i32.const 2) - ) - (block - (br $block$3$break) - ) - ) - ) - (block - (block - (call $if-br-wat - (i32.const 3) - ) - (return) - ) - ) - ) - (func $switcher-to-nowhere (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (block - (block - (local.set $4 - (local.get $0) - ) - (local.set $1 - (local.get $4) - ) - (local.set $5 - (local.get $1) - ) - ) - (block $switch$1$leave - (block $switch$1$default - (block $switch$1$case$4 - (block $switch$1$case$5 - (br_table $switch$1$case$5 $switch$1$case$4 $switch$1$default - (local.get $5) - ) - ) - (block - (block - (return - (i32.const 1) - ) - ) - ) - ) - (block - (block - (return - (i32.const 2) - ) - ) - ) - ) - (block - (block - (return - (i32.const 3) - ) - ) - ) - ) - ) - (unreachable) - ) -) diff --git a/test/passes/flatten_rereloop.wast b/test/passes/flatten_rereloop.wast deleted file mode 100644 index c6625805e..000000000 --- a/test/passes/flatten_rereloop.wast +++ /dev/null @@ -1,783 +0,0 @@ -(module - (memory 1) - (global $global (mut i32) (i32.const 0)) - (func $0 (result f64) - (if - (i32.const 0) - (loop $label$2 - (unreachable) - ) - ) - (f64.const -nan:0xfffffd63e4e5a) - ) - (func $1 (result i32) - (block $label$8 - (block $label$9 - (block $label$16 - (block $label$18 - (block $label$19 - (br_table $label$18 $label$16 $label$19 - (i32.const 0) - ) - ) - (br_table $label$9 $label$8 - (i32.const 1) - ) - ) - (unreachable) - ) - (unreachable) - ) - (unreachable) - ) - (i32.const 2) - ) - (func $skip-empty - (block $a1 - (block $a2 - (block $a3 - (block $a4 - (br $a4) - ) - (br $a3) - ) - (br $a2) - ) - (br $a1) - ) - ) - (func $skip-empty-2 - (block $a1 - (block $a2 - (block $a3 - (block $a4 - (br $a4) - ) - (call $skip-empty) - (br $a3) - ) - (call $skip-empty) - (br $a2) - ) - (br $a1) - ) - ) - (func $skip-empty-3 - (block $a1 - (block $a2 - (block $a3 - (block $a4 - (nop) - (br $a4) - (nop) - ) - (nop) - (call $skip-empty) - (nop) - (br $a3) - ) - (nop) - (call $skip-empty) - (nop) - (br $a2) - ) - (br $a1) - ) - ) - (func $skip-empty-4 (param $x i32) - (block $a1 - (block $a2 - (block $a3 - (block $a4 - (br_table $a1 $a2 $a3 $a4 $a1 $a2 $a3 $a4 (local.get $x)) - ) - (br $a3) - ) - (br $a2) - ) - (br $a1) - ) - ) - (func $skipping (param $0 i32) (result f32) - (if - (i32.const 0) - (unreachable) - ) ;; branches joining here lead to skip opportunities - (loop $label$2 (result f32) - (f32.const 1) - ) - ) - (func $merging - (if - (i32.const 0) - (return) - ;; no else, but the else ends up with a return too, and we can merge them - ) - ) - (func $unswitch - (block $label$1 - (br_table $label$1 $label$1 - (i32.const 0) - ) - ) - ) - (func $skip-only-empty - (if - (i32.const 1) - (global.set $global - (i32.const 0) - ) - ) - ) - (func $skip-only-one-branch-out (result i32) - (block $label$1 - (nop) - ) - (if - (i32.const 1) - (unreachable) ;; blocks a path through - ) - (i32.const 0) - ) - (func $multipass-for-skips (result f32) - (if (result f32) - (i32.const 0) - (block (result f32) - (block $label$2 - (br_if $label$2 - (i32.const 536870912) - ) - ) - (f32.const 9223372036854775808) - ) - (f32.const 65505) - ) - ) - (func $branch-merge-vs-replace - (if - (i32.const 0) - (unreachable) - ) - ) - (func $unswitch-amount - (block $label$1 - (if - (i32.const -23) - (nop) - (block - (block $label$4 - (br_table $label$1 $label$4 - (i32.const 44064) - ) - ) - (unreachable) - ) - ) - ) - ) -) -;; manual TODO: merge branches, all the parts -(module - (type $0 (func)) - (type $1 (func (result i32))) - (type $2 (func (param i32) (result i32))) - (type $3 (func (param i32))) - (func $trivial (; 0 ;) (type $0) - (nop) - ) - (func $trivial2 (; 1 ;) (type $0) - (block - (call $trivial) - (nop) - (call $trivial) - (nop) - ) - (nop) - ) - (func $return-void (; 2 ;) (type $0) - (return) - (unreachable) - ) - (func $return-val (; 3 ;) (type $1) (result i32) - (return - (i32.const 1) - ) - (unreachable) - ) - (func $ifs (; 4 ;) (type $2) (param $x i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (block - (block - (local.set $1 - (local.get $x) - ) - (if - (local.get $1) - (block - (block - (local.set $2 - (local.get $x) - ) - (if - (local.get $2) - (block - (return - (i32.const 2) - ) - (unreachable) - ) - (block - (return - (i32.const 3) - ) - (unreachable) - ) - ) - ) - (unreachable) - ) - ) - ) - (nop) - (block - (local.set $3 - (local.get $x) - ) - (if - (local.get $3) - (block - (return - (i32.const 4) - ) - (unreachable) - ) - ) - ) - (nop) - (return - (i32.const 5) - ) - (unreachable) - ) - (local.set $5 - (local.get $4) - ) - (return - (local.get $5) - ) - ) - (func $loops (; 5 ;) (type $3) (param $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (block - (block - (local.set $1 - (local.get $x) - ) - (if - (local.get $1) - (block - (loop $top - (block - (call $trivial) - (nop) - (br $top) - (unreachable) - ) - (unreachable) - ) - (unreachable) - ) - ) - ) - (nop) - (loop $top2 - (block - (call $trivial) - (nop) - (local.set $2 - (local.get $x) - ) - (br_if $top2 - (local.get $2) - ) - (nop) - ) - (nop) - ) - (nop) - (loop $top3 - (block - (call $trivial) - (nop) - (block - (local.set $3 - (local.get $x) - ) - (if - (local.get $3) - (block - (br $top3) - (unreachable) - ) - ) - ) - (nop) - ) - (nop) - ) - (nop) - ) - (nop) - ) - (func $br-out (; 6 ;) (type $3) (param $x i32) - (block $out - (call $br-out - (i32.const 5) - ) - (nop) - (br $out) - (unreachable) - ) - (nop) - ) - (func $unreachable (; 7 ;) (type $3) (param $x i32) - (local $1 i32) - (local $2 i32) - (block - (block - (local.set $1 - (local.get $x) - ) - (if - (local.get $1) - (block - (block - (local.set $2 - (local.get $x) - ) - (if - (local.get $2) - (block - (block $block - (call $unreachable - (i32.const 1) - ) - (nop) - (unreachable) - (unreachable) - (call $unreachable - (i32.const 2) - ) - (nop) - ) - (unreachable) - ) - (block - (block $block4 - (call $unreachable - (i32.const 3) - ) - (nop) - (return) - (unreachable) - (call $unreachable - (i32.const 4) - ) - (nop) - ) - (unreachable) - ) - ) - ) - (unreachable) - ) - ) - ) - (nop) - (block $out - (call $unreachable - (i32.const 5) - ) - (nop) - (br $out) - (unreachable) - (call $unreachable - (i32.const 6) - ) - (nop) - ) - (nop) - ) - (nop) - ) - (func $empty-blocks (; 8 ;) (type $3) (param $x i32) - (block - (block $block - ) - (nop) - (block $block5 - ) - (nop) - ) - (nop) - ) - (func $before-and-after (; 9 ;) (type $3) (param $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (block - (call $before-and-after - (i32.const 1) - ) - (nop) - (block $block - (call $before-and-after - (i32.const 2) - ) - (nop) - ) - (nop) - (call $before-and-after - (i32.const 3) - ) - (nop) - (block $out - (call $before-and-after - (i32.const 4) - ) - (nop) - (local.set $1 - (local.get $x) - ) - (br_if $out - (local.get $1) - ) - (nop) - (call $before-and-after - (i32.const 5) - ) - (nop) - ) - (nop) - (call $before-and-after - (i32.const 6) - ) - (nop) - (loop $loop-in - (nop) - ) - (nop) - (call $before-and-after - (i32.const 7) - ) - (nop) - (loop $top - (nop) - ) - (nop) - (call $before-and-after - (i32.const 8) - ) - (nop) - (loop $top2 - (block - (call $before-and-after - (i32.const 9) - ) - (nop) - (local.set $2 - (local.get $x) - ) - (br_if $top2 - (local.get $2) - ) - (nop) - (call $before-and-after - (i32.const 10) - ) - (nop) - ) - (nop) - ) - (nop) - (call $before-and-after - (i32.const 11) - ) - (nop) - (block - (local.set $3 - (local.get $x) - ) - (if - (local.get $3) - (block - (call $before-and-after - (i32.const 12) - ) - (nop) - ) - ) - ) - (nop) - (call $before-and-after - (i32.const 13) - ) - (nop) - (block - (local.set $4 - (local.get $x) - ) - (if - (local.get $4) - (block - (call $before-and-after - (i32.const 14) - ) - (nop) - ) - (block - (call $before-and-after - (i32.const 15) - ) - (nop) - ) - ) - ) - (nop) - (block - (local.set $5 - (local.get $x) - ) - (if - (local.get $5) - (block - (block $block8 - (call $before-and-after - (i32.const 16) - ) - (nop) - ) - (nop) - ) - ) - ) - (nop) - (call $before-and-after - (i32.const 17) - ) - (nop) - (block $block9 - (call $before-and-after - (i32.const 18) - ) - (nop) - (block $block10 - (call $before-and-after - (i32.const 19) - ) - (nop) - ) - (nop) - (call $before-and-after - (i32.const 20) - ) - (nop) - ) - (nop) - (call $before-and-after - (i32.const 21) - ) - (nop) - (block $block11 - (block $block12 - (call $before-and-after - (i32.const 22) - ) - (nop) - ) - (nop) - ) - (nop) - (call $before-and-after - (i32.const 23) - ) - (nop) - (block $no1 - (block $no2 - (call $before-and-after - (i32.const 24) - ) - (nop) - ) - (nop) - ) - (nop) - (call $before-and-after - (i32.const 25) - ) - (nop) - ) - (nop) - ) - (func $switch (; 10 ;) (type $3) (param $x i32) - (local $1 i32) - (local $2 i32) - (block $out - (block $a - (local.set $1 - (local.get $x) - ) - (br_table $a $a - (local.get $1) - ) - (unreachable) - ) - (nop) - (call $switch - (i32.const 1) - ) - (nop) - (block $b - (block $c - (local.set $2 - (local.get $x) - ) - (br_table $b $b $b $c - (local.get $2) - ) - (unreachable) - ) - (nop) - (call $switch - (i32.const 2) - ) - (nop) - ) - (nop) - (call $switch - (i32.const 3) - ) - (nop) - ) - (nop) - ) - (func $no-return (; 11 ;) (type $0) - (if - (i32.const 1) - (block - (drop - (i32.const 2) - ) - (nop) - ) - (block - (drop - (i32.const 3) - ) - (nop) - ) - ) - (nop) - ) - (func $if-br-wat (; 12 ;) (type $3) (param $x i32) - (local $1 i32) - (local $2 i32) - (block - (call $if-br-wat - (i32.const 0) - ) - (nop) - (block $label$2 - (block - (local.set $1 - (local.get $x) - ) - (if - (local.get $1) - (block - (call $if-br-wat - (i32.const 1) - ) - (nop) - ) - (block - (block - (local.set $2 - (local.get $x) - ) - (if - (local.get $2) - (block - (br $label$2) - (unreachable) - ) - ) - ) - (nop) - ) - ) - ) - (nop) - (call $if-br-wat - (i32.const 2) - ) - (nop) - ) - (nop) - (call $if-br-wat - (i32.const 3) - ) - (nop) - ) - (nop) - ) - (func $switcher-to-nowhere (; 13 ;) (type $2) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (block - (block $switch - (block $switch-case0 - (block $switch-case - (local.set $1 - (local.get $0) - ) - (br_table $switch-case $switch-case0 $switch - (local.get $1) - ) - (unreachable) - ) - (nop) - (return - (i32.const 1) - ) - (unreachable) - ) - (nop) - (return - (i32.const 2) - ) - (unreachable) - ) - (nop) - (return - (i32.const 3) - ) - (unreachable) - ) - (local.set $3 - (local.get $2) - ) - (return - (local.get $3) - ) - ) -) diff --git a/test/passes/flatten_simplify-locals-nonesting_dfo_O3.txt b/test/passes/flatten_simplify-locals-nonesting_dfo_O3.txt deleted file mode 100644 index c603e0386..000000000 --- a/test/passes/flatten_simplify-locals-nonesting_dfo_O3.txt +++ /dev/null @@ -1,41 +0,0 @@ -(module - (type $none_=>_none (func)) - (type $none_=>_f64 (func (result f64))) - (type $i32_f64_f64_=>_i32 (func (param i32 f64 f64) (result i32))) - (type $i64_=>_none (func (param i64))) - (type $f64_=>_i32 (func (param f64) (result i32))) - (export "if-select" (func $0)) - (export "unreachable-body-update-zext" (func $1)) - (export "ssa-const" (func $2)) - (export "if-nothing" (func $3)) - (export "only-dfo" (func $4)) - (func $0 (; has Stack IR ;) - (nop) - ) - (func $1 (; has Stack IR ;) (result f64) - (unreachable) - ) - (func $2 (; has Stack IR ;) (param $0 i32) (param $1 f64) (param $2 f64) (result i32) - (unreachable) - ) - (func $3 (; has Stack IR ;) (param $0 i64) - (unreachable) - ) - (func $4 (; has Stack IR ;) (param $0 f64) (result i32) - (local $1 i32) - (loop $label$1 - (if - (i32.eqz - (local.get $1) - ) - (block - (local.set $1 - (i32.const -2147483648) - ) - (br $label$1) - ) - ) - ) - (i32.const -2766) - ) -) diff --git a/test/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.txt b/test/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.txt deleted file mode 100644 index 71c272079..000000000 --- a/test/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.txt +++ /dev/null @@ -1,4775 +0,0 @@ - -; function: figure-1a - -; start LHS (in figure-1a) -%0:i64 = var -%1:i64 = var -%2 = eq %0, %1 -infer %2 - - -; start LHS (in figure-1a) -%0:i64 = var -%1:i64 = var -%2 = ne %0, %1 -infer %2 - - -; start LHS (in figure-1a) -%0:i64 = var -%1:i64 = var -%2 = eq %0, %1 -%3:i32 = zext %2 -%4:i64 = var -%5 = ne %0, %4 -%6:i32 = zext %5 -%7 = and %3, %6 -infer %7 - - -; function: figure-1b - -; start LHS (in figure-1b) -%0:i64 = var -%1:i64 = var -%2 = slt %0, %1 -infer %2 - - -; start LHS (in figure-1b) -%0:i64 = var -%1:i64 = var -%2 = eq %0, %1 -%3:i64 = var -%4 = slt %1, %3 -pc %4 1:i1 -infer %2 - - -; start LHS (in figure-1b) -%0:i64 = var -%1:i64 = var -%2 = ne %0, %1 -%3:i64 = var -%4 = slt %3, %1 -pc %4 1:i1 -infer %2 - - -; start LHS (in figure-1b) -%0:i64 = var -%1:i64 = var -%2 = eq %0, %1 -%3:i32 = zext %2 -%4:i64 = var -%5 = ne %0, %4 -%6:i32 = zext %5 -%7 = and %3, %6 -%8 = slt %1, %4 -pc %8 1:i1 -infer %7 - - -; function: figure-3-if - -; start LHS (in figure-3-if) -%0:i32 = var -%1 = and %0, 1:i32 -infer %1 - - -; start LHS (in figure-3-if) -%0:i32 = var -%1 = add %0, 1:i32 -%2 = and %0, 1:i32 -%3 = ne %2, 0:i32 -pc %3 1:i1 -infer %1 - - -; start LHS (in figure-3-if) -%0:i32 = var -%1 = add %0, 2:i32 -%2 = and %0, 1:i32 -%3 = eq %2, 0:i32 -pc %3 1:i1 -infer %1 - - -; start LHS (in figure-3-if) -%0 = block 2 -%1:i32 = var -%2 = add %1, 1:i32 -%3 = add %1, 2:i32 -%4 = phi %0, %2, %3 -%5 = and %4, 1:i32 -%6 = and %1, 1:i32 -%7 = ne %6, 0:i32 -blockpc %0 0 %7 1:i1 -%8 = eq %6, 0:i32 -blockpc %0 1 %8 1:i1 -infer %5 - - -; function: flips - -; start LHS (in flips) -%0 = sle 0:i32, 0:i32 -infer %0 - - -; start LHS (in flips) -%0 = sle 0:i32, 0:i32 -%1:i32 = zext %0 -%2 = ule 0:i32, %1 -infer %2 - - -; start LHS (in flips) -%0 = sle 0:i32, 0:i32 -%1:i32 = zext %0 -%2 = ule 0:i32, %1 -%3:i32 = zext %2 -%4 = slt 0:i32, %3 -infer %4 - - -; start LHS (in flips) -%0 = sle 0:i32, 0:i32 -%1:i32 = zext %0 -%2 = ule 0:i32, %1 -%3:i32 = zext %2 -%4 = slt 0:i32, %3 -%5:i32 = zext %4 -%6 = ult 0:i32, %5 -infer %6 - - -; function: various-conditions-1 - -; start LHS (in various-conditions-1) -%0:i32 = var -%1 = add %0, 1:i32 -%2 = ne %0, 0:i32 -pc %2 1:i1 -infer %1 - - -; function: various-conditions-2 - -; start LHS (in various-conditions-2) -%0:i32 = var -%1 = slt %0, 0:i32 -infer %1 - - -; start LHS (in various-conditions-2) -%0:i32 = var -%1 = sub %0, 2:i32 -%2 = slt %0, 0:i32 -pc %2 1:i1 -infer %1 - - -; function: various-conditions-3 - -; start LHS (in various-conditions-3) -%0:i32 = var -%1 = sub %0, 4:i32 -%2:i32 = var -%3 = ne %2, 0:i32 -pc %3 1:i1 -infer %1 - - -; function: various-conditions-4 - -; function: unaries - -; start LHS (in unaries) -%0:i32 = var -%1 = eq %0, 0:i32 -infer %1 - - -; start LHS (in unaries) -%0:i32 = var -%1 = cttz %0 -%2:i32 = var -%3 = eq %2, 0:i32 -pc %3 1:i1 -infer %1 - - -; start LHS (in unaries) -%0:i32 = var -%1 = ctlz %0 -%2 = eq %0, 0:i32 -pc %2 1:i1 -infer %1 - - -; start LHS (in unaries) -%0:i32 = var -%1 = ctpop %0 -%2:i32 = var -%3 = eq %2, 0:i32 -pc %3 1:i1 -infer %1 - - -; start LHS (in unaries) -%0:i32 = var -%1 = ctlz %0 -%2:i32 = var -%3 = ctpop %2 -%4 = sub %1, %3 -%5 = eq %0, 0:i32 -pc %5 1:i1 -infer %4 - - -; start LHS (in unaries) -%0:i32 = var -%1 = cttz %0 -%2:i32 = var -%3 = ctlz %2 -%4 = ctpop %0 -%5 = sub %3, %4 -%6 = add %1, %5 -%7 = eq %2, 0:i32 -pc %7 1:i1 -infer %6 - - -; function: unary-condition - -; start LHS (in unary-condition) -%0:i32 = var -%1 = ult 1:i32, %0 -infer %1 - - -; start LHS (in unary-condition) -%0:i32 = var -%1 = ult 1:i32, %0 -%2:i32 = zext %1 -%3 = cttz %2 -infer %3 - - -; start LHS (in unary-condition) -%0:i32 = var -%1 = add %0, 2:i32 -%2 = ult 1:i32, %0 -%3:i32 = zext %2 -%4 = cttz %3 -%5 = ne %4, 0:i32 -pc %5 1:i1 -infer %1 - - -; function: unary-condition-2 - -; start LHS (in unary-condition-2) -%0:i32 = var -%1 = ult 1:i32, %0 -infer %1 - - -; start LHS (in unary-condition-2) -%0:i32 = var -%1 = ult 1:i32, %0 -%2:i32 = zext %1 -%3 = eq %2, 0:i32 -infer %3 - - -; start LHS (in unary-condition-2) -%0:i32 = var -%1 = add %0, 2:i32 -%2 = ult 1:i32, %0 -%3:i32 = zext %2 -%4 = eq %3, 0:i32 -pc %4 1:i1 -infer %1 - - -; function: if-else-cond - -; start LHS (in if-else-cond) -%0:i32 = var -%1 = slt %0, 1:i32 -infer %1 - - -; start LHS (in if-else-cond) -%0:i32 = var -%1 = add %0, 1:i32 -%2 = slt %0, 1:i32 -pc %2 1:i1 -infer %1 - - -; start LHS (in if-else-cond) -%0:i32 = var -%1 = add %0, 2:i32 -%2 = slt %0, 1:i32 -%3:i32 = zext %2 -%4 = eq %3, 0:i32 -pc %4 1:i1 -infer %1 - - -; start LHS (in if-else-cond) -%0 = block 2 -%1:i32 = var -%2 = add %1, 1:i32 -%3 = add %1, 2:i32 -%4 = phi %0, %2, %3 -%5 = and %4, 1:i32 -%6 = slt %1, 1:i32 -blockpc %0 0 %6 1:i1 -%7:i32 = zext %6 -%8 = eq %7, 0:i32 -blockpc %0 1 %8 1:i1 -infer %5 - - -; function: trivial-ret - -; start LHS (in trivial-ret) -%0 = add 0:i32, 1:i32 -infer %0 - - -; function: trivial-const - -; function: trivial-const-block - -; function: bad-phi-value - -; function: bad-phi-value-2 - -; function: select - -; start LHS (in select) -%0 = ne 3:i32, 0:i32 -infer %0 - - -; start LHS (in select) -%0 = ne 3:i32, 0:i32 -%1 = select %0, 1:i32, 2:i32 -infer %1 - - -; function: select-2 - -; start LHS (in select-2) -%0:i32 = var -%1:i32 = var -%2 = add %0, %1 -infer %2 - - -; start LHS (in select-2) -%0:i32 = var -%1 = add %0, 1:i32 -infer %1 - - -; start LHS (in select-2) -%0:i32 = var -%1 = add 2:i32, %0 -infer %1 - - -; start LHS (in select-2) -%0:i32 = var -%1 = add 2:i32, %0 -%2 = ne %1, 0:i32 -infer %2 - - -; start LHS (in select-2) -%0:i32 = var -%1 = add 2:i32, %0 -%2 = ne %1, 0:i32 -%3:i32 = var -%4 = add %3, %0 -%5 = add %3, 1:i32 -%6 = select %2, %4, %5 -infer %6 - - -; function: block-phi-1 - -; start LHS (in block-phi-1) -%0:i32 = var -%1 = add %0, 1:i32 -infer %1 - - -; start LHS (in block-phi-1) -%0:i32 = var -%1 = add %0, 2:i32 -infer %1 - - -; start LHS (in block-phi-1) -%0 = block 2 -%1:i32 = var -%2 = add %1, 2:i32 -%3 = phi %0, %1, %2 -%4 = add %3, 3:i32 -infer %4 - - -; function: block-phi-2 - -; start LHS (in block-phi-2) -%0 = block 2 -%1 = phi %0, 1:i32, 2:i32 -%2 = add %1, 3:i32 -infer %2 - - -; function: zero_init-phi-bad_type - -; function: phi-bad-type - -; function: phi-one-side-i1 - -; start LHS (in phi-one-side-i1) -%0:i32 = var -%1:i32 = var -%2 = sle %0, %1 -infer %2 - - -; start LHS (in phi-one-side-i1) -%0:i32 = var -%1:i32 = var -%2 = eq %0, %1 -%3 = sle %0, %1 -pc %3 1:i1 -infer %2 - - -; start LHS (in phi-one-side-i1) -%0:i32 = var -%1:i32 = var -%2 = add %0, %1 -%3 = sle %0, %1 -%4:i32 = zext %3 -%5 = eq %4, 0:i32 -pc %5 1:i1 -infer %2 - - -; function: call - -; start LHS (in call) -%0:i32 = var -%1:i32 = var -%2 = add %0, %1 -infer %2 - - -; start LHS (in call) -%0:i32 = var -%1 = add 10:i32, %0 -infer %1 - - -; start LHS (in call) -%0:i32 = var -%1:i32 = var -%2 = add %0, %1 -%3:i32 = var -%4 = add 10:i32, %3 -%5 = mul %2, %4 -infer %5 - - -; function: in-unreachable-1 - -; function: in-unreachable-2 - -; function: in-unreachable-3 - -; function: in-unreachable-4 - -; function: in-unreachable-br_if - -; function: in-unreachable-big - -; function: in-unreachable-operations - -; function: merge-with-one-less - -; function: deep - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -infer %1 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -infer %2 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -infer %3 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -infer %4 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -infer %5 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -infer %6 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -infer %7 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -infer %8 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -%9 = xor %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = mul %0, 1234:i32 -%2 = xor %1, 1234:i32 -%3 = mul %2, 1234:i32 -%4 = xor %3, 1234:i32 -%5 = mul %4, 1234:i32 -%6 = xor %5, 1234:i32 -%7 = mul %6, 1234:i32 -%8 = xor %7, 1234:i32 -%9 = mul %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -%9 = xor %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = mul %0, 1234:i32 -%2 = xor %1, 1234:i32 -%3 = mul %2, 1234:i32 -%4 = xor %3, 1234:i32 -%5 = mul %4, 1234:i32 -%6 = xor %5, 1234:i32 -%7 = mul %6, 1234:i32 -%8 = xor %7, 1234:i32 -%9 = mul %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -%9 = xor %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = mul %0, 1234:i32 -%2 = xor %1, 1234:i32 -%3 = mul %2, 1234:i32 -%4 = xor %3, 1234:i32 -%5 = mul %4, 1234:i32 -%6 = xor %5, 1234:i32 -%7 = mul %6, 1234:i32 -%8 = xor %7, 1234:i32 -%9 = mul %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -%9 = xor %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = mul %0, 1234:i32 -%2 = xor %1, 1234:i32 -%3 = mul %2, 1234:i32 -%4 = xor %3, 1234:i32 -%5 = mul %4, 1234:i32 -%6 = xor %5, 1234:i32 -%7 = mul %6, 1234:i32 -%8 = xor %7, 1234:i32 -%9 = mul %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -%9 = xor %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = mul %0, 1234:i32 -%2 = xor %1, 1234:i32 -%3 = mul %2, 1234:i32 -%4 = xor %3, 1234:i32 -%5 = mul %4, 1234:i32 -%6 = xor %5, 1234:i32 -%7 = mul %6, 1234:i32 -%8 = xor %7, 1234:i32 -%9 = mul %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -%9 = xor %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = mul %0, 1234:i32 -%2 = xor %1, 1234:i32 -%3 = mul %2, 1234:i32 -%4 = xor %3, 1234:i32 -%5 = mul %4, 1234:i32 -%6 = xor %5, 1234:i32 -%7 = mul %6, 1234:i32 -%8 = xor %7, 1234:i32 -%9 = mul %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -%9 = xor %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = mul %0, 1234:i32 -%2 = xor %1, 1234:i32 -%3 = mul %2, 1234:i32 -%4 = xor %3, 1234:i32 -%5 = mul %4, 1234:i32 -%6 = xor %5, 1234:i32 -%7 = mul %6, 1234:i32 -%8 = xor %7, 1234:i32 -%9 = mul %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -%9 = xor %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = mul %0, 1234:i32 -%2 = xor %1, 1234:i32 -%3 = mul %2, 1234:i32 -%4 = xor %3, 1234:i32 -%5 = mul %4, 1234:i32 -%6 = xor %5, 1234:i32 -%7 = mul %6, 1234:i32 -%8 = xor %7, 1234:i32 -%9 = mul %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -%9 = xor %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = mul %0, 1234:i32 -%2 = xor %1, 1234:i32 -%3 = mul %2, 1234:i32 -%4 = xor %3, 1234:i32 -%5 = mul %4, 1234:i32 -%6 = xor %5, 1234:i32 -%7 = mul %6, 1234:i32 -%8 = xor %7, 1234:i32 -%9 = mul %8, 1234:i32 -infer %9 - - -; function: two-pcs - -; start LHS (in two-pcs) -%0:i64 = var -%1:i64 = var -%2 = slt %0, %1 -infer %2 - - -; start LHS (in two-pcs) -%0:i64 = var -%1 = eq %0, 0:i64 -%2:i64 = var -%3 = slt %0, %2 -pc %3 1:i1 -infer %1 - - -; start LHS (in two-pcs) -%0:i64 = var -%1:i64 = var -%2 = add %0, %1 -%3 = eq %0, 0:i64 -%4 = slt %0, %1 -pc %3 1:i1 -pc %4 1:i1 -infer %2 - - -; start LHS (in two-pcs) -%0:i64 = var -%1:i64 = var -%2 = sub %0, %1 -%3 = eq %0, 0:i64 -%4:i32 = zext %3 -%5 = eq %4, 0:i32 -%6 = slt %0, %1 -pc %5 1:i1 -pc %6 1:i1 -infer %2 - - -; start LHS (in two-pcs) -%0:i64 = var -%1 = eq %0, 0:i64 -%2:i64 = var -%3 = slt %2, %0 -%4:i32 = zext %3 -%5 = eq %4, 0:i32 -pc %5 1:i1 -infer %1 - - -; start LHS (in two-pcs) -%0:i64 = var -%1:i64 = var -%2 = mul %0, %1 -%3 = eq %1, 0:i64 -%4 = slt %0, %1 -%5:i32 = zext %4 -%6 = eq %5, 0:i32 -pc %3 1:i1 -pc %6 1:i1 -infer %2 - - -; start LHS (in two-pcs) -%0:i64 = var -%1:i64 = var -%2 = sdiv %0, %1 -%3 = eq %1, 0:i64 -%4:i32 = zext %3 -%5 = eq %4, 0:i32 -%6 = slt %0, %1 -%7:i32 = zext %6 -%8 = eq %7, 0:i32 -pc %5 1:i1 -pc %8 1:i1 -infer %2 - - -; function: loop-1 - -; start LHS (in loop-1) -%0 = add 1:i32, 2:i32 -infer %0 - - -; function: loop-2 - -; start LHS (in loop-2) -%0 = add 1:i32, 3:i32 -infer %0 - - -; start LHS (in loop-2) -%0 = add 2:i32, 4:i32 -infer %0 - - -; start LHS (in loop-2) -%0 = add 1:i32, 3:i32 -%1 = add 2:i32, 4:i32 -%2 = add %0, %1 -infer %2 - - -; function: loop-3 - -; start LHS (in loop-3) -%0:i32 = var -%1 = add %0, 3:i32 -infer %1 - - -; start LHS (in loop-3) -%0:i32 = var -%1 = add %0, 4:i32 -infer %1 - - -; start LHS (in loop-3) -%0:i32 = var -%1:i32 = var -%2 = add %0, %1 -infer %2 - - -; function: loop-4 - -; start LHS (in loop-4) -%0:i32 = var -%1 = add %0, 3:i32 -infer %1 - - -; start LHS (in loop-4) -%0:i32 = var -%1 = add %0, 2:i32 -infer %1 - - -; function: loop-5 - -; start LHS (in loop-5) -%0:i32 = var -%1 = add %0, 3:i32 -infer %1 - - -; start LHS (in loop-5) -%0:i32 = var -%1 = add %0, 2:i32 -infer %1 - - -; function: loop-6 - -; start LHS (in loop-6) -%0:i32 = var -%1 = add %0, 3:i32 -infer %1 - - -; start LHS (in loop-6) -%0:i32 = var -%1 = add %0, 2:i32 -infer %1 - - -; function: loop-7 - -; start LHS (in loop-7) -%0:i32 = var -%1 = add %0, 3:i32 -infer %1 - - -; start LHS (in loop-7) -%0:i32 = var -%1 = add %0, 5:i32 -infer %1 - - -; function: loop-8 - -; start LHS (in loop-8) -%0 = add 1:i32, 4:i32 -infer %0 - - -; start LHS (in loop-8) -%0:i32 = var -%1 = sub 1:i32, %0 -infer %1 - - -; start LHS (in loop-8) -%0 = add 1:i32, 4:i32 -%1:i32 = var -%2 = sub 1:i32, %1 -%3 = mul %0, %2 -infer %3 - - -; function: loop-9 - -; start LHS (in loop-9) -%0:i32 = var -%1:i32 = var -%2 = add %0, %1 -infer %2 - - -; function: loop-10 - -; start LHS (in loop-10) -%0:i32 = var -%1:i32 = var -%2 = add %0, %1 -infer %2 - - -; function: loop-multicond-1 - -; start LHS (in loop-multicond-1) -%0 = ne 6:i32, 0:i32 -infer %0 - - -; start LHS (in loop-multicond-1) -%0 = ne 6:i32, 0:i32 -%1 = select %0, 4:i32, 5:i32 -infer %1 - - -; function: loop-multicond-2 - -; start LHS (in loop-multicond-2) -%0:i32 = var -%1 = add %0, 4:i32 -infer %1 - - -; start LHS (in loop-multicond-2) -%0:i32 = var -%1 = add %0, 5:i32 -infer %1 - - -; start LHS (in loop-multicond-2) -%0 = add 3:i32, 6:i32 -infer %0 - - -; start LHS (in loop-multicond-2) -%0 = add 3:i32, 6:i32 -%1 = ne %0, 0:i32 -infer %1 - - -; start LHS (in loop-multicond-2) -%0 = add 3:i32, 6:i32 -%1 = ne %0, 0:i32 -%2:i32 = var -%3:i32 = var -%4 = select %1, %2, %3 -infer %4 - - -; function: loop-block-1 - -; start LHS (in loop-block-1) -%0:i32 = var -%1 = add %0, 4:i32 -infer %1 - - -; start LHS (in loop-block-1) -%0:i32 = var -%1 = add %0, 5:i32 -infer %1 - - -; start LHS (in loop-block-1) -%0:i32 = var -%1 = add %0, 6:i32 -infer %1 - - -; start LHS (in loop-block-1) -%0:i32 = var -%1 = ne %0, 0:i32 -infer %1 - - -; start LHS (in loop-block-1) -%0:i32 = var -%1 = ne %0, 0:i32 -%2:i32 = var -%3 = block 2 -%4:i32 = var -%5:i32 = var -%6 = phi %3, %4, %5 -%7 = select %1, %2, %6 -infer %7 - - -; function: loop-block-2 - -; start LHS (in loop-block-2) -%0:i32 = var -%1 = add %0, 4:i32 -infer %1 - - -; start LHS (in loop-block-2) -%0:i32 = var -%1 = add %0, 5:i32 -infer %1 - - -; start LHS (in loop-block-2) -%0:i32 = var -%1 = add %0, 6:i32 -infer %1 - - -; start LHS (in loop-block-2) -%0:i32 = var -%1 = ne %0, 0:i32 -infer %1 - - -; start LHS (in loop-block-2) -%0:i32 = var -%1 = ne %0, 0:i32 -%2:i32 = var -%3 = block 2 -%4:i32 = var -%5:i32 = var -%6 = phi %3, %4, %5 -%7 = select %1, %2, %6 -infer %7 - - -; function: bad-phi-type - -; function: loop-unreachable - -; function: phi-value-turns-bad - -; start LHS (in phi-value-turns-bad) -%0:i32 = var -%1 = ctlz %0 -%2 = eq %0, 0:i32 -pc %2 1:i1 -infer %1 - - -; function: multi-use - -; start LHS (in multi-use) -%0:i32 = var -%1 = add %0, 1:i32 -infer %1 - - -; start LHS (in multi-use) -%0:i32 = var -%1 = add %0, %0 -infer %1 - - -; function: multi-use-2 - -; start LHS (in multi-use-2) -%0:i32 = var -%1 = add %0, 1:i32 -infer %1 - - -; start LHS (in multi-use-2) -%0:i32 = var -%1 = mul %0, 2:i32 -infer %1 - - -; start LHS (in multi-use-2) -%0:i32 = var -%1 = mul %0, 2:i32 -%2 = sub %1, %0 -infer %2 - - -; function: many-single-uses-with-param - -; start LHS (in many-single-uses-with-param) -%0:i32 = var -%1 = mul 10:i32, %0 -infer %1 - - -; start LHS (in many-single-uses-with-param) -%0:i32 = var -%1 = cttz %0 -infer %1 - - -; start LHS (in many-single-uses-with-param) -%0:i32 = var -%1 = cttz %0 -%2 = sub %1, 20:i32 -infer %2 - - -; start LHS (in many-single-uses-with-param) -%0:i32 = var -%1 = mul 10:i32, %0 -%2 = cttz %0 -%3 = sub %2, 20:i32 -%4 = add %1, %3 -infer %4 - - -; start LHS (in many-single-uses-with-param) -%0:i32 = var -%1 = mul 10:i32, %0 -%2 = cttz %0 -%3 = sub %2, 20:i32 -%4 = add %1, %3 -%5 = eq %4, 0:i32 -infer %5 - - -; function: 55 - -; start LHS (in 55) -%0:i32 = var -%1 = add %0, -7:i32 -infer %1 - - -; start LHS (in 55) -%0:i32 = var -%1 = eq %0, 0:i32 -%2 = ne %0, 0:i32 -pc %2 1:i1 -infer %1 - - -; start LHS (in 55) -%0:i32 = var -%1:i32 = var -%2 = ne %0, %1 -%3 = ne %1, 0:i32 -pc %3 1:i1 -infer %2 - - -; function: multiple-uses-to-non-expression - -; start LHS (in multiple-uses-to-non-expression) -%0:i32 = var -%1 = add %0, 10:i32 -infer %1 - - -; start LHS (in multiple-uses-to-non-expression) -%0:i32 = var -%1 = add %0, 20:i32 -infer %1 - - -; function: nested-phi-forwarding - -; start LHS (in nested-phi-forwarding) -%0 = block 2 -%1:i32 = var -%2 = block 2 -%3 = block 2 -%4 = phi %3, %1, 1:i32 -%5 = phi %2, %1, %4 -%6 = phi %0, %1, %5 -%7 = or 1:i32, %6 -infer %7 - - -; function: zext-numGets - -; start LHS (in zext-numGets) -%0:i32 = var -%1 = eq %0, 0:i32 -infer %1 - - -; start LHS (in zext-numGets) -%0 = block 2 -%1:i32 = var -%2 = eq %1, 0:i32 -%3:i32 = zext %2 -%4 = phi %0, 1:i32, %3 -%5 = cttz %4 -infer %5 - - -; function: zext-numGets-hasAnotherUse - -; start LHS (in zext-numGets-hasAnotherUse) -%0:i32 = var -%1 = eq %0, 0:i32 -infer %1 - - -; start LHS (in zext-numGets-hasAnotherUse) -%0 = block 2 -%1:i32 = var -%2 = eq %1, 0:i32 -%3:i32 = zext %2 -%4 = phi %0, 1:i32, %3 -%5 = cttz %4 -infer %5 - - -; function: flipped-needs-right-origin - -; start LHS (in flipped-needs-right-origin) -%0 = block 2 -%1 = phi %0, 0:i32, 2:i32 -%2 = add %1, 4:i32 -infer %2 - - -; start LHS (in flipped-needs-right-origin) -%0 = block 2 -%1 = phi %0, 0:i32, 2:i32 -%2 = add %1, 4:i32 -%3 = slt %2, 3:i32 -infer %3 - - -; function: non-expr-nodes-may-have-multiple-uses-too-its-the-ORIGIN - -; start LHS (in non-expr-nodes-may-have-multiple-uses-too-its-the-ORIGIN) -%0:i32 = var -%1 = ult 1:i32, %0 -infer %1 - - -; start LHS (in non-expr-nodes-may-have-multiple-uses-too-its-the-ORIGIN) -%0:i32 = var -%1:i32 = zext %0 -%2 = sub 4:i32, %1 -infer %2 - - -; function: loop-of-set-connections - -; start LHS (in loop-of-set-connections) -%0 = add 0:i32, 1:i32 -%1 = ne 0:i32, 0:i32 -pc %1 1:i1 -infer %0 - - -; function: conditions-in-conditions - -; start LHS (in conditions-in-conditions) -%0 = sub 0:i32, 1:i32 -%1 = ne 0:i32, 0:i32 -pc %1 1:i1 -infer %0 - - -; start LHS (in conditions-in-conditions) -%0 = block 2 -%1 = block 2 -%2 = phi %1, 0:i32, 1:i32 -%3 = phi %0, %2, 1:i32 -%4 = add %3, 16:i32 -%5 = ne 0:i32, 0:i32 -blockpc %1 0 %5 1:i1 -%6 = eq 0:i32, 0:i32 -blockpc %1 1 %6 1:i1 -%7:i32 = var -%8 = phi %1, 1:i32, %7 -%9 = ne %8, 0:i32 -blockpc %0 0 %9 1:i1 -%10 = eq %8, 0:i32 -blockpc %0 1 %10 1:i1 -infer %4 - -(module - (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) - (type $i32_=>_i32 (func (param i32) (result i32))) - (type $i32_=>_none (func (param i32))) - (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) - (type $none_=>_i32 (func (result i32))) - (type $i32_i32_=>_none (func (param i32 i32))) - (type $none_=>_f64 (func (result f64))) - (type $i64_i64_i64_=>_i32 (func (param i64 i64 i64) (result i32))) - (type $none_=>_none (func)) - (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) - (type $i64_i64_i64_=>_i64 (func (param i64 i64 i64) (result i64))) - (type $i64_i64_i32_f32_=>_none (func (param i64 i64 i32 f32))) - (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) - (memory $0 (shared 1 1)) - (export "replaced-print-internal" (func $55)) - (func $figure-1a (param $a i64) (param $x i64) (param $y i64) (result i32) - (local $i i32) - (local $j i32) - (local $r i32) - (local $6 i64) - (local $7 i64) - (local $8 i32) - (local $9 i64) - (local $10 i64) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (local $17 i32) - (block - (nop) - (nop) - (nop) - (nop) - (nop) - (nop) - (nop) - (nop) - (local.set $12 - (i64.eq - (local.get $a) - (local.get $x) - ) - ) - (local.set $13 - (i64.ne - (local.get $a) - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $15 - (i32.and - (local.get $12) - (local.get $13) - ) - ) - (return - (local.get $15) - ) - (unreachable) - ) - (nop) - (return - (local.get $16) - ) - ) - (func $figure-1b (param $a i64) (param $x i64) (param $y i64) (result i32) - (local $i i32) - (local $j i32) - (local $r i32) - (local $6 i64) - (local $7 i64) - (local $8 i32) - (local $9 i64) - (local $10 i64) - (local $11 i32) - (local $12 i64) - (local $13 i64) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (local $17 i32) - (local $18 i32) - (block - (nop) - (nop) - (local.set $8 - (i64.lt_s - (local.get $x) - (local.get $y) - ) - ) - (if - (local.get $8) - (block - (block $block - (nop) - (nop) - (nop) - (nop) - (nop) - (nop) - (nop) - (nop) - (local.set $15 - (i64.eq - (local.get $a) - (local.get $x) - ) - ) - (local.set $16 - (i64.ne - (local.get $a) - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $18 - (i32.and - (local.get $15) - (local.get $16) - ) - ) - (return - (local.get $18) - ) - (unreachable) - ) - (unreachable) - ) - (block - (unreachable) - (unreachable) - ) - ) - ) - (unreachable) - ) - (func $figure-3-if (param $x i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (block - (block - (nop) - (local.set $2 - (i32.and - (local.get $x) - (i32.const 1) - ) - ) - (if - (local.get $2) - (block - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 1) - ) - ) - ) - (block - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 2) - ) - ) - ) - ) - ) - (nop) - (local.set $8 - (i32.and - (local.get $x) - (i32.const 1) - ) - ) - (return - (local.get $8) - ) - (unreachable) - ) - (nop) - (return - (local.get $9) - ) - ) - (func $flips - (local $x i32) - (local $y i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (nop) - (nop) - (nop) - (local.set $x - (i32.ge_s - (local.get $x) - (local.get $y) - ) - ) - (nop) - (nop) - (nop) - (local.set $x - (i32.ge_u - (local.get $x) - (local.get $y) - ) - ) - (nop) - (nop) - (nop) - (local.set $x - (i32.gt_s - (local.get $x) - (local.get $y) - ) - ) - (nop) - (nop) - (nop) - (local.set $x - (i32.gt_u - (local.get $x) - (local.get $y) - ) - ) - ) - (func $various-conditions-1 (param $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (nop) - (if - (local.get $x) - (block - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 1) - ) - ) - ) - ) - ) - (func $various-conditions-2 (param $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (nop) - (local.set $2 - (i32.lt_s - (local.get $x) - (i32.const 0) - ) - ) - (if - (local.get $2) - (block - (nop) - (nop) - (local.set $x - (i32.sub - (local.get $x) - (i32.const 2) - ) - ) - ) - ) - ) - (func $various-conditions-3 (param $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local.set $1 - (i32.reinterpret_f32 - (f32.const 0) - ) - ) - (if - (local.get $1) - (block - (nop) - (nop) - (local.set $x - (i32.sub - (local.get $x) - (i32.const 4) - ) - ) - ) - ) - ) - (func $various-conditions-4 (param $x i32) - (local $1 i32) - (local $2 i32) - (block - (unreachable) - (if - (unreachable) - (block - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - ) - ) - ) - (unreachable) - ) - (func $unaries (param $x i32) (param $y i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (nop) - (local.set $3 - (i32.eqz - (local.get $x) - ) - ) - (if - (local.get $3) - (block - (nop) - (local.set $5 - (i32.ctz - (local.get $y) - ) - ) - (nop) - (local.set $7 - (i32.clz - (local.get $x) - ) - ) - (nop) - (local.set $9 - (i32.popcnt - (local.get $y) - ) - ) - (local.set $10 - (i32.sub - (local.get $7) - (local.get $9) - ) - ) - (nop) - (local.set $x - (i32.add - (local.get $5) - (local.get $10) - ) - ) - ) - ) - ) - (func $unary-condition (param $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (nop) - (local.set $2 - (i32.gt_u - (local.get $x) - (i32.const 1) - ) - ) - (local.set $3 - (i32.ctz - (local.get $2) - ) - ) - (if - (local.get $3) - (block - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 2) - ) - ) - ) - ) - ) - (func $unary-condition-2 (param $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (nop) - (local.set $2 - (i32.gt_u - (local.get $x) - (i32.const 1) - ) - ) - (local.set $3 - (i32.eqz - (local.get $2) - ) - ) - (if - (local.get $3) - (block - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 2) - ) - ) - ) - ) - ) - (func $if-else-cond (param $x i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (block - (block - (nop) - (local.set $2 - (i32.lt_s - (local.get $x) - (i32.const 1) - ) - ) - (if - (local.get $2) - (block - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 1) - ) - ) - ) - (block - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 2) - ) - ) - ) - ) - ) - (nop) - (local.set $8 - (i32.and - (local.get $x) - (i32.const 1) - ) - ) - (return - (local.get $8) - ) - (unreachable) - ) - (nop) - (return - (local.get $9) - ) - ) - (func $trivial-ret (result i32) - (local $0 i32) - (local.set $0 - (i32.add - (i32.const 0) - (i32.const 1) - ) - ) - (return - (local.get $0) - ) - ) - (func $trivial-const (result i32) - (return - (i32.const 0) - ) - ) - (func $trivial-const-block (result i32) - (local $0 i32) - (local $1 i32) - (block - (nop) - (nop) - ) - (local.set $1 - (i32.const 0) - ) - (return - (local.get $1) - ) - ) - (func $bad-phi-value (result i32) - (local $0 i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (block - (if - (i32.const 1) - (block - (nop) - (local.set $1 - (i32.load - (i32.const 0) - ) - ) - ) - (local.set $1 - (i32.const 0) - ) - ) - (nop) - (if - (local.get $1) - (local.set $3 - (i32.const 0) - ) - (local.set $3 - (i32.const 1) - ) - ) - ) - (nop) - (return - (local.get $3) - ) - ) - (func $bad-phi-value-2 (param $x i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (block - (block - (if - (i32.const 1) - (block - (nop) - (local.set $2 - (i32.load - (i32.const 0) - ) - ) - ) - (local.set $2 - (i32.const 0) - ) - ) - (nop) - (if - (local.get $2) - (local.set $x - (i32.const 1) - ) - (local.set $x - (i32.const 2) - ) - ) - ) - (nop) - (nop) - ) - (nop) - (return - (local.get $x) - ) - ) - (func $select (param $x i32) (result i32) - (local $1 i32) - (local.set $1 - (select - (i32.const 1) - (i32.const 2) - (i32.const 3) - ) - ) - (return - (local.get $1) - ) - (unreachable) - ) - (func $select-2 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (nop) - (nop) - (local.set $4 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (nop) - (local.set $6 - (i32.add - (local.get $x) - (i32.const 1) - ) - ) - (nop) - (local.set $8 - (i32.add - (i32.const 2) - (local.get $y) - ) - ) - (local.set $9 - (select - (local.get $4) - (local.get $6) - (local.get $8) - ) - ) - (return - (local.get $9) - ) - (unreachable) - ) - (func $block-phi-1 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (block - (block $out - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 1) - ) - ) - (nop) - (br_if $out - (local.get $y) - ) - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 2) - ) - ) - ) - (nop) - (nop) - (nop) - ) - (local.set $10 - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - (return - (local.get $10) - ) - ) - (func $block-phi-2 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (block - (block $out - (local.set $x - (i32.const 1) - ) - (nop) - (br_if $out - (local.get $y) - ) - (local.set $x - (i32.const 2) - ) - ) - (nop) - (nop) - (nop) - ) - (local.set $6 - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - (return - (local.get $6) - ) - ) - (func $zero_init-phi-bad_type (result f64) - (local $x f64) - (local $1 f64) - (local $2 f64) - (local $3 f64) - (block - (if - (i32.const 0) - (local.set $x - (f64.const 1) - ) - ) - (nop) - (nop) - ) - (nop) - (return - (local.get $x) - ) - ) - (func $phi-bad-type (result f64) - (local $0 f64) - (local $1 f64) - (local $2 f64) - (local $3 f64) - (block $label$1 - (if - (i32.const 0) - (local.set $0 - (f64.const 0) - ) - (local.set $0 - (f64.const 1) - ) - ) - (nop) - (nop) - ) - (nop) - (return - (local.get $0) - ) - ) - (func $phi-one-side-i1 (param $x i32) (param $y i32) (result i32) - (local $i i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (block - (block - (nop) - (nop) - (local.set $5 - (i32.le_s - (local.get $x) - (local.get $y) - ) - ) - (if - (local.get $5) - (block - (nop) - (nop) - (nop) - (local.set $i - (i32.eq - (local.get $x) - (local.get $y) - ) - ) - ) - (block - (nop) - (nop) - (nop) - (local.set $i - (i32.add - (local.get $x) - (local.get $y) - ) - ) - ) - ) - ) - (nop) - (nop) - ) - (nop) - (return - (local.get $i) - ) - ) - (func $call (result i32) - (local $0 i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local.set $0 - (call $call) - ) - (local.set $1 - (call $call) - ) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (local.set $3 - (call $call) - ) - (local.set $4 - (i32.add - (i32.const 10) - (local.get $3) - ) - ) - (local.set $5 - (i32.mul - (local.get $2) - (local.get $4) - ) - ) - (return - (local.get $5) - ) - (unreachable) - ) - (func $in-unreachable-1 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (block - (block - (nop) - (if - (local.get $x) - (block - (block $block - (local.set $x - (i32.const 1) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (unreachable) - ) - (local.set $x - (i32.const 2) - ) - ) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (nop) - (return - (local.get $5) - ) - ) - (func $in-unreachable-2 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (block - (block - (nop) - (if - (local.get $x) - (block - (block $block - (local.set $x - (i32.const 1) - ) - (unreachable) - (unreachable) - ) - (unreachable) - ) - (local.set $x - (i32.const 2) - ) - ) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (nop) - (return - (local.get $4) - ) - ) - (func $in-unreachable-3 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (block - (block $out - (block - (nop) - (if - (local.get $x) - (block - (block $block - (local.set $x - (i32.const 1) - ) - (br $out) - (unreachable) - ) - (unreachable) - ) - (local.set $x - (i32.const 2) - ) - ) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (nop) - (return - (local.get $5) - ) - ) - (func $in-unreachable-4 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (block - (block $out - (block - (nop) - (if - (local.get $x) - (block - (block $block - (local.set $x - (i32.const 1) - ) - (br_table $out $out $out - (i32.const 1) - ) - (unreachable) - ) - (unreachable) - ) - (local.set $x - (i32.const 2) - ) - ) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (nop) - (return - (local.get $5) - ) - ) - (func $in-unreachable-br_if (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (block - (block $out - (block - (nop) - (if - (local.get $x) - (block $block - (local.set $x - (i32.const 1) - ) - (nop) - (br_if $out - (local.get $x) - ) - ) - (local.set $x - (i32.const 2) - ) - ) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (nop) - (return - (local.get $6) - ) - ) - (func $in-unreachable-big (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (block $label$1 - (block $label$2 - (block $label$3 - (block - (nop) - (if - (local.get $2) - (block - (block - (nop) - (if - (local.get $0) - (block - (block $block - (local.set $1 - (i32.const -8531) - ) - (br $label$3) - (unreachable) - ) - (unreachable) - ) - (block - (block $block3 - (local.set $1 - (i32.const -8531) - ) - (br $label$1) - (unreachable) - ) - (unreachable) - ) - ) - ) - (unreachable) - ) - ) - ) - (br $label$2) - (unreachable) - ) - (local.set $6 - (i32.load - (i32.const 0) - ) - ) - (drop - (local.get $6) - ) - (br $label$1) - (unreachable) - ) - (nop) - (i32.store16 - (i32.const 1) - (local.get $1) - ) - (unreachable) - (unreachable) - ) - (i32.store16 - (i32.const 0) - (i32.const -8531) - ) - ) - (func $in-unreachable-operations (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (block $block - (unreachable) - (unreachable) - (block - (nop) - (if - (local.get $x) - (local.set $x - (i32.const 1) - ) - (local.set $x - (i32.const 2) - ) - ) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (unreachable) - ) - (func $merge-with-one-less (param $var$0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (block - (block $label$1 - (block $label$2 - (block $label$3 - (block $label$4 - (block $label$5 - (local.set $1 - (i32.load - (i32.const 1) - ) - ) - (br_table $label$5 $label$4 $label$3 $label$2 - (local.get $1) - ) - (unreachable) - ) - (unreachable) - (unreachable) - ) - (br $label$1) - (unreachable) - ) - (local.set $var$0 - (i32.const 8) - ) - (nop) - (local.set $3 - (i32.load - (local.get $var$0) - ) - ) - (f64.store - (local.get $3) - (f64.const 0) - ) - (br $label$1) - (unreachable) - ) - (unreachable) - (unreachable) - ) - (nop) - (i32.store - (local.get $var$0) - (i32.const 16) - ) - (nop) - ) - (local.set $6 - (i32.const 1) - ) - (return - (local.get $6) - ) - ) - (func $deep (param $x i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (local $17 i32) - (local $18 i32) - (local $19 i32) - (local $20 i32) - (local $21 i32) - (local $22 i32) - (local $23 i32) - (local $24 i32) - (local $25 i32) - (local $26 i32) - (local $27 i32) - (local $28 i32) - (local $29 i32) - (local $30 i32) - (local $31 i32) - (local $32 i32) - (local $33 i32) - (local $34 i32) - (local $35 i32) - (local $36 i32) - (local $37 i32) - (local $38 i32) - (local $39 i32) - (local $40 i32) - (local $41 i32) - (local $42 i32) - (local $43 i32) - (local $44 i32) - (local $45 i32) - (local $46 i32) - (local $47 i32) - (local $48 i32) - (local $49 i32) - (local $50 i32) - (local $51 i32) - (local $52 i32) - (local $53 i32) - (local $54 i32) - (local $55 i32) - (block - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - ) - (nop) - (return - (local.get $x) - ) - ) - (func $two-pcs (param $x i64) (param $y i64) (param $t i64) (result i64) - (local $3 i64) - (local $4 i64) - (local $5 i32) - (local $6 i64) - (local $7 i32) - (local $8 i64) - (local $9 i64) - (local $10 i64) - (local $11 i64) - (local $12 i64) - (local $13 i64) - (local $14 i64) - (local $15 i32) - (local $16 i64) - (local $17 i64) - (local $18 i64) - (local $19 i64) - (local $20 i64) - (local $21 i64) - (local $22 i64) - (local $23 i64) - (local $24 i64) - (block - (block - (nop) - (nop) - (local.set $5 - (i64.lt_s - (local.get $x) - (local.get $y) - ) - ) - (if - (local.get $5) - (block - (nop) - (local.set $7 - (i64.eqz - (local.get $x) - ) - ) - (if - (local.get $7) - (block - (nop) - (nop) - (nop) - (local.set $t - (i64.add - (local.get $x) - (local.get $y) - ) - ) - ) - (block - (nop) - (nop) - (nop) - (local.set $t - (i64.sub - (local.get $x) - (local.get $y) - ) - ) - ) - ) - ) - (block - (nop) - (local.set $15 - (i64.eqz - (local.get $y) - ) - ) - (if - (local.get $15) - (block - (nop) - (nop) - (nop) - (local.set $t - (i64.mul - (local.get $x) - (local.get $y) - ) - ) - ) - (block - (nop) - (nop) - (nop) - (local.set $t - (i64.div_s - (local.get $x) - (local.get $y) - ) - ) - ) - ) - ) - ) - ) - (nop) - (return - (local.get $t) - ) - (unreachable) - ) - (nop) - (return - (local.get $23) - ) - ) - (func $loop-1 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (loop $loopy - (nop) - ) - (nop) - (nop) - (local.set $4 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (return - (local.get $4) - ) - (unreachable) - ) - (nop) - (return - (local.get $5) - ) - ) - (func $loop-2 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (loop $loopy - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - (nop) - (nop) - (local.set $y - (i32.add - (local.get $y) - (i32.const 4) - ) - ) - ) - (nop) - (nop) - (local.set $8 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (return - (local.get $8) - ) - (unreachable) - ) - (nop) - (return - (local.get $9) - ) - ) - (func $loop-3 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (loop $loopy - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - (nop) - (nop) - (local.set $y - (i32.add - (local.get $y) - (i32.const 4) - ) - ) - (nop) - (br_if $loopy - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $9 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (return - (local.get $9) - ) - (unreachable) - ) - (nop) - (return - (local.get $10) - ) - ) - (func $loop-4 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (loop $loopy - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - (nop) - (br_if $loopy - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $7 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (return - (local.get $7) - ) - (unreachable) - ) - (nop) - (return - (local.get $8) - ) - ) - (func $loop-5 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (loop $loopy - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - (local.set $y - (i32.const 2) - ) - (nop) - (br_if $loopy - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $7 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (return - (local.get $7) - ) - (unreachable) - ) - (nop) - (return - (local.get $8) - ) - ) - (func $loop-6 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (loop $loopy - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - (nop) - (nop) - (nop) - (br_if $loopy - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $8 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (return - (local.get $8) - ) - (unreachable) - ) - (nop) - (return - (local.get $9) - ) - ) - (func $loop-7 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (loop $loopy - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - (local.set $y - (i32.const 5) - ) - (nop) - (br_if $loopy - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $7 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (return - (local.get $7) - ) - (unreachable) - ) - (nop) - (return - (local.get $8) - ) - ) - (func $loop-8 (param $x i32) (param $y i32) (result i32) - (local $z i32) - (local $w i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (loop $loopy - (nop) - (local.set $z - (local.get $x) - ) - (nop) - (local.set $w - (local.get $y) - ) - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 4) - ) - (nop) - (br_if $loopy - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $9 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $12 - (i32.sub - (local.get $z) - (local.get $w) - ) - ) - (local.set $13 - (i32.mul - (local.get $9) - (local.get $12) - ) - ) - (return - (local.get $13) - ) - (unreachable) - ) - (nop) - (return - (local.get $14) - ) - ) - (func $loop-9 (param $x i32) (param $y i32) (result i32) - (local $t i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (loop $loopy - (nop) - (local.set $t - (local.get $x) - ) - (nop) - (local.set $x - (local.get $y) - ) - (nop) - (local.set $y - (local.get $t) - ) - (nop) - (br_if $loopy - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $9 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (return - (local.get $9) - ) - (unreachable) - ) - (nop) - (return - (local.get $10) - ) - ) - (func $loop-10 (param $x i32) (param $y i32) (result i32) - (local $t i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 1) - ) - (loop $loopy - (nop) - (local.set $t - (local.get $x) - ) - (nop) - (local.set $x - (local.get $y) - ) - (nop) - (local.set $y - (local.get $t) - ) - (nop) - (br_if $loopy - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $9 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (return - (local.get $9) - ) - (unreachable) - ) - (nop) - (return - (local.get $10) - ) - ) - (func $loop-multicond-1 (param $x i32) (param $y i32) (param $z i32) (result i32) - (local $t i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (block - (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) - ) - (nop) - (br_if $loopy - (local.get $t) - ) - (local.set $y - (i32.const 5) - ) - (nop) - (br_if $loopy - (local.get $t) - ) - (local.set $z - (i32.const 6) - ) - ) - (nop) - (nop) - (nop) - (local.set $9 - (select - (local.get $x) - (local.get $y) - (local.get $z) - ) - ) - (return - (local.get $9) - ) - (unreachable) - ) - (nop) - (return - (local.get $10) - ) - ) - (func $loop-multicond-2 (param $x i32) (param $y i32) (param $z i32) (result i32) - (local $t i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (local $17 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (local.set $z - (i32.const 3) - ) - (loop $loopy - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 4) - ) - ) - (nop) - (br_if $loopy - (local.get $t) - ) - (nop) - (nop) - (local.set $y - (i32.add - (local.get $y) - (i32.const 5) - ) - ) - (nop) - (br_if $loopy - (local.get $t) - ) - (nop) - (nop) - (local.set $z - (i32.add - (local.get $z) - (i32.const 6) - ) - ) - ) - (nop) - (nop) - (nop) - (local.set $15 - (select - (local.get $x) - (local.get $y) - (local.get $z) - ) - ) - (return - (local.get $15) - ) - (unreachable) - ) - (nop) - (return - (local.get $16) - ) - ) - (func $loop-block-1 (param $x i32) (param $y i32) (param $z i32) (result i32) - (local $t i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (local $17 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (local.set $z - (i32.const 3) - ) - (loop $loopy - (block $out - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 4) - ) - ) - (nop) - (br_if $out - (local.get $t) - ) - (nop) - (nop) - (local.set $y - (i32.add - (local.get $y) - (i32.const 5) - ) - ) - (nop) - (br_if $out - (local.get $t) - ) - (nop) - (nop) - (local.set $z - (i32.add - (local.get $z) - (i32.const 6) - ) - ) - (br $loopy) - (unreachable) - ) - ) - (nop) - (nop) - (nop) - (local.set $15 - (select - (local.get $x) - (local.get $y) - (local.get $z) - ) - ) - (return - (local.get $15) - ) - (unreachable) - ) - (nop) - (return - (local.get $16) - ) - ) - (func $loop-block-2 (param $x i32) (param $y i32) (param $z i32) (result i32) - (local $t i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (local $17 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (local.set $z - (i32.const 3) - ) - (block $out - (loop $loopy - (block - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 4) - ) - ) - (nop) - (br_if $out - (local.get $t) - ) - (nop) - (nop) - (local.set $y - (i32.add - (local.get $y) - (i32.const 5) - ) - ) - (nop) - (br_if $out - (local.get $t) - ) - (nop) - (nop) - (local.set $z - (i32.add - (local.get $z) - (i32.const 6) - ) - ) - (br $loopy) - (unreachable) - ) - (unreachable) - ) - (unreachable) - ) - (nop) - (nop) - (nop) - (local.set $15 - (select - (local.get $x) - (local.get $y) - (local.get $z) - ) - ) - (return - (local.get $15) - ) - (unreachable) - ) - (nop) - (return - (local.get $16) - ) - ) - (func $bad-phi-type (param $var$0 i64) (param $var$1 i64) (param $var$2 i32) (param $var$3 f32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 f64) - (local $9 f64) - (local $10 f64) - (local $11 f64) - (nop) - (if - (local.get $var$2) - (block - (loop $label$2 - (block - (block - (block $label$3 - (if - (i32.const 0) - (block - (unreachable) - (unreachable) - ) - ) - (nop) - (nop) - ) - (local.set $6 - (i32.const 0) - ) - (if - (local.get $6) - (block - (unreachable) - (unreachable) - ) - ) - ) - (nop) - (br_if $label$2 - (local.get $var$2) - ) - (nop) - ) - (nop) - (local.set $10 - (f64.const 0) - ) - ) - (nop) - (drop - (local.get $10) - ) - ) - ) - ) - (func $loop-unreachable - (local $var$0 i32) - (local $var$1 f64) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 f64) - (local $12 f64) - (local $13 f64) - (loop $label$1 - (block - (block $label$2 - (block $label$3 - (block $label$4 - (if - (i32.const 1337) - (block - (unreachable) - (unreachable) - ) - ) - (nop) - (nop) - ) - (nop) - (nop) - (loop $label$6 - (block $label$7 - (nop) - (local.set $6 - (local.get $var$0) - ) - (br_if $label$7 - (i32.const 65535) - ) - (nop) - (drop - (local.get $6) - ) - (nop) - (local.set $6 - (local.get $var$0) - ) - (br_if $label$7 - (i32.const 0) - ) - (nop) - (drop - (local.get $6) - ) - (unreachable) - (unreachable) - ) - (nop) - (br_if $label$6 - (local.get $6) - ) - ) - ) - (nop) - (nop) - ) - (nop) - (nop) - (br $label$1) - (unreachable) - ) - (unreachable) - ) - (unreachable) - ) - (func $phi-value-turns-bad (result f64) - (local $var$0 i32) - (local $var$1 i32) - (local $var$2 f32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 f32) - (local $13 f32) - (local $14 f32) - (local $15 f32) - (local $16 f64) - (local $17 f64) - (block - (block - (nop) - (local.set $var$0 - (i32.atomic.rmw16.sub_u offset=22 - (i32.const 0) - (i32.const 0) - ) - ) - (nop) - (if - (local.get $var$0) - (block - (unreachable) - (unreachable) - ) - (block - (block $block - (block - (loop $label$3 - (block $label$4 - (nop) - (local.set $6 - (local.get $var$0) - ) - (br_if $label$4 - (i32.const 1) - ) - (nop) - (nop) - (local.set $6 - (i32.clz - (local.get $6) - ) - ) - ) - (nop) - (nop) - ) - (nop) - (if - (local.get $6) - (nop) - ) - ) - (nop) - ) - (nop) - (local.set $14 - (f32.const 1) - ) - ) - ) - ) - (nop) - (nop) - (unreachable) - (unreachable) - ) - (nop) - (return - (local.get $16) - ) - ) - (func $multi-use (param $x i32) (result i32) - (local $temp i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (block - (nop) - (nop) - (local.set $temp - (i32.add - (local.get $x) - (i32.const 1) - ) - ) - (nop) - (nop) - (nop) - (nop) - ) - (local.set $8 - (i32.add - (local.get $temp) - (local.get $temp) - ) - ) - (return - (local.get $8) - ) - ) - (func $multi-use-2 (param $x i32) (result i32) - (local $temp i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (block - (nop) - (nop) - (local.set $temp - (i32.add - (local.get $x) - (i32.const 1) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $temp) - (i32.const 2) - ) - ) - (nop) - (nop) - (nop) - (nop) - ) - (local.set $10 - (i32.sub - (local.get $x) - (local.get $temp) - ) - ) - (return - (local.get $10) - ) - ) - (func $many-single-uses-with-param (param $x i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (nop) - (local.set $2 - (i32.mul - (i32.const 10) - (local.get $x) - ) - ) - (nop) - (local.set $4 - (i32.ctz - (local.get $x) - ) - ) - (local.set $5 - (i32.sub - (local.get $4) - (i32.const 20) - ) - ) - (local.set $6 - (i32.add - (local.get $2) - (local.get $5) - ) - ) - (local.set $7 - (i32.eqz - (local.get $6) - ) - ) - (return - (local.get $7) - ) - (unreachable) - ) - (func $55 (param $var$0 i32) - (local $var$1 i32) - (local $var$2 i32) - (local $var$3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (nop) - (nop) - (local.set $var$0 - (i32.add - (local.get $var$0) - (i32.const -7) - ) - ) - (nop) - (if - (local.get $var$0) - (block $label$2 - (block $label$3 - (nop) - (local.set $var$1 - (local.get $var$0) - ) - (nop) - (local.set $8 - (i32.const 12) - ) - (br_if $label$3 - (local.get $8) - ) - (unreachable) - (unreachable) - ) - (nop) - (local.set $10 - (i32.eqz - (local.get $var$1) - ) - ) - (br_if $label$2 - (local.get $10) - ) - (block - (local.set $11 - (i32.load - (i32.const 0) - ) - ) - (nop) - (local.set $13 - (i32.ne - (local.get $11) - (local.get $var$0) - ) - ) - (if - (local.get $13) - (block - (unreachable) - (unreachable) - ) - ) - ) - (unreachable) - (unreachable) - ) - ) - ) - (func $multiple-uses-to-non-expression (param $x i32) - (local $temp i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 10) - ) - ) - (nop) - (i32.store - (i32.const 1) - (local.get $x) - ) - (nop) - (local.set $6 - (i32.add - (local.get $x) - (i32.const 20) - ) - ) - (i32.store - (i32.const 2) - (local.get $6) - ) - ) - (func $nested-phi-forwarding (param $var$0 i32) (result i32) - (local $var$1 i32) - (local $var$2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (block - (block $label$1 - (block $label$2 - (loop $label$3 - (block $label$4 - (block $label$5 - (block $label$6 - (block $label$7 - (block $label$8 - (nop) - (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) - ) - (unreachable) - ) - (local.set $var$1 - (i32.const 1) - ) - ) - (br $label$4) - (unreachable) - ) - (unreachable) - (unreachable) - ) - (br $label$1) - (unreachable) - ) - (local.set $var$2 - (i32.const 1) - ) - (nop) - (br_if $label$3 - (local.get $var$2) - ) - ) - ) - (block $label$9 - (nop) - (local.set $6 - (i32.or - (i32.const 1) - (local.get $var$1) - ) - ) - (br_if $label$9 - (local.get $6) - ) - ) - (unreachable) - (unreachable) - ) - (nop) - (i32.store offset=176 - (i32.const 0) - (local.get $var$2) - ) - (nop) - ) - (local.set $9 - (i32.const 0) - ) - (return - (local.get $9) - ) - ) - (func $zext-numGets (param $var$0 i32) (param $var$1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (block $label$1 - (local.set $2 - (i32.load - (i32.const -8) - ) - ) - (local.set $3 - (i32.const 1) - ) - (br_if $label$1 - (local.get $2) - ) - (nop) - (drop - (local.get $3) - ) - (local.set $5 - (i32.load - (i32.const -16) - ) - ) - (nop) - (local.set $3 - (i32.eqz - (local.get $5) - ) - ) - ) - (nop) - (local.set $8 - (i32.ctz - (local.get $3) - ) - ) - (if - (local.get $8) - (block - (unreachable) - (unreachable) - ) - ) - ) - (func $zext-numGets-hasAnotherUse (param $var$0 i32) (param $var$1 i32) - (local $temp i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (block $label$1 - (local.set $3 - (i32.load - (i32.const -8) - ) - ) - (local.set $4 - (i32.const 1) - ) - (br_if $label$1 - (local.get $3) - ) - (nop) - (drop - (local.get $4) - ) - (local.set $6 - (i32.load - (i32.const -16) - ) - ) - (nop) - (local.set $temp - (i32.eqz - (local.get $6) - ) - ) - (nop) - (drop - (local.get $temp) - ) - (nop) - (local.set $4 - (local.get $temp) - ) - ) - (nop) - (local.set $11 - (i32.ctz - (local.get $4) - ) - ) - (if - (local.get $11) - (block - (unreachable) - (unreachable) - ) - ) - ) - (func $flipped-needs-right-origin (param $var$0 i32) (result i32) - (local $var$1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (block - (block $label$1 - (local.set $2 - (i32.load - (i32.const 1) - ) - ) - (br_if $label$1 - (local.get $2) - ) - (local.set $var$1 - (i32.const 2) - ) - ) - (block - (nop) - (local.set $4 - (i32.add - (local.get $var$1) - (i32.const 4) - ) - ) - (local.set $5 - (i32.gt_s - (i32.const 3) - (local.get $4) - ) - ) - (if - (local.get $5) - (block - (unreachable) - (unreachable) - ) - ) - ) - (nop) - ) - (local.set $7 - (i32.const 5) - ) - (return - (local.get $7) - ) - ) - (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) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (block - (nop) - (nop) - (local.set $var$1 - (i32.gt_u - (local.get $var$1) - (i32.const 1) - ) - ) - (nop) - (i32.store - (local.get $var$1) - (i32.const 2) - ) - (nop) - (local.set $7 - (i32.sub - (i32.const 4) - (local.get $var$1) - ) - ) - (i32.store offset=8 - (i32.const 3) - (local.get $7) - ) - (unreachable) - (unreachable) - ) - (nop) - (return - (local.get $8) - ) - ) - (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) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (loop $label$1 - (block - (if - (i32.const 0) - (block - (block $block - (nop) - (local.set $var$2 - (i32.add - (i32.const 0) - (i32.const 1) - ) - ) - (br $label$1) - (unreachable) - ) - (unreachable) - ) - ) - (nop) - (nop) - (nop) - (nop) - (br $label$1) - (unreachable) - ) - (unreachable) - ) - (unreachable) - ) - (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 $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (block - (local.set $var$1 - (i32.const 1) - ) - (if - (i32.const 0) - (loop $label$2 - (block - (nop) - (if - (local.get $var$1) - (nop) - ) - ) - (local.set $var$3 - (i32.const 1) - ) - (nop) - (nop) - (local.set $var$1 - (i32.sub - (i32.const 0) - (local.get $var$3) - ) - ) - (br_if $label$2 - (i32.const 0) - ) - ) - ) - (block - (nop) - (if - (local.get $var$1) - (local.set $var$3 - (i32.const 1) - ) - ) - ) - (nop) - (local.set $14 - (i32.add - (local.get $var$3) - (i32.const 16) - ) - ) - (i32.store - (i32.const 8) - (local.get $14) - ) - (i32.store - (i32.const 8) - (i32.const 64) - ) - (unreachable) - (unreachable) - ) - (nop) - (return - (local.get $15) - ) - ) -) diff --git a/test/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.wast b/test/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.wast deleted file mode 100644 index 709a3645a..000000000 --- a/test/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.wast +++ /dev/null @@ -1,1246 +0,0 @@ -(module - (memory $0 (shared 1 1)) - ;; Figure 1a from the Souper paper https://arxiv.org/pdf/1711.04422.pdf - (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 - (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 - (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) - ) - ) - ) - ;; flipping of greater than/or equals ops, which are not in Souper IR - (func $flips - (local $x i32) - (local $y i32) - (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))) - ) - (func $various-conditions-1 (param $x i32) - (if - (local.get $x) - (local.set $x - (i32.add - (local.get $x) - (i32.const 1) - ) - ) - ) - ) - (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) - ) - ) - ) - ) - (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) - ) - ) - ) - ) - (func $various-conditions-4 (param $x i32) - (if - (unreachable) - (local.set $x - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - ) - ) - (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) - ) - ) - ) - ) - ) - ) - (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) - ) - ) - ) - ) - (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) - ) - ) - ) - ) - (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) - ) - ) - ) - (func $trivial-ret (result i32) - (i32.add - (i32.const 0) - (i32.const 1) - ) - ) - (func $trivial-const (result i32) - (i32.const 0) - ) - (func $trivial-const-block (result i32) - (nop) - (i32.const 0) - ) - (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) - ) - ) - (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) - ) - (func $select (param $x i32) (result i32) - (return - (select - (i32.const 1) - (i32.const 2) - (i32.const 3) - ) - ) - ) - (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) - ) - ) - ) - ) - (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) - ) - ) - (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) - ) - ) - (func $zero_init-phi-bad_type (result f64) - (local $x f64) - (if - (i32.const 0) - (local.set $x - (f64.const 1) - ) - ) - (local.get $x) - ) - (func $phi-bad-type (result f64) - (block $label$1 (result f64) - (if (result f64) - (i32.const 0) - (f64.const 0) - (f64.const 1) - ) - ) - ) - (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) - ) - (func $call (result i32) - (return - (i32.mul - (i32.add - (call $call) - (call $call) - ) - (i32.add - (i32.const 10) - (call $call) - ) - ) - ) - ) - (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) - ) - ) - (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) - ) - ) - (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) - ) - ) - (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) - ) - ) - (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) - ) - ) - (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) - ) - ) - (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) - ) - ) - ) - (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) - ) - (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) - ) - (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)) - ) - (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))) - ) - (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))) - ) - (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))) - ) - (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))) - ) - (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))) - ) - (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))) - ) - (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))) - ) - (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) - ) - ) - ) - ) - (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))) - ) - (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))) - ) - (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))) - ) - (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))) - ) - (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))) - ) - (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))) - ) - (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) - ) - ) - ) - ) - (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) - ) - ) - (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) - ) - (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)) - ) - (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)) - ) - (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) - ) - ) - ) - (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) - ) - ) - ) - (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) - ) - (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) - ) - ) - (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) - ) - ) - (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) - ) - (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) - ) - (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) - ) - ) - (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) - ) -) diff --git a/test/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.txt b/test/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.txt deleted file mode 100644 index f7c4860ec..000000000 --- a/test/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.txt +++ /dev/null @@ -1,4877 +0,0 @@ - -; function: figure-1a - -; start LHS (in figure-1a) -%0:i64 = var -%1:i64 = var -%2 = eq %0, %1 -infer %2 - - -; start LHS (in figure-1a) -%0:i64 = var -%1:i64 = var -%2 = ne %0, %1 -infer %2 - - -; start LHS (in figure-1a) -%0:i64 = var -%1:i64 = var -%2 = eq %0, %1 -%3:i32 = zext %2 -%4:i64 = var -%5 = ne %0, %4 -%6:i32 = zext %5 -%7 = and %3, %6 -infer %7 - - -; function: figure-1b - -; start LHS (in figure-1b) -%0:i64 = var -%1:i64 = var -%2 = slt %0, %1 -infer %2 - - -; start LHS (in figure-1b) -%0:i64 = var -%1:i64 = var -%2 = eq %0, %1 -%3:i64 = var -%4 = slt %1, %3 -pc %4 1:i1 -infer %2 - - -; start LHS (in figure-1b) -%0:i64 = var -%1:i64 = var -%2 = ne %0, %1 -%3:i64 = var -%4 = slt %3, %1 -pc %4 1:i1 -infer %2 - - -; start LHS (in figure-1b) -%0:i64 = var -%1:i64 = var -%2 = eq %0, %1 -%3:i32 = zext %2 -%4:i64 = var -%5 = ne %0, %4 -%6:i32 = zext %5 -%7 = and %3, %6 -%8 = slt %1, %4 -pc %8 1:i1 -infer %7 - - -; function: figure-3-if - -; start LHS (in figure-3-if) -%0:i32 = var -%1 = and %0, 1:i32 -infer %1 - - -; start LHS (in figure-3-if) -%0:i32 = var -%1 = add %0, 1:i32 -%2 = and %0, 1:i32 -%3 = ne %2, 0:i32 -pc %3 1:i1 -infer %1 - - -; start LHS (in figure-3-if) -%0:i32 = var -%1 = add %0, 2:i32 -%2 = and %0, 1:i32 -%3 = eq %2, 0:i32 -pc %3 1:i1 -infer %1 - - -; start LHS (in figure-3-if) -%0 = block 2 -%1:i32 = var -%2 = add %1, 1:i32 -%3 = add %1, 2:i32 -%4 = phi %0, %2, %3 -%5 = and %4, 1:i32 -%6 = and %1, 1:i32 -%7 = ne %6, 0:i32 -blockpc %0 0 %7 1:i1 -%8 = eq %6, 0:i32 -blockpc %0 1 %8 1:i1 -infer %5 - - -; function: send-i32 - -; function: flips - -; start LHS (in flips) -%0 = sle 0:i32, 0:i32 -infer %0 - - -; start LHS (in flips) -%0 = sle 0:i32, 0:i32 -%1:i32 = zext %0 -%2 = ule 0:i32, %1 -infer %2 - - -; start LHS (in flips) -%0 = sle 0:i32, 0:i32 -%1:i32 = zext %0 -%2 = ule 0:i32, %1 -%3:i32 = zext %2 -%4 = slt 0:i32, %3 -infer %4 - - -; start LHS (in flips) -%0 = sle 0:i32, 0:i32 -%1:i32 = zext %0 -%2 = ule 0:i32, %1 -%3:i32 = zext %2 -%4 = slt 0:i32, %3 -%5:i32 = zext %4 -%6 = ult 0:i32, %5 -infer %6 - - -; start LHS (in flips) -%0 = sle 0:i64, 0:i64 -infer %0 - - -; start LHS (in flips) -%0 = ule 0:i64, 0:i64 -infer %0 - - -; start LHS (in flips) -%0 = slt 0:i64, 0:i64 -infer %0 - - -; start LHS (in flips) -%0 = ult 0:i64, 0:i64 -infer %0 - - -; function: various-conditions-1 - -; start LHS (in various-conditions-1) -%0:i32 = var -%1 = add %0, 1:i32 -%2 = ne %0, 0:i32 -pc %2 1:i1 -infer %1 - - -; function: various-conditions-2 - -; start LHS (in various-conditions-2) -%0:i32 = var -%1 = slt %0, 0:i32 -infer %1 - - -; start LHS (in various-conditions-2) -%0:i32 = var -%1 = sub %0, 2:i32 -%2 = slt %0, 0:i32 -pc %2 1:i1 -infer %1 - - -; function: various-conditions-3 - -; start LHS (in various-conditions-3) -%0:i32 = var -%1 = sub %0, 4:i32 -%2:i32 = var -%3 = ne %2, 0:i32 -pc %3 1:i1 -infer %1 - - -; function: various-conditions-4 - -; function: unaries - -; start LHS (in unaries) -%0:i32 = var -%1 = eq %0, 0:i32 -infer %1 - - -; start LHS (in unaries) -%0:i32 = var -%1 = cttz %0 -%2:i32 = var -%3 = eq %2, 0:i32 -pc %3 1:i1 -infer %1 - - -; start LHS (in unaries) -%0:i32 = var -%1 = ctlz %0 -%2 = eq %0, 0:i32 -pc %2 1:i1 -infer %1 - - -; start LHS (in unaries) -%0:i32 = var -%1 = ctpop %0 -%2:i32 = var -%3 = eq %2, 0:i32 -pc %3 1:i1 -infer %1 - - -; start LHS (in unaries) -%0:i32 = var -%1 = ctlz %0 -%2:i32 = var -%3 = ctpop %2 -%4 = sub %1, %3 -%5 = eq %0, 0:i32 -pc %5 1:i1 -infer %4 - - -; start LHS (in unaries) -%0:i32 = var -%1 = cttz %0 -%2:i32 = var -%3 = ctlz %2 -%4 = ctpop %0 -%5 = sub %3, %4 -%6 = add %1, %5 -%7 = eq %2, 0:i32 -pc %7 1:i1 -infer %6 - - -; function: unary-condition - -; start LHS (in unary-condition) -%0:i32 = var -%1 = ult 1:i32, %0 -infer %1 - - -; start LHS (in unary-condition) -%0:i32 = var -%1 = ult 1:i32, %0 -%2:i32 = zext %1 -%3 = cttz %2 -infer %3 - - -; start LHS (in unary-condition) -%0:i32 = var -%1 = add %0, 2:i32 -%2 = ult 1:i32, %0 -%3:i32 = zext %2 -%4 = cttz %3 -%5 = ne %4, 0:i32 -pc %5 1:i1 -infer %1 - - -; function: unary-condition-2 - -; start LHS (in unary-condition-2) -%0:i32 = var -%1 = ult 1:i32, %0 -infer %1 - - -; start LHS (in unary-condition-2) -%0:i32 = var -%1 = ult 1:i32, %0 -%2:i32 = zext %1 -%3 = eq %2, 0:i32 -infer %3 - - -; start LHS (in unary-condition-2) -%0:i32 = var -%1 = add %0, 2:i32 -%2 = ult 1:i32, %0 -%3:i32 = zext %2 -%4 = eq %3, 0:i32 -pc %4 1:i1 -infer %1 - - -; function: if-else-cond - -; start LHS (in if-else-cond) -%0:i32 = var -%1 = slt %0, 1:i32 -infer %1 - - -; start LHS (in if-else-cond) -%0:i32 = var -%1 = add %0, 1:i32 -%2 = slt %0, 1:i32 -pc %2 1:i1 -infer %1 - - -; start LHS (in if-else-cond) -%0:i32 = var -%1 = add %0, 2:i32 -%2 = slt %0, 1:i32 -%3:i32 = zext %2 -%4 = eq %3, 0:i32 -pc %4 1:i1 -infer %1 - - -; start LHS (in if-else-cond) -%0 = block 2 -%1:i32 = var -%2 = add %1, 1:i32 -%3 = add %1, 2:i32 -%4 = phi %0, %2, %3 -%5 = and %4, 1:i32 -%6 = slt %1, 1:i32 -blockpc %0 0 %6 1:i1 -%7:i32 = zext %6 -%8 = eq %7, 0:i32 -blockpc %0 1 %8 1:i1 -infer %5 - - -; function: trivial-ret - -; start LHS (in trivial-ret) -%0 = add 0:i32, 1:i32 -infer %0 - - -; function: trivial-const - -; function: trivial-const-block - -; function: bad-phi-value - -; function: bad-phi-value-2 - -; function: select - -; start LHS (in select) -%0 = ne 3:i32, 0:i32 -infer %0 - - -; start LHS (in select) -%0 = ne 3:i32, 0:i32 -%1 = select %0, 1:i32, 2:i32 -infer %1 - - -; function: select-2 - -; start LHS (in select-2) -%0:i32 = var -%1:i32 = var -%2 = add %0, %1 -infer %2 - - -; start LHS (in select-2) -%0:i32 = var -%1 = add %0, 1:i32 -infer %1 - - -; start LHS (in select-2) -%0:i32 = var -%1 = add 2:i32, %0 -infer %1 - - -; start LHS (in select-2) -%0:i32 = var -%1 = add 2:i32, %0 -%2 = ne %1, 0:i32 -infer %2 - - -; start LHS (in select-2) -%0:i32 = var -%1 = add 2:i32, %0 -%2 = ne %1, 0:i32 -%3:i32 = var -%4 = add %3, %0 -%5 = add %3, 1:i32 -%6 = select %2, %4, %5 -infer %6 - - -; function: block-phi-1 - -; start LHS (in block-phi-1) -%0:i32 = var -%1 = add %0, 1:i32 -infer %1 - - -; start LHS (in block-phi-1) -%0:i32 = var -%1 = add %0, 1:i32 (hasExternalUses) -%2 = add %1, 2:i32 -infer %2 - - -; start LHS (in block-phi-1) -%0 = block 2 -%1:i32 = var -%2 = add %1, 1:i32 -%3 = add %2, 2:i32 -%4 = phi %0, %2, %3 -%5 = add %4, 3:i32 -infer %5 - - -; function: block-phi-2 - -; start LHS (in block-phi-2) -%0 = block 2 -%1 = phi %0, 1:i32, 2:i32 -%2 = add %1, 3:i32 -infer %2 - - -; function: zero_init-phi-bad_type - -; function: phi-bad-type - -; function: phi-one-side-i1 - -; start LHS (in phi-one-side-i1) -%0:i32 = var -%1:i32 = var -%2 = sle %0, %1 -infer %2 - - -; start LHS (in phi-one-side-i1) -%0:i32 = var -%1:i32 = var -%2 = eq %0, %1 -%3 = sle %0, %1 -pc %3 1:i1 -infer %2 - - -; start LHS (in phi-one-side-i1) -%0:i32 = var -%1:i32 = var -%2 = add %0, %1 -%3 = sle %0, %1 -%4:i32 = zext %3 -%5 = eq %4, 0:i32 -pc %5 1:i1 -infer %2 - - -; function: call - -; start LHS (in call) -%0:i32 = var -%1:i32 = var -%2 = add %0, %1 -infer %2 - - -; start LHS (in call) -%0:i32 = var -%1 = add 10:i32, %0 -infer %1 - - -; start LHS (in call) -%0:i32 = var -%1:i32 = var -%2 = add %0, %1 -%3:i32 = var -%4 = add 10:i32, %3 -%5 = mul %2, %4 -infer %5 - - -; function: in-unreachable-1 - -; function: in-unreachable-2 - -; function: in-unreachable-3 - -; function: in-unreachable-4 - -; function: in-unreachable-br_if - -; function: in-unreachable-big - -; function: in-unreachable-operations - -; function: merge-with-one-less - -; function: deep - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -infer %1 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -infer %2 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -infer %3 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -infer %4 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -infer %5 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -infer %6 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -infer %7 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -infer %8 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -%9 = xor %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = mul %0, 1234:i32 -%2 = xor %1, 1234:i32 -%3 = mul %2, 1234:i32 -%4 = xor %3, 1234:i32 -%5 = mul %4, 1234:i32 -%6 = xor %5, 1234:i32 -%7 = mul %6, 1234:i32 -%8 = xor %7, 1234:i32 -%9 = mul %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -%9 = xor %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = mul %0, 1234:i32 -%2 = xor %1, 1234:i32 -%3 = mul %2, 1234:i32 -%4 = xor %3, 1234:i32 -%5 = mul %4, 1234:i32 -%6 = xor %5, 1234:i32 -%7 = mul %6, 1234:i32 -%8 = xor %7, 1234:i32 -%9 = mul %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -%9 = xor %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = mul %0, 1234:i32 -%2 = xor %1, 1234:i32 -%3 = mul %2, 1234:i32 -%4 = xor %3, 1234:i32 -%5 = mul %4, 1234:i32 -%6 = xor %5, 1234:i32 -%7 = mul %6, 1234:i32 -%8 = xor %7, 1234:i32 -%9 = mul %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -%9 = xor %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = mul %0, 1234:i32 -%2 = xor %1, 1234:i32 -%3 = mul %2, 1234:i32 -%4 = xor %3, 1234:i32 -%5 = mul %4, 1234:i32 -%6 = xor %5, 1234:i32 -%7 = mul %6, 1234:i32 -%8 = xor %7, 1234:i32 -%9 = mul %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -%9 = xor %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = mul %0, 1234:i32 -%2 = xor %1, 1234:i32 -%3 = mul %2, 1234:i32 -%4 = xor %3, 1234:i32 -%5 = mul %4, 1234:i32 -%6 = xor %5, 1234:i32 -%7 = mul %6, 1234:i32 -%8 = xor %7, 1234:i32 -%9 = mul %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -%9 = xor %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = mul %0, 1234:i32 -%2 = xor %1, 1234:i32 -%3 = mul %2, 1234:i32 -%4 = xor %3, 1234:i32 -%5 = mul %4, 1234:i32 -%6 = xor %5, 1234:i32 -%7 = mul %6, 1234:i32 -%8 = xor %7, 1234:i32 -%9 = mul %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -%9 = xor %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = mul %0, 1234:i32 -%2 = xor %1, 1234:i32 -%3 = mul %2, 1234:i32 -%4 = xor %3, 1234:i32 -%5 = mul %4, 1234:i32 -%6 = xor %5, 1234:i32 -%7 = mul %6, 1234:i32 -%8 = xor %7, 1234:i32 -%9 = mul %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -%9 = xor %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = mul %0, 1234:i32 -%2 = xor %1, 1234:i32 -%3 = mul %2, 1234:i32 -%4 = xor %3, 1234:i32 -%5 = mul %4, 1234:i32 -%6 = xor %5, 1234:i32 -%7 = mul %6, 1234:i32 -%8 = xor %7, 1234:i32 -%9 = mul %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = xor %0, 1234:i32 -%2 = mul %1, 1234:i32 -%3 = xor %2, 1234:i32 -%4 = mul %3, 1234:i32 -%5 = xor %4, 1234:i32 -%6 = mul %5, 1234:i32 -%7 = xor %6, 1234:i32 -%8 = mul %7, 1234:i32 -%9 = xor %8, 1234:i32 -infer %9 - - -; start LHS (in deep) -%0:i32 = var -%1 = mul %0, 1234:i32 -%2 = xor %1, 1234:i32 -%3 = mul %2, 1234:i32 -%4 = xor %3, 1234:i32 -%5 = mul %4, 1234:i32 -%6 = xor %5, 1234:i32 -%7 = mul %6, 1234:i32 -%8 = xor %7, 1234:i32 -%9 = mul %8, 1234:i32 -infer %9 - - -; function: two-pcs - -; start LHS (in two-pcs) -%0:i64 = var -%1:i64 = var -%2 = slt %0, %1 -infer %2 - - -; start LHS (in two-pcs) -%0:i64 = var -%1 = eq %0, 0:i64 -%2:i64 = var -%3 = slt %0, %2 -pc %3 1:i1 -infer %1 - - -; start LHS (in two-pcs) -%0:i64 = var -%1:i64 = var -%2 = add %0, %1 -%3 = eq %0, 0:i64 -%4 = slt %0, %1 -pc %3 1:i1 -pc %4 1:i1 -infer %2 - - -; start LHS (in two-pcs) -%0:i64 = var -%1:i64 = var -%2 = sub %0, %1 -%3 = eq %0, 0:i64 -%4:i32 = zext %3 -%5 = eq %4, 0:i32 -%6 = slt %0, %1 -pc %5 1:i1 -pc %6 1:i1 -infer %2 - - -; start LHS (in two-pcs) -%0:i64 = var -%1 = eq %0, 0:i64 -%2:i64 = var -%3 = slt %2, %0 -%4:i32 = zext %3 -%5 = eq %4, 0:i32 -pc %5 1:i1 -infer %1 - - -; start LHS (in two-pcs) -%0:i64 = var -%1:i64 = var -%2 = mul %0, %1 -%3 = eq %1, 0:i64 -%4 = slt %0, %1 -%5:i32 = zext %4 -%6 = eq %5, 0:i32 -pc %3 1:i1 -pc %6 1:i1 -infer %2 - - -; start LHS (in two-pcs) -%0:i64 = var -%1:i64 = var -%2 = sdiv %0, %1 -%3 = eq %1, 0:i64 -%4:i32 = zext %3 -%5 = eq %4, 0:i32 -%6 = slt %0, %1 -%7:i32 = zext %6 -%8 = eq %7, 0:i32 -pc %5 1:i1 -pc %8 1:i1 -infer %2 - - -; function: loop-1 - -; start LHS (in loop-1) -%0 = add 1:i32, 2:i32 -infer %0 - - -; function: loop-2 - -; start LHS (in loop-2) -%0 = add 1:i32, 3:i32 -infer %0 - - -; start LHS (in loop-2) -%0 = add 2:i32, 4:i32 -infer %0 - - -; start LHS (in loop-2) -%0 = add 1:i32, 3:i32 -%1 = add 2:i32, 4:i32 -%2 = add %0, %1 -infer %2 - - -; function: loop-3 - -; start LHS (in loop-3) -%0:i32 = var -%1 = add %0, 3:i32 -infer %1 - - -; start LHS (in loop-3) -%0:i32 = var -%1 = add %0, 4:i32 -infer %1 - - -; start LHS (in loop-3) -%0:i32 = var -%1 = add %0, 3:i32 -%2:i32 = var -%3 = add %2, 4:i32 (hasExternalUses) -%4 = add %1, %3 -infer %4 - - -; function: loop-4 - -; start LHS (in loop-4) -%0:i32 = var -%1 = add %0, 3:i32 -infer %1 - - -; start LHS (in loop-4) -%0:i32 = var -%1 = add %0, 3:i32 -%2 = add %1, 2:i32 -infer %2 - - -; function: loop-5 - -; start LHS (in loop-5) -%0:i32 = var -%1 = add %0, 3:i32 -infer %1 - - -; start LHS (in loop-5) -%0:i32 = var -%1 = add %0, 3:i32 -%2 = add %1, 2:i32 -infer %2 - - -; function: loop-6 - -; start LHS (in loop-6) -%0:i32 = var -%1 = add %0, 3:i32 -infer %1 - - -; start LHS (in loop-6) -%0:i32 = var -%1 = add %0, 3:i32 -%2 = add %1, 2:i32 -infer %2 - - -; function: loop-7 - -; start LHS (in loop-7) -%0:i32 = var -%1 = add %0, 3:i32 -infer %1 - - -; start LHS (in loop-7) -%0:i32 = var -%1 = add %0, 3:i32 -%2 = add %1, 5:i32 -infer %2 - - -; function: loop-8 - -; start LHS (in loop-8) -%0 = add 1:i32, 4:i32 -infer %0 - - -; start LHS (in loop-8) -%0:i32 = var -%1 = sub 1:i32, %0 -infer %1 - - -; start LHS (in loop-8) -%0 = add 1:i32, 4:i32 -%1:i32 = var -%2 = sub 1:i32, %1 -%3 = mul %0, %2 -infer %3 - - -; function: loop-9 - -; start LHS (in loop-9) -%0:i32 = var -%1:i32 = var -%2 = add %0, %1 -infer %2 - - -; function: loop-10 - -; start LHS (in loop-10) -%0:i32 = var -%1:i32 = var -%2 = add %0, %1 -infer %2 - - -; function: loop-multicond-1 - -; start LHS (in loop-multicond-1) -%0 = ne 6:i32, 0:i32 -infer %0 - - -; start LHS (in loop-multicond-1) -%0 = ne 6:i32, 0:i32 -%1 = select %0, 4:i32, 5:i32 -infer %1 - - -; function: loop-multicond-2 - -; start LHS (in loop-multicond-2) -%0:i32 = var -%1 = add %0, 4:i32 -infer %1 - - -; start LHS (in loop-multicond-2) -%0:i32 = var -%1 = add %0, 5:i32 -infer %1 - - -; start LHS (in loop-multicond-2) -%0 = add 3:i32, 6:i32 -infer %0 - - -; start LHS (in loop-multicond-2) -%0 = add 3:i32, 6:i32 -%1 = ne %0, 0:i32 -infer %1 - - -; start LHS (in loop-multicond-2) -%0 = add 3:i32, 6:i32 -%1 = ne %0, 0:i32 -%2:i32 = var -%3 = add %2, 4:i32 -%4:i32 = var -%5 = add %4, 5:i32 -%6 = select %1, %3, %5 -infer %6 - - -; function: loop-block-1 - -; start LHS (in loop-block-1) -%0:i32 = var -%1 = add %0, 4:i32 -infer %1 - - -; start LHS (in loop-block-1) -%0:i32 = var -%1 = add %0, 5:i32 -infer %1 - - -; start LHS (in loop-block-1) -%0:i32 = var -%1 = add %0, 6:i32 -infer %1 - - -; start LHS (in loop-block-1) -%0:i32 = var -%1 = ne %0, 0:i32 -infer %1 - - -; start LHS (in loop-block-1) -%0:i32 = var -%1 = ne %0, 0:i32 -%2:i32 = var -%3 = add %2, 4:i32 -%4 = block 2 -%5:i32 = var -%6 = add %5, 5:i32 -%7 = phi %4, %5, %6 -%8 = select %1, %3, %7 -infer %8 - - -; function: loop-block-2 - -; start LHS (in loop-block-2) -%0:i32 = var -%1 = add %0, 4:i32 -infer %1 - - -; start LHS (in loop-block-2) -%0:i32 = var -%1 = add %0, 5:i32 -infer %1 - - -; start LHS (in loop-block-2) -%0:i32 = var -%1 = add %0, 6:i32 -infer %1 - - -; start LHS (in loop-block-2) -%0:i32 = var -%1 = ne %0, 0:i32 -infer %1 - - -; start LHS (in loop-block-2) -%0:i32 = var -%1 = ne %0, 0:i32 -%2:i32 = var -%3 = add %2, 4:i32 -%4 = block 2 -%5:i32 = var -%6 = add %5, 5:i32 -%7 = phi %4, %5, %6 -%8 = select %1, %3, %7 -infer %8 - - -; function: bad-phi-type - -; function: loop-unreachable - -; function: phi-value-turns-bad - -; start LHS (in phi-value-turns-bad) -%0:i32 = var -%1 = ctlz %0 -%2 = eq %0, 0:i32 -pc %2 1:i1 -infer %1 - - -; function: multi-use - -; start LHS (in multi-use) -%0:i32 = var -%1 = add %0, 1:i32 -infer %1 - - -; start LHS (in multi-use) -%0:i32 = var -%1 = add %0, 1:i32 -%2 = add %1, %1 -infer %2 - - -; function: multi-use-2 - -; start LHS (in multi-use-2) -%0:i32 = var -%1 = add %0, 1:i32 -infer %1 - - -; start LHS (in multi-use-2) -%0:i32 = var -%1 = add %0, 1:i32 (hasExternalUses) -%2 = mul %1, 2:i32 -infer %2 - - -; start LHS (in multi-use-2) -%0:i32 = var -%1 = add %0, 1:i32 -%2 = mul %1, 2:i32 -%3 = sub %2, %1 -infer %3 - - -; function: many-single-uses-with-param - -; start LHS (in many-single-uses-with-param) -%0:i32 = var -%1 = mul 10:i32, %0 -infer %1 - - -; start LHS (in many-single-uses-with-param) -%0:i32 = var -%1 = cttz %0 -infer %1 - - -; start LHS (in many-single-uses-with-param) -%0:i32 = var -%1 = cttz %0 -%2 = sub %1, 20:i32 -infer %2 - - -; start LHS (in many-single-uses-with-param) -%0:i32 = var -%1 = mul 10:i32, %0 -%2 = cttz %0 -%3 = sub %2, 20:i32 -%4 = add %1, %3 -infer %4 - - -; start LHS (in many-single-uses-with-param) -%0:i32 = var -%1 = mul 10:i32, %0 -%2 = cttz %0 -%3 = sub %2, 20:i32 -%4 = add %1, %3 -%5 = eq %4, 0:i32 -infer %5 - - -; function: 56 - -; start LHS (in 56) -%0:i32 = var -%1 = add %0, -7:i32 -infer %1 - - -; start LHS (in 56) -%0:i32 = var -%1 = add %0, -7:i32 (hasExternalUses) -%2 = eq %1, 0:i32 -%3 = ne %1, 0:i32 -pc %3 1:i1 -infer %2 - - -; start LHS (in 56) -%0:i32 = var -%1:i32 = var -%2 = add %1, -7:i32 (hasExternalUses) -%3 = ne %0, %2 -%4 = ne %2, 0:i32 -pc %4 1:i1 -infer %3 - - -; function: multiple-uses-to-non-expression - -; start LHS (in multiple-uses-to-non-expression) -%0:i32 = var -%1 = add %0, 10:i32 -infer %1 - - -; start LHS (in multiple-uses-to-non-expression) -%0:i32 = var -%1 = add %0, 10:i32 (hasExternalUses) -%2 = add %1, 20:i32 -infer %2 - - -; function: nested-phi-forwarding - -; start LHS (in nested-phi-forwarding) -%0 = block 2 -%1:i32 = var -%2 = block 2 -%3 = block 2 -%4 = phi %3, %1, 1:i32 -%5 = phi %2, %1, %4 -%6 = phi %0, %1, %5 -%7 = or 1:i32, %6 -infer %7 - - -; function: zext-numGets - -; start LHS (in zext-numGets) -%0:i32 = var -%1 = eq %0, 0:i32 -infer %1 - - -; start LHS (in zext-numGets) -%0 = block 2 -%1:i32 = var -%2 = eq %1, 0:i32 -%3:i32 = zext %2 -%4 = phi %0, 1:i32, %3 -%5 = cttz %4 -infer %5 - - -; function: zext-numGets-hasAnotherUse - -; start LHS (in zext-numGets-hasAnotherUse) -%0:i32 = var -%1 = eq %0, 0:i32 -infer %1 - - -; start LHS (in zext-numGets-hasAnotherUse) -%0 = block 2 -%1:i32 = var -%2 = eq %1, 0:i32 -%3:i32 = zext %2 -%4 = phi %0, 1:i32, %3 -%5 = cttz %4 -infer %5 - - -; function: flipped-needs-right-origin - -; start LHS (in flipped-needs-right-origin) -%0 = block 2 -%1 = phi %0, 0:i32, 2:i32 -%2 = add %1, 4:i32 -infer %2 - - -; start LHS (in flipped-needs-right-origin) -%0 = block 2 -%1 = phi %0, 0:i32, 2:i32 -%2 = add %1, 4:i32 -%3 = slt %2, 3:i32 -infer %3 - - -; function: non-expr-nodes-may-have-multiple-uses-too-its-the-ORIGIN - -; start LHS (in non-expr-nodes-may-have-multiple-uses-too-its-the-ORIGIN) -%0:i32 = var -%1 = ult 1:i32, %0 -infer %1 - - -; start LHS (in non-expr-nodes-may-have-multiple-uses-too-its-the-ORIGIN) -%0:i32 = var -%1 = ult 1:i32, %0 (hasExternalUses) -%2:i32 = zext %1 -%3 = sub 4:i32, %2 -infer %3 - - -; function: loop-of-set-connections - -; start LHS (in loop-of-set-connections) -%0 = add 0:i32, 1:i32 -%1 = ne 0:i32, 0:i32 -pc %1 1:i1 -infer %0 - - -; function: conditions-in-conditions - -; start LHS (in conditions-in-conditions) -%0 = sub 0:i32, 1:i32 -%1 = ne 0:i32, 0:i32 -pc %1 1:i1 -infer %0 - - -; start LHS (in conditions-in-conditions) -%0 = block 2 -%1 = block 2 -%2 = phi %1, 0:i32, 1:i32 -%3 = phi %0, %2, 1:i32 -%4 = add %3, 16:i32 -%5 = ne 0:i32, 0:i32 -blockpc %1 0 %5 1:i1 -%6 = eq 0:i32, 0:i32 -blockpc %1 1 %6 1:i1 -%7 = sub 0:i32, 1:i32 -%8 = phi %1, 1:i32, %7 -%9 = ne %8, 0:i32 -blockpc %0 0 %9 1:i1 -%10 = eq %8, 0:i32 -blockpc %0 1 %10 1:i1 -infer %4 - -(module - (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) - (type $i32_=>_i32 (func (param i32) (result i32))) - (type $i32_=>_none (func (param i32))) - (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) - (type $none_=>_i32 (func (result i32))) - (type $i32_i32_=>_none (func (param i32 i32))) - (type $none_=>_f64 (func (result f64))) - (type $i64_i64_i64_=>_i32 (func (param i64 i64 i64) (result i32))) - (type $none_=>_none (func)) - (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) - (type $i64_i64_i64_=>_i64 (func (param i64 i64 i64) (result i64))) - (type $i64_i64_i32_f32_=>_none (func (param i64 i64 i32 f32))) - (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) - (memory $0 (shared 1 1)) - (export "replaced-print-internal" (func $56)) - (func $figure-1a (param $a i64) (param $x i64) (param $y i64) (result i32) - (local $i i32) - (local $j i32) - (local $r i32) - (local $6 i64) - (local $7 i64) - (local $8 i32) - (local $9 i64) - (local $10 i64) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (local $17 i32) - (block - (nop) - (nop) - (nop) - (nop) - (nop) - (nop) - (nop) - (nop) - (local.set $12 - (i64.eq - (local.get $a) - (local.get $x) - ) - ) - (local.set $13 - (i64.ne - (local.get $a) - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $15 - (i32.and - (local.get $12) - (local.get $13) - ) - ) - (return - (local.get $15) - ) - (unreachable) - ) - (nop) - (return - (local.get $16) - ) - ) - (func $figure-1b (param $a i64) (param $x i64) (param $y i64) (result i32) - (local $i i32) - (local $j i32) - (local $r i32) - (local $6 i64) - (local $7 i64) - (local $8 i32) - (local $9 i64) - (local $10 i64) - (local $11 i32) - (local $12 i64) - (local $13 i64) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (local $17 i32) - (local $18 i32) - (block - (nop) - (nop) - (local.set $8 - (i64.lt_s - (local.get $x) - (local.get $y) - ) - ) - (if - (local.get $8) - (block - (block $block - (nop) - (nop) - (nop) - (nop) - (nop) - (nop) - (nop) - (nop) - (local.set $15 - (i64.eq - (local.get $a) - (local.get $x) - ) - ) - (local.set $16 - (i64.ne - (local.get $a) - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $18 - (i32.and - (local.get $15) - (local.get $16) - ) - ) - (return - (local.get $18) - ) - (unreachable) - ) - (unreachable) - ) - (block - (unreachable) - (unreachable) - ) - ) - ) - (unreachable) - ) - (func $figure-3-if (param $x i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (block - (block - (nop) - (local.set $2 - (i32.and - (local.get $x) - (i32.const 1) - ) - ) - (if - (local.get $2) - (block - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 1) - ) - ) - ) - (block - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 2) - ) - ) - ) - ) - ) - (nop) - (local.set $8 - (i32.and - (local.get $x) - (i32.const 1) - ) - ) - (return - (local.get $8) - ) - (unreachable) - ) - (nop) - (return - (local.get $9) - ) - ) - (func $send-i32 (param $0 i32) - (nop) - ) - (func $flips - (local $x i32) - (local $y i32) - (local $z i64) - (local $w i64) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i64) - (local $17 i64) - (local $18 i32) - (local $19 i64) - (local $20 i64) - (local $21 i32) - (local $22 i64) - (local $23 i64) - (local $24 i32) - (local $25 i64) - (local $26 i64) - (local $27 i32) - (nop) - (nop) - (nop) - (local.set $x - (i32.ge_s - (local.get $x) - (local.get $y) - ) - ) - (nop) - (nop) - (nop) - (local.set $x - (i32.ge_u - (local.get $x) - (local.get $y) - ) - ) - (nop) - (nop) - (nop) - (local.set $x - (i32.gt_s - (local.get $x) - (local.get $y) - ) - ) - (nop) - (nop) - (nop) - (local.set $x - (i32.gt_u - (local.get $x) - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $18 - (i64.ge_s - (local.get $z) - (local.get $w) - ) - ) - (call $send-i32 - (local.get $18) - ) - (nop) - (nop) - (local.set $21 - (i64.ge_u - (local.get $z) - (local.get $w) - ) - ) - (call $send-i32 - (local.get $21) - ) - (nop) - (nop) - (local.set $24 - (i64.gt_s - (local.get $z) - (local.get $w) - ) - ) - (call $send-i32 - (local.get $24) - ) - (nop) - (nop) - (local.set $27 - (i64.gt_u - (local.get $z) - (local.get $w) - ) - ) - (call $send-i32 - (local.get $27) - ) - ) - (func $various-conditions-1 (param $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (nop) - (if - (local.get $x) - (block - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 1) - ) - ) - ) - ) - ) - (func $various-conditions-2 (param $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (nop) - (local.set $2 - (i32.lt_s - (local.get $x) - (i32.const 0) - ) - ) - (if - (local.get $2) - (block - (nop) - (nop) - (local.set $x - (i32.sub - (local.get $x) - (i32.const 2) - ) - ) - ) - ) - ) - (func $various-conditions-3 (param $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local.set $1 - (i32.reinterpret_f32 - (f32.const 0) - ) - ) - (if - (local.get $1) - (block - (nop) - (nop) - (local.set $x - (i32.sub - (local.get $x) - (i32.const 4) - ) - ) - ) - ) - ) - (func $various-conditions-4 (param $x i32) - (local $1 i32) - (local $2 i32) - (block - (unreachable) - (if - (unreachable) - (block - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - ) - ) - ) - (unreachable) - ) - (func $unaries (param $x i32) (param $y i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (nop) - (local.set $3 - (i32.eqz - (local.get $x) - ) - ) - (if - (local.get $3) - (block - (nop) - (local.set $5 - (i32.ctz - (local.get $y) - ) - ) - (nop) - (local.set $7 - (i32.clz - (local.get $x) - ) - ) - (nop) - (local.set $9 - (i32.popcnt - (local.get $y) - ) - ) - (local.set $10 - (i32.sub - (local.get $7) - (local.get $9) - ) - ) - (nop) - (local.set $x - (i32.add - (local.get $5) - (local.get $10) - ) - ) - ) - ) - ) - (func $unary-condition (param $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (nop) - (local.set $2 - (i32.gt_u - (local.get $x) - (i32.const 1) - ) - ) - (local.set $3 - (i32.ctz - (local.get $2) - ) - ) - (if - (local.get $3) - (block - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 2) - ) - ) - ) - ) - ) - (func $unary-condition-2 (param $x i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (nop) - (local.set $2 - (i32.gt_u - (local.get $x) - (i32.const 1) - ) - ) - (local.set $3 - (i32.eqz - (local.get $2) - ) - ) - (if - (local.get $3) - (block - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 2) - ) - ) - ) - ) - ) - (func $if-else-cond (param $x i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (block - (block - (nop) - (local.set $2 - (i32.lt_s - (local.get $x) - (i32.const 1) - ) - ) - (if - (local.get $2) - (block - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 1) - ) - ) - ) - (block - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 2) - ) - ) - ) - ) - ) - (nop) - (local.set $8 - (i32.and - (local.get $x) - (i32.const 1) - ) - ) - (return - (local.get $8) - ) - (unreachable) - ) - (nop) - (return - (local.get $9) - ) - ) - (func $trivial-ret (result i32) - (local $0 i32) - (local.set $0 - (i32.add - (i32.const 0) - (i32.const 1) - ) - ) - (return - (local.get $0) - ) - ) - (func $trivial-const (result i32) - (return - (i32.const 0) - ) - ) - (func $trivial-const-block (result i32) - (local $0 i32) - (local $1 i32) - (block - (nop) - (nop) - ) - (local.set $1 - (i32.const 0) - ) - (return - (local.get $1) - ) - ) - (func $bad-phi-value (result i32) - (local $0 i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (block - (if - (i32.const 1) - (block - (nop) - (local.set $1 - (i32.load - (i32.const 0) - ) - ) - ) - (local.set $1 - (i32.const 0) - ) - ) - (nop) - (if - (local.get $1) - (local.set $3 - (i32.const 0) - ) - (local.set $3 - (i32.const 1) - ) - ) - ) - (nop) - (return - (local.get $3) - ) - ) - (func $bad-phi-value-2 (param $x i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (block - (block - (if - (i32.const 1) - (block - (nop) - (local.set $2 - (i32.load - (i32.const 0) - ) - ) - ) - (local.set $2 - (i32.const 0) - ) - ) - (nop) - (if - (local.get $2) - (local.set $x - (i32.const 1) - ) - (local.set $x - (i32.const 2) - ) - ) - ) - (nop) - (nop) - ) - (nop) - (return - (local.get $x) - ) - ) - (func $select (param $x i32) (result i32) - (local $1 i32) - (local.set $1 - (select - (i32.const 1) - (i32.const 2) - (i32.const 3) - ) - ) - (return - (local.get $1) - ) - (unreachable) - ) - (func $select-2 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (nop) - (nop) - (local.set $4 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (nop) - (local.set $6 - (i32.add - (local.get $x) - (i32.const 1) - ) - ) - (nop) - (local.set $8 - (i32.add - (i32.const 2) - (local.get $y) - ) - ) - (local.set $9 - (select - (local.get $4) - (local.get $6) - (local.get $8) - ) - ) - (return - (local.get $9) - ) - (unreachable) - ) - (func $block-phi-1 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (block - (block $out - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 1) - ) - ) - (nop) - (br_if $out - (local.get $y) - ) - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 2) - ) - ) - ) - (nop) - (nop) - (nop) - ) - (local.set $10 - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - (return - (local.get $10) - ) - ) - (func $block-phi-2 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (block - (block $out - (local.set $x - (i32.const 1) - ) - (nop) - (br_if $out - (local.get $y) - ) - (local.set $x - (i32.const 2) - ) - ) - (nop) - (nop) - (nop) - ) - (local.set $6 - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - (return - (local.get $6) - ) - ) - (func $zero_init-phi-bad_type (result f64) - (local $x f64) - (local $1 f64) - (local $2 f64) - (local $3 f64) - (block - (if - (i32.const 0) - (local.set $x - (f64.const 1) - ) - ) - (nop) - (nop) - ) - (nop) - (return - (local.get $x) - ) - ) - (func $phi-bad-type (result f64) - (local $0 f64) - (local $1 f64) - (local $2 f64) - (local $3 f64) - (block $label$1 - (if - (i32.const 0) - (local.set $0 - (f64.const 0) - ) - (local.set $0 - (f64.const 1) - ) - ) - (nop) - (nop) - ) - (nop) - (return - (local.get $0) - ) - ) - (func $phi-one-side-i1 (param $x i32) (param $y i32) (result i32) - (local $i i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (block - (block - (nop) - (nop) - (local.set $5 - (i32.le_s - (local.get $x) - (local.get $y) - ) - ) - (if - (local.get $5) - (block - (nop) - (nop) - (nop) - (local.set $i - (i32.eq - (local.get $x) - (local.get $y) - ) - ) - ) - (block - (nop) - (nop) - (nop) - (local.set $i - (i32.add - (local.get $x) - (local.get $y) - ) - ) - ) - ) - ) - (nop) - (nop) - ) - (nop) - (return - (local.get $i) - ) - ) - (func $call (result i32) - (local $0 i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local.set $0 - (call $call) - ) - (local.set $1 - (call $call) - ) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (local.set $3 - (call $call) - ) - (local.set $4 - (i32.add - (i32.const 10) - (local.get $3) - ) - ) - (local.set $5 - (i32.mul - (local.get $2) - (local.get $4) - ) - ) - (return - (local.get $5) - ) - (unreachable) - ) - (func $in-unreachable-1 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (block - (block - (nop) - (if - (local.get $x) - (block - (block $block - (local.set $x - (i32.const 1) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (unreachable) - ) - (local.set $x - (i32.const 2) - ) - ) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (nop) - (return - (local.get $5) - ) - ) - (func $in-unreachable-2 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (block - (block - (nop) - (if - (local.get $x) - (block - (block $block - (local.set $x - (i32.const 1) - ) - (unreachable) - (unreachable) - ) - (unreachable) - ) - (local.set $x - (i32.const 2) - ) - ) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (nop) - (return - (local.get $4) - ) - ) - (func $in-unreachable-3 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (block - (block $out - (block - (nop) - (if - (local.get $x) - (block - (block $block - (local.set $x - (i32.const 1) - ) - (br $out) - (unreachable) - ) - (unreachable) - ) - (local.set $x - (i32.const 2) - ) - ) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (nop) - (return - (local.get $5) - ) - ) - (func $in-unreachable-4 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (block - (block $out - (block - (nop) - (if - (local.get $x) - (block - (block $block - (local.set $x - (i32.const 1) - ) - (br_table $out $out $out - (i32.const 1) - ) - (unreachable) - ) - (unreachable) - ) - (local.set $x - (i32.const 2) - ) - ) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (nop) - (return - (local.get $5) - ) - ) - (func $in-unreachable-br_if (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (block - (block $out - (block - (nop) - (if - (local.get $x) - (block $block - (local.set $x - (i32.const 1) - ) - (nop) - (br_if $out - (local.get $x) - ) - ) - (local.set $x - (i32.const 2) - ) - ) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (nop) - (return - (local.get $6) - ) - ) - (func $in-unreachable-big (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (block $label$1 - (block $label$2 - (block $label$3 - (block - (nop) - (if - (local.get $2) - (block - (block - (nop) - (if - (local.get $0) - (block - (block $block - (local.set $1 - (i32.const -8531) - ) - (br $label$3) - (unreachable) - ) - (unreachable) - ) - (block - (block $block3 - (local.set $1 - (i32.const -8531) - ) - (br $label$1) - (unreachable) - ) - (unreachable) - ) - ) - ) - (unreachable) - ) - ) - ) - (br $label$2) - (unreachable) - ) - (local.set $6 - (i32.load - (i32.const 0) - ) - ) - (drop - (local.get $6) - ) - (br $label$1) - (unreachable) - ) - (nop) - (i32.store16 - (i32.const 1) - (local.get $1) - ) - (unreachable) - (unreachable) - ) - (i32.store16 - (i32.const 0) - (i32.const -8531) - ) - ) - (func $in-unreachable-operations (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (block $block - (unreachable) - (unreachable) - (block - (nop) - (if - (local.get $x) - (local.set $x - (i32.const 1) - ) - (local.set $x - (i32.const 2) - ) - ) - ) - (nop) - (return - (local.get $x) - ) - (unreachable) - ) - (unreachable) - ) - (func $merge-with-one-less (param $var$0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (block - (block $label$1 - (block $label$2 - (block $label$3 - (block $label$4 - (block $label$5 - (local.set $1 - (i32.load - (i32.const 1) - ) - ) - (br_table $label$5 $label$4 $label$3 $label$2 - (local.get $1) - ) - (unreachable) - ) - (unreachable) - (unreachable) - ) - (br $label$1) - (unreachable) - ) - (local.set $var$0 - (i32.const 8) - ) - (nop) - (local.set $3 - (i32.load - (local.get $var$0) - ) - ) - (f64.store - (local.get $3) - (f64.const 0) - ) - (br $label$1) - (unreachable) - ) - (unreachable) - (unreachable) - ) - (nop) - (i32.store - (local.get $var$0) - (i32.const 16) - ) - (nop) - ) - (local.set $6 - (i32.const 1) - ) - (return - (local.get $6) - ) - ) - (func $deep (param $x i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (local $17 i32) - (local $18 i32) - (local $19 i32) - (local $20 i32) - (local $21 i32) - (local $22 i32) - (local $23 i32) - (local $24 i32) - (local $25 i32) - (local $26 i32) - (local $27 i32) - (local $28 i32) - (local $29 i32) - (local $30 i32) - (local $31 i32) - (local $32 i32) - (local $33 i32) - (local $34 i32) - (local $35 i32) - (local $36 i32) - (local $37 i32) - (local $38 i32) - (local $39 i32) - (local $40 i32) - (local $41 i32) - (local $42 i32) - (local $43 i32) - (local $44 i32) - (local $45 i32) - (local $46 i32) - (local $47 i32) - (local $48 i32) - (local $49 i32) - (local $50 i32) - (local $51 i32) - (local $52 i32) - (local $53 i32) - (local $54 i32) - (local $55 i32) - (block - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.xor - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $x) - (i32.const 1234) - ) - ) - (nop) - (nop) - ) - (nop) - (return - (local.get $x) - ) - ) - (func $two-pcs (param $x i64) (param $y i64) (param $t i64) (result i64) - (local $3 i64) - (local $4 i64) - (local $5 i32) - (local $6 i64) - (local $7 i32) - (local $8 i64) - (local $9 i64) - (local $10 i64) - (local $11 i64) - (local $12 i64) - (local $13 i64) - (local $14 i64) - (local $15 i32) - (local $16 i64) - (local $17 i64) - (local $18 i64) - (local $19 i64) - (local $20 i64) - (local $21 i64) - (local $22 i64) - (local $23 i64) - (local $24 i64) - (block - (block - (nop) - (nop) - (local.set $5 - (i64.lt_s - (local.get $x) - (local.get $y) - ) - ) - (if - (local.get $5) - (block - (nop) - (local.set $7 - (i64.eqz - (local.get $x) - ) - ) - (if - (local.get $7) - (block - (nop) - (nop) - (nop) - (local.set $t - (i64.add - (local.get $x) - (local.get $y) - ) - ) - ) - (block - (nop) - (nop) - (nop) - (local.set $t - (i64.sub - (local.get $x) - (local.get $y) - ) - ) - ) - ) - ) - (block - (nop) - (local.set $15 - (i64.eqz - (local.get $y) - ) - ) - (if - (local.get $15) - (block - (nop) - (nop) - (nop) - (local.set $t - (i64.mul - (local.get $x) - (local.get $y) - ) - ) - ) - (block - (nop) - (nop) - (nop) - (local.set $t - (i64.div_s - (local.get $x) - (local.get $y) - ) - ) - ) - ) - ) - ) - ) - (nop) - (return - (local.get $t) - ) - (unreachable) - ) - (nop) - (return - (local.get $23) - ) - ) - (func $loop-1 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (loop $loopy - (nop) - ) - (nop) - (nop) - (local.set $4 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (return - (local.get $4) - ) - (unreachable) - ) - (nop) - (return - (local.get $5) - ) - ) - (func $loop-2 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (loop $loopy - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - (nop) - (nop) - (local.set $y - (i32.add - (local.get $y) - (i32.const 4) - ) - ) - ) - (nop) - (nop) - (local.set $8 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (return - (local.get $8) - ) - (unreachable) - ) - (nop) - (return - (local.get $9) - ) - ) - (func $loop-3 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (loop $loopy - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - (nop) - (nop) - (local.set $y - (i32.add - (local.get $y) - (i32.const 4) - ) - ) - (nop) - (br_if $loopy - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $9 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (return - (local.get $9) - ) - (unreachable) - ) - (nop) - (return - (local.get $10) - ) - ) - (func $loop-4 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (loop $loopy - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - (nop) - (br_if $loopy - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $7 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (return - (local.get $7) - ) - (unreachable) - ) - (nop) - (return - (local.get $8) - ) - ) - (func $loop-5 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (loop $loopy - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - (local.set $y - (i32.const 2) - ) - (nop) - (br_if $loopy - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $7 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (return - (local.get $7) - ) - (unreachable) - ) - (nop) - (return - (local.get $8) - ) - ) - (func $loop-6 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (loop $loopy - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - (nop) - (nop) - (nop) - (br_if $loopy - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $8 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (return - (local.get $8) - ) - (unreachable) - ) - (nop) - (return - (local.get $9) - ) - ) - (func $loop-7 (param $x i32) (param $y i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (loop $loopy - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - (local.set $y - (i32.const 5) - ) - (nop) - (br_if $loopy - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $7 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (return - (local.get $7) - ) - (unreachable) - ) - (nop) - (return - (local.get $8) - ) - ) - (func $loop-8 (param $x i32) (param $y i32) (result i32) - (local $z i32) - (local $w i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (loop $loopy - (nop) - (local.set $z - (local.get $x) - ) - (nop) - (local.set $w - (local.get $y) - ) - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 4) - ) - (nop) - (br_if $loopy - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $9 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $12 - (i32.sub - (local.get $z) - (local.get $w) - ) - ) - (local.set $13 - (i32.mul - (local.get $9) - (local.get $12) - ) - ) - (return - (local.get $13) - ) - (unreachable) - ) - (nop) - (return - (local.get $14) - ) - ) - (func $loop-9 (param $x i32) (param $y i32) (result i32) - (local $t i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (loop $loopy - (nop) - (local.set $t - (local.get $x) - ) - (nop) - (local.set $x - (local.get $y) - ) - (nop) - (local.set $y - (local.get $t) - ) - (nop) - (br_if $loopy - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $9 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (return - (local.get $9) - ) - (unreachable) - ) - (nop) - (return - (local.get $10) - ) - ) - (func $loop-10 (param $x i32) (param $y i32) (result i32) - (local $t i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 1) - ) - (loop $loopy - (nop) - (local.set $t - (local.get $x) - ) - (nop) - (local.set $x - (local.get $y) - ) - (nop) - (local.set $y - (local.get $t) - ) - (nop) - (br_if $loopy - (local.get $y) - ) - ) - (nop) - (nop) - (local.set $9 - (i32.add - (local.get $x) - (local.get $y) - ) - ) - (return - (local.get $9) - ) - (unreachable) - ) - (nop) - (return - (local.get $10) - ) - ) - (func $loop-multicond-1 (param $x i32) (param $y i32) (param $z i32) (result i32) - (local $t i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (block - (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) - ) - (nop) - (br_if $loopy - (local.get $t) - ) - (local.set $y - (i32.const 5) - ) - (nop) - (br_if $loopy - (local.get $t) - ) - (local.set $z - (i32.const 6) - ) - ) - (nop) - (nop) - (nop) - (local.set $9 - (select - (local.get $x) - (local.get $y) - (local.get $z) - ) - ) - (return - (local.get $9) - ) - (unreachable) - ) - (nop) - (return - (local.get $10) - ) - ) - (func $loop-multicond-2 (param $x i32) (param $y i32) (param $z i32) (result i32) - (local $t i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (local $17 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (local.set $z - (i32.const 3) - ) - (loop $loopy - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 4) - ) - ) - (nop) - (br_if $loopy - (local.get $t) - ) - (nop) - (nop) - (local.set $y - (i32.add - (local.get $y) - (i32.const 5) - ) - ) - (nop) - (br_if $loopy - (local.get $t) - ) - (nop) - (nop) - (local.set $z - (i32.add - (local.get $z) - (i32.const 6) - ) - ) - ) - (nop) - (nop) - (nop) - (local.set $15 - (select - (local.get $x) - (local.get $y) - (local.get $z) - ) - ) - (return - (local.get $15) - ) - (unreachable) - ) - (nop) - (return - (local.get $16) - ) - ) - (func $loop-block-1 (param $x i32) (param $y i32) (param $z i32) (result i32) - (local $t i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (local $17 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (local.set $z - (i32.const 3) - ) - (loop $loopy - (block $out - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 4) - ) - ) - (nop) - (br_if $out - (local.get $t) - ) - (nop) - (nop) - (local.set $y - (i32.add - (local.get $y) - (i32.const 5) - ) - ) - (nop) - (br_if $out - (local.get $t) - ) - (nop) - (nop) - (local.set $z - (i32.add - (local.get $z) - (i32.const 6) - ) - ) - (br $loopy) - (unreachable) - ) - ) - (nop) - (nop) - (nop) - (local.set $15 - (select - (local.get $x) - (local.get $y) - (local.get $z) - ) - ) - (return - (local.get $15) - ) - (unreachable) - ) - (nop) - (return - (local.get $16) - ) - ) - (func $loop-block-2 (param $x i32) (param $y i32) (param $z i32) (result i32) - (local $t i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (local $17 i32) - (block - (local.set $x - (i32.const 1) - ) - (local.set $y - (i32.const 2) - ) - (local.set $z - (i32.const 3) - ) - (block $out - (loop $loopy - (block - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 4) - ) - ) - (nop) - (br_if $out - (local.get $t) - ) - (nop) - (nop) - (local.set $y - (i32.add - (local.get $y) - (i32.const 5) - ) - ) - (nop) - (br_if $out - (local.get $t) - ) - (nop) - (nop) - (local.set $z - (i32.add - (local.get $z) - (i32.const 6) - ) - ) - (br $loopy) - (unreachable) - ) - (unreachable) - ) - (unreachable) - ) - (nop) - (nop) - (nop) - (local.set $15 - (select - (local.get $x) - (local.get $y) - (local.get $z) - ) - ) - (return - (local.get $15) - ) - (unreachable) - ) - (nop) - (return - (local.get $16) - ) - ) - (func $bad-phi-type (param $var$0 i64) (param $var$1 i64) (param $var$2 i32) (param $var$3 f32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 f64) - (local $9 f64) - (local $10 f64) - (local $11 f64) - (nop) - (if - (local.get $var$2) - (block - (loop $label$2 - (block - (block - (block $label$3 - (if - (i32.const 0) - (block - (unreachable) - (unreachable) - ) - ) - (nop) - (nop) - ) - (local.set $6 - (i32.const 0) - ) - (if - (local.get $6) - (block - (unreachable) - (unreachable) - ) - ) - ) - (nop) - (br_if $label$2 - (local.get $var$2) - ) - (nop) - ) - (nop) - (local.set $10 - (f64.const 0) - ) - ) - (nop) - (drop - (local.get $10) - ) - ) - ) - ) - (func $loop-unreachable - (local $var$0 i32) - (local $var$1 f64) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 f64) - (local $12 f64) - (local $13 f64) - (loop $label$1 - (block - (block $label$2 - (block $label$3 - (block $label$4 - (if - (i32.const 1337) - (block - (unreachable) - (unreachable) - ) - ) - (nop) - (nop) - ) - (nop) - (nop) - (loop $label$6 - (block $label$7 - (nop) - (local.set $6 - (local.get $var$0) - ) - (br_if $label$7 - (i32.const 65535) - ) - (nop) - (drop - (local.get $6) - ) - (nop) - (local.set $6 - (local.get $var$0) - ) - (br_if $label$7 - (i32.const 0) - ) - (nop) - (drop - (local.get $6) - ) - (unreachable) - (unreachable) - ) - (nop) - (br_if $label$6 - (local.get $6) - ) - ) - ) - (nop) - (nop) - ) - (nop) - (nop) - (br $label$1) - (unreachable) - ) - (unreachable) - ) - (unreachable) - ) - (func $phi-value-turns-bad (result f64) - (local $var$0 i32) - (local $var$1 i32) - (local $var$2 f32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 f32) - (local $13 f32) - (local $14 f32) - (local $15 f32) - (local $16 f64) - (local $17 f64) - (block - (block - (nop) - (local.set $var$0 - (i32.atomic.rmw16.sub_u offset=22 - (i32.const 0) - (i32.const 0) - ) - ) - (nop) - (if - (local.get $var$0) - (block - (unreachable) - (unreachable) - ) - (block - (block $block - (block - (loop $label$3 - (block $label$4 - (nop) - (local.set $6 - (local.get $var$0) - ) - (br_if $label$4 - (i32.const 1) - ) - (nop) - (nop) - (local.set $6 - (i32.clz - (local.get $6) - ) - ) - ) - (nop) - (nop) - ) - (nop) - (if - (local.get $6) - (nop) - ) - ) - (nop) - ) - (nop) - (local.set $14 - (f32.const 1) - ) - ) - ) - ) - (nop) - (nop) - (unreachable) - (unreachable) - ) - (nop) - (return - (local.get $16) - ) - ) - (func $multi-use (param $x i32) (result i32) - (local $temp i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (block - (nop) - (nop) - (local.set $temp - (i32.add - (local.get $x) - (i32.const 1) - ) - ) - (nop) - (nop) - (nop) - (nop) - ) - (local.set $8 - (i32.add - (local.get $temp) - (local.get $temp) - ) - ) - (return - (local.get $8) - ) - ) - (func $multi-use-2 (param $x i32) (result i32) - (local $temp i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (block - (nop) - (nop) - (local.set $temp - (i32.add - (local.get $x) - (i32.const 1) - ) - ) - (nop) - (nop) - (local.set $x - (i32.mul - (local.get $temp) - (i32.const 2) - ) - ) - (nop) - (nop) - (nop) - (nop) - ) - (local.set $10 - (i32.sub - (local.get $x) - (local.get $temp) - ) - ) - (return - (local.get $10) - ) - ) - (func $many-single-uses-with-param (param $x i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (nop) - (local.set $2 - (i32.mul - (i32.const 10) - (local.get $x) - ) - ) - (nop) - (local.set $4 - (i32.ctz - (local.get $x) - ) - ) - (local.set $5 - (i32.sub - (local.get $4) - (i32.const 20) - ) - ) - (local.set $6 - (i32.add - (local.get $2) - (local.get $5) - ) - ) - (local.set $7 - (i32.eqz - (local.get $6) - ) - ) - (return - (local.get $7) - ) - (unreachable) - ) - (func $56 (param $var$0 i32) - (local $var$1 i32) - (local $var$2 i32) - (local $var$3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (nop) - (nop) - (local.set $var$0 - (i32.add - (local.get $var$0) - (i32.const -7) - ) - ) - (nop) - (if - (local.get $var$0) - (block $label$2 - (block $label$3 - (nop) - (local.set $var$1 - (local.get $var$0) - ) - (nop) - (local.set $8 - (i32.const 12) - ) - (br_if $label$3 - (local.get $8) - ) - (unreachable) - (unreachable) - ) - (nop) - (local.set $10 - (i32.eqz - (local.get $var$1) - ) - ) - (br_if $label$2 - (local.get $10) - ) - (block - (local.set $11 - (i32.load - (i32.const 0) - ) - ) - (nop) - (local.set $13 - (i32.ne - (local.get $11) - (local.get $var$0) - ) - ) - (if - (local.get $13) - (block - (unreachable) - (unreachable) - ) - ) - ) - (unreachable) - (unreachable) - ) - ) - ) - (func $multiple-uses-to-non-expression (param $x i32) - (local $temp i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (nop) - (nop) - (local.set $x - (i32.add - (local.get $x) - (i32.const 10) - ) - ) - (nop) - (i32.store - (i32.const 1) - (local.get $x) - ) - (nop) - (local.set $6 - (i32.add - (local.get $x) - (i32.const 20) - ) - ) - (i32.store - (i32.const 2) - (local.get $6) - ) - ) - (func $nested-phi-forwarding (param $var$0 i32) (result i32) - (local $var$1 i32) - (local $var$2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (block - (block $label$1 - (block $label$2 - (loop $label$3 - (block $label$4 - (block $label$5 - (block $label$6 - (block $label$7 - (block $label$8 - (nop) - (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) - ) - (unreachable) - ) - (local.set $var$1 - (i32.const 1) - ) - ) - (br $label$4) - (unreachable) - ) - (unreachable) - (unreachable) - ) - (br $label$1) - (unreachable) - ) - (local.set $var$2 - (i32.const 1) - ) - (nop) - (br_if $label$3 - (local.get $var$2) - ) - ) - ) - (block $label$9 - (nop) - (local.set $6 - (i32.or - (i32.const 1) - (local.get $var$1) - ) - ) - (br_if $label$9 - (local.get $6) - ) - ) - (unreachable) - (unreachable) - ) - (nop) - (i32.store offset=176 - (i32.const 0) - (local.get $var$2) - ) - (nop) - ) - (local.set $9 - (i32.const 0) - ) - (return - (local.get $9) - ) - ) - (func $zext-numGets (param $var$0 i32) (param $var$1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (block $label$1 - (local.set $2 - (i32.load - (i32.const -8) - ) - ) - (local.set $3 - (i32.const 1) - ) - (br_if $label$1 - (local.get $2) - ) - (nop) - (drop - (local.get $3) - ) - (local.set $5 - (i32.load - (i32.const -16) - ) - ) - (nop) - (local.set $3 - (i32.eqz - (local.get $5) - ) - ) - ) - (nop) - (local.set $8 - (i32.ctz - (local.get $3) - ) - ) - (if - (local.get $8) - (block - (unreachable) - (unreachable) - ) - ) - ) - (func $zext-numGets-hasAnotherUse (param $var$0 i32) (param $var$1 i32) - (local $temp i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (block $label$1 - (local.set $3 - (i32.load - (i32.const -8) - ) - ) - (local.set $4 - (i32.const 1) - ) - (br_if $label$1 - (local.get $3) - ) - (nop) - (drop - (local.get $4) - ) - (local.set $6 - (i32.load - (i32.const -16) - ) - ) - (nop) - (local.set $temp - (i32.eqz - (local.get $6) - ) - ) - (nop) - (drop - (local.get $temp) - ) - (nop) - (local.set $4 - (local.get $temp) - ) - ) - (nop) - (local.set $11 - (i32.ctz - (local.get $4) - ) - ) - (if - (local.get $11) - (block - (unreachable) - (unreachable) - ) - ) - ) - (func $flipped-needs-right-origin (param $var$0 i32) (result i32) - (local $var$1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (block - (block $label$1 - (local.set $2 - (i32.load - (i32.const 1) - ) - ) - (br_if $label$1 - (local.get $2) - ) - (local.set $var$1 - (i32.const 2) - ) - ) - (block - (nop) - (local.set $4 - (i32.add - (local.get $var$1) - (i32.const 4) - ) - ) - (local.set $5 - (i32.gt_s - (i32.const 3) - (local.get $4) - ) - ) - (if - (local.get $5) - (block - (unreachable) - (unreachable) - ) - ) - ) - (nop) - ) - (local.set $7 - (i32.const 5) - ) - (return - (local.get $7) - ) - ) - (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) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (block - (nop) - (nop) - (local.set $var$1 - (i32.gt_u - (local.get $var$1) - (i32.const 1) - ) - ) - (nop) - (i32.store - (local.get $var$1) - (i32.const 2) - ) - (nop) - (local.set $7 - (i32.sub - (i32.const 4) - (local.get $var$1) - ) - ) - (i32.store offset=8 - (i32.const 3) - (local.get $7) - ) - (unreachable) - (unreachable) - ) - (nop) - (return - (local.get $8) - ) - ) - (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) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (loop $label$1 - (block - (if - (i32.const 0) - (block - (block $block - (nop) - (local.set $var$2 - (i32.add - (i32.const 0) - (i32.const 1) - ) - ) - (br $label$1) - (unreachable) - ) - (unreachable) - ) - ) - (nop) - (nop) - (nop) - (nop) - (br $label$1) - (unreachable) - ) - (unreachable) - ) - (unreachable) - ) - (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 $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (block - (local.set $var$1 - (i32.const 1) - ) - (if - (i32.const 0) - (loop $label$2 - (block - (nop) - (if - (local.get $var$1) - (nop) - ) - ) - (local.set $var$3 - (i32.const 1) - ) - (nop) - (nop) - (local.set $var$1 - (i32.sub - (i32.const 0) - (local.get $var$3) - ) - ) - (br_if $label$2 - (i32.const 0) - ) - ) - ) - (block - (nop) - (if - (local.get $var$1) - (local.set $var$3 - (i32.const 1) - ) - ) - ) - (nop) - (local.set $14 - (i32.add - (local.get $var$3) - (i32.const 16) - ) - ) - (i32.store - (i32.const 8) - (local.get $14) - ) - (i32.store - (i32.const 8) - (i32.const 64) - ) - (unreachable) - (unreachable) - ) - (nop) - (return - (local.get $15) - ) - ) -) diff --git a/test/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.wast b/test/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.wast deleted file mode 100644 index a40f81322..000000000 --- a/test/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.wast +++ /dev/null @@ -1,1253 +0,0 @@ -(module - (memory $0 (shared 1 1)) - ;; Figure 1a from the Souper paper https://arxiv.org/pdf/1711.04422.pdf - (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 - (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 - (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) - ) - ) - ) - (func $send-i32 (param i32)) - ;; flipping of greater than/or equals ops, which are not in Souper IR - (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))) - ) - (func $various-conditions-1 (param $x i32) - (if - (local.get $x) - (local.set $x - (i32.add - (local.get $x) - (i32.const 1) - ) - ) - ) - ) - (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) - ) - ) - ) - ) - (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) - ) - ) - ) - ) - (func $various-conditions-4 (param $x i32) - (if - (unreachable) - (local.set $x - (i32.add - (local.get $x) - (i32.const 3) - ) - ) - ) - ) - (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) - ) - ) - ) - ) - ) - ) - (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) - ) - ) - ) - ) - (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) - ) - ) - ) - ) - (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) - ) - ) - ) - (func $trivial-ret (result i32) - (i32.add - (i32.const 0) - (i32.const 1) - ) - ) - (func $trivial-const (result i32) - (i32.const 0) - ) - (func $trivial-const-block (result i32) - (nop) - (i32.const 0) - ) - (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) - ) - ) - (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) - ) - (func $select (param $x i32) (result i32) - (return - (select - (i32.const 1) - (i32.const 2) - (i32.const 3) - ) - ) - ) - (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) - ) - ) - ) - ) - (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) - ) - ) - (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) - ) - ) - (func $zero_init-phi-bad_type (result f64) - (local $x f64) - (if - (i32.const 0) - (local.set $x - (f64.const 1) - ) - ) - (local.get $x) - ) - (func $phi-bad-type (result f64) - (block $label$1 (result f64) - (if (result f64) - (i32.const 0) - (f64.const 0) - (f64.const 1) - ) - ) - ) - (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) - ) - (func $call (result i32) - (return - (i32.mul - (i32.add - (call $call) - (call $call) - ) - (i32.add - (i32.const 10) - (call $call) - ) - ) - ) - ) - (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) - ) - ) - (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) - ) - ) - (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) - ) - ) - (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) - ) - ) - (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) - ) - ) - (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) - ) - ) - (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) - ) - ) - ) - (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) - ) - (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) - ) - (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)) - ) - (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))) - ) - (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))) - ) - (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))) - ) - (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))) - ) - (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))) - ) - (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))) - ) - (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))) - ) - (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) - ) - ) - ) - ) - (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))) - ) - (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))) - ) - (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))) - ) - (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))) - ) - (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))) - ) - (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))) - ) - (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) - ) - ) - ) - ) - (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) - ) - ) - (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) - ) - (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)) - ) - (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)) - ) - (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) - ) - ) - ) - (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) - ) - ) - ) - (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) - ) - (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) - ) - ) - (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) - ) - ) - (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) - ) - (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) - ) - (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) - ) - ) - (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) - ) -) |