diff options
author | Daniel Wirtz <dcode@dcode.io> | 2019-11-19 19:58:58 +0100 |
---|---|---|
committer | Alon Zakai <azakai@google.com> | 2019-11-19 10:58:58 -0800 |
commit | 00bbde099c0d968ce4ab95eba56d767d534e4094 (patch) | |
tree | 918c58218ebf22ab8cb7195a8af9063620b4d5c5 /test/passes | |
parent | 365e6f239926e3da640014237b5420895ec247b9 (diff) | |
download | binaryen-00bbde099c0d968ce4ab95eba56d767d534e4094.tar.gz binaryen-00bbde099c0d968ce4ab95eba56d767d534e4094.tar.bz2 binaryen-00bbde099c0d968ce4ab95eba56d767d534e4094.zip |
Add PostAssemblyScript pass (#2407)
Adds the AssemblyScript-specific passes post-assemblyscript
and post-assemblyscript-finalize, eliminating redundant ARC-style
retain/release patterns conservatively emitted by the compiler.
Diffstat (limited to 'test/passes')
-rw-r--r-- | test/passes/post-assemblyscript-finalize.txt | 40 | ||||
-rw-r--r-- | test/passes/post-assemblyscript-finalize.wast | 54 | ||||
-rw-r--r-- | test/passes/post-assemblyscript.txt | 263 | ||||
-rw-r--r-- | test/passes/post-assemblyscript.wast | 342 |
4 files changed, 699 insertions, 0 deletions
diff --git a/test/passes/post-assemblyscript-finalize.txt b/test/passes/post-assemblyscript-finalize.txt new file mode 100644 index 000000000..46f69acdf --- /dev/null +++ b/test/passes/post-assemblyscript-finalize.txt @@ -0,0 +1,40 @@ +(module + (type $FUNCSIG$ii (func (param i32) (result i32))) + (type $FUNCSIG$vi (func (param i32))) + (type $FUNCSIG$iii (func (param i32 i32) (result i32))) + (type $FUNCSIG$v (func)) + (import "rt" "retain" (func $~lib/rt/pure/__retain (param i32) (result i32))) + (import "rt" "release" (func $~lib/rt/pure/__release (param i32))) + (import "rt" "alloc" (func $~lib/rt/tlsf/__alloc (param i32 i32) (result i32))) + (func $eliminates.unnecessaryAllocation (; 3 ;) (type $FUNCSIG$v) + (nop) + ) + (func $eliminates.unnecessaryPair (; 4 ;) (type $FUNCSIG$vi) (param $0 i32) + (drop + (local.get $0) + ) + ) + (func $eliminates.unnecessaryStaticPair (; 5 ;) (type $FUNCSIG$v) + (nop) + ) + (func $eliminates.unnecessaryStaticRetain (; 6 ;) (type $FUNCSIG$v) + (drop + (i32.const 272) + ) + ) + (func $eliminates.unnecessaryStaticRelease (; 7 ;) (type $FUNCSIG$v) + (nop) + ) + (func $keeps.dynamicRetain (; 8 ;) (type $FUNCSIG$vi) (param $0 i32) + (local.set $0 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + ) + (func $keeps.dynamicRelease (; 9 ;) (type $FUNCSIG$vi) (param $0 i32) + (call $~lib/rt/pure/__release + (local.get $0) + ) + ) +) diff --git a/test/passes/post-assemblyscript-finalize.wast b/test/passes/post-assemblyscript-finalize.wast new file mode 100644 index 000000000..6de35b471 --- /dev/null +++ b/test/passes/post-assemblyscript-finalize.wast @@ -0,0 +1,54 @@ +;; FinalizeARC part of assemblyscript/tests/compiler/rc/optimize +(module + (import "rt" "retain" (func $~lib/rt/pure/__retain (param i32) (result i32))) + (import "rt" "release" (func $~lib/rt/pure/__release (param i32))) + (import "rt" "alloc" (func $~lib/rt/tlsf/__alloc (param i32) (param i32) (result i32))) + (func $eliminates.unnecessaryAllocation + (call $~lib/rt/pure/__release + (call $~lib/rt/pure/__retain + (call $~lib/rt/tlsf/__alloc + (i32.const 1) + (i32.const 0) + ) + ) + ) + ) + (func $eliminates.unnecessaryPair (param $0 i32) + (call $~lib/rt/pure/__release + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + ) + (func $eliminates.unnecessaryStaticPair + (call $~lib/rt/pure/__release + (call $~lib/rt/pure/__retain + (i32.const 272) + ) + ) + ) + (func $eliminates.unnecessaryStaticRetain + (drop + (call $~lib/rt/pure/__retain + (i32.const 272) + ) + ) + ) + (func $eliminates.unnecessaryStaticRelease + (call $~lib/rt/pure/__release + (i32.const 272) + ) + ) + (func $keeps.dynamicRetain (param $0 i32) + (local.set $0 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + ) + (func $keeps.dynamicRelease (param $0 i32) + (call $~lib/rt/pure/__release + (local.get $0) + ) + ) +) diff --git a/test/passes/post-assemblyscript.txt b/test/passes/post-assemblyscript.txt new file mode 100644 index 000000000..b81301cd4 --- /dev/null +++ b/test/passes/post-assemblyscript.txt @@ -0,0 +1,263 @@ +(module + (type $FUNCSIG$ii (func (param i32) (result i32))) + (type $FUNCSIG$vi (func (param i32))) + (type $FUNCSIG$vii (func (param i32 i32))) + (type $FUNCSIG$viii (func (param i32 i32 i32))) + (type $FUNCSIG$i (func (result i32))) + (type $FUNCSIG$iii (func (param i32 i32) (result i32))) + (import "rt" "retain" (func $~lib/rt/pure/__retain (param i32) (result i32))) + (import "rt" "release" (func $~lib/rt/pure/__release (param i32))) + (import "rc" "getRetainedRef" (func $getRetainedRef (result i32))) + (func $eliminates.linearArgument (; 3 ;) (type $FUNCSIG$vi) (param $0 i32) + (local.set $0 + (local.get $0) + ) + (nop) + ) + (func $eliminates.linearLocal (; 4 ;) (type $FUNCSIG$vi) (param $0 i32) + (local $1 i32) + (local.set $1 + (local.get $0) + ) + (nop) + ) + (func $eliminates.linearChain (; 5 ;) (type $FUNCSIG$vi) (param $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local.set $1 + (local.get $0) + ) + (local.set $2 + (local.get $1) + ) + (local.set $3 + (local.get $2) + ) + (nop) + (nop) + (nop) + ) + (func $eliminates.balancedReleases (; 6 ;) (type $FUNCSIG$vii) (param $0 i32) (param $cond i32) + (local $2 i32) + (local.set $2 + (local.get $0) + ) + (if + (local.get $cond) + (nop) + (nop) + ) + ) + (func $eliminates.partialReleases (; 7 ;) (type $FUNCSIG$vii) (param $0 i32) (param $cond i32) + (local $2 i32) + (local.set $2 + (local.get $0) + ) + (if + (local.get $cond) + (nop) + ) + ) + (func $eliminates.balancedRetains (; 8 ;) (type $FUNCSIG$viii) (param $0 i32) (param $cond1 i32) (param $cond2 i32) + (local $3 i32) + (if + (local.get $cond1) + (if + (local.get $cond2) + (local.set $3 + (local.get $0) + ) + (local.set $3 + (local.get $0) + ) + ) + (local.set $3 + (local.get $0) + ) + ) + (nop) + ) + (func $eliminates.balancedInsideLoop (; 9 ;) (type $FUNCSIG$vii) (param $0 i32) (param $cond i32) + (local $flat i32) + (block $break|0 + (loop $continue|0 + (local.set $flat + (i32.eqz + (local.get $cond) + ) + ) + (br_if $break|0 + (local.get $flat) + ) + (local.set $0 + (local.get $0) + ) + (nop) + (br $continue|0) + ) + (unreachable) + ) + ) + (func $eliminates.balancedOutsideLoop (; 10 ;) (type $FUNCSIG$vii) (param $0 i32) (param $cond i32) + (local $flat i32) + (local.set $0 + (local.get $0) + ) + (block $break|0 + (loop $continue|0 + (local.set $flat + (i32.eqz + (local.get $cond) + ) + ) + (br_if $break|0 + (local.get $flat) + ) + (br $continue|0) + ) + (unreachable) + ) + (nop) + ) + (func $eliminates.balancedInsideOutsideLoop (; 11 ;) (type $FUNCSIG$vii) (param $0 i32) (param $cond i32) + (local $flat i32) + (local.set $0 + (local.get $0) + ) + (block $break|0 + (loop $continue|0 + (local.set $flat + (i32.eqz + (local.get $cond) + ) + ) + (br_if $break|0 + (local.get $flat) + ) + (nop) + (local.set $0 + (local.get $0) + ) + (br $continue|0) + ) + (unreachable) + ) + (nop) + ) + (func $eliminates.balancedInsideOutsideLoopWithBranch (; 12 ;) (type $FUNCSIG$viii) (param $0 i32) (param $cond1 i32) (param $cond2 i32) + (local $flat i32) + (local.set $0 + (local.get $0) + ) + (block $break|0 + (loop $continue|0 + (local.set $flat + (i32.eqz + (local.get $cond1) + ) + ) + (br_if $break|0 + (local.get $flat) + ) + (if + (local.get $cond2) + (block $block + (nop) + (return) + ) + ) + (nop) + (local.set $0 + (local.get $0) + ) + (br $continue|0) + ) + (unreachable) + ) + (nop) + ) + (func $eliminates.replace (; 13 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local.set $0 + (local.get $0) + ) + (local.set $1 + (local.get $1) + ) + (local.set $2 + (local.get $1) + ) + (local.set $3 + (local.get $0) + ) + (if + (i32.ne + (local.get $2) + (local.get $3) + ) + (local.set $2 + (local.get $2) + ) + (nop) + ) + (local.set $0 + (local.get $2) + ) + (nop) + (nop) + ) + (func $eliminates.replaceAlreadyRetained (; 14 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) + (block $block + (local.set $0 + (local.get $0) + ) + (local.set $1 + (call $getRetainedRef) + ) + (nop) + (local.set $0 + (local.get $1) + ) + (return + (local.get $0) + ) + ) + ) + (func $keeps.partialRetains (; 15 ;) (type $FUNCSIG$vii) (param $0 i32) (param $cond i32) + (if + (local.get $cond) + (local.set $0 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + ) + (call $~lib/rt/pure/__release + (local.get $0) + ) + ) + (func $keeps.reachesReturn (; 16 ;) (type $FUNCSIG$iii) (param $0 i32) (param $cond i32) (result i32) + (block $block + (local.set $0 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + (if + (local.get $cond) + (return + (local.get $0) + ) + ) + (call $~lib/rt/pure/__release + (local.get $0) + ) + (return + (i32.const 0) + ) + ) + ) +) diff --git a/test/passes/post-assemblyscript.wast b/test/passes/post-assemblyscript.wast new file mode 100644 index 000000000..c79bfe1d9 --- /dev/null +++ b/test/passes/post-assemblyscript.wast @@ -0,0 +1,342 @@ +;; OptimizeARC part of assemblyscript/tests/compiler/rc/optimize +;; with flattening applied manually +(module + (import "rt" "retain" (func $~lib/rt/pure/__retain (param i32) (result i32))) + (import "rt" "release" (func $~lib/rt/pure/__release (param i32))) + (func $eliminates.linearArgument (param $0 i32) + (local.set $0 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + (call $~lib/rt/pure/__release + (local.get $0) + ) + ) + (func $eliminates.linearLocal (param $0 i32) + (local $1 i32) + (local.set $1 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + (call $~lib/rt/pure/__release + (local.get $1) + ) + ) + (func $eliminates.linearChain (param $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local.set $1 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + (local.set $2 + (call $~lib/rt/pure/__retain + (local.get $1) + ) + ) + (local.set $3 + (call $~lib/rt/pure/__retain + (local.get $2) + ) + ) + (call $~lib/rt/pure/__release + (local.get $3) + ) + (call $~lib/rt/pure/__release + (local.get $2) + ) + (call $~lib/rt/pure/__release + (local.get $1) + ) + ) + (func $eliminates.balancedReleases (param $0 i32) (param $cond i32) + (local $2 i32) + (local.set $2 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + (if + (local.get $cond) + (call $~lib/rt/pure/__release + (local.get $2) + ) + (call $~lib/rt/pure/__release + (local.get $2) + ) + ) + ) + (func $eliminates.partialReleases (param $0 i32) (param $cond i32) + ;; technically invalid but assumed to be never emitted + (local $2 i32) + (local.set $2 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + (if + (local.get $cond) + (call $~lib/rt/pure/__release + (local.get $2) + ) + ) + ) + (func $eliminates.balancedRetains (param $0 i32) (param $cond1 i32) (param $cond2 i32) + (local $3 i32) + (if + (local.get $cond1) + (if + (local.get $cond2) + (local.set $3 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + (local.set $3 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + ) + (local.set $3 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + ) + (call $~lib/rt/pure/__release + (local.get $3) + ) + ) + (func $eliminates.balancedInsideLoop (param $0 i32) (param $cond i32) + (local $flat i32) + (block $break|0 + (loop $continue|0 + (local.set $flat + (i32.eqz + (local.get $cond) + ) + ) + (br_if $break|0 + (local.get $flat) + ) + (local.set $0 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + (call $~lib/rt/pure/__release + (local.get $0) + ) + (br $continue|0) + ) + (unreachable) + ) + ) + (func $eliminates.balancedOutsideLoop (param $0 i32) (param $cond i32) + (local $flat i32) + (local.set $0 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + (block $break|0 + (loop $continue|0 + (local.set $flat + (i32.eqz + (local.get $cond) + ) + ) + (br_if $break|0 + (local.get $flat) + ) + (br $continue|0) + ) + (unreachable) + ) + (call $~lib/rt/pure/__release + (local.get $0) + ) + ) + (func $eliminates.balancedInsideOutsideLoop (param $0 i32) (param $cond i32) + (local $flat i32) + (local.set $0 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + (block $break|0 + (loop $continue|0 + (local.set $flat + (i32.eqz + (local.get $cond) + ) + ) + (br_if $break|0 + (local.get $flat) + ) + (call $~lib/rt/pure/__release + (local.get $0) + ) + (local.set $0 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + (br $continue|0) + ) + (unreachable) + ) + (call $~lib/rt/pure/__release + (local.get $0) + ) + ) + (func $eliminates.balancedInsideOutsideLoopWithBranch (param $0 i32) (param $cond1 i32) (param $cond2 i32) + (local $flat i32) + (local.set $0 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + (block $break|0 + (loop $continue|0 + (local.set $flat + (i32.eqz + (local.get $cond1) + ) + ) + (br_if $break|0 + (local.get $flat) + ) + (if + (local.get $cond2) + (block + (call $~lib/rt/pure/__release + (local.get $0) + ) + (return) + ) + ) + (call $~lib/rt/pure/__release + (local.get $0) + ) + (local.set $0 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + (br $continue|0) + ) + (unreachable) + ) + (call $~lib/rt/pure/__release + (local.get $0) + ) + ) + (func $eliminates.replace (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local.set $0 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + (local.set $1 + (call $~lib/rt/pure/__retain + (local.get $1) + ) + ) + ;; flat + (local.set $2 + (local.get $1) + ) + (local.set $3 + (local.get $0) + ) + ;; /flat + (if + (i32.ne + (local.get $2) ;; flat (local.tee $2 (local.get $1)) + (local.get $3) ;; flat (local.tee $3 (local.get $0)) + ) + (local.set $2 + (call $~lib/rt/pure/__retain + (local.get $2) + ) + ) + (call $~lib/rt/pure/__release + (local.get $3) + ) + ) + (local.set $0 + (local.get $2) + ) + (call $~lib/rt/pure/__release + (local.get $0) + ) + (call $~lib/rt/pure/__release + (local.get $1) + ) + ) + (import "rc" "getRetainedRef" (func $getRetainedRef (result i32))) + (func $eliminates.replaceAlreadyRetained (param $0 i32) (result i32) + (local $1 i32) + (block + (local.set $0 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + (local.set $1 + (call $getRetainedRef) + ) + (call $~lib/rt/pure/__release + (local.get $0) + ) + (local.set $0 + (local.get $1) + ) + (return + (local.get $0) + ) + ) + ) + (func $keeps.partialRetains (param $0 i32) (param $cond i32) + (if + (local.get $cond) + (local.set $0 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + ) + (call $~lib/rt/pure/__release + (local.get $0) + ) + ) + (func $keeps.reachesReturn (param $0 i32) (param $cond i32) (result i32) + (block + (local.set $0 + (call $~lib/rt/pure/__retain + (local.get $0) + ) + ) + (if + (local.get $cond) + (return + (local.get $0) + ) + ) + (call $~lib/rt/pure/__release + (local.get $0) + ) + (return + (i32.const 0) + ) + ) + ) +) |