| ;; 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) |
| ) |
| ) |
| ) |
| ) |