diff options
author | Alon Zakai <alonzakai@gmail.com> | 2019-02-25 13:00:20 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-25 13:00:20 -0800 |
commit | 8b698a87ba2c7891a8c17c07744bf3fcfe49f691 (patch) | |
tree | 7a890e92e8c7986a70b0fda5406cfba1ce70a5c2 /test | |
parent | 605e2b7498a7979b59917aa5db17d5022e974c8b (diff) | |
download | binaryen-8b698a87ba2c7891a8c17c07744bf3fcfe49f691.tar.gz binaryen-8b698a87ba2c7891a8c17c07744bf3fcfe49f691.tar.bz2 binaryen-8b698a87ba2c7891a8c17c07744bf3fcfe49f691.zip |
Vacuum unused values (#1918)
Checks if a value is being dropped higher up, like
```
(drop
(block i32
(block i32
(i32.const 1)
)
)
)
```
Handling this forces us to be careful in that pass about whether a value is used, and whether the type matters (for example, we can't replace a unary with its child in all cases, if the return value matters).
Diffstat (limited to 'test')
-rw-r--r-- | test/passes/vacuum.txt | 135 | ||||
-rw-r--r-- | test/passes/vacuum.wast | 134 |
2 files changed, 269 insertions, 0 deletions
diff --git a/test/passes/vacuum.txt b/test/passes/vacuum.txt index 3b2c4bfbb..9f106cd89 100644 --- a/test/passes/vacuum.txt +++ b/test/passes/vacuum.txt @@ -305,3 +305,138 @@ (nop) ) ) +(module + (type $0 (func (param i64))) + (type $1 (func (param f32 i32) (result i32))) + (func $0 (; 0 ;) (type $0) (param $0 i64) + (nop) + ) + (func $1 (; 1 ;) (type $1) (param $0 f32) (param $1 i32) (result i32) + (drop + (block $label$2 (result i64) + (call $0 + (br_if $label$2 + (i64.const -137438953472) + (i32.const 1) + ) + ) + (unreachable) + ) + ) + (unreachable) + ) +) +(module + (type $0 (func (param i32) (result i32))) + (type $1 (func (param i32 i32 i32))) + (global $global$1 (mut i32) (i32.const 0)) + (export "compress" (func $3)) + (func $_deflate (; 0 ;) (type $0) (param $0 i32) (result i32) + (call $_deflate + (local.get $0) + ) + ) + (func $_deflateInit2_ (; 1 ;) (type $0) (param $0 i32) (result i32) + (call $_deflateInit2_ + (local.get $0) + ) + ) + (func $_deflateEnd (; 2 ;) (type $0) (param $0 i32) (result i32) + (call $_deflateEnd + (local.get $0) + ) + ) + (func $3 (; 3 ;) (type $1) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local.set $3 + (global.get $global$1) + ) + (global.set $global$1 + (i32.sub + (global.get $global$1) + (i32.const -64) + ) + ) + (i32.store + (local.get $3) + (local.get $2) + ) + (i32.store offset=4 + (local.get $3) + (i32.const 100000) + ) + (i32.store offset=12 + (local.get $3) + (local.get $0) + ) + (i32.store offset=16 + (local.get $3) + (i32.load + (local.get $1) + ) + ) + (i32.store offset=32 + (local.get $3) + (i32.const 0) + ) + (i32.store offset=36 + (local.get $3) + (i32.const 0) + ) + (i32.store offset=40 + (local.get $3) + (i32.const 0) + ) + (if + (call $_deflateInit2_ + (local.get $3) + ) + (block $block + (global.set $global$1 + (local.get $3) + ) + (return) + ) + ) + (drop + (if (result i32) + (i32.eq + (local.tee $0 + (call $_deflate + (local.get $3) + ) + ) + (i32.const 1) + ) + (block $block1 (result i32) + (i32.store + (local.get $1) + (i32.load offset=20 + (local.get $3) + ) + ) + (local.set $0 + (call $_deflateEnd + (local.get $3) + ) + ) + (global.set $global$1 + (local.get $3) + ) + (i32.const 0) + ) + (block $block2 (result i32) + (drop + (call $_deflateEnd + (local.get $3) + ) + ) + (global.set $global$1 + (local.get $3) + ) + (i32.const 0) + ) + ) + ) + ) +) diff --git a/test/passes/vacuum.wast b/test/passes/vacuum.wast index a2dc58950..0e15c76ad 100644 --- a/test/passes/vacuum.wast +++ b/test/passes/vacuum.wast @@ -660,3 +660,137 @@ ) ) ) +(module ;; a child with a different type, cannot simply replace the parent with it + (type $0 (func (param i64))) + (type $1 (func (param f32 i32) (result i32))) + (func $0 (; 0 ;) (type $0) (param $0 i64) + (nop) + ) + (func $1 (; 1 ;) (type $1) (param $0 f32) (param $1 i32) (result i32) + (drop + (block $label$1 (result i32) + (i32.wrap_i64 + (block $label$2 (result i64) + (call $0 + (br_if $label$2 + (i64.const -137438953472) + (i32.const 1) + ) + ) + (unreachable) + ) + ) + ) + ) + (unreachable) + ) +) +(module ;; vacuum away a drop on an if where both arms can be vacuumed + (global $global$1 (mut i32) (i32.const 0)) + (func $_deflate (param i32) (result i32) + (call $_deflate (local.get $0)) + ) + (func $_deflateInit2_ (param i32) (result i32) + (call $_deflateInit2_ (local.get $0)) + ) + (func $_deflateEnd (param i32) (result i32) + (call $_deflateEnd (local.get $0)) + ) + (func "compress" (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local.set $3 + (global.get $global$1) + ) + (global.set $global$1 + (i32.sub + (global.get $global$1) + (i32.const -64) + ) + ) + (i32.store + (local.get $3) + (local.get $2) + ) + (i32.store offset=4 + (local.get $3) + (i32.const 100000) + ) + (i32.store offset=12 + (local.get $3) + (local.get $0) + ) + (i32.store offset=16 + (local.get $3) + (i32.load + (local.get $1) + ) + ) + (i32.store offset=32 + (local.get $3) + (i32.const 0) + ) + (i32.store offset=36 + (local.get $3) + (i32.const 0) + ) + (i32.store offset=40 + (local.get $3) + (i32.const 0) + ) + (if + (call $_deflateInit2_ + (local.get $3) + ) + (block + (global.set $global$1 + (local.get $3) + ) + (return) + ) + ) + (drop + (if (result i32) + (i32.eq + (local.tee $0 + (call $_deflate + (local.get $3) + ) + ) + (i32.const 1) + ) + (block (result i32) + (i32.store + (local.get $1) + (i32.load offset=20 + (local.get $3) + ) + ) + (local.set $0 + (call $_deflateEnd + (local.get $3) + ) + ) + (global.set $global$1 + (local.get $3) + ) + (local.get $0) + ) + (block (result i32) + (drop + (call $_deflateEnd + (local.get $3) + ) + ) + (global.set $global$1 + (local.get $3) + ) + (select + (local.get $0) + (i32.const -5) + (local.get $0) + ) + ) + ) + ) + ) +) |