(module
 (export "add" (func $add))
 (export "ret" (func $ret))
 (export "opts" (func $opts))
 (export "fib" (func $fib))
 (export "switch_reach" (func $switch_reach))
 (export "nofile" (func $nofile))
 (export "inlineInto" (func $inlineInto))
 (func $add (; 0 ;) (; has Stack IR ;) (param $0 i32) (param $1 i32) (result i32)
  ;;@ tests/other_file.cpp:314159:0
  (i32.add
   (local.get $1)
   (local.get $1)
  )
 )
 (func $ret (; 1 ;) (; has Stack IR ;) (param $0 i32) (result i32)
  ;;@ return.cpp:50:0
  (local.set $0
   (i32.shl
    (local.get $0)
    (i32.const 1)
   )
  )
  ;;@ return.cpp:100:0
  (i32.add
   (local.get $0)
   (i32.const 1)
  )
 )
 (func $opts (; 2 ;) (; has Stack IR ;) (param $0 i32) (param $1 i32) (result i32)
  ;;@ even-opted.cpp:1:0
  (local.set $0
   (i32.add
    (local.get $0)
    (local.get $1)
   )
  )
  ;;@ even-opted.cpp:2:0
  (local.set $1
   (i32.shr_s
    (local.get $1)
    (local.get $0)
   )
  )
  ;;@ even-opted.cpp:3:0
  (i32.add
   (local.get $1)
   (i32.rem_s
    (local.get $0)
    (local.get $1)
   )
  )
 )
 (func $fib (; 3 ;) (; has Stack IR ;) (param $0 i32) (result i32)
  (local $1 i32)
  (local $2 i32)
  (local $3 i32)
  (local $4 i32)
  (local.set $2
   (if (result i32)
    ;;@ fib.c:3:0
    (i32.gt_s
     (local.get $0)
     (i32.const 0)
    )
    (i32.const 1)
    (block
     (local.set $0
      (i32.const 1)
     )
     ;;@ fib.c:8:0
     (return
      (local.get $0)
     )
    )
   )
  )
  (loop $while-in
   ;;@ fib.c:4:0
   (local.set $4
    (i32.add
     (local.get $2)
     (local.get $3)
    )
   )
   ;;@ fib.c:3:0
   (local.set $1
    (i32.add
     (local.get $1)
     (i32.const 1)
    )
   )
   (if
    (i32.ne
     (local.get $0)
     (local.get $1)
    )
    (block
     (local.set $3
      (local.get $2)
     )
     (local.set $2
      (local.get $4)
     )
     (br $while-in)
    )
   )
  )
  ;;@ fib.c:8:0
  (local.get $4)
 )
 (func $switch_reach (; 4 ;) (; has Stack IR ;) (param $0 i32) (result i32)
  (local $1 i32)
  (local.set $1
   (block $__rjto$0 (result i32)
    (block $__rjti$0
     (if
      (i32.lt_s
       (local.tee $1
        (i32.add
         (local.get $0)
         (i32.const 52)
        )
       )
       (i32.const 1369188723)
      )
      (br_if $__rjti$0
       (i32.eqz
        (i32.sub
         (local.get $1)
         (i32.const -1108210269)
        )
       )
      )
      (br_if $__rjti$0
       (i32.eqz
        (i32.sub
         (local.get $1)
         (i32.const 1369188723)
        )
       )
      )
     )
     (br $__rjto$0
      (i32.const 0)
     )
    )
    (call $switch_reach
     (local.get $0)
    )
   )
  )
  (drop
   (call $switch_reach
    (local.get $0)
   )
  )
  ;;@ /tmp/emscripten_test_binaryen2_28hnAe/src.c:59950:0
  (local.get $1)
 )
 (func $nofile (; 5 ;) (; has Stack IR ;)
  ;;@ (unknown):1337:0
  (call $nofile)
 )
 (func $inlineInto (; 6 ;) (; has Stack IR ;) (param $0 i32) (param $1 i32) (result i32)
  ;;@ inline_me.c:125:0
  (i32.add
   ;;@ inline_me.c:120:0
   (local.tee $0
    (i32.add
     (local.get $0)
     (local.get $1)
    )
   )
   (i32.add
    (local.get $0)
    (local.get $1)
   )
  )
 )
)
