(module
 (type $i32_i32_=>_none (func (param i32 i32)))
 (type $i32_=>_none (func (param i32)))
 (type $i32_i32_i32_=>_none (func (param i32 i32 i32)))
 (type $i32_=>_i32 (func (param i32) (result i32)))
 (type $none_=>_i32 (func (result i32)))
 (type $i32_i32_=>_i32 (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 (param $0 i32)
  (local.set $0
   (local.get $0)
  )
  (nop)
 )
 (func $eliminates.linearLocal (param $0 i32)
  (local $1 i32)
  (local.set $1
   (local.get $0)
  )
  (nop)
 )
 (func $eliminates.linearChain (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 (param $0 i32) (param $cond i32)
  (local $2 i32)
  (local.set $2
   (local.get $0)
  )
  (if
   (local.get $cond)
   (nop)
   (nop)
  )
 )
 (func $eliminates.partialReleases (param $0 i32) (param $cond i32)
  (local $2 i32)
  (local.set $2
   (local.get $0)
  )
  (if
   (local.get $cond)
   (nop)
  )
 )
 (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
     (local.get $0)
    )
    (local.set $3
     (local.get $0)
    )
   )
   (local.set $3
    (local.get $0)
   )
  )
  (nop)
 )
 (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
     (local.get $0)
    )
    (nop)
    (br $continue|0)
   )
   (unreachable)
  )
 )
 (func $eliminates.balancedOutsideLoop (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 (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 (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 (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 (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 (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 $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)
   )
  )
 )
)
