summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/lit/passes/flatten_all-features.wast3538
-rw-r--r--test/lit/passes/flatten_dfo_O3_enable-threads.wast (renamed from test/passes/flatten_dfo_O3_enable-threads.wast)69
-rw-r--r--test/lit/passes/flatten_i64-to-i32-lowering.wast667
-rw-r--r--test/lit/passes/flatten_local-cse_Os.wast71
-rw-r--r--test/lit/passes/flatten_local-cse_all-features.wast1139
-rw-r--r--test/lit/passes/flatten_rereloop.wast1975
-rw-r--r--test/lit/passes/flatten_simplify-locals-nonesting_dfo_O3.wast (renamed from test/passes/flatten_simplify-locals-nonesting_dfo_O3.wast)58
-rw-r--r--test/lit/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.wast4606
-rw-r--r--test/lit/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.wast4674
-rw-r--r--test/passes/flatten_all-features.txt2462
-rw-r--r--test/passes/flatten_all-features.wast1067
-rw-r--r--test/passes/flatten_dfo_O3_enable-threads.txt50
-rw-r--r--test/passes/flatten_i64-to-i32-lowering.txt572
-rw-r--r--test/passes/flatten_i64-to-i32-lowering.wast77
-rw-r--r--test/passes/flatten_local-cse_Os.txt27
-rw-r--r--test/passes/flatten_local-cse_Os.wast39
-rw-r--r--test/passes/flatten_local-cse_all-features.txt815
-rw-r--r--test/passes/flatten_local-cse_all-features.wast316
-rw-r--r--test/passes/flatten_rereloop.txt1182
-rw-r--r--test/passes/flatten_rereloop.wast783
-rw-r--r--test/passes/flatten_simplify-locals-nonesting_dfo_O3.txt41
-rw-r--r--test/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.txt4775
-rw-r--r--test/passes/flatten_simplify-locals-nonesting_souperify-single-use_enable-threads.wast1246
-rw-r--r--test/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.txt4877
-rw-r--r--test/passes/flatten_simplify-locals-nonesting_souperify_enable-threads.wast1253
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)
- )
-)