diff options
author | Alon Zakai <alonzakai@gmail.com> | 2017-05-09 09:36:45 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-09 09:36:45 -0700 |
commit | 64aa81e0e9655cf16e3af65e1bbe98e7fc6cf974 (patch) | |
tree | 26f3608bb1944b63712a8d1a161e61b41956276d /test | |
parent | b856925f6c25df22a0901d8f9e24e4247b4acc18 (diff) | |
download | binaryen-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.txt | 117 | ||||
-rw-r--r-- | test/passes/O.wasm | bin | 0 -> 330 bytes | |||
-rw-r--r-- | test/passes/dce.txt | 51 | ||||
-rw-r--r-- | test/passes/dce_vacuum.bin.txt | 101 | ||||
-rw-r--r-- | test/passes/dce_vacuum.txt | 19 | ||||
-rw-r--r-- | test/passes/dce_vacuum.wasm | bin | 0 -> 260 bytes | |||
-rw-r--r-- | test/passes/dce_vacuum.wast | 37 |
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 Binary files differnew file mode 100644 index 000000000..6dfd301de --- /dev/null +++ b/test/passes/O.wasm 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 Binary files differnew file mode 100644 index 000000000..5fa1892bd --- /dev/null +++ b/test/passes/dce_vacuum.wasm 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) + ) + ) ) |