summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/lit/passes/dce_all-features.wast1417
-rw-r--r--test/lit/passes/dce_vacuum_remove-unused-names.wast82
-rw-r--r--test/lit/passes/dealign.wast48
-rw-r--r--test/lit/passes/dealign64.wast48
-rw-r--r--test/lit/passes/denan.wast271
-rw-r--r--test/lit/passes/directize_all-features.wast521
-rw-r--r--test/passes/dce_all-features.txt599
-rw-r--r--test/passes/dce_all-features.wast809
-rw-r--r--test/passes/dce_vacuum_remove-unused-names.txt25
-rw-r--r--test/passes/dce_vacuum_remove-unused-names.wast51
-rw-r--r--test/passes/dealign.txt33
-rw-r--r--test/passes/dealign.wast11
-rw-r--r--test/passes/dealign64.passes1
-rw-r--r--test/passes/dealign64.txt33
-rw-r--r--test/passes/dealign64.wast11
-rw-r--r--test/passes/denan.txt212
-rw-r--r--test/passes/denan.wast49
-rw-r--r--test/passes/directize_all-features.txt263
-rw-r--r--test/passes/directize_all-features.wast263
19 files changed, 2387 insertions, 2360 deletions
diff --git a/test/lit/passes/dce_all-features.wast b/test/lit/passes/dce_all-features.wast
new file mode 100644
index 000000000..58bdbf5e5
--- /dev/null
+++ b/test/lit/passes/dce_all-features.wast
@@ -0,0 +1,1417 @@
+;; 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 --dce --all-features -S -o - | filecheck %s
+
+(module
+ (memory 10)
+ ;; CHECK: (type $none_=>_i32 (func (result i32)))
+
+ ;; CHECK: (type $1 (func))
+
+ ;; CHECK: (type $i32_=>_i32 (func (param i32) (result i32)))
+
+ ;; CHECK: (type $ii (func (param i32 i32)))
+ (type $ii (func (param i32 i32)))
+ (type $1 (func))
+ (table 1 1 funcref)
+ (elem (i32.const 0) $call-me)
+ ;; CHECK: (type $i64_i64_=>_i64 (func (param i64 i64) (result i64)))
+
+ ;; CHECK: (type $f32_i64_=>_none (func (param f32 i64)))
+
+ ;; CHECK: (type $f32_i64_=>_i32 (func (param f32 i64) (result i32)))
+
+ ;; CHECK: (global $x (mut i32) (i32.const 0))
+ (global $x (mut i32) (i32.const 0))
+ ;; CHECK: (memory $0 10)
+
+ ;; CHECK: (table $0 1 1 funcref)
+
+ ;; CHECK: (elem (i32.const 0) $call-me)
+
+ ;; CHECK: (func $call-me (param $0 i32) (param $1 i32)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: )
+ (func $call-me (type $ii) (param $0 i32) (param $1 i32)
+ (nop)
+ )
+ ;; CHECK: (func $code-to-kill
+ ;; CHECK-NEXT: (local $x i32)
+ ;; CHECK-NEXT: (block $out
+ ;; CHECK-NEXT: (br $out)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (block $out3
+ ;; CHECK-NEXT: (return)
+ ;; 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: )
+ ;; 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 $block4
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (unreachable)
+ ;; 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: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; 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: )
+ ;; 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: )
+ ;; 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: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; 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: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; 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: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block $out29
+ ;; CHECK-NEXT: (loop $in30
+ ;; CHECK-NEXT: (br_if $out29
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (block $block20
+ ;; CHECK-NEXT: (loop $in32
+ ;; CHECK-NEXT: (br_if $in32
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 123)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 2)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 3)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const -1)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 123)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 456)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const -2)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 139)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const -3)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 246)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const -4)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 11)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 22)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 33)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 44)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 55)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 66)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 77)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 88)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 99)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 100)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 123)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 456)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 101)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 123)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 102)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 1337)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $code-to-kill (type $1)
+ (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 $out
+ (unreachable)
+ (drop
+ (i32.const 0)
+ )
+ )
+ )
+ (if
+ (i32.const 0)
+ (block $out
+ (return)
+ (drop
+ (i32.const 0)
+ )
+ )
+ )
+ (block $out
+ (br_table $out $out $out $out
+ (i32.const 4)
+ )
+ (drop
+ (i32.const 0)
+ )
+ )
+ (block $out
+ (br_if $out
+ (i32.const 3)
+ )
+ (drop
+ (i32.const 0)
+ )
+ )
+ (if
+ (i32.const 0)
+ (block $block4
+ (if
+ (i32.const 0)
+ (block $out
+ (unreachable)
+ (drop
+ (i32.const 0)
+ )
+ )
+ (block $out
+ (unreachable)
+ (drop
+ (i32.const 0)
+ )
+ )
+ )
+ (drop
+ (i32.const 0)
+ )
+ )
+ )
+ (if
+ (i32.const 0)
+ (drop
+ (block $out (result i32)
+ (br $out
+ (unreachable)
+ )
+ (drop
+ (i32.const 0)
+ )
+ (unreachable)
+ )
+ )
+ )
+ (if
+ (i32.const 0)
+ (drop
+ (block $out (result i32)
+ (br_if $out
+ (unreachable)
+ (i32.const 0)
+ )
+ (drop
+ (i32.const 0)
+ )
+ (unreachable)
+ )
+ )
+ )
+ (if
+ (i32.const 0)
+ (drop
+ (block $out (result i32)
+ (br_if $out
+ (unreachable)
+ (unreachable)
+ )
+ (drop
+ (i32.const 0)
+ )
+ (unreachable)
+ )
+ )
+ )
+ (block $out
+ (block $in
+ (br_if $out
+ (i32.const 1)
+ )
+ )
+ (unreachable)
+ )
+ (if
+ (i32.const 0)
+ (block $block11
+ (block $out
+ (block $in
+ (br_if $in
+ (i32.const 1)
+ )
+ )
+ (unreachable)
+ )
+ (drop
+ (i32.const 10)
+ )
+ )
+ )
+ (block $out
+ (block $in
+ (br_table $out $in
+ (i32.const 1)
+ )
+ )
+ (unreachable)
+ )
+ (block $out
+ (block $in
+ (br_table $in $out
+ (i32.const 1)
+ )
+ )
+ (unreachable)
+ )
+ (if
+ (i32.const 0)
+ (block $block13
+ (block $out
+ (block $in
+ (br_table $in $in
+ (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 $out
+ (loop $in
+ (br_if $out
+ (i32.const 1)
+ )
+ (unreachable)
+ )
+ )
+ (if
+ (i32.const 0)
+ (block $block20
+ (loop $in
+ (br_if $in
+ (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: (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: (block $top-typed
+ ;; CHECK-NEXT: (block $switch$0
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $typed-block-none-then-unreachable (result i32)
+ (block $top-typed (result i32)
+ (block $switch$0 ;; this looks like it can be broken to, so it gets type 'none'
+ (return
+ (i32.const 0)
+ )
+ (br $switch$0) ;; this is not reachable, so dce cleans it up, changing $switch$0's type
+ )
+ (return ;; and this is cleaned up as well, leaving $top-typed in need of a type change
+ (i32.const 1)
+ )
+ )
+ )
+ ;; CHECK: (func $typed-block-remove-br-changes-type (param $$$0 i32) (result i32)
+ ;; 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: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (local.get $$$0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (local.get $$$0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $typed-block-remove-br-changes-type (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: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $global
+ (unreachable)
+ (drop (global.get $x))
+ (global.set $x (i32.const 1))
+ )
+ ;; CHECK: (func $ret (result i32)
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $ret (result i32)
+ (return
+ (i32.const 0)
+ )
+ (nop)
+ (i32.const 0)
+ )
+ ;; CHECK: (func $unreachable-br (result i32)
+ ;; CHECK-NEXT: (block $out (result i32)
+ ;; CHECK-NEXT: (br $out
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $unreachable-br (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: )
+ ;; CHECK-NEXT: )
+ (func $unreachable-br-loop (result i32)
+ (loop $out
+ (br $out)
+ )
+ )
+ ;; CHECK: (func $unreachable-block-ends-switch (result i32)
+ ;; CHECK-NEXT: (block $label$0
+ ;; CHECK-NEXT: (block $label$3
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $unreachable-block-ends-switch (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: (block $label$0
+ ;; CHECK-NEXT: (block $label$2
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; 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: (block $label$0 (result i32)
+ ;; CHECK-NEXT: (br $label$0
+ ;; CHECK-NEXT: (i32.const 18)
+ ;; CHECK-NEXT: )
+ ;; 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: (drop
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block $label$0
+ ;; CHECK-NEXT: (block $label$1
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 4104)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; 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) ;; this block is declared i32, but we can see it is unreachable
+ (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: (if (result i64)
+ ;; CHECK-NEXT: (i64.eqz
+ ;; CHECK-NEXT: (local.get $var$0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block $label$0 (result i64)
+ ;; CHECK-NEXT: (local.get $var$1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block $label$1
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i64.sub
+ ;; CHECK-NEXT: (local.get $var$0)
+ ;; CHECK-NEXT: (i64.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (block $block (result i64)
+ ;; CHECK-NEXT: (local.set $2
+ ;; CHECK-NEXT: (local.get $var$0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (local.get $2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; 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 (result i64)
+ (local.set $2
+ (local.get $var$0)
+ )
+ (nop)
+ (local.get $2)
+ )
+ (unreachable)
+ )
+ )
+ )
+ )
+ )
+ ;; CHECK: (func $br-gone-means-block-type-changes-then-refinalize-at-end-is-too-late (param $var$0 i32) (result i32)
+ ;; CHECK-NEXT: (block $label$0
+ ;; CHECK-NEXT: (block $block
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $br-gone-means-block-type-changes-then-refinalize-at-end-is-too-late (param $var$0 i32) (result i32)
+ (block $label$0 (result i32)
+ (br $label$0
+ (block (result i32)
+ (nop)
+ (drop
+ (br_if $label$0
+ (unreachable)
+ (local.get $var$0)
+ )
+ )
+ (i32.const 4)
+ )
+ )
+ )
+ )
+ ;; CHECK: (func $br-with-unreachable-value-should-not-give-a-block-a-value (param $var$0 i32) (result i32)
+ ;; CHECK-NEXT: (block $label$0 (result i32)
+ ;; CHECK-NEXT: (block $block
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (br_if $label$0
+ ;; CHECK-NEXT: (i32.const 8)
+ ;; CHECK-NEXT: (local.get $var$0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $br-with-unreachable-value-should-not-give-a-block-a-value (param $var$0 i32) (result i32)
+ (block $label$0 (result i32)
+ (br $label$0
+ (block (result i32) ;; turns into unreachable when refinalized
+ (drop
+ (br_if $label$0
+ (i32.const 8)
+ (local.get $var$0)
+ )
+ )
+ (unreachable)
+ )
+ )
+ (i32.const 16)
+ )
+ )
+ ;; CHECK: (func $replace-br-value-of-i32-with-unreachable (result i32)
+ ;; CHECK-NEXT: (block $label$0
+ ;; CHECK-NEXT: (block $label$1
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $replace-br-value-of-i32-with-unreachable (result i32)
+ (block $label$0 (result i32)
+ (br $label$0
+ (block $label$1 (result i32)
+ (nop)
+ (unreachable)
+ )
+ )
+ )
+ )
+ ;; CHECK: (func $shorten-block-requires-sync-refinalize (param $var$0 i32) (param $var$1 i32)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $shorten-block-requires-sync-refinalize (param $var$0 i32) (param $var$1 i32)
+ (block $label$0
+ (unreachable)
+ (if
+ (unreachable)
+ (br_if $label$0
+ (local.get $var$1)
+ )
+ )
+ )
+ )
+ ;; CHECK: (func $block-with-type-but-is-unreachable (param $var$0 i32) (result i32)
+ ;; CHECK-NEXT: (block $label$0
+ ;; CHECK-NEXT: (block $block
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $block-with-type-but-is-unreachable (param $var$0 i32) (result i32)
+ (block $label$0 (result i32)
+ (br $label$0
+ (block $block (result i32)
+ (nop)
+ (unreachable)
+ )
+ )
+ )
+ )
+ ;; CHECK: (func $if-with-type-but-is-unreachable (param $var$0 i32) (result i32)
+ ;; CHECK-NEXT: (block $label$0
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (local.get $var$0)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $if-with-type-but-is-unreachable (param $var$0 i32) (result i32)
+ (block $label$0 (result i32)
+ (br $label$0
+ (if (result i32)
+ (local.get $var$0)
+ (unreachable)
+ (unreachable)
+ )
+ )
+ )
+ )
+ ;; CHECK: (func $unreachable-loop
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $unreachable-loop
+ (loop $label$2
+ (unreachable)
+ (br $label$2)
+ )
+ )
+ ;; CHECK: (func $br-block-from-unary (result i32)
+ ;; CHECK-NEXT: (block $label$6 (result i32)
+ ;; CHECK-NEXT: (block $label$7
+ ;; CHECK-NEXT: (br $label$6
+ ;; CHECK-NEXT: (i32.const 8)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $br-block-from-unary (result i32)
+ (block $label$6 (result i32)
+ (i32.ctz
+ (block $label$7 (result i32)
+ (br $label$6
+ (i32.const 8)
+ )
+ )
+ )
+ )
+ )
+ ;; CHECK: (func $replace-unary-with-br-child
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (block $label$6 (result i32)
+ ;; CHECK-NEXT: (br $label$6
+ ;; CHECK-NEXT: (i32.const 8)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $replace-unary-with-br-child
+ (drop
+ (block $label$6 (result i32)
+ (i32.ctz
+ (br $label$6
+ (i32.const 8)
+ )
+ )
+ )
+ )
+ )
+ ;; CHECK: (func $br_if-unreach-then-br_if-normal
+ ;; CHECK-NEXT: (block $out
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $br_if-unreach-then-br_if-normal
+ (block $out
+ (nop)
+ (br_if $out
+ (unreachable)
+ )
+ (br_if $out
+ (i32.const 1)
+ )
+ )
+ )
+ ;; CHECK: (func $replace-with-unreachable-affects-parent (param $var$0 f32) (param $var$1 i64)
+ ;; CHECK-NEXT: (block $top
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i64.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (block $block (result i32)
+ ;; CHECK-NEXT: (call $replace-with-unreachable-affects-parent
+ ;; CHECK-NEXT: (f32.const 1)
+ ;; CHECK-NEXT: (i64.const -15917430362925035)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $replace-with-unreachable-affects-parent (param $var$0 f32) (param $var$1 i64)
+ (block $top
+ (drop
+ (f32.load offset=4
+ (i64.ne
+ (i64.const 0)
+ (if (result i64)
+ (block (result i32)
+ (call $replace-with-unreachable-affects-parent
+ (f32.const 1)
+ (i64.const -15917430362925035)
+ )
+ (i32.const 1)
+ )
+ (unreachable)
+ (unreachable)
+ )
+ )
+ )
+ )
+ (nop) ;; this is not reachable due to the above code, so we replace it with unreachable. type should go to parent
+ )
+ )
+ ;; CHECK: (func $replace-block-changes-later-when-if-goes
+ ;; CHECK-NEXT: (block $top
+ ;; CHECK-NEXT: (global.set $x
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block $inner
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (call $helper
+ ;; CHECK-NEXT: (f32.const 1)
+ ;; CHECK-NEXT: (i64.const -15917430362925035)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $replace-block-changes-later-when-if-goes
+ (block $top ;; and so should this
+ (global.set $x
+ (i32.const 0)
+ )
+ (drop
+ (f32.load offset=4
+ (i64.ne
+ (block $inner (result i64) ;; this becomes unreachable
+ (drop
+ (call $helper
+ (f32.const 1)
+ (i64.const -15917430362925035)
+ )
+ )
+ (unreachable)
+ )
+ (i64.const 0)
+ )
+ )
+ )
+ (if
+ (i32.load16_s offset=22 align=1
+ (i32.const 0)
+ )
+ (br $top) ;; this keeps the block none after the inner block gets unreachable. but it will vanish into unreachable itself
+ (unreachable)
+ )
+ )
+ )
+ ;; CHECK: (func $helper (param $var$0 f32) (param $var$1 i64) (result i32)
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ (func $helper (param $var$0 f32) (param $var$1 i64) (result i32)
+ (i32.const 0)
+ )
+)
+;; if goes to unreachable, need to propagate that up to the global.set
+(module
+ ;; CHECK: (type $none_=>_none (func))
+
+ ;; CHECK: (global $global (mut f64) (f64.const 0))
+ (global $global (mut f64) (f64.const 0))
+ ;; CHECK: (func $0
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $0
+ (global.set $global
+ (if (result f64)
+ (i32.const 0)
+ (unreachable)
+ (unreachable)
+ )
+ )
+ )
+)
+(module
+ ;; CHECK: (type $none_=>_none (func))
+
+ ;; CHECK: (func $0
+ ;; CHECK-NEXT: (local $local f64)
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $0
+ (local $local f64)
+ (local.set $local
+ (if (result f64)
+ (i32.const 0)
+ (unreachable)
+ (unreachable)
+ )
+ )
+ )
+)
+
+(module
+ ;; CHECK: (type $none_=>_i32 (func (result i32)))
+
+ ;; CHECK: (type $none_=>_none (func))
+
+ ;; CHECK: (func $unnecessary-concrete-block (result i32)
+ ;; CHECK-NEXT: (block $foo
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $unnecessary-concrete-block (result i32)
+ (block $foo (result i32) ;; unnecessary type
+ (nop)
+ (unreachable)
+ )
+ )
+ ;; CHECK: (func $necessary-concrete-block (result i32)
+ ;; CHECK-NEXT: (block $foo (result i32)
+ ;; CHECK-NEXT: (br $foo
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $necessary-concrete-block (result i32)
+ (block $foo (result i32)
+ (br $foo (i32.const 1))
+ (unreachable)
+ )
+ )
+ ;; CHECK: (func $unnecessary-concrete-if (result i32)
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $unnecessary-concrete-if (result i32)
+ (if (result i32) ;; unnecessary type
+ (i32.const 0)
+ (return (i32.const 1))
+ (unreachable)
+ )
+ )
+ ;; CHECK: (func $unnecessary-concrete-try (result i32)
+ ;; CHECK-NEXT: (try $try
+ ;; CHECK-NEXT: (do
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (catch_all
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $unnecessary-concrete-try (result i32)
+ (try (result i32)
+ (do
+ (unreachable)
+ )
+ (catch_all
+ (unreachable)
+ )
+ )
+ )
+ ;; CHECK: (func $note-loss-of-if-children
+ ;; CHECK-NEXT: (block $label$1
+ ;; CHECK-NEXT: (block $label$2
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $note-loss-of-if-children
+ (block $label$1
+ (if ;; begins unreachable - type never changes - but after the condition
+ ;; becomes unreachable, it will lose the children, which means no more
+ ;; br to the outer block, changing that type.
+ (block $label$2 (result i32)
+ (nop)
+ (unreachable)
+ )
+ (unreachable)
+ (br $label$1)
+ )
+ )
+ )
+ ;; CHECK: (func $note-loss-of-non-control-flow-children
+ ;; CHECK-NEXT: (block $out
+ ;; CHECK-NEXT: (block $block
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $note-loss-of-non-control-flow-children
+ (block $out
+ (drop
+ (i32.add
+ (block (result i32)
+ (nop)
+ (unreachable)
+ )
+ (br $out) ;; when this is removed as dead, the block becomes unreachable
+ )
+ )
+ )
+ )
+)
+(module
+ ;; CHECK: (type $none_=>_ref|any| (func (result (ref any))))
+
+ ;; CHECK: (func $foo (result (ref any))
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $foo (result (ref any))
+ (block $label$1 (result (ref any))
+ ;; this break has an unreachable input, and so it does not have a heap type
+ ;; there, and no heap type to send on the branch. this tests we do not hit
+ ;; the assertion in getHeapType() if we call that.
+ (br_on_non_null $label$1
+ (block (result anyref)
+ (unreachable)
+ )
+ )
+ (unreachable)
+ )
+ )
+)
diff --git a/test/lit/passes/dce_vacuum_remove-unused-names.wast b/test/lit/passes/dce_vacuum_remove-unused-names.wast
new file mode 100644
index 000000000..13d0800db
--- /dev/null
+++ b/test/lit/passes/dce_vacuum_remove-unused-names.wast
@@ -0,0 +1,82 @@
+;; 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 --dce --vacuum --remove-unused-names -S -o - | filecheck %s
+
+(module
+ ;; CHECK: (type $none_=>_i32 (func (result i32)))
+
+ ;; CHECK: (type $f32_f32_=>_f32 (func (param f32 f32) (result f32)))
+
+ ;; CHECK: (type $i64_=>_i64 (func (param i64) (result i64)))
+
+ ;; CHECK: (func $__Z12serveroptionPc (result i32)
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $__Z12serveroptionPc (result i32)
+ (block $switch$0
+ (return
+ (i32.const 0)
+ )
+ (br $switch$0)
+ )
+ (return
+ (i32.const 0)
+ )
+ )
+ ;; CHECK: (func $drop-unreachable (param $var$0 f32) (param $var$1 f32) (result f32)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $drop-unreachable (param $var$0 f32) (param $var$1 f32) (result f32)
+ (block $label$0 (result f32)
+ (loop $label$2
+ (drop
+ (unreachable)
+ )
+ (unreachable)
+ )
+ (local.get $var$1)
+ )
+ )
+
+ ;; CHECK: (func $set-unreachable (param $var$0 i64) (result i64)
+ ;; CHECK-NEXT: (local $var$1 i64)
+ ;; CHECK-NEXT: (local $var$2 i64)
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i64.eq
+ ;; CHECK-NEXT: (local.get $var$1)
+ ;; CHECK-NEXT: (i64.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $set-unreachable (param $var$0 i64) (result i64)
+ (local $var$1 i64)
+ (local $var$2 i64)
+ (block $label$0 (result i64)
+ (block $label$1
+ (loop $label$2
+ (if
+ (i64.eq
+ (local.get $var$1)
+ (i64.const 0)
+ )
+ (unreachable)
+ (local.set $var$2
+ (i64.mul
+ (unreachable)
+ (local.get $var$2)
+ )
+ )
+ )
+ (br $label$2)
+ )
+ )
+ (local.get $var$2)
+ )
+ )
+)
+
diff --git a/test/lit/passes/dealign.wast b/test/lit/passes/dealign.wast
new file mode 100644
index 000000000..7af89659b
--- /dev/null
+++ b/test/lit/passes/dealign.wast
@@ -0,0 +1,48 @@
+;; 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 --dealign -S -o - | filecheck %s
+
+(module
+ ;; CHECK: (type $none_=>_none (func))
+
+ ;; CHECK: (memory $0 1 1)
+ (memory $0 1 1)
+ ;; CHECK: (func $test
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.load align=1
+ ;; CHECK-NEXT: (i32.const 4)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.load align=1
+ ;; CHECK-NEXT: (i32.const 8)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.load align=1
+ ;; CHECK-NEXT: (i32.const 12)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.store align=1
+ ;; CHECK-NEXT: (i32.const 16)
+ ;; CHECK-NEXT: (i32.const 28)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.store align=1
+ ;; CHECK-NEXT: (i32.const 20)
+ ;; CHECK-NEXT: (i32.const 32)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.store align=1
+ ;; CHECK-NEXT: (i32.const 24)
+ ;; CHECK-NEXT: (i32.const 36)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $test
+ (drop (i32.load (i32.const 4)))
+ (drop (i32.load align=1 (i32.const 8)))
+ (drop (i32.load align=2 (i32.const 12)))
+ (i32.store (i32.const 16) (i32.const 28))
+ (i32.store align=1 (i32.const 20) (i32.const 32))
+ (i32.store align=2 (i32.const 24) (i32.const 36))
+ )
+)
diff --git a/test/lit/passes/dealign64.wast b/test/lit/passes/dealign64.wast
new file mode 100644
index 000000000..28f80dafa
--- /dev/null
+++ b/test/lit/passes/dealign64.wast
@@ -0,0 +1,48 @@
+;; 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 --dealign --enable-memory64 -S -o - | filecheck %s
+
+(module
+ ;; CHECK: (type $none_=>_none (func))
+
+ ;; CHECK: (memory $0 i64 1 1)
+ (memory $0 i64 1 1)
+ ;; CHECK: (func $test
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.load align=1
+ ;; CHECK-NEXT: (i64.const 4)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.load align=1
+ ;; CHECK-NEXT: (i64.const 8)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.load align=1
+ ;; CHECK-NEXT: (i64.const 12)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.store align=1
+ ;; CHECK-NEXT: (i64.const 16)
+ ;; CHECK-NEXT: (i32.const 28)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.store align=1
+ ;; CHECK-NEXT: (i64.const 20)
+ ;; CHECK-NEXT: (i32.const 32)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.store align=1
+ ;; CHECK-NEXT: (i64.const 24)
+ ;; CHECK-NEXT: (i32.const 36)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $test
+ (drop (i32.load (i64.const 4)))
+ (drop (i32.load align=1 (i64.const 8)))
+ (drop (i32.load align=2 (i64.const 12)))
+ (i32.store (i64.const 16) (i32.const 28))
+ (i32.store align=1 (i64.const 20) (i32.const 32))
+ (i32.store align=2 (i64.const 24) (i32.const 36))
+ )
+)
diff --git a/test/lit/passes/denan.wast b/test/lit/passes/denan.wast
new file mode 100644
index 000000000..a808df4b0
--- /dev/null
+++ b/test/lit/passes/denan.wast
@@ -0,0 +1,271 @@
+;; 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 --denan -S -o - | filecheck %s
+
+(module
+ ;; CHECK: (type $f32_=>_f32 (func (param f32) (result f32)))
+
+ ;; CHECK: (type $f64_=>_f64 (func (param f64) (result f64)))
+
+ ;; CHECK: (type $i32_f32_i64_f64_=>_none (func (param i32 f32 i64 f64)))
+
+ ;; CHECK: (type $f32_f64_=>_none (func (param f32 f64)))
+
+ ;; CHECK: (global $global$1 (mut f32) (f32.const 0))
+ (global $global$1 (mut f32) (f32.const nan))
+ ;; CHECK: (global $global$2 (mut f32) (f32.const 12.34000015258789))
+ (global $global$2 (mut f32) (f32.const 12.34))
+ ;; CHECK: (func $foo32 (param $x f32) (result f32)
+ ;; CHECK-NEXT: (local.set $x
+ ;; CHECK-NEXT: (call $deNan32
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (call $deNan32
+ ;; CHECK-NEXT: (call $foo32
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $foo32 (param $x f32) (result f32)
+ (call $foo32 (local.get $x))
+ )
+ ;; CHECK: (func $foo64 (param $x f64) (result f64)
+ ;; CHECK-NEXT: (local.set $x
+ ;; CHECK-NEXT: (call $deNan64
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (call $deNan64
+ ;; CHECK-NEXT: (call $foo64
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $foo64 (param $x f64) (result f64)
+ (call $foo64 (local.get $x))
+ )
+ ;; CHECK: (func $various (param $x i32) (param $y f32) (param $z i64) (param $w f64)
+ ;; CHECK-NEXT: (local.set $y
+ ;; CHECK-NEXT: (call $deNan32
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $w
+ ;; CHECK-NEXT: (call $deNan64
+ ;; CHECK-NEXT: (local.get $w)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: )
+ (func $various (param $x i32) (param $y f32) (param $z i64) (param $w f64)
+ )
+ ;; CHECK: (func $ignore-local.get (param $f f32) (param $d f64)
+ ;; CHECK-NEXT: (local.set $f
+ ;; CHECK-NEXT: (call $deNan32
+ ;; CHECK-NEXT: (local.get $f)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $d
+ ;; CHECK-NEXT: (call $deNan64
+ ;; CHECK-NEXT: (local.get $d)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $f)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $d)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $f
+ ;; CHECK-NEXT: (local.get $f)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $d
+ ;; CHECK-NEXT: (local.get $d)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $f)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $d)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (call $deNan32
+ ;; CHECK-NEXT: (f32.abs
+ ;; CHECK-NEXT: (local.get $f)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (call $deNan64
+ ;; CHECK-NEXT: (f64.abs
+ ;; CHECK-NEXT: (local.get $d)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $f
+ ;; CHECK-NEXT: (call $deNan32
+ ;; CHECK-NEXT: (f32.abs
+ ;; CHECK-NEXT: (local.get $f)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $d
+ ;; CHECK-NEXT: (call $deNan64
+ ;; CHECK-NEXT: (f64.abs
+ ;; CHECK-NEXT: (local.get $d)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $f)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $d)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $ignore-local.get (param $f f32) (param $d f64)
+ (drop (local.get $f))
+ (drop (local.get $d))
+ (local.set $f (local.get $f))
+ (local.set $d (local.get $d))
+ (drop (local.get $f))
+ (drop (local.get $d))
+ (drop (f32.abs (local.get $f)))
+ (drop (f64.abs (local.get $d)))
+ (local.set $f (f32.abs (local.get $f)))
+ (local.set $d (f64.abs (local.get $d)))
+ (drop (local.get $f))
+ (drop (local.get $d))
+ )
+ ;; CHECK: (func $tees (param $x f32) (result f32)
+ ;; CHECK-NEXT: (local.set $x
+ ;; CHECK-NEXT: (call $deNan32
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.tee $x
+ ;; CHECK-NEXT: (local.tee $x
+ ;; CHECK-NEXT: (local.tee $x
+ ;; CHECK-NEXT: (local.tee $x
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $tees (param $x f32) (result f32)
+ (local.tee $x
+ (local.tee $x
+ (local.tee $x
+ (local.tee $x
+ (local.get $x))))))
+ ;; CHECK: (func $select (param $x f32) (result f32)
+ ;; CHECK-NEXT: (local.set $x
+ ;; CHECK-NEXT: (call $deNan32
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (select
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $select (param $x f32) (result f32)
+ (select
+ (local.get $x)
+ (local.get $x)
+ (i32.const 1)))
+)
+;; existing names should not be a problem
+;; CHECK: (func $deNan32 (param $0 f32) (result f32)
+;; CHECK-NEXT: (if (result f32)
+;; CHECK-NEXT: (f32.eq
+;; CHECK-NEXT: (local.get $0)
+;; CHECK-NEXT: (local.get $0)
+;; CHECK-NEXT: )
+;; CHECK-NEXT: (local.get $0)
+;; CHECK-NEXT: (f32.const 0)
+;; CHECK-NEXT: )
+;; CHECK-NEXT: )
+
+;; CHECK: (func $deNan64 (param $0 f64) (result f64)
+;; CHECK-NEXT: (if (result f64)
+;; CHECK-NEXT: (f64.eq
+;; CHECK-NEXT: (local.get $0)
+;; CHECK-NEXT: (local.get $0)
+;; CHECK-NEXT: )
+;; CHECK-NEXT: (local.get $0)
+;; CHECK-NEXT: (f64.const 0)
+;; CHECK-NEXT: )
+;; CHECK-NEXT: )
+(module
+ ;; CHECK: (type $none_=>_none (func))
+
+ ;; CHECK: (type $f32_=>_f32 (func (param f32) (result f32)))
+
+ ;; CHECK: (type $f64_=>_f64 (func (param f64) (result f64)))
+
+ ;; CHECK: (func $deNan32
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: )
+ (func $deNan32)
+ ;; CHECK: (func $deNan64
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: )
+ (func $deNan64)
+ ;; CHECK: (func $foo32 (param $x f32) (result f32)
+ ;; CHECK-NEXT: (local.set $x
+ ;; CHECK-NEXT: (call $deNan32_0
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (call $deNan32_0
+ ;; CHECK-NEXT: (call $foo32
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $foo32 (param $x f32) (result f32)
+ (call $foo32 (local.get $x))
+ )
+ ;; CHECK: (func $foo64 (param $x f64) (result f64)
+ ;; CHECK-NEXT: (local.set $x
+ ;; CHECK-NEXT: (call $deNan64_0
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (call $deNan64_0
+ ;; CHECK-NEXT: (call $foo64
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $foo64 (param $x f64) (result f64)
+ (call $foo64 (local.get $x))
+ )
+
+)
+;; CHECK: (func $deNan32_0 (param $0 f32) (result f32)
+;; CHECK-NEXT: (if (result f32)
+;; CHECK-NEXT: (f32.eq
+;; CHECK-NEXT: (local.get $0)
+;; CHECK-NEXT: (local.get $0)
+;; CHECK-NEXT: )
+;; CHECK-NEXT: (local.get $0)
+;; CHECK-NEXT: (f32.const 0)
+;; CHECK-NEXT: )
+;; CHECK-NEXT: )
+
+;; CHECK: (func $deNan64_0 (param $0 f64) (result f64)
+;; CHECK-NEXT: (if (result f64)
+;; CHECK-NEXT: (f64.eq
+;; CHECK-NEXT: (local.get $0)
+;; CHECK-NEXT: (local.get $0)
+;; CHECK-NEXT: )
+;; CHECK-NEXT: (local.get $0)
+;; CHECK-NEXT: (f64.const 0)
+;; CHECK-NEXT: )
+;; CHECK-NEXT: )
diff --git a/test/lit/passes/directize_all-features.wast b/test/lit/passes/directize_all-features.wast
new file mode 100644
index 000000000..d9010a76d
--- /dev/null
+++ b/test/lit/passes/directize_all-features.wast
@@ -0,0 +1,521 @@
+;; 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 --directize --all-features -S -o - | filecheck %s
+
+(module
+ ;; CHECK: (type $ii (func (param i32 i32)))
+ (type $ii (func (param i32 i32)))
+ ;; CHECK: (table $0 5 5 funcref)
+ (table $0 5 5 funcref)
+ (elem (i32.const 1) $foo)
+ ;; CHECK: (elem (i32.const 1) $foo)
+
+ ;; CHECK: (func $foo (param $0 i32) (param $1 i32)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $foo (param i32) (param i32)
+ (unreachable)
+ )
+ ;; CHECK: (func $bar (param $x i32) (param $y i32)
+ ;; CHECK-NEXT: (call $foo
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $bar (param $x i32) (param $y i32)
+ (call_indirect (type $ii)
+ (local.get $x)
+ (local.get $y)
+ (i32.const 1)
+ )
+ )
+)
+(module
+ ;; CHECK: (type $ii (func (param i32 i32)))
+ (type $ii (func (param i32 i32)))
+ ;; CHECK: (type $i32_=>_i32 (func (param i32) (result i32)))
+
+ ;; CHECK: (table $0 5 5 funcref)
+ (table $0 5 5 funcref)
+ ;; CHECK: (table $1 5 5 funcref)
+ (table $1 5 5 funcref)
+ (elem (table $0) (i32.const 1) func $dummy)
+ (elem (table $1) (i32.const 1) func $f)
+ ;; CHECK: (elem $0 (table $0) (i32.const 1) func $dummy)
+
+ ;; CHECK: (elem $1 (table $1) (i32.const 1) func $f)
+
+ ;; CHECK: (func $dummy (param $0 i32) (result i32)
+ ;; CHECK-NEXT: (local.get $0)
+ ;; CHECK-NEXT: )
+ (func $dummy (param i32) (result i32)
+ (local.get 0)
+ )
+ ;; CHECK: (func $f (param $0 i32) (param $1 i32)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $f (param i32) (param i32)
+ (unreachable)
+ )
+ ;; CHECK: (func $g (param $x i32) (param $y i32)
+ ;; CHECK-NEXT: (call $f
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $g (param $x i32) (param $y i32)
+ (call_indirect $1 (type $ii)
+ (local.get $x)
+ (local.get $y)
+ (i32.const 1)
+ )
+ )
+)
+;; at table edges
+(module
+ ;; CHECK: (type $ii (func (param i32 i32)))
+ (type $ii (func (param i32 i32)))
+ ;; CHECK: (table $0 5 5 funcref)
+ (table $0 5 5 funcref)
+ ;; CHECK: (table $1 5 5 funcref)
+ (table $1 5 5 funcref)
+ (elem (table $1) (i32.const 4) func $foo)
+ ;; CHECK: (elem (table $1) (i32.const 4) func $foo)
+
+ ;; CHECK: (func $foo (param $0 i32) (param $1 i32)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $foo (param i32) (param i32)
+ (unreachable)
+ )
+ ;; CHECK: (func $bar (param $x i32) (param $y i32)
+ ;; CHECK-NEXT: (call $foo
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $bar (param $x i32) (param $y i32)
+ (call_indirect $1 (type $ii)
+ (local.get $x)
+ (local.get $y)
+ (i32.const 4)
+ )
+ )
+)
+(module
+ ;; CHECK: (type $ii (func (param i32 i32)))
+ (type $ii (func (param i32 i32)))
+ ;; CHECK: (table $0 5 5 funcref)
+ (table $0 5 5 funcref)
+ (elem (i32.const 0) $foo)
+ ;; CHECK: (elem (i32.const 0) $foo)
+
+ ;; CHECK: (func $foo (param $0 i32) (param $1 i32)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $foo (param i32) (param i32)
+ (unreachable)
+ )
+ ;; CHECK: (func $bar (param $x i32) (param $y i32)
+ ;; CHECK-NEXT: (call $foo
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $bar (param $x i32) (param $y i32)
+ (call_indirect (type $ii)
+ (local.get $x)
+ (local.get $y)
+ (i32.const 0)
+ )
+ )
+)
+(module
+ ;; CHECK: (type $ii (func (param i32 i32)))
+ (type $ii (func (param i32 i32)))
+ ;; CHECK: (table $0 5 5 funcref)
+ (table $0 5 5 funcref)
+ ;; CHECK: (table $1 5 5 funcref)
+ (table $1 5 5 funcref)
+ (elem (i32.const 0) $foo $foo $foo $foo $foo)
+ (elem (table $1) (i32.const 0) func $foo $foo $foo $foo $foo)
+ ;; CHECK: (elem $0 (table $0) (i32.const 0) func $foo $foo $foo $foo $foo)
+
+ ;; CHECK: (elem $1 (table $1) (i32.const 0) func $foo $foo $foo $foo $foo)
+
+ ;; CHECK: (func $foo (param $0 i32) (param $1 i32)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $foo (param i32) (param i32)
+ (unreachable)
+ )
+ ;; CHECK: (func $bar (param $x i32) (param $y i32)
+ ;; CHECK-NEXT: (call $foo
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $bar (param $x i32) (param $y i32)
+ (call_indirect $1 (type $ii)
+ (local.get $x)
+ (local.get $y)
+ (i32.const 2)
+ )
+ )
+)
+;; imported table
+(module
+ ;; CHECK: (type $ii (func (param i32 i32)))
+ (type $ii (func (param i32 i32)))
+ ;; CHECK: (import "env" "table" (table $table 5 5 funcref))
+ (import "env" "table" (table $table 5 5 funcref))
+ (elem (i32.const 1) $foo)
+ ;; CHECK: (elem (i32.const 1) $foo)
+
+ ;; CHECK: (func $foo (param $0 i32) (param $1 i32)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $foo (param i32) (param i32)
+ (unreachable)
+ )
+ ;; CHECK: (func $bar (param $x i32) (param $y i32)
+ ;; CHECK-NEXT: (call_indirect $table (type $ii)
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $bar (param $x i32) (param $y i32)
+ (call_indirect (type $ii)
+ (local.get $x)
+ (local.get $y)
+ (i32.const 1)
+ )
+ )
+)
+;; exported table
+(module
+ ;; CHECK: (type $ii (func (param i32 i32)))
+ (type $ii (func (param i32 i32)))
+ ;; CHECK: (table $0 5 5 funcref)
+ (table $0 5 5 funcref)
+ ;; CHECK: (elem (i32.const 1) $foo)
+
+ ;; CHECK: (export "tab" (table $0))
+ (export "tab" (table $0))
+ (elem (i32.const 1) $foo)
+ ;; CHECK: (func $foo (param $0 i32) (param $1 i32)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $foo (param i32) (param i32)
+ (unreachable)
+ )
+ ;; CHECK: (func $bar (param $x i32) (param $y i32)
+ ;; CHECK-NEXT: (call_indirect $0 (type $ii)
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $bar (param $x i32) (param $y i32)
+ (call_indirect (type $ii)
+ (local.get $x)
+ (local.get $y)
+ (i32.const 1)
+ )
+ )
+)
+;; non-constant table offset
+(module
+ ;; CHECK: (type $ii (func (param i32 i32)))
+ (type $ii (func (param i32 i32)))
+ ;; CHECK: (global $g (mut i32) (i32.const 1))
+
+ ;; CHECK: (table $0 5 5 funcref)
+ (table $0 5 5 funcref)
+ (global $g (mut i32) (i32.const 1))
+ (elem (global.get $g) $foo)
+ ;; CHECK: (elem (global.get $g) $foo)
+
+ ;; CHECK: (func $foo (param $0 i32) (param $1 i32)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $foo (param i32) (param i32)
+ (unreachable)
+ )
+ ;; CHECK: (func $bar (param $x i32) (param $y i32)
+ ;; CHECK-NEXT: (call_indirect $0 (type $ii)
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $bar (param $x i32) (param $y i32)
+ (call_indirect (type $ii)
+ (local.get $x)
+ (local.get $y)
+ (i32.const 1)
+ )
+ )
+)
+(module
+ ;; CHECK: (type $ii (func (param i32 i32)))
+ (type $ii (func (param i32 i32)))
+ ;; CHECK: (global $g (mut i32) (i32.const 1))
+
+ ;; CHECK: (table $0 5 5 funcref)
+ (table $0 5 5 funcref)
+ ;; CHECK: (table $1 5 5 funcref)
+ (table $1 5 5 funcref)
+ (global $g (mut i32) (i32.const 1))
+ (elem (table $1) (global.get $g) func $foo)
+ ;; CHECK: (elem (table $1) (global.get $g) func $foo)
+
+ ;; CHECK: (func $foo (param $0 i32) (param $1 i32)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $foo (param i32) (param i32)
+ (unreachable)
+ )
+ ;; CHECK: (func $bar (param $x i32) (param $y i32)
+ ;; CHECK-NEXT: (call_indirect $1 (type $ii)
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $bar (param $x i32) (param $y i32)
+ (call_indirect $1 (type $ii)
+ (local.get $x)
+ (local.get $y)
+ (i32.const 1)
+ )
+ )
+)
+;; non-constant call index
+(module
+ ;; CHECK: (type $ii (func (param i32 i32)))
+ (type $ii (func (param i32 i32)))
+ ;; CHECK: (type $i32_i32_i32_=>_none (func (param i32 i32 i32)))
+
+ ;; CHECK: (table $0 5 5 funcref)
+ (table $0 5 5 funcref)
+ (elem (i32.const 1) $foo)
+ ;; CHECK: (elem (i32.const 1) $foo)
+
+ ;; CHECK: (func $foo (param $0 i32) (param $1 i32)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $foo (param i32) (param i32)
+ (unreachable)
+ )
+ ;; CHECK: (func $bar (param $x i32) (param $y i32) (param $z i32)
+ ;; CHECK-NEXT: (call_indirect $0 (type $ii)
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: (local.get $z)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $bar (param $x i32) (param $y i32) (param $z i32)
+ (call_indirect (type $ii)
+ (local.get $x)
+ (local.get $y)
+ (local.get $z)
+ )
+ )
+)
+;; bad index
+(module
+ ;; CHECK: (type $ii (func (param i32 i32)))
+ (type $ii (func (param i32 i32)))
+ ;; CHECK: (table $0 5 5 funcref)
+ (table $0 5 5 funcref)
+ (elem (i32.const 1) $foo)
+ ;; CHECK: (elem (i32.const 1) $foo)
+
+ ;; CHECK: (func $foo (param $0 i32) (param $1 i32)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $foo (param i32) (param i32)
+ (unreachable)
+ )
+ ;; CHECK: (func $bar (param $x i32) (param $y i32)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $bar (param $x i32) (param $y i32)
+ (call_indirect (type $ii)
+ (local.get $x)
+ (local.get $y)
+ (i32.const 5)
+ )
+ )
+)
+;; missing index
+(module
+ ;; CHECK: (type $ii (func (param i32 i32)))
+ (type $ii (func (param i32 i32)))
+ ;; CHECK: (table $0 5 5 funcref)
+ (table $0 5 5 funcref)
+ (elem (i32.const 1) $foo)
+ ;; CHECK: (elem (i32.const 1) $foo)
+
+ ;; CHECK: (func $foo (param $0 i32) (param $1 i32)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $foo (param i32) (param i32)
+ (unreachable)
+ )
+ ;; CHECK: (func $bar (param $x i32) (param $y i32)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $bar (param $x i32) (param $y i32)
+ (call_indirect (type $ii)
+ (local.get $x)
+ (local.get $y)
+ (i32.const 2)
+ )
+ )
+)
+;; bad type
+(module
+ ;; CHECK: (type $i32_=>_none (func (param i32)))
+
+ ;; CHECK: (type $ii (func (param i32 i32)))
+ (type $ii (func (param i32 i32)))
+ ;; CHECK: (table $0 5 5 funcref)
+ (table $0 5 5 funcref)
+ (elem (i32.const 1) $foo)
+ ;; CHECK: (elem (i32.const 1) $foo)
+
+ ;; CHECK: (func $foo (param $0 i32)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $foo (param i32)
+ (unreachable)
+ )
+ ;; CHECK: (func $bar (param $x i32) (param $y i32)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $bar (param $x i32) (param $y i32)
+ (call_indirect (type $ii)
+ (local.get $x)
+ (local.get $y)
+ (i32.const 1)
+ )
+ )
+)
+;; no table
+(module
+ ;; CHECK: (type $i32_=>_none (func (param i32)))
+
+ ;; CHECK: (func $foo (param $0 i32)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $foo (param i32)
+ (unreachable)
+ )
+)
+;; change types
+(module
+ (type (func))
+ ;; CHECK: (type $none_=>_none (func))
+
+ ;; CHECK: (table $0 8 8 funcref)
+ (table $0 8 8 funcref)
+ ;; CHECK: (func $0
+ ;; CHECK-NEXT: (block $block
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $0
+ (block ;; the type of this block will change
+ (nop)
+ (call_indirect (type 0)
+ (i32.const 15)
+ )
+ )
+ )
+)
+(module ;; indirect tail call
+ ;; CHECK: (type $ii (func (param i32 i32)))
+ (type $ii (func (param i32 i32)))
+ ;; CHECK: (table $0 5 5 funcref)
+ (table $0 5 5 funcref)
+ (elem (i32.const 1) $foo)
+ ;; CHECK: (elem (i32.const 1) $foo)
+
+ ;; CHECK: (func $foo (param $0 i32) (param $1 i32)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $foo (param i32) (param i32)
+ (unreachable)
+ )
+ ;; CHECK: (func $bar (param $x i32) (param $y i32)
+ ;; CHECK-NEXT: (return_call $foo
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $bar (param $x i32) (param $y i32)
+ (return_call_indirect (type $ii)
+ (local.get $x)
+ (local.get $y)
+ (i32.const 1)
+ )
+ )
+)
+;; call_ref
+(module
+ ;; CHECK: (type $i32_i32_=>_none (func (param i32 i32)))
+
+ ;; CHECK: (func $foo (param $0 i32) (param $1 i32)
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $foo (param i32) (param i32)
+ (unreachable)
+ )
+ ;; CHECK: (func $bar (param $x i32) (param $y i32)
+ ;; CHECK-NEXT: (call $foo
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $bar (param $x i32) (param $y i32)
+ (call_ref
+ (local.get $x)
+ (local.get $y)
+ (ref.func $foo)
+ )
+ )
+)
+
diff --git a/test/passes/dce_all-features.txt b/test/passes/dce_all-features.txt
deleted file mode 100644
index 779405c13..000000000
--- a/test/passes/dce_all-features.txt
+++ /dev/null
@@ -1,599 +0,0 @@
-(module
- (type $none_=>_i32 (func (result i32)))
- (type $1 (func))
- (type $i32_=>_i32 (func (param i32) (result i32)))
- (type $ii (func (param i32 i32)))
- (type $i64_i64_=>_i64 (func (param i64 i64) (result i64)))
- (type $f32_i64_=>_none (func (param f32 i64)))
- (type $f32_i64_=>_i32 (func (param f32 i64) (result i32)))
- (global $x (mut i32) (i32.const 0))
- (memory $0 10)
- (table $0 1 1 funcref)
- (elem (i32.const 0) $call-me)
- (func $call-me (param $0 i32) (param $1 i32)
- (nop)
- )
- (func $code-to-kill
- (local $x i32)
- (block $out
- (br $out)
- )
- (if
- (i32.const 0)
- (unreachable)
- )
- (if
- (i32.const 0)
- (block $out3
- (return)
- )
- )
- (block $out4
- (br_table $out4 $out4 $out4 $out4
- (i32.const 4)
- )
- )
- (block $out5
- (br_if $out5
- (i32.const 3)
- )
- (drop
- (i32.const 0)
- )
- )
- (if
- (i32.const 0)
- (block $block4
- (if
- (i32.const 0)
- (unreachable)
- (unreachable)
- )
- )
- )
- (if
- (i32.const 0)
- (unreachable)
- )
- (if
- (i32.const 0)
- (unreachable)
- )
- (if
- (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)
- )
- )
- )
- (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)
- )
- )
- )
- (if
- (i32.const 0)
- (block $block15
- (drop
- (i32.const 10)
- )
- (drop
- (i32.const 42)
- )
- (unreachable)
- )
- )
- (if
- (i32.const 0)
- (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)
- )
- )
- )
- (if
- (i32.const 1)
- (block
- (drop
- (i32.const 123)
- )
- (unreachable)
- )
- )
- (if
- (i32.const 2)
- (unreachable)
- )
- (if
- (i32.const 3)
- (unreachable)
- )
- (if
- (i32.const -1)
- (block
- (drop
- (i32.const 123)
- )
- (drop
- (i32.const 456)
- )
- (unreachable)
- )
- )
- (if
- (i32.const -2)
- (block
- (drop
- (i32.const 139)
- )
- (unreachable)
- )
- )
- (if
- (i32.const -3)
- (block
- (drop
- (i32.const 246)
- )
- (unreachable)
- )
- )
- (if
- (i32.const -4)
- (unreachable)
- )
- (if
- (i32.const 11)
- (unreachable)
- )
- (if
- (i32.const 22)
- (unreachable)
- )
- (if
- (i32.const 33)
- (block
- (drop
- (i32.const 0)
- )
- (unreachable)
- )
- )
- (if
- (i32.const 44)
- (unreachable)
- )
- (if
- (i32.const 55)
- (unreachable)
- )
- (if
- (i32.const 66)
- (unreachable)
- )
- (if
- (i32.const 77)
- (unreachable)
- )
- (if
- (i32.const 88)
- (block
- (drop
- (i32.const 0)
- )
- (unreachable)
- )
- )
- (if
- (i32.const 99)
- (unreachable)
- )
- (if
- (i32.const 100)
- (block
- (drop
- (i32.const 123)
- )
- (drop
- (i32.const 456)
- )
- (unreachable)
- )
- )
- (if
- (i32.const 101)
- (block
- (drop
- (i32.const 123)
- )
- (unreachable)
- )
- )
- (if
- (i32.const 102)
- (unreachable)
- )
- (drop
- (i32.const 1337)
- )
- )
- (func $killer
- (unreachable)
- )
- (func $target
- (drop
- (i32.const 2000)
- )
- )
- (func $typed-block-none-then-unreachable (result i32)
- (block $top-typed
- (block $switch$0
- (return
- (i32.const 0)
- )
- )
- )
- )
- (func $typed-block-remove-br-changes-type (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)
- )
- )
- (return
- (local.get $$$0)
- )
- )
- )
- (func $global
- (unreachable)
- )
- (func $ret (result i32)
- (return
- (i32.const 0)
- )
- )
- (func $unreachable-br (result i32)
- (block $out (result i32)
- (br $out
- (i32.const 0)
- )
- )
- )
- (func $unreachable-br-loop (result i32)
- (loop $out
- (br $out)
- )
- )
- (func $unreachable-block-ends-switch (result i32)
- (block $label$0
- (block $label$3
- (nop)
- (unreachable)
- )
- )
- )
- (func $unreachable-block-ends-br_if (result i32)
- (block $label$0
- (block $label$2
- (nop)
- (unreachable)
- )
- )
- )
- (func $unreachable-brs-3 (result i32)
- (block $label$0 (result i32)
- (br $label$0
- (i32.const 18)
- )
- )
- )
- (func $unreachable-brs-4 (param $var$0 i32) (result i32)
- (drop
- (i32.const 1)
- )
- (block $label$0
- (block $label$1
- (block
- (drop
- (i32.const 4104)
- )
- (unreachable)
- )
- )
- )
- )
- (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
- (block
- (drop
- (i64.sub
- (local.get $var$0)
- (i64.const 1)
- )
- )
- (block
- (drop
- (block $block (result i64)
- (local.set $2
- (local.get $var$0)
- )
- (nop)
- (local.get $2)
- )
- )
- (unreachable)
- )
- )
- )
- )
- )
- (func $br-gone-means-block-type-changes-then-refinalize-at-end-is-too-late (param $var$0 i32) (result i32)
- (block $label$0
- (block $block
- (nop)
- (unreachable)
- )
- )
- )
- (func $br-with-unreachable-value-should-not-give-a-block-a-value (param $var$0 i32) (result i32)
- (block $label$0 (result i32)
- (block $block
- (drop
- (br_if $label$0
- (i32.const 8)
- (local.get $var$0)
- )
- )
- (unreachable)
- )
- )
- )
- (func $replace-br-value-of-i32-with-unreachable (result i32)
- (block $label$0
- (block $label$1
- (nop)
- (unreachable)
- )
- )
- )
- (func $shorten-block-requires-sync-refinalize (param $var$0 i32) (param $var$1 i32)
- (unreachable)
- )
- (func $block-with-type-but-is-unreachable (param $var$0 i32) (result i32)
- (block $label$0
- (block $block
- (nop)
- (unreachable)
- )
- )
- )
- (func $if-with-type-but-is-unreachable (param $var$0 i32) (result i32)
- (block $label$0
- (if
- (local.get $var$0)
- (unreachable)
- (unreachable)
- )
- )
- )
- (func $unreachable-loop
- (unreachable)
- )
- (func $br-block-from-unary (result i32)
- (block $label$6 (result i32)
- (block $label$7
- (br $label$6
- (i32.const 8)
- )
- )
- )
- )
- (func $replace-unary-with-br-child
- (drop
- (block $label$6 (result i32)
- (br $label$6
- (i32.const 8)
- )
- )
- )
- )
- (func $br_if-unreach-then-br_if-normal
- (block $out
- (nop)
- (unreachable)
- )
- )
- (func $replace-with-unreachable-affects-parent (param $var$0 f32) (param $var$1 i64)
- (block $top
- (block
- (drop
- (i64.const 0)
- )
- (if
- (block $block (result i32)
- (call $replace-with-unreachable-affects-parent
- (f32.const 1)
- (i64.const -15917430362925035)
- )
- (i32.const 1)
- )
- (unreachable)
- (unreachable)
- )
- )
- )
- )
- (func $replace-block-changes-later-when-if-goes
- (block $top
- (global.set $x
- (i32.const 0)
- )
- (block $inner
- (drop
- (call $helper
- (f32.const 1)
- (i64.const -15917430362925035)
- )
- )
- (unreachable)
- )
- )
- )
- (func $helper (param $var$0 f32) (param $var$1 i64) (result i32)
- (i32.const 0)
- )
-)
-(module
- (type $none_=>_none (func))
- (global $global (mut f64) (f64.const 0))
- (func $0
- (if
- (i32.const 0)
- (unreachable)
- (unreachable)
- )
- )
-)
-(module
- (type $none_=>_none (func))
- (func $0
- (local $local f64)
- (if
- (i32.const 0)
- (unreachable)
- (unreachable)
- )
- )
-)
-(module
- (type $none_=>_i32 (func (result i32)))
- (type $none_=>_none (func))
- (func $unnecessary-concrete-block (result i32)
- (block $foo
- (nop)
- (unreachable)
- )
- )
- (func $necessary-concrete-block (result i32)
- (block $foo (result i32)
- (br $foo
- (i32.const 1)
- )
- )
- )
- (func $unnecessary-concrete-if (result i32)
- (if
- (i32.const 0)
- (return
- (i32.const 1)
- )
- (unreachable)
- )
- )
- (func $unnecessary-concrete-try (result i32)
- (try $try
- (do
- (unreachable)
- )
- (catch_all
- (unreachable)
- )
- )
- )
- (func $note-loss-of-if-children
- (block $label$1
- (block $label$2
- (nop)
- (unreachable)
- )
- )
- )
- (func $note-loss-of-non-control-flow-children
- (block $out
- (block $block
- (nop)
- (unreachable)
- )
- )
- )
-)
-(module
- (type $none_=>_ref|any| (func (result (ref any))))
- (func $foo (result (ref any))
- (unreachable)
- )
-)
diff --git a/test/passes/dce_all-features.wast b/test/passes/dce_all-features.wast
deleted file mode 100644
index 95344be93..000000000
--- a/test/passes/dce_all-features.wast
+++ /dev/null
@@ -1,809 +0,0 @@
-(module
- (memory 10)
- (type $ii (func (param i32 i32)))
- (type $1 (func))
- (table 1 1 funcref)
- (elem (i32.const 0) $call-me)
- (global $x (mut i32) (i32.const 0))
- (func $call-me (type $ii) (param $0 i32) (param $1 i32)
- (nop)
- )
- (func $code-to-kill (type $1)
- (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 $out
- (unreachable)
- (drop
- (i32.const 0)
- )
- )
- )
- (if
- (i32.const 0)
- (block $out
- (return)
- (drop
- (i32.const 0)
- )
- )
- )
- (block $out
- (br_table $out $out $out $out
- (i32.const 4)
- )
- (drop
- (i32.const 0)
- )
- )
- (block $out
- (br_if $out
- (i32.const 3)
- )
- (drop
- (i32.const 0)
- )
- )
- (if
- (i32.const 0)
- (block $block4
- (if
- (i32.const 0)
- (block $out
- (unreachable)
- (drop
- (i32.const 0)
- )
- )
- (block $out
- (unreachable)
- (drop
- (i32.const 0)
- )
- )
- )
- (drop
- (i32.const 0)
- )
- )
- )
- (if
- (i32.const 0)
- (drop
- (block $out (result i32)
- (br $out
- (unreachable)
- )
- (drop
- (i32.const 0)
- )
- (unreachable)
- )
- )
- )
- (if
- (i32.const 0)
- (drop
- (block $out (result i32)
- (br_if $out
- (unreachable)
- (i32.const 0)
- )
- (drop
- (i32.const 0)
- )
- (unreachable)
- )
- )
- )
- (if
- (i32.const 0)
- (drop
- (block $out (result i32)
- (br_if $out
- (unreachable)
- (unreachable)
- )
- (drop
- (i32.const 0)
- )
- (unreachable)
- )
- )
- )
- (block $out
- (block $in
- (br_if $out
- (i32.const 1)
- )
- )
- (unreachable)
- )
- (if
- (i32.const 0)
- (block $block11
- (block $out
- (block $in
- (br_if $in
- (i32.const 1)
- )
- )
- (unreachable)
- )
- (drop
- (i32.const 10)
- )
- )
- )
- (block $out
- (block $in
- (br_table $out $in
- (i32.const 1)
- )
- )
- (unreachable)
- )
- (block $out
- (block $in
- (br_table $in $out
- (i32.const 1)
- )
- )
- (unreachable)
- )
- (if
- (i32.const 0)
- (block $block13
- (block $out
- (block $in
- (br_table $in $in
- (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 $out
- (loop $in
- (br_if $out
- (i32.const 1)
- )
- (unreachable)
- )
- )
- (if
- (i32.const 0)
- (block $block20
- (loop $in
- (br_if $in
- (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 (result i32)
- (block $top-typed (result i32)
- (block $switch$0 ;; this looks like it can be broken to, so it gets type 'none'
- (return
- (i32.const 0)
- )
- (br $switch$0) ;; this is not reachable, so dce cleans it up, changing $switch$0's type
- )
- (return ;; and this is cleaned up as well, leaving $top-typed in need of a type change
- (i32.const 1)
- )
- )
- )
- (func $typed-block-remove-br-changes-type (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
- (unreachable)
- (drop (global.get $x))
- (global.set $x (i32.const 1))
- )
- (func $ret (result i32)
- (return
- (i32.const 0)
- )
- (nop)
- (i32.const 0)
- )
- (func $unreachable-br (result i32)
- (block $out (result i32)
- (br $out
- (br $out (i32.const 0))
- )
- )
- )
- (func $unreachable-br-loop (result i32)
- (loop $out
- (br $out)
- )
- )
- (func $unreachable-block-ends-switch (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) ;; this block is declared i32, but we can see it is unreachable
- (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 (result i64)
- (local.set $2
- (local.get $var$0)
- )
- (nop)
- (local.get $2)
- )
- (unreachable)
- )
- )
- )
- )
- )
- (func $br-gone-means-block-type-changes-then-refinalize-at-end-is-too-late (param $var$0 i32) (result i32)
- (block $label$0 (result i32)
- (br $label$0
- (block (result i32)
- (nop)
- (drop
- (br_if $label$0
- (unreachable)
- (local.get $var$0)
- )
- )
- (i32.const 4)
- )
- )
- )
- )
- (func $br-with-unreachable-value-should-not-give-a-block-a-value (param $var$0 i32) (result i32)
- (block $label$0 (result i32)
- (br $label$0
- (block (result i32) ;; turns into unreachable when refinalized
- (drop
- (br_if $label$0
- (i32.const 8)
- (local.get $var$0)
- )
- )
- (unreachable)
- )
- )
- (i32.const 16)
- )
- )
- (func $replace-br-value-of-i32-with-unreachable (result i32)
- (block $label$0 (result i32)
- (br $label$0
- (block $label$1 (result i32)
- (nop)
- (unreachable)
- )
- )
- )
- )
- (func $shorten-block-requires-sync-refinalize (param $var$0 i32) (param $var$1 i32)
- (block $label$0
- (unreachable)
- (if
- (unreachable)
- (br_if $label$0
- (local.get $var$1)
- )
- )
- )
- )
- (func $block-with-type-but-is-unreachable (param $var$0 i32) (result i32)
- (block $label$0 (result i32)
- (br $label$0
- (block $block (result i32)
- (nop)
- (unreachable)
- )
- )
- )
- )
- (func $if-with-type-but-is-unreachable (param $var$0 i32) (result i32)
- (block $label$0 (result i32)
- (br $label$0
- (if (result i32)
- (local.get $var$0)
- (unreachable)
- (unreachable)
- )
- )
- )
- )
- (func $unreachable-loop
- (loop $label$2
- (unreachable)
- (br $label$2)
- )
- )
- (func $br-block-from-unary (result i32)
- (block $label$6 (result i32)
- (i32.ctz
- (block $label$7 (result i32)
- (br $label$6
- (i32.const 8)
- )
- )
- )
- )
- )
- (func $replace-unary-with-br-child
- (drop
- (block $label$6 (result i32)
- (i32.ctz
- (br $label$6
- (i32.const 8)
- )
- )
- )
- )
- )
- (func $br_if-unreach-then-br_if-normal
- (block $out
- (nop)
- (br_if $out
- (unreachable)
- )
- (br_if $out
- (i32.const 1)
- )
- )
- )
- (func $replace-with-unreachable-affects-parent (param $var$0 f32) (param $var$1 i64)
- (block $top
- (drop
- (f32.load offset=4
- (i64.ne
- (i64.const 0)
- (if (result i64)
- (block (result i32)
- (call $replace-with-unreachable-affects-parent
- (f32.const 1)
- (i64.const -15917430362925035)
- )
- (i32.const 1)
- )
- (unreachable)
- (unreachable)
- )
- )
- )
- )
- (nop) ;; this is not reachable due to the above code, so we replace it with unreachable. type should go to parent
- )
- )
- (func $replace-block-changes-later-when-if-goes
- (block $top ;; and so should this
- (global.set $x
- (i32.const 0)
- )
- (drop
- (f32.load offset=4
- (i64.ne
- (block $inner (result i64) ;; this becomes unreachable
- (drop
- (call $helper
- (f32.const 1)
- (i64.const -15917430362925035)
- )
- )
- (unreachable)
- )
- (i64.const 0)
- )
- )
- )
- (if
- (i32.load16_s offset=22 align=1
- (i32.const 0)
- )
- (br $top) ;; this keeps the block none after the inner block gets unreachable. but it will vanish into unreachable itself
- (unreachable)
- )
- )
- )
- (func $helper (param $var$0 f32) (param $var$1 i64) (result i32)
- (i32.const 0)
- )
-)
-;; if goes to unreachable, need to propagate that up to the global.set
-(module
- (global $global (mut f64) (f64.const 0))
- (func $0
- (global.set $global
- (if (result f64)
- (i32.const 0)
- (unreachable)
- (unreachable)
- )
- )
- )
-)
-(module
- (func $0
- (local $local f64)
- (local.set $local
- (if (result f64)
- (i32.const 0)
- (unreachable)
- (unreachable)
- )
- )
- )
-)
-
-(module
- (func $unnecessary-concrete-block (result i32)
- (block $foo (result i32) ;; unnecessary type
- (nop)
- (unreachable)
- )
- )
- (func $necessary-concrete-block (result i32)
- (block $foo (result i32)
- (br $foo (i32.const 1))
- (unreachable)
- )
- )
- (func $unnecessary-concrete-if (result i32)
- (if (result i32) ;; unnecessary type
- (i32.const 0)
- (return (i32.const 1))
- (unreachable)
- )
- )
- (func $unnecessary-concrete-try (result i32)
- (try (result i32)
- (do
- (unreachable)
- )
- (catch_all
- (unreachable)
- )
- )
- )
- (func $note-loss-of-if-children
- (block $label$1
- (if ;; begins unreachable - type never changes - but after the condition
- ;; becomes unreachable, it will lose the children, which means no more
- ;; br to the outer block, changing that type.
- (block $label$2 (result i32)
- (nop)
- (unreachable)
- )
- (unreachable)
- (br $label$1)
- )
- )
- )
- (func $note-loss-of-non-control-flow-children
- (block $out
- (drop
- (i32.add
- (block (result i32)
- (nop)
- (unreachable)
- )
- (br $out) ;; when this is removed as dead, the block becomes unreachable
- )
- )
- )
- )
-)
-(module
- (func $foo (result (ref any))
- (block $label$1 (result (ref any))
- ;; this break has an unreachable input, and so it does not have a heap type
- ;; there, and no heap type to send on the branch. this tests we do not hit
- ;; the assertion in getHeapType() if we call that.
- (br_on_non_null $label$1
- (block (result anyref)
- (unreachable)
- )
- )
- (unreachable)
- )
- )
-)
diff --git a/test/passes/dce_vacuum_remove-unused-names.txt b/test/passes/dce_vacuum_remove-unused-names.txt
deleted file mode 100644
index f602d2f80..000000000
--- a/test/passes/dce_vacuum_remove-unused-names.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-(module
- (type $none_=>_i32 (func (result i32)))
- (type $f32_f32_=>_f32 (func (param f32 f32) (result f32)))
- (type $i64_=>_i64 (func (param i64) (result i64)))
- (func $__Z12serveroptionPc (result i32)
- (return
- (i32.const 0)
- )
- )
- (func $drop-unreachable (param $var$0 f32) (param $var$1 f32) (result f32)
- (unreachable)
- )
- (func $set-unreachable (param $var$0 i64) (result i64)
- (local $var$1 i64)
- (local $var$2 i64)
- (if
- (i64.eq
- (local.get $var$1)
- (i64.const 0)
- )
- (unreachable)
- (unreachable)
- )
- )
-)
diff --git a/test/passes/dce_vacuum_remove-unused-names.wast b/test/passes/dce_vacuum_remove-unused-names.wast
deleted file mode 100644
index 47f4affbd..000000000
--- a/test/passes/dce_vacuum_remove-unused-names.wast
+++ /dev/null
@@ -1,51 +0,0 @@
-(module
- (func $__Z12serveroptionPc (result i32)
- (block $switch$0
- (return
- (i32.const 0)
- )
- (br $switch$0)
- )
- (return
- (i32.const 0)
- )
- )
- (func $drop-unreachable (param $var$0 f32) (param $var$1 f32) (result f32)
- (block $label$0 (result f32)
- (loop $label$2
- (drop
- (unreachable)
- )
- (unreachable)
- )
- (local.get $var$1)
- )
- )
-
- (func $set-unreachable (param $var$0 i64) (result i64)
- (local $var$1 i64)
- (local $var$2 i64)
- (block $label$0 (result i64)
- (block $label$1
- (loop $label$2
- (if
- (i64.eq
- (local.get $var$1)
- (i64.const 0)
- )
- (unreachable)
- (local.set $var$2
- (i64.mul
- (unreachable)
- (local.get $var$2)
- )
- )
- )
- (br $label$2)
- )
- )
- (local.get $var$2)
- )
- )
-)
-
diff --git a/test/passes/dealign.txt b/test/passes/dealign.txt
deleted file mode 100644
index 379241da9..000000000
--- a/test/passes/dealign.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-(module
- (type $none_=>_none (func))
- (memory $0 1 1)
- (func $test
- (drop
- (i32.load align=1
- (i32.const 4)
- )
- )
- (drop
- (i32.load align=1
- (i32.const 8)
- )
- )
- (drop
- (i32.load align=1
- (i32.const 12)
- )
- )
- (i32.store align=1
- (i32.const 16)
- (i32.const 28)
- )
- (i32.store align=1
- (i32.const 20)
- (i32.const 32)
- )
- (i32.store align=1
- (i32.const 24)
- (i32.const 36)
- )
- )
-)
diff --git a/test/passes/dealign.wast b/test/passes/dealign.wast
deleted file mode 100644
index c7116daca..000000000
--- a/test/passes/dealign.wast
+++ /dev/null
@@ -1,11 +0,0 @@
-(module
- (memory $0 1 1)
- (func $test
- (drop (i32.load (i32.const 4)))
- (drop (i32.load align=1 (i32.const 8)))
- (drop (i32.load align=2 (i32.const 12)))
- (i32.store (i32.const 16) (i32.const 28))
- (i32.store align=1 (i32.const 20) (i32.const 32))
- (i32.store align=2 (i32.const 24) (i32.const 36))
- )
-)
diff --git a/test/passes/dealign64.passes b/test/passes/dealign64.passes
deleted file mode 100644
index e60b7bb7e..000000000
--- a/test/passes/dealign64.passes
+++ /dev/null
@@ -1 +0,0 @@
-dealign_enable-memory64
diff --git a/test/passes/dealign64.txt b/test/passes/dealign64.txt
deleted file mode 100644
index cbbe0b375..000000000
--- a/test/passes/dealign64.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-(module
- (type $none_=>_none (func))
- (memory $0 i64 1 1)
- (func $test
- (drop
- (i32.load align=1
- (i64.const 4)
- )
- )
- (drop
- (i32.load align=1
- (i64.const 8)
- )
- )
- (drop
- (i32.load align=1
- (i64.const 12)
- )
- )
- (i32.store align=1
- (i64.const 16)
- (i32.const 28)
- )
- (i32.store align=1
- (i64.const 20)
- (i32.const 32)
- )
- (i32.store align=1
- (i64.const 24)
- (i32.const 36)
- )
- )
-)
diff --git a/test/passes/dealign64.wast b/test/passes/dealign64.wast
deleted file mode 100644
index bce361106..000000000
--- a/test/passes/dealign64.wast
+++ /dev/null
@@ -1,11 +0,0 @@
-(module
- (memory $0 i64 1 1)
- (func $test
- (drop (i32.load (i64.const 4)))
- (drop (i32.load align=1 (i64.const 8)))
- (drop (i32.load align=2 (i64.const 12)))
- (i32.store (i64.const 16) (i32.const 28))
- (i32.store align=1 (i64.const 20) (i32.const 32))
- (i32.store align=2 (i64.const 24) (i32.const 36))
- )
-)
diff --git a/test/passes/denan.txt b/test/passes/denan.txt
deleted file mode 100644
index de592c7fd..000000000
--- a/test/passes/denan.txt
+++ /dev/null
@@ -1,212 +0,0 @@
-(module
- (type $f32_=>_f32 (func (param f32) (result f32)))
- (type $f64_=>_f64 (func (param f64) (result f64)))
- (type $i32_f32_i64_f64_=>_none (func (param i32 f32 i64 f64)))
- (type $f32_f64_=>_none (func (param f32 f64)))
- (global $global$1 (mut f32) (f32.const 0))
- (global $global$2 (mut f32) (f32.const 12.34000015258789))
- (func $foo32 (param $x f32) (result f32)
- (local.set $x
- (call $deNan32
- (local.get $x)
- )
- )
- (call $deNan32
- (call $foo32
- (local.get $x)
- )
- )
- )
- (func $foo64 (param $x f64) (result f64)
- (local.set $x
- (call $deNan64
- (local.get $x)
- )
- )
- (call $deNan64
- (call $foo64
- (local.get $x)
- )
- )
- )
- (func $various (param $x i32) (param $y f32) (param $z i64) (param $w f64)
- (local.set $y
- (call $deNan32
- (local.get $y)
- )
- )
- (local.set $w
- (call $deNan64
- (local.get $w)
- )
- )
- (nop)
- )
- (func $ignore-local.get (param $f f32) (param $d f64)
- (local.set $f
- (call $deNan32
- (local.get $f)
- )
- )
- (local.set $d
- (call $deNan64
- (local.get $d)
- )
- )
- (drop
- (local.get $f)
- )
- (drop
- (local.get $d)
- )
- (local.set $f
- (local.get $f)
- )
- (local.set $d
- (local.get $d)
- )
- (drop
- (local.get $f)
- )
- (drop
- (local.get $d)
- )
- (drop
- (call $deNan32
- (f32.abs
- (local.get $f)
- )
- )
- )
- (drop
- (call $deNan64
- (f64.abs
- (local.get $d)
- )
- )
- )
- (local.set $f
- (call $deNan32
- (f32.abs
- (local.get $f)
- )
- )
- )
- (local.set $d
- (call $deNan64
- (f64.abs
- (local.get $d)
- )
- )
- )
- (drop
- (local.get $f)
- )
- (drop
- (local.get $d)
- )
- )
- (func $tees (param $x f32) (result f32)
- (local.set $x
- (call $deNan32
- (local.get $x)
- )
- )
- (local.tee $x
- (local.tee $x
- (local.tee $x
- (local.tee $x
- (local.get $x)
- )
- )
- )
- )
- )
- (func $select (param $x f32) (result f32)
- (local.set $x
- (call $deNan32
- (local.get $x)
- )
- )
- (select
- (local.get $x)
- (local.get $x)
- (i32.const 1)
- )
- )
- (func $deNan32 (param $0 f32) (result f32)
- (if (result f32)
- (f32.eq
- (local.get $0)
- (local.get $0)
- )
- (local.get $0)
- (f32.const 0)
- )
- )
- (func $deNan64 (param $0 f64) (result f64)
- (if (result f64)
- (f64.eq
- (local.get $0)
- (local.get $0)
- )
- (local.get $0)
- (f64.const 0)
- )
- )
-)
-(module
- (type $none_=>_none (func))
- (type $f32_=>_f32 (func (param f32) (result f32)))
- (type $f64_=>_f64 (func (param f64) (result f64)))
- (func $deNan32
- (nop)
- )
- (func $deNan64
- (nop)
- )
- (func $foo32 (param $x f32) (result f32)
- (local.set $x
- (call $deNan32_0
- (local.get $x)
- )
- )
- (call $deNan32_0
- (call $foo32
- (local.get $x)
- )
- )
- )
- (func $foo64 (param $x f64) (result f64)
- (local.set $x
- (call $deNan64_0
- (local.get $x)
- )
- )
- (call $deNan64_0
- (call $foo64
- (local.get $x)
- )
- )
- )
- (func $deNan32_0 (param $0 f32) (result f32)
- (if (result f32)
- (f32.eq
- (local.get $0)
- (local.get $0)
- )
- (local.get $0)
- (f32.const 0)
- )
- )
- (func $deNan64_0 (param $0 f64) (result f64)
- (if (result f64)
- (f64.eq
- (local.get $0)
- (local.get $0)
- )
- (local.get $0)
- (f64.const 0)
- )
- )
-)
diff --git a/test/passes/denan.wast b/test/passes/denan.wast
deleted file mode 100644
index 78405d3a4..000000000
--- a/test/passes/denan.wast
+++ /dev/null
@@ -1,49 +0,0 @@
-(module
- (global $global$1 (mut f32) (f32.const nan))
- (global $global$2 (mut f32) (f32.const 12.34))
- (func $foo32 (param $x f32) (result f32)
- (call $foo32 (local.get $x))
- )
- (func $foo64 (param $x f64) (result f64)
- (call $foo64 (local.get $x))
- )
- (func $various (param $x i32) (param $y f32) (param $z i64) (param $w f64)
- )
- (func $ignore-local.get (param $f f32) (param $d f64)
- (drop (local.get $f))
- (drop (local.get $d))
- (local.set $f (local.get $f))
- (local.set $d (local.get $d))
- (drop (local.get $f))
- (drop (local.get $d))
- (drop (f32.abs (local.get $f)))
- (drop (f64.abs (local.get $d)))
- (local.set $f (f32.abs (local.get $f)))
- (local.set $d (f64.abs (local.get $d)))
- (drop (local.get $f))
- (drop (local.get $d))
- )
- (func $tees (param $x f32) (result f32)
- (local.tee $x
- (local.tee $x
- (local.tee $x
- (local.tee $x
- (local.get $x))))))
- (func $select (param $x f32) (result f32)
- (select
- (local.get $x)
- (local.get $x)
- (i32.const 1)))
-)
-;; existing names should not be a problem
-(module
- (func $deNan32)
- (func $deNan64)
- (func $foo32 (param $x f32) (result f32)
- (call $foo32 (local.get $x))
- )
- (func $foo64 (param $x f64) (result f64)
- (call $foo64 (local.get $x))
- )
-
-)
diff --git a/test/passes/directize_all-features.txt b/test/passes/directize_all-features.txt
deleted file mode 100644
index dae7c8746..000000000
--- a/test/passes/directize_all-features.txt
+++ /dev/null
@@ -1,263 +0,0 @@
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (elem (i32.const 1) $foo)
- (func $foo (param $0 i32) (param $1 i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call $foo
- (local.get $x)
- (local.get $y)
- )
- )
-)
-(module
- (type $ii (func (param i32 i32)))
- (type $i32_=>_i32 (func (param i32) (result i32)))
- (table $0 5 5 funcref)
- (table $1 5 5 funcref)
- (elem $0 (table $0) (i32.const 1) func $dummy)
- (elem $1 (table $1) (i32.const 1) func $f)
- (func $dummy (param $0 i32) (result i32)
- (local.get $0)
- )
- (func $f (param $0 i32) (param $1 i32)
- (unreachable)
- )
- (func $g (param $x i32) (param $y i32)
- (call $f
- (local.get $x)
- (local.get $y)
- )
- )
-)
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (table $1 5 5 funcref)
- (elem (table $1) (i32.const 4) func $foo)
- (func $foo (param $0 i32) (param $1 i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call $foo
- (local.get $x)
- (local.get $y)
- )
- )
-)
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (elem (i32.const 0) $foo)
- (func $foo (param $0 i32) (param $1 i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call $foo
- (local.get $x)
- (local.get $y)
- )
- )
-)
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (table $1 5 5 funcref)
- (elem $0 (table $0) (i32.const 0) func $foo $foo $foo $foo $foo)
- (elem $1 (table $1) (i32.const 0) func $foo $foo $foo $foo $foo)
- (func $foo (param $0 i32) (param $1 i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call $foo
- (local.get $x)
- (local.get $y)
- )
- )
-)
-(module
- (type $ii (func (param i32 i32)))
- (import "env" "table" (table $table 5 5 funcref))
- (elem (i32.const 1) $foo)
- (func $foo (param $0 i32) (param $1 i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call_indirect $table (type $ii)
- (local.get $x)
- (local.get $y)
- (i32.const 1)
- )
- )
-)
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (elem (i32.const 1) $foo)
- (export "tab" (table $0))
- (func $foo (param $0 i32) (param $1 i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call_indirect $0 (type $ii)
- (local.get $x)
- (local.get $y)
- (i32.const 1)
- )
- )
-)
-(module
- (type $ii (func (param i32 i32)))
- (global $g (mut i32) (i32.const 1))
- (table $0 5 5 funcref)
- (elem (global.get $g) $foo)
- (func $foo (param $0 i32) (param $1 i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call_indirect $0 (type $ii)
- (local.get $x)
- (local.get $y)
- (i32.const 1)
- )
- )
-)
-(module
- (type $ii (func (param i32 i32)))
- (global $g (mut i32) (i32.const 1))
- (table $0 5 5 funcref)
- (table $1 5 5 funcref)
- (elem (table $1) (global.get $g) func $foo)
- (func $foo (param $0 i32) (param $1 i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call_indirect $1 (type $ii)
- (local.get $x)
- (local.get $y)
- (i32.const 1)
- )
- )
-)
-(module
- (type $ii (func (param i32 i32)))
- (type $i32_i32_i32_=>_none (func (param i32 i32 i32)))
- (table $0 5 5 funcref)
- (elem (i32.const 1) $foo)
- (func $foo (param $0 i32) (param $1 i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32) (param $z i32)
- (call_indirect $0 (type $ii)
- (local.get $x)
- (local.get $y)
- (local.get $z)
- )
- )
-)
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (elem (i32.const 1) $foo)
- (func $foo (param $0 i32) (param $1 i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (block
- (drop
- (local.get $x)
- )
- (drop
- (local.get $y)
- )
- )
- (unreachable)
- )
-)
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (elem (i32.const 1) $foo)
- (func $foo (param $0 i32) (param $1 i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (block
- (drop
- (local.get $x)
- )
- (drop
- (local.get $y)
- )
- )
- (unreachable)
- )
-)
-(module
- (type $i32_=>_none (func (param i32)))
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (elem (i32.const 1) $foo)
- (func $foo (param $0 i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (block
- (drop
- (local.get $x)
- )
- (drop
- (local.get $y)
- )
- )
- (unreachable)
- )
-)
-(module
- (type $i32_=>_none (func (param i32)))
- (func $foo (param $0 i32)
- (unreachable)
- )
-)
-(module
- (type $none_=>_none (func))
- (table $0 8 8 funcref)
- (func $0
- (block $block
- (nop)
- (block
- (block
- )
- (unreachable)
- )
- )
- )
-)
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (elem (i32.const 1) $foo)
- (func $foo (param $0 i32) (param $1 i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (return_call $foo
- (local.get $x)
- (local.get $y)
- )
- )
-)
-(module
- (type $i32_i32_=>_none (func (param i32 i32)))
- (func $foo (param $0 i32) (param $1 i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call $foo
- (local.get $x)
- (local.get $y)
- )
- )
-)
diff --git a/test/passes/directize_all-features.wast b/test/passes/directize_all-features.wast
deleted file mode 100644
index d07b2d191..000000000
--- a/test/passes/directize_all-features.wast
+++ /dev/null
@@ -1,263 +0,0 @@
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (elem (i32.const 1) $foo)
- (func $foo (param i32) (param i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call_indirect (type $ii)
- (local.get $x)
- (local.get $y)
- (i32.const 1)
- )
- )
-)
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (table $1 5 5 funcref)
- (elem (table $0) (i32.const 1) func $dummy)
- (elem (table $1) (i32.const 1) func $f)
- (func $dummy (param i32) (result i32)
- (local.get 0)
- )
- (func $f (param i32) (param i32)
- (unreachable)
- )
- (func $g (param $x i32) (param $y i32)
- (call_indirect $1 (type $ii)
- (local.get $x)
- (local.get $y)
- (i32.const 1)
- )
- )
-)
-;; at table edges
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (table $1 5 5 funcref)
- (elem (table $1) (i32.const 4) func $foo)
- (func $foo (param i32) (param i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call_indirect $1 (type $ii)
- (local.get $x)
- (local.get $y)
- (i32.const 4)
- )
- )
-)
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (elem (i32.const 0) $foo)
- (func $foo (param i32) (param i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call_indirect (type $ii)
- (local.get $x)
- (local.get $y)
- (i32.const 0)
- )
- )
-)
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (table $1 5 5 funcref)
- (elem (i32.const 0) $foo $foo $foo $foo $foo)
- (elem (table $1) (i32.const 0) func $foo $foo $foo $foo $foo)
- (func $foo (param i32) (param i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call_indirect $1 (type $ii)
- (local.get $x)
- (local.get $y)
- (i32.const 2)
- )
- )
-)
-;; imported table
-(module
- (type $ii (func (param i32 i32)))
- (import "env" "table" (table $table 5 5 funcref))
- (elem (i32.const 1) $foo)
- (func $foo (param i32) (param i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call_indirect (type $ii)
- (local.get $x)
- (local.get $y)
- (i32.const 1)
- )
- )
-)
-;; exported table
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (export "tab" (table $0))
- (elem (i32.const 1) $foo)
- (func $foo (param i32) (param i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call_indirect (type $ii)
- (local.get $x)
- (local.get $y)
- (i32.const 1)
- )
- )
-)
-;; non-constant table offset
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (global $g (mut i32) (i32.const 1))
- (elem (global.get $g) $foo)
- (func $foo (param i32) (param i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call_indirect (type $ii)
- (local.get $x)
- (local.get $y)
- (i32.const 1)
- )
- )
-)
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (table $1 5 5 funcref)
- (global $g (mut i32) (i32.const 1))
- (elem (table $1) (global.get $g) func $foo)
- (func $foo (param i32) (param i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call_indirect $1 (type $ii)
- (local.get $x)
- (local.get $y)
- (i32.const 1)
- )
- )
-)
-;; non-constant call index
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (elem (i32.const 1) $foo)
- (func $foo (param i32) (param i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32) (param $z i32)
- (call_indirect (type $ii)
- (local.get $x)
- (local.get $y)
- (local.get $z)
- )
- )
-)
-;; bad index
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (elem (i32.const 1) $foo)
- (func $foo (param i32) (param i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call_indirect (type $ii)
- (local.get $x)
- (local.get $y)
- (i32.const 5)
- )
- )
-)
-;; missing index
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (elem (i32.const 1) $foo)
- (func $foo (param i32) (param i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call_indirect (type $ii)
- (local.get $x)
- (local.get $y)
- (i32.const 2)
- )
- )
-)
-;; bad type
-(module
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (elem (i32.const 1) $foo)
- (func $foo (param i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call_indirect (type $ii)
- (local.get $x)
- (local.get $y)
- (i32.const 1)
- )
- )
-)
-;; no table
-(module
- (func $foo (param i32)
- (unreachable)
- )
-)
-;; change types
-(module
- (type (func))
- (table $0 8 8 funcref)
- (func $0
- (block ;; the type of this block will change
- (nop)
- (call_indirect (type 0)
- (i32.const 15)
- )
- )
- )
-)
-(module ;; indirect tail call
- (type $ii (func (param i32 i32)))
- (table $0 5 5 funcref)
- (elem (i32.const 1) $foo)
- (func $foo (param i32) (param i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (return_call_indirect (type $ii)
- (local.get $x)
- (local.get $y)
- (i32.const 1)
- )
- )
-)
-;; call_ref
-(module
- (func $foo (param i32) (param i32)
- (unreachable)
- )
- (func $bar (param $x i32) (param $y i32)
- (call_ref
- (local.get $x)
- (local.get $y)
- (ref.func $foo)
- )
- )
-)
-