summaryrefslogtreecommitdiff
path: root/test/passes
diff options
context:
space:
mode:
authorDaniel Wirtz <dcode@dcode.io>2019-11-19 19:58:58 +0100
committerAlon Zakai <azakai@google.com>2019-11-19 10:58:58 -0800
commit00bbde099c0d968ce4ab95eba56d767d534e4094 (patch)
tree918c58218ebf22ab8cb7195a8af9063620b4d5c5 /test/passes
parent365e6f239926e3da640014237b5420895ec247b9 (diff)
downloadbinaryen-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.txt40
-rw-r--r--test/passes/post-assemblyscript-finalize.wast54
-rw-r--r--test/passes/post-assemblyscript.txt263
-rw-r--r--test/passes/post-assemblyscript.wast342
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)
+ )
+ )
+ )
+)