blob: c79bfe1d98f7d2610a80b3858974ddba1347a840 [file] [log] [blame] [edit]
;; 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)
)
)
)
)