summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2017-05-09 09:36:45 -0700
committerGitHub <noreply@github.com>2017-05-09 09:36:45 -0700
commit64aa81e0e9655cf16e3af65e1bbe98e7fc6cf974 (patch)
tree26f3608bb1944b63712a8d1a161e61b41956276d /test
parentb856925f6c25df22a0901d8f9e24e4247b4acc18 (diff)
downloadbinaryen-64aa81e0e9655cf16e3af65e1bbe98e7fc6cf974.tar.gz
binaryen-64aa81e0e9655cf16e3af65e1bbe98e7fc6cf974.tar.bz2
binaryen-64aa81e0e9655cf16e3af65e1bbe98e7fc6cf974.zip
Unreachable typing fixes (#1004)
* fix type of drop, set_local, set_global, load, etc: when operand is unreachable, so is the node itself * support binary tests properly in test/passes * fix unreachable typing of blocks with no name and an unreachable child * fix continue emitting in asm2wasm * properly handle emitting of unreachable load
Diffstat (limited to 'test')
-rw-r--r--test/passes/O.bin.txt117
-rw-r--r--test/passes/O.wasmbin0 -> 330 bytes
-rw-r--r--test/passes/dce.txt51
-rw-r--r--test/passes/dce_vacuum.bin.txt101
-rw-r--r--test/passes/dce_vacuum.txt19
-rw-r--r--test/passes/dce_vacuum.wasmbin0 -> 260 bytes
-rw-r--r--test/passes/dce_vacuum.wast37
7 files changed, 295 insertions, 30 deletions
diff --git a/test/passes/O.bin.txt b/test/passes/O.bin.txt
new file mode 100644
index 000000000..395c04369
--- /dev/null
+++ b/test/passes/O.bin.txt
@@ -0,0 +1,117 @@
+(module
+ (type $0 (func (param i64) (result i64)))
+ (memory $0 0)
+ (export "fac-rec" (func $0))
+ (export "fac-rec-named" (func $1))
+ (export "fac-iter" (func $2))
+ (export "fac-iter-named" (func $3))
+ (export "fac-opt" (func $4))
+ (func $0 (type $0) (param $0 i64) (result i64)
+ (if i64
+ (i64.eq
+ (get_local $0)
+ (i64.const 0)
+ )
+ (i64.const 1)
+ (i64.mul
+ (get_local $0)
+ (call $0
+ (i64.sub
+ (get_local $0)
+ (i64.const 1)
+ )
+ )
+ )
+ )
+ )
+ (func $1 (type $0) (param $0 i64) (result i64)
+ (if i64
+ (i64.eq
+ (get_local $0)
+ (i64.const 0)
+ )
+ (i64.const 1)
+ (i64.mul
+ (get_local $0)
+ (call $1
+ (i64.sub
+ (get_local $0)
+ (i64.const 1)
+ )
+ )
+ )
+ )
+ )
+ (func $2 (type $0) (param $0 i64) (result i64)
+ (if
+ (i64.eq
+ (get_local $0)
+ (i64.const 0)
+ )
+ (unreachable)
+ (unreachable)
+ )
+ )
+ (func $3 (type $0) (param $0 i64) (result i64)
+ (local $1 i64)
+ (set_local $1
+ (i64.const 1)
+ )
+ (block $label$1
+ (loop $label$2
+ (br_if $label$1
+ (i64.eq
+ (get_local $0)
+ (i64.const 0)
+ )
+ )
+ (set_local $1
+ (i64.mul
+ (get_local $0)
+ (get_local $1)
+ )
+ )
+ (set_local $0
+ (i64.sub
+ (get_local $0)
+ (i64.const 1)
+ )
+ )
+ (br $label$2)
+ )
+ )
+ (get_local $1)
+ )
+ (func $4 (type $0) (param $0 i64) (result i64)
+ (local $1 i64)
+ (set_local $1
+ (i64.const 1)
+ )
+ (if
+ (i64.ge_s
+ (get_local $0)
+ (i64.const 2)
+ )
+ (loop $label$2
+ (set_local $1
+ (i64.mul
+ (get_local $1)
+ (get_local $0)
+ )
+ )
+ (br_if $label$2
+ (i64.gt_s
+ (tee_local $0
+ (i64.add
+ (get_local $0)
+ (i64.const -1)
+ )
+ )
+ (i64.const 1)
+ )
+ )
+ )
+ )
+ (get_local $1)
+ )
+)
diff --git a/test/passes/O.wasm b/test/passes/O.wasm
new file mode 100644
index 000000000..6dfd301de
--- /dev/null
+++ b/test/passes/O.wasm
Binary files differ
diff --git a/test/passes/dce.txt b/test/passes/dce.txt
index 98f0ea177..3ccdbdffd 100644
--- a/test/passes/dce.txt
+++ b/test/passes/dce.txt
@@ -361,22 +361,15 @@
)
)
(func $unreachable-brs-4 (type $3) (param $var$0 i32) (result i32)
- (i32.add
+ (drop
(i32.const 1)
- (block $label$0 i32
- (br $label$0
- (block $label$1 i32
- (drop
- (block
- (drop
- (i32.const 4104)
- )
- (unreachable)
- )
- )
- (unreachable)
- )
+ )
+ (drop
+ (block
+ (drop
+ (i32.const 4104)
)
+ (unreachable)
)
)
)
@@ -389,26 +382,24 @@
(block $label$0 i64
(get_local $var$1)
)
- (block $label$1 i64
- (block i64
- (drop
- (i64.sub
- (get_local $var$0)
- (i64.const 1)
- )
+ (block
+ (drop
+ (i64.sub
+ (get_local $var$0)
+ (i64.const 1)
)
- (block
- (drop
- (block $block i64
- (set_local $2
- (get_local $var$0)
- )
- (nop)
- (get_local $2)
+ )
+ (block
+ (drop
+ (block $block i64
+ (set_local $2
+ (get_local $var$0)
)
+ (nop)
+ (get_local $2)
)
- (unreachable)
)
+ (unreachable)
)
)
)
diff --git a/test/passes/dce_vacuum.bin.txt b/test/passes/dce_vacuum.bin.txt
new file mode 100644
index 000000000..8d365b327
--- /dev/null
+++ b/test/passes/dce_vacuum.bin.txt
@@ -0,0 +1,101 @@
+(module
+ (type $0 (func (param f32 f32) (result f32)))
+ (type $1 (func (param f64 f64) (result f64)))
+ (memory $0 0)
+ (export "f32.compute_radix" (func $0))
+ (export "f64.compute_radix" (func $1))
+ (func $0 (type $0) (param $var$0 f32) (param $var$1 f32) (result f32)
+ (block $label$0 f32
+ (loop $label$1
+ (br_if $label$1
+ (f32.eq
+ (f32.add
+ (f32.sub
+ (f32.add
+ (tee_local $var$0
+ (f32.add
+ (get_local $var$0)
+ (get_local $var$0)
+ )
+ )
+ (f32.const 1)
+ )
+ (get_local $var$0)
+ )
+ (f32.const -1)
+ )
+ (f32.const 0)
+ )
+ )
+ )
+ (drop
+ (block
+ (drop
+ (call $0
+ (f32.add
+ (get_local $var$0)
+ (tee_local $var$1
+ (f32.add
+ (get_local $var$1)
+ (f32.const 1)
+ )
+ )
+ )
+ (get_local $var$0)
+ )
+ )
+ (unreachable)
+ )
+ )
+ )
+ )
+ (func $1 (type $1) (param $var$0 f64) (param $var$1 f64) (result f64)
+ (block $label$0 f64
+ (loop $label$1
+ (br_if $label$1
+ (f64.eq
+ (f64.add
+ (f64.sub
+ (f64.add
+ (tee_local $var$0
+ (f64.add
+ (get_local $var$0)
+ (get_local $var$0)
+ )
+ )
+ (f64.const 1)
+ )
+ (get_local $var$0)
+ )
+ (f64.const -1)
+ )
+ (f64.const 0)
+ )
+ )
+ )
+ (loop $label$2
+ (br_if $label$2
+ (f64.ne
+ (f64.sub
+ (f64.sub
+ (f64.add
+ (get_local $var$0)
+ (tee_local $var$1
+ (f64.add
+ (get_local $var$1)
+ (f64.const 1)
+ )
+ )
+ )
+ (get_local $var$0)
+ )
+ (get_local $var$1)
+ )
+ (f64.const 0)
+ )
+ )
+ )
+ (get_local $var$1)
+ )
+ )
+)
diff --git a/test/passes/dce_vacuum.txt b/test/passes/dce_vacuum.txt
index 4fb982524..0f1ec5095 100644
--- a/test/passes/dce_vacuum.txt
+++ b/test/passes/dce_vacuum.txt
@@ -1,9 +1,28 @@
(module
(type $0 (func (result i32)))
+ (type $1 (func (param f32 f32) (result f32)))
+ (type $2 (func (param i64) (result i64)))
(memory $0 0)
(func $__Z12serveroptionPc (type $0) (result i32)
(return
(i32.const 0)
)
)
+ (func $drop-unreachable (type $1) (param $var$0 f32) (param $var$1 f32) (result f32)
+ (drop
+ (unreachable)
+ )
+ )
+ (func $set-unreachable (type $2) (param $var$0 i64) (result i64)
+ (local $var$1 i64)
+ (local $var$2 i64)
+ (if
+ (i64.eq
+ (get_local $var$1)
+ (i64.const 0)
+ )
+ (unreachable)
+ (unreachable)
+ )
+ )
)
diff --git a/test/passes/dce_vacuum.wasm b/test/passes/dce_vacuum.wasm
new file mode 100644
index 000000000..5fa1892bd
--- /dev/null
+++ b/test/passes/dce_vacuum.wasm
Binary files differ
diff --git a/test/passes/dce_vacuum.wast b/test/passes/dce_vacuum.wast
index a7e43db23..acddd76e9 100644
--- a/test/passes/dce_vacuum.wast
+++ b/test/passes/dce_vacuum.wast
@@ -10,5 +10,42 @@
(i32.const 0)
)
)
+ (func $drop-unreachable (param $var$0 f32) (param $var$1 f32) (result f32)
+ (block $label$0 f32
+ (loop $label$2
+ (drop
+ (unreachable)
+ )
+ (unreachable)
+ )
+ (get_local $var$1)
+ )
+ )
+
+ (func $set-unreachable (param $var$0 i64) (result i64)
+ (local $var$1 i64)
+ (local $var$2 i64)
+ (block $label$0 i64
+ (block $label$1
+ (loop $label$2
+ (if
+ (i64.eq
+ (get_local $var$1)
+ (i64.const 0)
+ )
+ (unreachable)
+ (set_local $var$2
+ (i64.mul
+ (unreachable)
+ (get_local $var$2)
+ )
+ )
+ )
+ (br $label$2)
+ )
+ )
+ (get_local $var$2)
+ )
+ )
)