(module
  (memory 256 256)
  (type $0 (func (param i32)))
  (type $1 (func))
  (type $2 (func (result i32)))
  (func $b0-yes (type $0) (param $i1 i32)
    (block $topmost
      (br $topmost)
    )
  )
  (func $b1 (type $0) (param $i1 i32)
    (block $topmost
      (block
        (drop
          (i32.const 0)
        )
        (br $topmost)
      )
    )
  )
  (func $b2 (type $0) (param $i1 i32)
    (block $topmost
      (block $inner
        (br $topmost)
      )
    )
  )
  (func $b3-yes (type $0) (param $i1 i32)
    (block $topmost
      (block $inner
        (br $inner)
      )
    )
  )
  (func $b4 (type $0) (param $i1 i32)
    (block $topmost
      (block $inner
        (block
          (drop
            (i32.const 0)
          )
          (br $topmost)
        )
      )
    )
  )
  (func $b5 (type $0) (param $i1 i32)
    (block $topmost
      (block $inner
        (block
          (drop
            (i32.const 0)
          )
          (br $inner)
        )
      )
    )
  )
  (func $b6 (type $0) (param $i1 i32)
    (block $topmost
      (br_if $topmost
        (i32.const 1)
      )
    )
  )
  (func $b7 (type $0) (param $i1 i32)
    (block $topmost
      (block
        (drop
          (i32.const 0)
        )
        (br_if $topmost
          (i32.const 1)
        )
      )
    )
  )
  (func $b8 (type $0) (param $i1 i32)
    (block $topmost
      (block $inner
        (br_if $topmost
          (i32.const 1)
        )
      )
    )
  )
  (func $b9 (type $0) (param $i1 i32)
    (block $topmost
      (block $inner
        (br_if $topmost
          (i32.const 1)
        )
      )
    )
  )
  (func $b10 (type $0) (param $i1 i32)
    (block $topmost
      (block $inner
        (block
          (drop
            (i32.const 0)
          )
          (br_if $topmost
            (i32.const 1)
          )
        )
      )
    )
  )
  (func $b11 (type $0) (param $i1 i32)
    (block $topmost
      (block $inner
        (block
          (drop
            (i32.const 0)
          )
          (br_if $inner
            (i32.const 1)
          )
        )
      )
    )
  )
  (func $b12-yes (type $1)
    (block $topmost
      (if
        (i32.const 1)
        (then
          (block $block1
            (drop
              (i32.const 12)
            )
            (block
              (drop
                (i32.const 1)
              )
              (br $topmost)
            )
          )
        )
        (else
          (block $block3
            (drop
              (i32.const 27)
            )
            (block
              (drop
                (i32.const 2)
              )
              (br $topmost)
            )
          )
        )
      )
    )
  )
  (func $b13 (type $2) (result i32)
    (block $topmost (result i32)
      (if
        (i32.const 1)
        (then
          (block $block1
            (drop
              (i32.const 12)
            )
            (drop
              (br_if $topmost
                (i32.const 1)
                (i32.const 1)
              )
            )
          )
        )
        (else
          (block $block3
            (drop
              (i32.const 27)
            )
            (br $topmost
              (i32.const 2)
            )
          )
        )
      )
      (i32.const 3)
    )
  )
  (func $b14 (type $2) (result i32)
    (block $topmost (result i32)
      (if (result i32)
        (i32.const 1)
        (then
          (block $block1 (result i32)
            (i32.const 12)
          )
        )
        (else
          (block $block3 (result i32)
            (i32.const 27)
          )
        )
      )
    )
  )
  (func $b14-tuple (result i32 i64)
    (block $topmost (result i32 i64)
      (if (result i32 i64)
        (i32.const 1)
        (then
          (block $block1 (result i32 i64)
            (tuple.make 2
              (i32.const 12)
              (i64.const 12)
            )
          )
        )
        (else
          (block $block3 (result i32 i64)
            (tuple.make 2
              (i32.const 27)
              (i64.const 27)
            )
          )
        )
      )
    )
  )
  (func $b15 (type $1)
    (block $topmost
      (if
        (i32.const 17)
        (then
          (br $topmost)
        )
      )
    )
  )
  (func $b15b (type $1)
    (block $topmost
      (if
        (i32.const 18)
        (then
          (block
            (drop
              (i32.const 0)
            )
            (br $topmost)
          )
        )
      )
    )
  )
  (func $b16 (type $1)
    (block $a
      (block $b
        (block $c
          (br $a)
        )
        (br $a)
      )
      (br $a)
    )
    (block $a
      (block $b
        (block $c
          (br $c)
        )
        (br $b)
      )
      (br $a)
    )
    (block $a
      (block $b
        (block $c
          (br $b)
        )
        (br $a)
      )
      (br $a)
    )
  )
  (func $b17 (type $1)
    (block $a
      (if
        (i32.const 0)
        (then
          (block $block1
            (br $a)
          )
        )
        (else
          (block $block3
            (br $a)
          )
        )
      )
    )
    (block $a
      (if
        (i32.const 0)
        (then
          (drop
            (i32.const 1)
          )
        )
        (else
          (block $block6
            (br $a)
          )
        )
      )
    )
    (block $a
      (if
        (i32.const 0)
        (then
          (block $block8
            (br $a)
          )
        )
        (else
          (drop
            (i32.const 1)
          )
        )
      )
    )
    (block $c
      (block $b
        (if
          (i32.const 0)
          (then
            (block $block11
              (br $b)
            )
          )
          (else
            (block $block13
              (br $c)
            )
          )
        )
      )
    )
  )
  (func $ret-1 (type $1)
    (return)
  )
  (func $ret-2 (type $1)
    (block $block0
      (block $block1
        (return)
      )
    )
  )
  (func $ret-3 (type $1)
    (block $block0
      (if
        (i32.const 0)
        (then
          (return)
        )
        (else
          (block $block3
            (return)
          )
        )
      )
    )
  )
  (func $ret-value (type $2) (result i32)
    (block $block0
      (block $block1
        (return
          (i32.const 1)
        )
      )
    )
  )
  (func $no-select-but-the-last (type $1)
    (block $a
      (if
        (i32.const 0)
        (then
          (drop
            (i32.const 1)
          )
        )
        (else
          (block $block2
            (block
              (drop
                (i32.const 2)
              )
              (br $a)
            )
            (drop
              (i32.const 3)
            )
          )
        )
      )
      (if
        (i32.const 0)
        (then
          (block $block4
            (block
              (drop
                (i32.const 2)
              )
              (br $a)
            )
            (drop
              (i32.const 3)
            )
          )
        )
        (else
          (drop
            (i32.const 1)
          )
        )
      )
      (if
        (block $block6 (result i32)
          (block
            (drop
              (i32.const 2)
            )
            (br $a)
          )
          (i32.const 3)
        )
        (then
          (drop
            (i32.const 0)
          )
        )
        (else
          (drop
            (i32.const 1)
          )
        )
      )
      (if
        (block $a (result i32)
          (br $a
            (i32.const 0)
          )
        )
        (then
          (block $a
            (block
              (drop
                (i32.const 1)
              )
              (br $a)
            )
          )
        )
        (else
          (block $a
            (block
              (drop
                (i32.const 2)
              )
              (br $a)
            )
          )
        )
      )
    )
  )
  (func $side-effects-and-order (type $2) (result i32)
    (local $x i32)
    (block $do-once$0
      (if
        (call $b13)
        (then
          (block
            (drop
              (i32.const 0)
            )
            (br $do-once$0)
          )
        )
      )
      (drop
        (i32.const 1)
      )
    )
    (block $do-once$0
      (if
        (call $b13)
        (then
          (block
            (drop
              (call $b14)
            )
            (br $do-once$0)
          )
        )
      )
      (drop
        (i32.const 1)
      )
    )
    (block $do-once$0
      (if
        (i32.const 0)
        (then
          (block
            (drop
              (call $b14)
            )
            (br $do-once$0)
          )
        )
      )
      (drop
        (i32.const 1)
      )
    )
    (block $do-once$0 (result i32)
      (if
        (local.tee $x
          (i32.const 1)
        )
        (then
          (br $do-once$0
            (local.tee $x
              (i32.const 2)
            )
          )
        )
      )
      (i32.const 1)
    )
  )
  (func $loops
    (loop $in
      (block $out
        (if (i32.const 0) (then (br $out)))
        (br $in) ;; we can conditionalize this, and then the br out can vanish
      )
    )
    (loop $in
      (br $in)
    )
    (loop
      (block $out
        (if (i32.const 0) (then (br $out)))
        (br $out)
      )
    )
    (loop $in
      (block $out
        (if (i32.const 0) (then (br $out)))
        (br $out)
      )
    )
    (loop $in)
    (loop $in
      (block $out)
    )
    (loop $in
      (block $out
        (if (i32.const 0) (then (br $out)))
        (br_if $in (i32.const 1))
      )
    )
    (loop $in
      (block $out
        (if (i32.const 0) (then (br $in)))
        (br $out)
      )
    )
    (loop $in
      (block $out
        (if (i32.const 0) (then (unreachable)))
        (br $in)
      )
    )
    (loop $in
      (block $out
        (if (i32.const 0)
          (then
            (block
              (call $loops)
              (br $out)
            )
          )
        )
        (br $in)
      )
    )
    (loop $in-todo ;; br_if into if
      (block $out-todo
        (if (i32.const 0) (then (br $out-todo)))
        (call $loops)
        (br $in-todo)
      )
    )
    (loop $in
      (block $out
        (if (i32.const 0)
          (then
            (br $out)
          )
          (else
            (call $loops)
          )
        )
        (br $in)
      )
    )
    (loop $in
      (block $out
        (if (i32.const 0)
          (then
            (call $loops)
          )
          (else
            (br $out)
          )
        )
        (br $in)
      )
    )
    (loop $in
      (block $out
        (if (i32.const 0)
          (then
            (block
              (drop (i32.const 1))
              (call $loops)
            )
          )
          (else
            (br $out)
          )
        )
        (br $in)
      )
    )
    (loop $in
      (block $out
        (if (i32.const 0)
          (then
            (br $out)
          )
          (else
            (call $loops)
          )
        )
        (drop (i32.const 100))
        (br $in)
      )
    )
    (loop $in
      (block $out
        (if (i32.const 0)
          (then
            (call $loops)
          )
          (else
            (br $out)
          )
        )
        (drop (i32.const 101))
        (br $in)
      )
    )
    (loop $in
      (block $out
        (if (i32.const 0)
          (then
            (block
              (drop (i32.const 1))
              (call $loops)
            )
          )
          (else
            (br $out)
          )
        )
        (drop (i32.const 102))
        (br $in)
      )
    )
    (loop $in
      (block $out
        (if (i32.const 0)
          (then
            (br $out)
          )
          (else
            (call $loops)
          )
        )
        (return)
        (br $in)
      )
    )
    (loop $in
      (block $out
        (if (i32.const 0)
          (then
            (br $out)
          )
          (else
            (call $loops)
          )
        )
        (br $out)
        (br $in)
      )
    )
    (loop $in
      (block $out
        (if (i32.const 0)
          (then
            (br $out)
          )
          (else
            (call $loops)
          )
        )
        (drop
          (block $out2 (result i32)
            (br $out2 (i32.const 1))
          )
        )
        (br $in)
      )
    )
    (loop $in
      (block $out
        (br_if $out (i32.const 0))
        (br $in)
      )
    )
    (loop $in-todo2 ;; if-ify
      (block $out-todo2
        (br_if $out-todo2 (i32.const 0))
        (call $loops)
        (br $in-todo2)
      )
    )
    (loop $in
      (block $out
        (br $out)
        (br $in)
      )
    )
    (loop $in
      (block $out
        (br_if $in (i32.const 0))
        (br $in)
      )
    )
    (loop $in-not ;; do NOT if-ify, the block can't be removed
      (block $out-not
        (br_if $out-not (i32.const -1))
        (br_if $out-not (i32.const 0))
        (call $loops)
        (br $in-not)
      )
    )
    (loop $in-todo2 ;; if-ify a slice with 2 things
      (block $out-todo2
        (br_if $out-todo2 (i32.const 0))
        (call $loops)
        (drop (i32.const 1))
        (br $in-todo2)
      )
    )
  )
  (func $br_if_in_block (result i32)
    (block $outval (result i32)
      (block $in
        (if (i32.const 1) (then (br $in) )(else (br $in)))
        (drop (i32.const 2))
        (if (i32.const 3) (then (unreachable) )(else (br $in)))
        (drop (i32.const 4))
        (if (i32.const 5) (then (br $in) )(else (unreachable)))
        (drop (i32.const 6))
      )
      (if (result i32) (i32.const 6) (then (br $outval (i32.const 7)) )(else (i32.const 8)))
    )
  )
  (func $threading
    (drop
      (block $value-out (result i32)
        (block $value-in (result i32)
          (block $out
            (block $in
              (if (i32.const 1)
                (then
                  (br $in)
                )
              )
              (br_if $in (i32.const 2))
              (br $value-in (i32.const 3))
            )
            (br $out)
          )
          (i32.const 4)
        )
      )
    )
    (block $stack1
      (block $stack2
        (block $stack3
          (block $stack4
            (if (i32.const 1)
              (then
                (br $stack4)
              )
            )
            (unreachable)
          )
          (br $stack3)
        )
        (br $stack2)
      )
      (br $stack1)
    )
  )
  (func $if-to-br_if-conflict (param $x i32) (param $y i32) (result i32)
    (block $leave
      (local.set $y
        (block $out (result i32)
          (if
            (local.get $x)
            (then
              (br $out
                (block (result i32)
                  (local.set $x (i32.const 0))
                  (i32.const 1)
                )
              )
            )
            (else
              (br_if $leave (i32.const 1))
            )
          )
          (unreachable)
        )
      )
    )
    (i32.add (local.get $x) (local.get $y))
  )
  (func $if-to-br_if-conflict2 (param $x i32) (param $y i32) (result i32)
    (block $leave
      (local.set $y
        (block $out (result i32)
          (if
            (local.get $x)
            (then
              (br_if $leave (i32.const 1))
            )
            (else
              (br $out
                (block (result i32)
                  (local.set $x (i32.const 0))
                  (i32.const 1)
                )
              )
            )
          )
          (unreachable)
        )
      )
    )
    (i32.add (local.get $x) (local.get $y))
  )
  (func $if-to-br_if-value-sideeffect (param $x i32) (param $y i32) (result i32)
    (block $leave
      (local.set $y
        (block $out (result i32)
          (if
            (local.get $x)
            (then
              (br $out
                (block (result i32)
                  (drop (call $if-to-br_if-value-sideeffect (i32.const 0) (i32.const 1)))
                  (nop)
                  (i32.const 1)
                )
              )
            )
          )
          (unreachable)
        )
      )
    )
    (i32.add (local.get $x) (local.get $y))
  )
  (func $fuzz (param $j i32) (param $g i32)
    (block $label$break$c
      (loop $label$continue$d
        (block $label$break$d
          (if
            (i32.lt_s
              (local.get $j)
              (i32.const 2147483640)
            )
            (then
              (block $x
                (block $y
                  (block $z
                    (br_if $y
                      (local.get $j)
                    )
                    (br $x) ;; don't be confused by this
                  )
                  (nop) ;; get me to the store!
                )
              )
            )
            (else
              (block $switch$26
                (nop)
              )
            )
          )
          (i32.store
            (i32.const 5724)
            (i32.const -254899267)
          )
          (br $label$continue$d)
        )
      )
    )
  )
  (func $iffify
    (block $yes
      (br_if $yes
        (i32.const 0)
      )
      (drop (i32.const 1))
      (drop (i32.const 2))
    )
    (block $no
      (br_if $no
        (i32.const 0)
      )
      (drop (i32.const 1))
      (br $no)
      (drop (i32.const 2))
    )
    (block $no2
      (br_if $no2
        (i32.const 0)
      )
    )
    (block $no3
      (br $no3)
      (drop (i32.const 1))
      (drop (i32.const 2))
    )
    (block $no5
      (block $no4
        (br_if $no5
          (i32.const 0)
        )
        (drop (i32.const 1))
        (drop (i32.const 2))
      )
    )
  )
  (func $loop-if (result i32)
    (block $outer (result i32)
      (loop $typed (result i32)
        ;; we can move the br after us into our if-else, which means we are the final
        ;; element in the block,
        (if
          (i32.const 2)
          (then
            (block
              (drop (call $loop-if))
              (br $outer (i32.const 0))
            )
          )
        )
        (br $typed)
      )
    )
  )
  (func $block-break (param $0 i32)
    (block $block$7$break
      (block $shape$6$continue
        (call $block-break (i32.const 1))
        (br $block$7$break)
      )
    )
  )
  (func $loop-break (param $0 i32)
    (block $block$7$break
      (loop $shape$6$continue
        (call $loop-break (i32.const 1))
        (br_if $shape$6$continue
          (local.get $0)
        )
        (br $block$7$break)
      )
    )
  )
  (func $untaken-brs-might-prevent-block-removal (param $0 f32) (param $1 i32) (param $2 f32) (param $3 i32) (param $4 i32) (param $5 f64) (param $6 f32) (result i32)
   (block $label$0 (result i32)
    (block $label$1 ;; this block has no taken brs, but we can't remove it without removing them first
     (br_if $label$1
      (i32.const 607395945)
     )
     (br_if $label$1
      (i32.load16_s offset=3 align=1
       (select
        (call $untaken-brs-might-prevent-block-removal
         (f32.const 1.4904844647389837e-07)
         (br_if $label$0
          (i32.store16 offset=4 align=1
           (i32.const 1900641)
           (br $label$0
            (i32.const 1628075109)
           )
          )
          (i32.const 1764950569)
         )
         (f32.const 1.1910939690100655e-32)
         (i32.const 1628057906)
         (i32.const 859068982)
         (f64.const 2.524518840347722e-258)
         (f32.const -nan:0x40a63)
        )
        (i32.const 688529440)
        (i32.const 1751478890)
       )
      )
     )
    )
    (i32.const 1935947830)
   )
  )
  (func $unexitable-loops-result (param $0 i32) (result i64)
   (loop $label$0
    (loop $label$1
     (if
      (i32.load8_s
       (i32.const 201460482)
      )
      (then
       (br $label$0)
      )
      (else
       (block $label$3
        (br_if $label$3
         (local.get $0)
        )
       )
      )
     )
     (br $label$1)
    )
   )
  )
  (func $untaken-br-with-concrete-last-element
   (block $label$8
    (block $label$11
     (block $label$14
      (br_if $label$14
       (br $label$11
       )
      )
     )
    )
   )
  )
  (func $untaken-br-with-concrete-last-element2 (result i32)
   (block $label$8 (result i32)
    (block $label$11 (result i32)
     (block $label$14 (result i32)
      (br_if $label$14
       (i32.const 102)
       (br $label$11
        (i32.const 103)
       )
      )
     )
    )
   )
  )
  (func $untaken-br_if-then-if
   (block $label$0
    (br_if $label$0
     (unreachable)
    )
    (if
     (i32.const 0)
     (then
      (nop)
     )
    )
   )
  )
  (func $unreachable-if-that-could-be-a-br_if (result i64)
   (loop $label$3 (result i64)
    (drop
     (if (result f64)
      (unreachable)
      (then
       (f64.const 1)
      )
      (else
       (br $label$3)
      )
     )
    )
    (i64.const 1)
   )
  )
  (func $nop-br-might-update-type
   (block $label$39
    (drop
     (if (result i32)
      (unreachable)
      (then
       (if (result i32)
        (i32.const 1)
        (then
         (br $label$39) ;; if we nop this, then the parent type must change
        )
        (else
         (i32.const 0)
        )
       )
      )
      (else
       (i32.const 0)
      )
     )
    )
   )
  )
  (func $no-flow-through-if-without-else (result f32)
   (local $0 i32)
   (local $2 f32)
   (block $label$0
    (if
     (local.get $0)
     (then
      (block $label$11
       (return
        (f32.const 239)
       )
       (if
        (i32.const 0)
        (then
         (return
          (local.get $2)
         )
        )
       )
      )
     )
     (else
      (return
       (f32.const -9223372036854775808)
      )
     )
    )
   )
  )
  (func $unreachable-return-loop-value (result i64)
   (loop $loop
    (if
     (i32.const 1)
     (then
      (block $block
       (br_if $block
        (br $loop)
       )
       (br $loop)
      )
     )
    )
    (br $loop) ;; we 100% go back to the loop top, the loop is never exited. but opts move code around so that is not obvious anymore, and the loop becomes a nop, but the func has a return value
   )
  )
  (func $obviously-flows-out-maybe (param $var$0 i32) (result f32)
   (block $label$1 (result f32)
    (br $label$1
     (f32.const 1)
    )
    (loop $label$5
     (if
      (i32.const 11)
      (then
       (block $label$8  ;; this block is none - it has a break, even if not taken - and so looks like it might flow out,
        (br_if $label$8 ;; and so we can't move it outside to be the end of the loop's block
         (unreachable)
        )
        (br $label$5)
       )
      )
     )
     (br $label$5)
    )
   )
  )
  (func $br-to-table (param $a i32)
    (block $x
      (block $y
        (block $z
          (br_if $x (i32.eq (local.get $a) (i32.const 0)))
          (br_if $y (i32.eq (local.get $a) (i32.const 1)))
          (br_if $z (i32.eq (local.get $a) (i32.const 2)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $br-to-table-too-few (param $a i32)
    (block $x
      (block $y
        (block $z
          (br_if $x (i32.eq (local.get $a) (i32.const 0)))
          (br_if $y (i32.eq (local.get $a) (i32.const 1)))
        )
      )
    )
  )
  (func $br-to-table-one-more (param $a i32)
    (block $x
      (block $y
        (block $z
          (br_if $x (i32.eq (local.get $a) (i32.const 0)))
          (br_if $y (i32.eq (local.get $a) (i32.const 1)))
          (br_if $z (i32.eq (local.get $a) (i32.const 2)))
          (br_if $x (i32.eq (local.get $a) (i32.const 3)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $br-to-table-overlap (param $a i32)
    (block $x
      (block $y
        (block $z
          (br_if $x (i32.eq (local.get $a) (i32.const 0)))
          (br_if $y (i32.eq (local.get $a) (i32.const 1)))
          (br_if $z (i32.eq (local.get $a) (i32.const 1)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $br-to-table-overlap-start (param $a i32)
    (block $x
      (block $y
        (block $z
          (br_if $x (i32.eq (local.get $a) (i32.const 0)))
          (br_if $y (i32.eq (local.get $a) (i32.const 0)))
          (br_if $z (i32.eq (local.get $a) (i32.const 1)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $br-to-table-offset (param $a i32)
    (block $x
      (block $y
        (block $z
          (br_if $x (i32.eq (local.get $a) (i32.const 15)))
          (br_if $y (i32.eq (local.get $a) (i32.const 16)))
          (br_if $z (i32.eq (local.get $a) (i32.const 17)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $br-to-table-RANGE-high (param $a i32)
    (block $x
      (block $y
        (block $z
          (br_if $x (i32.eq (local.get $a) (i32.const 0)))
          (br_if $y (i32.eq (local.get $a) (i32.const 1)))
          (br_if $z (i32.eq (local.get $a) (i32.const 10)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $br-to-table-RANGE-low (param $a i32)
    (block $x
      (block $y
        (block $z
          (br_if $x (i32.eq (local.get $a) (i32.const 0)))
          (br_if $y (i32.eq (local.get $a) (i32.const 3)))
          (br_if $z (i32.eq (local.get $a) (i32.const 9)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $br-to-table-bad (param $a i32) (result i32)
    (block $value (result i32)
      (block $x
        (block $y
          (block $z
            (nop)
            (br $x)
            (br_if $x (i32.eq (local.get $a) (i32.const 0)))
            (br_if $y (i32.eq (local.get $a) (i32.const 1)))
            (br_if $z (i32.eq (local.get $a) (i32.const 2)))
            (unreachable)
          )
          (unreachable)
        )
        (unreachable)
      )
      (i32.const 2000)
    )
  )
  (func $br-to-table-bad2 (param $a i32) (result i32)
    (block $value (result i32)
      (block $x
        (block $y
          (block $z
            (nop)
            (drop (br_if $value (i32.const 1000) (i32.eq (local.get $a) (i32.const 0))))
            (br_if $x (i32.eq (local.get $a) (i32.const 0)))
            (br_if $y (i32.eq (local.get $a) (i32.const 1)))
            (br_if $z (i32.eq (local.get $a) (i32.const 2)))
            (unreachable)
          )
          (unreachable)
        )
        (unreachable)
      )
      (i32.const 2000)
    )
  )
  (func $br-to-table-bad3 (param $a i32)
    (block $x
      (block $y
        (block $z
          (br_if $x (i32.eq (i32.const 10) (i32.const 0)))
          (br_if $x (i32.eq (local.get $a) (i32.const 0)))
          (br_if $y (i32.eq (local.get $a) (i32.const 1)))
          (br_if $z (i32.eq (local.get $a) (i32.const 2)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $br-to-table-multi (param $a i32)
    (block $x
      (block $y
        (block $z
          (br_if $z (i32.eq (i32.const 10) (i32.const 5)))
          (br_if $y (i32.eq (i32.const 10) (i32.const 6)))
          (br_if $x (i32.eq (i32.const 10) (i32.const 7)))
          (br_if $x (i32.eq (local.get $a) (i32.const 0)))
          (br_if $y (i32.eq (local.get $a) (i32.const 1)))
          (br_if $z (i32.eq (local.get $a) (i32.const 2)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $br-to-table-bad4 (param $a i32)
    (block $x
      (block $y
        (block $z
          (br_if $x (i32.ne (local.get $a) (i32.const 0)))
          (br_if $y (i32.eq (local.get $a) (i32.const 1)))
          (br_if $z (i32.eq (local.get $a) (i32.const 2)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $br-to-table-bad5 (param $a i32)
    (block $x
      (block $y
        (block $z
          (br_if $x (i32.eq (local.get $a) (local.get $a)))
          (br_if $y (i32.eq (local.get $a) (local.get $a)))
          (br_if $z (i32.eq (local.get $a) (local.get $a)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $br-to-table-bad6 (param $a i32)
    (block $x
      (block $y
        (block $z
          (br_if $x (i32.eq (call $b13) (i32.const 0)))
          (br_if $y (i32.eq (call $b13) (i32.const 1)))
          (br_if $z (i32.eq (call $b13) (i32.const 2)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $br-to-table-bad7 (param $a i32)
    (block $x
      (block $y
        (block $z
          (br_if $x (i32.eq (local.get $a) (i32.const -1))) ;; negative, we support only positive up to int32_max
          (br_if $y (i32.eq (local.get $a) (i32.const -1)))
          (br_if $z (i32.eq (local.get $a) (i32.const -1)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $br-to-table-defaultNameOverlaps (param $a i32)
    (block $x
      (block $tablify|0
        (block $z
          (br_if $x (i32.eq (local.get $a) (i32.const 0)))
          (br_if $tablify|0 (i32.eq (local.get $a) (i32.const 1)))
          (br_if $z (i32.eq (local.get $a) (i32.const 2)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $br-to-table-unreach (param $a i32)
    (block $x
      (block $y
        (block $z
          (br_if $x (i32.eq (unreachable) (i32.const 0)))
          (br_if $y (i32.eq (unreachable) (i32.const 1)))
          (br_if $z (i32.eq (unreachable) (i32.const 2)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $br-to-table-overlap-but-later (param $a i32)
    (block $x
      (block $y
        (block $z
          (br_if $x (i32.eq (local.get $a) (i32.const 0)))
          (br_if $y (i32.eq (local.get $a) (i32.const 1)))
          (br_if $z (i32.eq (local.get $a) (i32.const 1)))
          (br_if $x (i32.eq (local.get $a) (i32.const 2)))
          (br_if $y (i32.eq (local.get $a) (i32.const 3)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $br-to-table-initial-tee (param $a i32)
    (block $x
      (block $y
        (block $z
          (br_if $x
            (i32.eq
              (local.tee $a
                (i32.add
                  (i32.const 10)
                  (i32.const 1)
                )
              )
              (i32.const 10)
            )
          )
          (br_if $y (i32.eq (local.get $a) (i32.const 11)))
          (br_if $z (i32.eq (local.get $a) (i32.const 12)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $br-to-table-initial-tee-wrong-index (param $a i32)
    (local $b i32)
    (block $x
      (block $y
        (block $z
          (br_if $x
            (i32.eq
              (local.tee $a (i32.const 99))
              (i32.const 10)
            )
          )
          ;; The subsequent conditions use a different local, $b, so we cannot
          ;; optimize here.
          (br_if $y (i32.eq (local.get $b) (i32.const 11)))
          (br_if $z (i32.eq (local.get $b) (i32.const 12)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $br-to-table-eqz (param $a i32)
    (block $x
      (block $y
        (block $z
          (br_if $x (i32.eqz (local.get $a)))
          (br_if $y (i32.eq (local.get $a) (i32.const 1)))
          (br_if $z (i32.eq (local.get $a) (i32.const 2)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $br-to-table-tee-eqz (param $a i32)
    (block $x
      (block $y
        (block $z
          (br_if $x
            (i32.eqz
              (local.tee $a
                (i32.add
                  (i32.const 0)
                  (i32.const 1)
                )
              )
            )
          )
          (br_if $y (i32.eq (local.get $a) (i32.const 1)))
          (br_if $z (i32.eq (local.get $a) (i32.const 2)))
          (unreachable)
        )
        (unreachable)
      )
      (unreachable)
    )
    (unreachable)
  )
  (func $tiny-switch
    (block $x
      (block $y
        (br_table $x $y
          (i32.const 0)
        )
      )
    )
    (block $z
      (br_table $z
        (i32.const 0)
      )
    )
  )
  (func $trim-switch
    (block $A
      (block $y
        (br_table $y $y $A $y $A $y $A $y $y $y $y $y $y $y $y $y $y $y
          (i32.const 0)
        )
      )
      (call $trim-switch)
    )
  )
  (func $same-target-br_if-and-br
    (block $x
      (br_if $x
        (i32.const 0)
      )
      (br $x)
      (unreachable)
    )
  )
  (func $simple-switch (result i32)
    (block $A
      (block $B
        (block $y
          (br_table $A $y $y $y $y $y $A $y $y $y $y $A $y
            (i32.const 0)
          )
          (return (i32.const 0))
        )
        (return (i32.const 1))
      )
      (return (i32.const 2))
    )
    (return (i32.const 3))
  )
  (func $simple-switch-2 (result i32)
    (block $A
      (block $B
        (block $y
          (br_table $A $y $y $y $y $y $y $y $y $y $y $y $A $y
            (i32.const 0)
          )
          (return (i32.const 0))
        )
        (return (i32.const 1))
      )
      (return (i32.const 2))
    )
    (return (i32.const 3))
  )
  (func $simple-switch-3 (result i32)
    (block $A
      (block $B
        (block $y
          (br_table $A $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $B $y
            (i32.const 0)
          )
          (return (i32.const 0))
        )
        (return (i32.const 1))
      )
      (return (i32.const 2))
    )
    (return (i32.const 3))
  )
  (func $simple-switch43 (result i32)
    (block $A
      (block $B
        (block $y
          (br_table $A $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $B $y
            (i32.const 0)
          )
          (return (i32.const 0))
        )
        (return (i32.const 1))
      )
      (return (i32.const 2))
    )
    (return (i32.const 3))
  )
  (func $simple-switch-5 (result i32)
    (block $A
      (block $B
        (block $y
          (br_table $A $y $y $y $y $y $A $y $y $y $y $y $A $y
            (i32.const 0)
          )
          (return (i32.const 0))
        )
        (return (i32.const 1))
      )
      (return (i32.const 2))
    )
    (return (i32.const 3))
  )
  (func $undo-if-return (param $p i32) (result i32)
    (local $x i32)
    (block $out
      (local.set $x
        (if (result i32)
          (local.get $p)
          (then
            (br $out)
          )
          (else
            (i32.const 1)
          )
        )
      )
      (local.set $x
        (if (result i32)
          (local.get $p)
          (then
            (i32.const 2)
          )
          (else
            (br $out)
          )
        )
      )
      (local.set $x
        (if (result i32)
          (local.get $p)
          (then
            (br $out)
          )
          (else
            (br $out)
          )
        )
      )
    )
    (local.get $p)
  )
  (func $if-unreachable-but-declares-value (param $var$0 i32) (param $var$1 f64) (param $var$2 i32) (param $var$3 f64) (param $var$4 f32) (param $var$5 f32) (result i32)
   (local $var$6 f64)
   (if
    (i32.const 0)
    (then
     (drop
      (loop $label$3 (result i64)
       (block $label$4 (result i64)
        (block $label$5
         (block $label$6
          (local.set $var$1
           (if (result f64)
            (unreachable)
            (then
             (br $label$5)
            )
            (else
             (f64.const 1)
            )
           )
          )
         )
         (nop)
        )
        (i64.const 1)
       )
      )
     )
    )
   )
   (i32.const 0)
  )
  (func $if-flow-1 (result i32)
    (if
      (i32.const 0)
      (then
        (return (i32.const 1))
      )
      (else
        (return (i32.const 2))
      )
    )
  )
  (func $if-flow-2 (result i32)
    (if
      (i32.const 0)
      (then
        (unreachable)
      )
      (else
        (return (i32.const 2))
      )
    )
  )
  (func $if-flow-3 (result i32)
    (if
      (i32.const 0)
      (then
        (return (i32.const 1))
      )
      (else
        (unreachable)
      )
    )
  )
  (func $if-flow-4 (result i32)
    (if
      (return (i32.const 0))
      (then
        (return (i32.const 1))
      )
      (else
        (return (i32.const 2))
      )
    )
  )
  (func $iff-flow-fuzz-bug (result i32)
   (loop $label$1
    (if
     (i32.const 1)
     (then
      (loop $label$2
       (unreachable)
       (if ;; a loop that is never reached at the end of a loop
        (i32.const 0)
        (then
         (nop)
        )
        (else
         (return
          (i32.const 0)
         )
        )
       )
      )
     )
    )
    (br $label$1)
   )
  )
  (func $fuzz-block-unreachable-brs-with-values (result i32)
   (local $0 i32)
   (loop $label$1 (result i32)
    (block $label$2 (result i32)
     (if
      (local.get $0)
      (then
       (local.set $0
        (loop $label$5
         (br_if $label$5
          (br_if $label$2
           (unreachable)
           (i32.const 0)
          )
         )
        )
       )
      )
     )
     (br $label$1)
    )
   )
  )
  (func $drop-restructure-if (param $x i32) (param $y i32) (result i32)
   (block $label$2 (result i32)
    (drop
     (br_if $label$2
      (local.get $x)
      (local.get $y)
     )
    )
    (i32.const 0)
   )
  )
  (func $drop-restructure-if-final (param $x i32) (param $y i32) (result i32)
   (block $label$2 (result i32)
    (drop
     (br_if $label$2
      (local.get $x)
      (local.get $y)
     )
    )
    (unreachable)
   )
  )
  (func $drop-restructure-if-middle (param $x i32) (param $y i32) (result i32)
   (block $label$2 (result i32)
    (drop
     (br_if $label$2
      (local.get $x)
      (local.get $y)
     )
    )
    (nop) ;; the middle
    (i32.const 0)
   )
  )
  (func $drop-restructure-select (param $x i32) (param $y i32) (result i32)
   (block $label$2 (result i32)
    (drop
     (br_if $label$2
      (local.tee $y (local.get $x))
      (local.get $y)
     )
    )
    (i32.const 0)
   )
  )
  (func $drop-restructure-if-bad-2 (param $x i32) (param $y i32) (result i32)
   (block $label$2 (result i32)
    (drop
     (br_if $label$2
      (local.get $y)
      (local.tee $y (local.get $x))
     )
    )
    (i32.const 0)
   )
  )
  (func $if-block
   (block $label
    (if
     (i32.const 1)
     (then
      (block
       (drop (i32.const 2))
       (drop (i32.const 3))
      )
     )
    )
   )
  )
  (func $if-block-bad
   (block $label
    (if
     (br $label) ;; use outside of arm
     (then
      (block
       (drop (i32.const 2))
       (drop (i32.const 3))
      )
     )
    )
   )
  )
  (func $if-block-br
   (block $label
    (if
     (i32.const 1)
     (then
      (br $label)
     )
    )
   )
  )
  (func $if-block-br-1
   (block $label
    (if
     (i32.const 1)
     (then
      (br $label)
     )
     (else
      (drop (i32.const 3))
     )
    )
   )
  )
  (func $if-block-br-2
   (block $label
    (if
     (i32.const 1)
     (then
      (drop (i32.const 3))
     )
     (else
      (br $label)
     )
    )
   )
  )
  (func $if-block-br-3
   (block $label
    (if
     (i32.const 1)
     (then
      (br $label)
     )
     (else
      (br $label)
     )
    )
   )
  )
  (func $if-block-br-4-eithre
   (block $label
    (if
     (i32.const 1)
     (then
      (drop (i32.const 2))
     )
     (else
      (drop (i32.const 3))
     )
    )
   )
  )
  (func $if-block-br-5-value (result i32)
   (block $label (result i32)
    (if (result i32)
     (i32.const 1)
     (then
      (i32.const 2)
     )
     (else
      (i32.const 3)
     )
    )
   )
  )
  (func $restructure-if-outerType-change
   (loop $label$1
    (br_if $label$1
     (block $label$2
      (block $label$3
       (if
        (block $label$4
         (unreachable)
        )
        (then
         (br $label$3)
        )
       )
      )
      (unreachable)
     )
    )
   )
  )
  (func $if-arm-unreachable
   (block $label$1
    (if
     (unreachable) ;; unreachable condition
     (then
      (nop)
     )
     (else
      (unreachable)
     )
    )
   )
  )
  (func $propagate-type-if-we-optimize
   (if
    (i32.const 1)
    (then
     (nop)
    )
    (else
     (block
      (drop
       (loop $label$3 (result i64)
        (br_if $label$3
         (block $label$4 (result i32)
          (if
           (i32.const 0)
           (then
            (unreachable)
           )
           (else
            (unreachable)
           )
          )
         )
        )
        (i64.const -9)
       )
      )
      (unreachable)
     )
    )
   )
  )
  (func $switch-to-br
    (block $A
      (block $y
        (br_table $y $y $A $A
          (i32.const 0)
        )
      )
    )
  )
  (func $switch-to-br-value (result i32)
    (block $A (result i32)
      (block $y (result i32)
        (br_table $A $A $A
          (i32.const 0)
          (i32.const 1)
        )
      )
    )
  )
  (func $switch-threading-multi (param $x i32) (param $y i32) (result i32)
   (block $block$5$break
    (block $block$4$break
     (loop $shape$1$continue
      (block $block$3$break
       (block $switch$2$case$5
        (block $switch$2$case$4
         (block $switch$2$default
          (block $switch$2$case$2
           (br_table $switch$2$case$2 $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$case$5 $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$default $switch$2$case$4 $switch$2$default
            (local.get $x)
           )
          )
          (br $shape$1$continue)
         )
         (br $block$3$break)
        ) ;; switch$2$case$4
        (br $block$4$break)
       )
       (br $block$5$break)
      )
     )
     (unreachable)
    ) ;; block$4$break
    (local.set $y
     (i32.const 1)
    )
    (unreachable)
   )
   (local.set $y
    (i32.const 2)
   )
   (unreachable)
  )
  (func $fuzz-type-changes-in-our-cycles (result i32)
   (loop $label$1
    (if
     (i32.const 0)
     (then
      (block $label$3
       (if
        (i32.const 0)
        (then
         (block
          (nop)
          (br $label$3)
         )
        )
        (else
         (return
          (i32.const -8192)
         )
        )
       )
      )
     )
    )
    (br $label$1)
   )
  )
  (func $refinalize-need-br-value (result i32)
   (loop $label$3 (result i32)
    (block $label$6 (result i32)
     (block $label$10
      (unreachable)
      (block $label$503 ;; this block will get a value flowing out
       (br_if $label$3
        (block $label$530 (result i32)
         (br_if $label$503 ;; while this br does not send a value
          (i32.const 0)
         )
         (i32.const 0)
        )
       )
       (return
        (i32.const 127)
       )
      )
     )
    )
   )
  )
  (func $selectify (param $x i32)
    (drop
      (if (result i32)
        (i32.eq
          (local.get $x)
          (i32.const 1)
        )
        (then
          (i32.mul
            (i32.const 2)
            (i32.const 3)
          )
        )
        (else
          (i32.mul
            (i32.const 2)
            (i32.const 3)
          )
        )
      )
    )
    (drop
      (if (result i32)
        (i32.eq
          (local.get $x)
          (i32.const 1)
        )
        (then
          (i32.add
            (i32.const 2)
            (i32.const 3)
          )
        )
        (else
          (i32.add
            (i32.const 2)
            (i32.const 3)
          )
        )
      )
    )
  )
  (func $selectify-even-with-condition-side-effects (param $0 i32)
    (drop (if (result i32)
      (i32.rem_s
        (local.get $0)
        (i32.const 2)
      )
      (then
            (i32.const 1)
      )
      (else
            (i32.const 0)
      )
    ))
  )
  (func $no-selectify-when-arm-side-effects (param $0 i32)
    (drop (if (result i32)
      (i32.rem_s
        (local.get $0)
        (i32.const 2)
      )
      (then
            (local.tee $0 (i32.const 1))
      )
      (else
            (i32.const 0)
      )
    ))
    (drop (if (result i32)
      (i32.rem_s
        (local.get $0)
        (i32.const 2)
      )
      (then
            (i32.const 0)
      )
      (else
            (local.tee $0 (i32.const 1))
      )
    ))
  )
  (func $no-selectify-when-effects-invalidate (param $0 i32)
    (local $1 i32)
    (drop (if (result i32)
      (i32.rem_s
        (local.tee $0 (i32.const 3))
        (i32.const 2)
      )
      (then
            (local.get $0)
      )
      (else
            (i32.const 0)
      )
    ))
    (drop (if (result i32)
      (i32.rem_s
        (local.tee $0 (i32.const 3))
        (i32.const 2)
      )
      (then
            (i32.const 0)
      )
      (else
            (local.get $0)
      )
    ))
    ;; but different locals do not invalidate
    (drop (if (result i32)
      (i32.rem_s
        (local.tee $0 (i32.const 3))
        (i32.const 2)
      )
      (then
            (i32.const 0)
      )
      (else
            (local.get $1)
      )
    ))
  )
  (func $if-one-side (result i32)
   (local $x i32)
   (local.set $x
    (if (result i32)
     (i32.const 1)
     (then
      (i32.const 2)
     )
     (else
      (local.get $x)
     )
    )
   )
   (local.get $x)
  )
  (func $if-one-side-b (result i32)
   (local $x i32)
   (local.set $x
    (if (result i32)
     (i32.const 1)
     (then
      (local.get $x)
     )
     (else
      (i32.const 2)
     )
    )
   )
   (local.get $x)
  )
  (func $if-one-side-tee-etc (param $0 i32) (result i32)
   (local $1 i32)
   (local $2 i32)
   (local $3 i32)
   (local $4 i32)
   (local $x i32)
   (local $y i32)
   (local $z i32)
   (drop
    (call $if-one-side-tee-etc
     (local.tee $x
       (if (result i32)
         (i32.const -3)
         (then
           (i32.const -4)
         )
         (else
           (local.get $x)
         )
       )
     )
    )
   )
   (i32.const 0)
  )
  (func $ifs-copies-recursive (param $20 i32) (result i32)
   (local.set $20
    (if (result i32)
     (i32.const 1)
     (then
      (if (result i32)
       (i32.const 2)
       (then
        (if (result i32)
         (i32.const 3)
         (then
          (i32.const 4)
         )
         (else
          (local.get $20)
         )
        )
       )
       (else
        (local.get $20)
       )
      )
     )
     (else
      (local.get $20)
     )
    )
   )
   (local.get $20)
  )
  (func $if-copy1
    (local $x i32)
    (local $y i32)
    (loop $top
      (local.set $x
        (if (result i32)
          (i32.const 1)
          (then
            (local.get $x)
          )
          (else
            (local.get $y)
          )
        )
      )
      (br $top)
    )
  )
  (func $if-copy3
    (local $x i32)
    (local $y i32)
    (loop $top
      (local.set $x
        (if (result i32)
          (i32.const 1)
          (then
            (unreachable)
          )
          (else
            (local.get $x)
          )
        )
      )
      (br $top)
    )
  )
  (func $if-copy4
    (local $x i32)
    (local $y i32)
    (loop $top
      (local.set $x
        (if (result i32)
          (i32.const 1)
          (then
            (unreachable)
          )
          (else
            (local.get $y)
          )
        )
      )
      (br $top)
    )
  )
  (func $if-copy-tee
    (local $x i32)
    (local $y i32)
    (loop $top
      (drop
        (local.tee $x
          (if (result i32)
            (i32.const 1)
            (then
              (local.get $x)
            )
            (else
              (i32.const 2)
            )
          )
        )
      )
      (br $top)
    )
  )
  (func $loop-end-set (param $x i32) (result i32)
    (loop $loop
      (nop)
      (if
        (local.get $x)
        (then
          (br $loop)
        )
        (else
          (local.set $x (i32.const 1))
        )
      )
    )
    (local.get $x)
  )
  (func $loop-end-value (param $x i32) (result i32)
    (loop $loop (result i32)
      (nop)
      (if (result i32)
        (local.get $x)
        (then
          (br $loop)
        )
        (else
          (i32.const 1)
        )
      )
    )
  )
  (func $do-not-flow-values-through-unreachable-code (result i32)
   (block
    (unreachable)
    (block $A
     (if
      (i32.const 0)
      (then
       (return
        (i32.const 0) ;; seems to flow out, but we are in unreachable code, and do not actually reach anywhere
       )
      )
      (else
       (br $A) ;; can be a nop
      )
     )
    )
   )
  )
  (func $do-not-flow-values-through-unreachable-code-b (result i32)
   (loop
    (unreachable)
    (block $A
     (if
      (i32.const 0)
      (then
       (return
        (i32.const 0)
       )
      )
      (else
       (br $A)
      )
     )
    )
   )
  )
 (func $if_br_if
  (local $0 i32)
  (block $label$1
   (if
    (local.tee $0 ;; note side effect; it's ok
     (i32.const 1024)
    )
    (then
     (br_if $label$1
      (i32.eqz
       (i32.const -4)
      )
     )
    )
   )
   (if
    (i32.const 1025)
    (then
     (br_if $label$1
      (i32.eqz
       (i32.const -5)
      )
     )
    )
   )
   (if
    (local.tee $0 ;; note side effect; it's ok
     (i32.const 1025)
    )
    (then
     (br_if $label$1
      (i32.eqz
       (i32.const -6)
      )
     )
    )
   )
   (if
    (i32.const 1026)
    (then
     (br_if $label$1
      (local.tee $0 ;; but here it is *not* ok
       (i32.const -7)
      )
     )
    )
   )
   (i32.store
    (i32.const 1024)
    (i32.add
     (local.get $0)
     (i32.const 1)
    )
   )
  )
 )
 (func $unswitch-reordering (param $x i32) (result i32)
  (block $label$1 (result i32)
   (br_table $label$1
    (block $label$2 (result i32)
     (i32.store ;; has a possible side effect
      (i32.const 1)
      (i32.const 2)
     )
     (i32.const 3)
    )
    (block (result i32)
     (if
      (local.get $x)
      (then
       (return
        (i32.const 5)
       )
      )
     )
     (i32.const 6)
    )
   )
  )
 )
 (func $no-selectify-if-condition-unreachable (result i32)
  (select
   (if (result i32)
    (unreachable)
    (then
     (i32.const 3)
    )
    (else
     (i32.const 4)
    )
   )
   (i32.const 1)
   (i32.const 2)
  )
 )
)
