;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited.
;; NOTE: This test was ported using port_passes_tests_to_lit.py and could be cleaned up.

;; RUN: foreach %s %t wasm-opt --remove-unused-brs --enable-multivalue -S -o - | filecheck %s

(module
  (memory 256 256)
  ;; CHECK:      (type $0 (func (param i32)))
  (type $0 (func (param i32)))
  ;; CHECK:      (type $1 (func))
  (type $1 (func))
  ;; CHECK:      (type $2 (func (result i32)))
  (type $2 (func (result i32)))
  ;; CHECK:      (type $3 (func (param i32 i32) (result i32)))

  ;; CHECK:      (type $4 (func (param i32) (result i32)))

  ;; CHECK:      (type $5 (func (result i32 i64)))

  ;; CHECK:      (type $6 (func (result i64)))

  ;; CHECK:      (type $7 (func (param i32 i32)))

  ;; CHECK:      (type $8 (func (param f32 i32 f32 i32 i32 f64 f32) (result i32)))

  ;; CHECK:      (type $9 (func (param i32) (result i64)))

  ;; CHECK:      (type $10 (func (result f32)))

  ;; CHECK:      (type $11 (func (param i32) (result f32)))

  ;; CHECK:      (type $12 (func (param i32 f64 i32 f64 f32 f32) (result i32)))

  ;; CHECK:      (memory $0 256 256)

  ;; CHECK:      (func $b0-yes (param $i1 i32)
  ;; CHECK-NEXT:  (block $topmost
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $b0-yes (type $0) (param $i1 i32)
    (block $topmost
      (br $topmost)
    )
  )
  ;; CHECK:      (func $b1 (param $i1 i32)
  ;; CHECK-NEXT:  (block $topmost
  ;; CHECK-NEXT:   (block
  ;; CHECK-NEXT:    (drop
  ;; CHECK-NEXT:     (i32.const 0)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $b1 (type $0) (param $i1 i32)
    (block $topmost
      (block
        (drop
          (i32.const 0)
        )
        (br $topmost)
      )
    )
  )
  ;; CHECK:      (func $b2 (param $i1 i32)
  ;; CHECK-NEXT:  (block $topmost
  ;; CHECK-NEXT:   (block $inner
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $b2 (type $0) (param $i1 i32)
    (block $topmost
      (block $inner
        (br $topmost)
      )
    )
  )
  ;; CHECK:      (func $b3-yes (param $i1 i32)
  ;; CHECK-NEXT:  (block $topmost
  ;; CHECK-NEXT:   (block $inner
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $b3-yes (type $0) (param $i1 i32)
    (block $topmost
      (block $inner
        (br $inner)
      )
    )
  )
  ;; CHECK:      (func $b4 (param $i1 i32)
  ;; CHECK-NEXT:  (block $topmost
  ;; CHECK-NEXT:   (block $inner
  ;; CHECK-NEXT:    (block
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $b4 (type $0) (param $i1 i32)
    (block $topmost
      (block $inner
        (block
          (drop
            (i32.const 0)
          )
          (br $topmost)
        )
      )
    )
  )
  ;; CHECK:      (func $b5 (param $i1 i32)
  ;; CHECK-NEXT:  (block $topmost
  ;; CHECK-NEXT:   (block $inner
  ;; CHECK-NEXT:    (block
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $b5 (type $0) (param $i1 i32)
    (block $topmost
      (block $inner
        (block
          (drop
            (i32.const 0)
          )
          (br $inner)
        )
      )
    )
  )
  ;; CHECK:      (func $b6 (param $i1 i32)
  ;; CHECK-NEXT:  (block $topmost
  ;; CHECK-NEXT:   (br_if $topmost
  ;; CHECK-NEXT:    (local.get $i1)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $b6 (type $0) (param $i1 i32)
    (block $topmost
      (br_if $topmost
        (local.get $i1)
      )
    )
  )
  ;; CHECK:      (func $b7 (param $i1 i32)
  ;; CHECK-NEXT:  (block $topmost
  ;; CHECK-NEXT:   (block
  ;; CHECK-NEXT:    (drop
  ;; CHECK-NEXT:     (i32.const 0)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (br_if $topmost
  ;; CHECK-NEXT:     (local.get $i1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $b7 (type $0) (param $i1 i32)
    (block $topmost
      (block
        (drop
          (i32.const 0)
        )
        (br_if $topmost
          (local.get $i1)
        )
      )
    )
  )
  ;; CHECK:      (func $b8 (param $i1 i32)
  ;; CHECK-NEXT:  (block $topmost
  ;; CHECK-NEXT:   (block $inner
  ;; CHECK-NEXT:    (br_if $topmost
  ;; CHECK-NEXT:     (local.get $i1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $b8 (type $0) (param $i1 i32)
    (block $topmost
      (block $inner
        (br_if $topmost
          (local.get $i1)
        )
      )
    )
  )
  ;; CHECK:      (func $b9 (param $i1 i32)
  ;; CHECK-NEXT:  (block $topmost
  ;; CHECK-NEXT:   (block $inner
  ;; CHECK-NEXT:    (br_if $topmost
  ;; CHECK-NEXT:     (local.get $i1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $b9 (type $0) (param $i1 i32)
    (block $topmost
      (block $inner
        (br_if $topmost
          (local.get $i1)
        )
      )
    )
  )
  ;; CHECK:      (func $b10 (param $i1 i32)
  ;; CHECK-NEXT:  (block $topmost
  ;; CHECK-NEXT:   (block $inner
  ;; CHECK-NEXT:    (block
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $topmost
  ;; CHECK-NEXT:      (local.get $i1)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $b10 (type $0) (param $i1 i32)
    (block $topmost
      (block $inner
        (block
          (drop
            (i32.const 0)
          )
          (br_if $topmost
            (local.get $i1)
          )
        )
      )
    )
  )
  ;; CHECK:      (func $b11 (param $i1 i32)
  ;; CHECK-NEXT:  (block $topmost
  ;; CHECK-NEXT:   (block $inner
  ;; CHECK-NEXT:    (block
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $topmost
  ;; CHECK-NEXT:      (local.get $i1)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $b11 (type $0) (param $i1 i32)
    (block $topmost
      (block $inner
        (block
          (drop
            (i32.const 0)
          )
          (br_if $inner
            (local.get $i1)
          )
        )
      )
    )
  )
  ;; CHECK:      (func $b12-yes
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (i32.const 1)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (block $topmost
  ;; CHECK-NEXT:     (block $block1
  ;; CHECK-NEXT:      (drop
  ;; CHECK-NEXT:       (i32.const 12)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (block
  ;; CHECK-NEXT:       (drop
  ;; CHECK-NEXT:        (i32.const 1)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (block $block3
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 27)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (block
  ;; CHECK-NEXT:      (drop
  ;; CHECK-NEXT:       (i32.const 2)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
            )
          )
        )
      )
    )
  )
  ;; CHECK:      (func $b13 (result i32)
  ;; CHECK-NEXT:  (local $x i32)
  ;; CHECK-NEXT:  (block $topmost (result i32)
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 1)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (block $block1
  ;; CHECK-NEXT:      (drop
  ;; CHECK-NEXT:       (i32.const 12)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (drop
  ;; CHECK-NEXT:       (br_if $topmost
  ;; CHECK-NEXT:        (local.get $x)
  ;; CHECK-NEXT:        (local.get $x)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (block $block3
  ;; CHECK-NEXT:      (drop
  ;; CHECK-NEXT:       (i32.const 27)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (br $topmost
  ;; CHECK-NEXT:       (i32.const 2)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (i32.const 3)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $b13 (type $2) (result i32)
    (local $x i32)
    (block $topmost (result i32)
      (if
        (i32.const 1)
        (then
          (block $block1
            (drop
              (i32.const 12)
            )
            (drop
              (br_if $topmost
                (local.get $x)
                (local.get $x)
              )
            )
          )
        )
        (else
          (block $block3
            (drop
              (i32.const 27)
            )
            (br $topmost
              (i32.const 2)
            )
          )
        )
      )
      (i32.const 3)
    )
  )
  ;; CHECK:      (func $b14 (result i32)
  ;; CHECK-NEXT:  (select
  ;; CHECK-NEXT:   (block $topmost (result i32)
  ;; CHECK-NEXT:    (block $block1 (result i32)
  ;; CHECK-NEXT:     (i32.const 12)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (block $block3 (result i32)
  ;; CHECK-NEXT:    (i32.const 27)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (i32.const 1)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
          )
        )
      )
    )
  )
  ;; CHECK:      (func $b14-tuple (result i32 i64)
  ;; CHECK-NEXT:  (if (type $5) (result i32 i64)
  ;; CHECK-NEXT:   (i32.const 1)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (block $topmost (type $5) (result i32 i64)
  ;; CHECK-NEXT:     (block $block1 (type $5) (result i32 i64)
  ;; CHECK-NEXT:      (tuple.make 2
  ;; CHECK-NEXT:       (i32.const 12)
  ;; CHECK-NEXT:       (i64.const 12)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (block $block3 (type $5) (result i32 i64)
  ;; CHECK-NEXT:     (tuple.make 2
  ;; CHECK-NEXT:      (i32.const 27)
  ;; CHECK-NEXT:      (i64.const 27)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
            )
          )
        )
      )
    )
  )
  ;; CHECK:      (func $b15
  ;; CHECK-NEXT:  (local $x i32)
  ;; CHECK-NEXT:  (block $topmost
  ;; CHECK-NEXT:   (br_if $topmost
  ;; CHECK-NEXT:    (local.get $x)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $b15 (type $1)
    (local $x i32)
    (block $topmost
      (if
        (local.get $x)
        (then
          (br $topmost)
        )
      )
    )
  )
  ;; CHECK:      (func $b15b
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (i32.const 18)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (block $topmost
  ;; CHECK-NEXT:     (block
  ;; CHECK-NEXT:      (drop
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $b15b (type $1)
    (block $topmost
      (if
        (i32.const 18)
        (then
          (block
            (drop
              (i32.const 0)
            )
            (br $topmost)
          )
        )
      )
    )
  )
  ;; CHECK:      (func $b16
  ;; CHECK-NEXT:  (block $a
  ;; CHECK-NEXT:   (block $b
  ;; CHECK-NEXT:    (block $c
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (block $a0
  ;; CHECK-NEXT:   (block $b0
  ;; CHECK-NEXT:    (block $c0
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (block $a1
  ;; CHECK-NEXT:   (block $b1
  ;; CHECK-NEXT:    (block $c1
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
    )
  )
  ;; CHECK:      (func $b17
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (i32.const 0)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (block $a
  ;; CHECK-NEXT:     (block $block1
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (block $block3
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (i32.const 0)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (block $a0
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 1)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (block $block6
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (i32.const 0)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (block $a1
  ;; CHECK-NEXT:     (block $block8
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (drop
  ;; CHECK-NEXT:     (i32.const 1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (i32.const 0)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (block $c
  ;; CHECK-NEXT:     (block $b
  ;; CHECK-NEXT:      (block $block11
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (block $block13
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
            )
          )
        )
      )
    )
  )
  ;; CHECK:      (func $ret-1
  ;; CHECK-NEXT:  (nop)
  ;; CHECK-NEXT: )
  (func $ret-1 (type $1)
    (return)
  )
  ;; CHECK:      (func $ret-2
  ;; CHECK-NEXT:  (block $block0
  ;; CHECK-NEXT:   (block $block1
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $ret-2 (type $1)
    (block $block0
      (block $block1
        (return)
      )
    )
  )
  ;; CHECK:      (func $ret-3
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (i32.const 0)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (block $block0
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (block $block3
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $ret-3 (type $1)
    (block $block0
      (if
        (i32.const 0)
        (then
          (return)
        )
        (else
          (block $block3
            (return)
          )
        )
      )
    )
  )
  ;; CHECK:      (func $ret-value (result i32)
  ;; CHECK-NEXT:  (block $block0 (result i32)
  ;; CHECK-NEXT:   (block $block1 (result i32)
  ;; CHECK-NEXT:    (i32.const 1)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $ret-value (type $2) (result i32)
    (block $block0
      (block $block1
        (return
          (i32.const 1)
        )
      )
    )
  )
  ;; CHECK:      (func $no-select-but-the-last
  ;; CHECK-NEXT:  (block $a
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 1)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (block $block2
  ;; CHECK-NEXT:      (block
  ;; CHECK-NEXT:       (drop
  ;; CHECK-NEXT:        (i32.const 2)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (br $a)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (drop
  ;; CHECK-NEXT:       (i32.const 3)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (block $block4
  ;; CHECK-NEXT:      (block
  ;; CHECK-NEXT:       (drop
  ;; CHECK-NEXT:        (i32.const 2)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (br $a)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (drop
  ;; CHECK-NEXT:       (i32.const 3)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 1)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (block $block6 (result i32)
  ;; CHECK-NEXT:     (block
  ;; CHECK-NEXT:      (drop
  ;; CHECK-NEXT:       (i32.const 2)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (br $a)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (i32.const 3)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 1)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (block $a0 (result i32)
  ;; CHECK-NEXT:     (i32.const 0)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (block $a1
  ;; CHECK-NEXT:      (block
  ;; CHECK-NEXT:       (drop
  ;; CHECK-NEXT:        (i32.const 1)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (block $a2
  ;; CHECK-NEXT:      (block
  ;; CHECK-NEXT:       (drop
  ;; CHECK-NEXT:        (i32.const 2)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
            )
          )
        )
      )
    )
  )
  ;; CHECK:      (func $side-effects-and-order (result i32)
  ;; CHECK-NEXT:  (local $x i32)
  ;; CHECK-NEXT:  (block $do-once$0
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (call $b13)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $do-once$0)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (drop
  ;; CHECK-NEXT:    (i32.const 1)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (block $do-once$00
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (call $b13)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (call $b14)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $do-once$00)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (drop
  ;; CHECK-NEXT:    (i32.const 1)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (block $do-once$01
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (call $b14)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $do-once$01)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (drop
  ;; CHECK-NEXT:    (i32.const 1)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (block $do-once$02 (result i32)
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (local.tee $x
  ;; CHECK-NEXT:     (i32.const 1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (br $do-once$02
  ;; CHECK-NEXT:      (local.tee $x
  ;; CHECK-NEXT:       (i32.const 2)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (i32.const 1)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
    )
  )
  ;; CHECK:      (func $loops
  ;; CHECK-NEXT:  (local $x i32)
  ;; CHECK-NEXT:  (loop $in
  ;; CHECK-NEXT:   (block $out
  ;; CHECK-NEXT:    (br_if $in
  ;; CHECK-NEXT:     (i32.eqz
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in0
  ;; CHECK-NEXT:   (br $in0)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop
  ;; CHECK-NEXT:   (block $out0
  ;; CHECK-NEXT:    (br_if $out0
  ;; CHECK-NEXT:     (local.get $x)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in1
  ;; CHECK-NEXT:   (block $out1
  ;; CHECK-NEXT:    (br_if $out1
  ;; CHECK-NEXT:     (local.get $x)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in2
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in3
  ;; CHECK-NEXT:   (block $out2
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in4
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.eqz
  ;; CHECK-NEXT:     (local.get $x)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (block $out3
  ;; CHECK-NEXT:      (nop)
  ;; CHECK-NEXT:      (br_if $in4
  ;; CHECK-NEXT:       (local.get $x)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in5
  ;; CHECK-NEXT:   (block $out4
  ;; CHECK-NEXT:    (br_if $in5
  ;; CHECK-NEXT:     (local.get $x)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in6
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (block $out5
  ;; CHECK-NEXT:      (unreachable)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (br $in6)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in7
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (block $out6
  ;; CHECK-NEXT:      (block
  ;; CHECK-NEXT:       (call $loops)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (br $in7)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in-todo
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (block $out-todo
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (call $loops)
  ;; CHECK-NEXT:     (br $in-todo)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in8
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (block $out7
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (call $loops)
  ;; CHECK-NEXT:     (br $in8)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in9
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (call $loops)
  ;; CHECK-NEXT:     (br $in9)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (block $out8
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in10
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 1)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (call $loops)
  ;; CHECK-NEXT:     (br $in10)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (block $out9
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in11
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (block $out10
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (call $loops)
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 100)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $in11)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in12
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (call $loops)
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 101)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $in12)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (block $out11
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in13
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 1)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (call $loops)
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 102)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $in13)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (block $out12
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in14
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.eqz
  ;; CHECK-NEXT:     (i32.const 0)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (block $out13
  ;; CHECK-NEXT:      (nop)
  ;; CHECK-NEXT:      (call $loops)
  ;; CHECK-NEXT:      (return)
  ;; CHECK-NEXT:      (br $in14)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in15
  ;; CHECK-NEXT:   (block $out14
  ;; CHECK-NEXT:    (br_if $out14
  ;; CHECK-NEXT:     (i32.const 0)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (call $loops)
  ;; CHECK-NEXT:    (br $out14)
  ;; CHECK-NEXT:    (br $in15)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in16
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (block $out15
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (call $loops)
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (block $out20 (result i32)
  ;; CHECK-NEXT:       (i32.const 1)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $in16)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in17
  ;; CHECK-NEXT:   (block $out16
  ;; CHECK-NEXT:    (br_if $in17
  ;; CHECK-NEXT:     (i32.eqz
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in-todo2
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (block $out-todo2
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (call $loops)
  ;; CHECK-NEXT:     (br $in-todo2)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in18
  ;; CHECK-NEXT:   (block $out17
  ;; CHECK-NEXT:    (br $out17)
  ;; CHECK-NEXT:    (br $in18)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in19
  ;; CHECK-NEXT:   (block $out18
  ;; CHECK-NEXT:    (drop
  ;; CHECK-NEXT:     (local.get $x)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (br $in19)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in-not
  ;; CHECK-NEXT:   (block $out-not
  ;; CHECK-NEXT:    (br_if $out-not
  ;; CHECK-NEXT:     (local.get $x)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (br_if $out-not
  ;; CHECK-NEXT:     (local.get $x)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (call $loops)
  ;; CHECK-NEXT:    (br $in-not)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $in-todo20
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (block $out-todo20
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (call $loops)
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 1)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $in-todo20)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $loops
    (local $x i32)
    (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 (local.get $x) (then (br $out)))
        (br $out)
      )
    )
    (loop $in
      (block $out
        (if (local.get $x) (then (br $out)))
        (br $out)
      )
    )
    (loop $in)
    (loop $in
      (block $out)
    )
    (loop $in
      (block $out
        (if (local.get $x) (then (br $out)))
        (br_if $in (local.get $x))
      )
    )
    (loop $in
      (block $out
        (if (local.get $x) (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 (local.get $x))
        (br $in)
      )
    )
    (loop $in-not ;; do NOT if-ify, the block can't be removed
      (block $out-not
        (br_if $out-not (local.get $x))
        (br_if $out-not (local.get $x))
        (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)
      )
    )
  )
  ;; CHECK:      (func $br_if_in_block (result i32)
  ;; CHECK-NEXT:  (block $outval (result i32)
  ;; CHECK-NEXT:   (block $in
  ;; CHECK-NEXT:    (drop
  ;; CHECK-NEXT:     (i32.const 1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (br $in)
  ;; CHECK-NEXT:    (drop
  ;; CHECK-NEXT:     (i32.const 2)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (br_if $in
  ;; CHECK-NEXT:     (i32.eqz
  ;; CHECK-NEXT:      (i32.const 3)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:    (drop
  ;; CHECK-NEXT:     (i32.const 4)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (br_if $in
  ;; CHECK-NEXT:     (i32.const 5)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:    (drop
  ;; CHECK-NEXT:     (i32.const 6)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (select
  ;; CHECK-NEXT:    (i32.const 7)
  ;; CHECK-NEXT:    (i32.const 8)
  ;; CHECK-NEXT:    (i32.const 6)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)))
    )
  )
  ;; CHECK:      (func $threading
  ;; CHECK-NEXT:  (local $x i32)
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (block $value-out (result i32)
  ;; CHECK-NEXT:    (block $value-in (result i32)
  ;; CHECK-NEXT:     (block $out
  ;; CHECK-NEXT:      (block $in
  ;; CHECK-NEXT:       (br_if $out
  ;; CHECK-NEXT:        (local.get $x)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (br_if $out
  ;; CHECK-NEXT:        (local.get $x)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (br $value-in
  ;; CHECK-NEXT:        (i32.const 3)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (i32.const 4)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (block $stack1
  ;; CHECK-NEXT:   (block $stack2
  ;; CHECK-NEXT:    (block $stack3
  ;; CHECK-NEXT:     (block $stack4
  ;; CHECK-NEXT:      (br_if $stack1
  ;; CHECK-NEXT:       (local.get $x)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (unreachable)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $threading
    (local $x i32)
    (drop
      (block $value-out (result i32)
        (block $value-in (result i32)
          (block $out
            (block $in
              (if (local.get $x)
                (then
                  (br $in)
                )
              )
              (br_if $in (local.get $x))
              (br $value-in (i32.const 3))
            )
            (br $out)
          )
          (i32.const 4)
        )
      )
    )
    (block $stack1
      (block $stack2
        (block $stack3
          (block $stack4
            (if (local.get $x)
              (then
                (br $stack4)
              )
            )
            (unreachable)
          )
          (br $stack3)
        )
        (br $stack2)
      )
      (br $stack1)
    )
  )
  ;; CHECK:      (func $if-to-br_if-conflict (param $x i32) (param $y i32) (result i32)
  ;; CHECK-NEXT:  (block $leave
  ;; CHECK-NEXT:   (local.set $y
  ;; CHECK-NEXT:    (block $out (result i32)
  ;; CHECK-NEXT:     (if
  ;; CHECK-NEXT:      (local.get $x)
  ;; CHECK-NEXT:      (then
  ;; CHECK-NEXT:       (br $out
  ;; CHECK-NEXT:        (block (result i32)
  ;; CHECK-NEXT:         (local.set $x
  ;; CHECK-NEXT:          (i32.const 0)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (i32.const 1)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (else
  ;; CHECK-NEXT:       (br_if $leave
  ;; CHECK-NEXT:        (local.get $x)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (i32.add
  ;; CHECK-NEXT:   (local.get $x)
  ;; CHECK-NEXT:   (local.get $y)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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 (local.get $x))
            )
          )
          (unreachable)
        )
      )
    )
    (i32.add (local.get $x) (local.get $y))
  )
  ;; CHECK:      (func $if-to-br_if-conflict2 (param $x i32) (param $y i32) (result i32)
  ;; CHECK-NEXT:  (block $leave
  ;; CHECK-NEXT:   (local.set $y
  ;; CHECK-NEXT:    (block $out (result i32)
  ;; CHECK-NEXT:     (if
  ;; CHECK-NEXT:      (local.get $x)
  ;; CHECK-NEXT:      (then
  ;; CHECK-NEXT:       (br_if $leave
  ;; CHECK-NEXT:        (local.get $x)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (else
  ;; CHECK-NEXT:       (br $out
  ;; CHECK-NEXT:        (block (result i32)
  ;; CHECK-NEXT:         (local.set $x
  ;; CHECK-NEXT:          (i32.const 0)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (i32.const 1)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (i32.add
  ;; CHECK-NEXT:   (local.get $x)
  ;; CHECK-NEXT:   (local.get $y)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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 (local.get $x))
            )
            (else
              (br $out
                (block (result i32)
                  (local.set $x (i32.const 0))
                  (i32.const 1)
                )
              )
            )
          )
          (unreachable)
        )
      )
    )
    (i32.add (local.get $x) (local.get $y))
  )
  ;; CHECK:      (func $if-to-br_if-value-sideeffect (param $x i32) (param $y i32) (result i32)
  ;; CHECK-NEXT:  (block $leave
  ;; CHECK-NEXT:   (local.set $y
  ;; CHECK-NEXT:    (block $out (result i32)
  ;; CHECK-NEXT:     (if
  ;; CHECK-NEXT:      (local.get $x)
  ;; CHECK-NEXT:      (then
  ;; CHECK-NEXT:       (br $out
  ;; CHECK-NEXT:        (block (result i32)
  ;; CHECK-NEXT:         (drop
  ;; CHECK-NEXT:          (call $if-to-br_if-value-sideeffect
  ;; CHECK-NEXT:           (i32.const 0)
  ;; CHECK-NEXT:           (i32.const 1)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (nop)
  ;; CHECK-NEXT:         (i32.const 1)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (i32.add
  ;; CHECK-NEXT:   (local.get $x)
  ;; CHECK-NEXT:   (local.get $y)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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))
  )
  ;; CHECK:      (func $fuzz (param $j i32) (param $g i32)
  ;; CHECK-NEXT:  (loop $label$continue$d
  ;; CHECK-NEXT:   (block $label$break$c
  ;; CHECK-NEXT:    (block $label$break$d
  ;; CHECK-NEXT:     (if
  ;; CHECK-NEXT:      (i32.lt_s
  ;; CHECK-NEXT:       (local.get $j)
  ;; CHECK-NEXT:       (i32.const 2147483640)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (then
  ;; CHECK-NEXT:       (block $x
  ;; CHECK-NEXT:        (block $y
  ;; CHECK-NEXT:         (block $z
  ;; CHECK-NEXT:          (br_if $x
  ;; CHECK-NEXT:           (local.get $j)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (else
  ;; CHECK-NEXT:       (block $switch$26
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (i32.store
  ;; CHECK-NEXT:      (i32.const 5724)
  ;; CHECK-NEXT:      (i32.const -254899267)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $label$continue$d)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
        )
      )
    )
  )
  ;; CHECK:      (func $iffify
  ;; CHECK-NEXT:  (local $x i32)
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (i32.eqz
  ;; CHECK-NEXT:    (local.get $x)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (block $yes
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 1)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 2)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (block $no
  ;; CHECK-NEXT:   (br_if $no
  ;; CHECK-NEXT:    (local.get $x)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (drop
  ;; CHECK-NEXT:    (i32.const 1)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (br $no)
  ;; CHECK-NEXT:   (drop
  ;; CHECK-NEXT:    (i32.const 2)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (block $no2
  ;; CHECK-NEXT:   (br_if $no2
  ;; CHECK-NEXT:    (local.get $x)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (block $no3
  ;; CHECK-NEXT:   (br $no3)
  ;; CHECK-NEXT:   (drop
  ;; CHECK-NEXT:    (i32.const 1)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (drop
  ;; CHECK-NEXT:    (i32.const 2)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (block $no5
  ;; CHECK-NEXT:   (block $no4
  ;; CHECK-NEXT:    (br_if $no5
  ;; CHECK-NEXT:     (local.get $x)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (drop
  ;; CHECK-NEXT:     (i32.const 1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (drop
  ;; CHECK-NEXT:     (i32.const 2)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $iffify
    (local $x i32)
    (block $yes
      (br_if $yes
        (local.get $x)
      )
      (drop (i32.const 1))
      (drop (i32.const 2))
    )
    (block $no
      (br_if $no
        (local.get $x)
      )
      (drop (i32.const 1))
      (br $no)
      (drop (i32.const 2))
    )
    (block $no2
      (br_if $no2
        (local.get $x)
      )
    )
    (block $no3
      (br $no3)
      (drop (i32.const 1))
      (drop (i32.const 2))
    )
    (block $no5
      (block $no4
        (br_if $no5
          (local.get $x)
        )
        (drop (i32.const 1))
        (drop (i32.const 2))
      )
    )
  )
  ;; CHECK:      (func $loop-if (result i32)
  ;; CHECK-NEXT:  (loop $typed (result i32)
  ;; CHECK-NEXT:   (block $outer (result i32)
  ;; CHECK-NEXT:    (block (result i32)
  ;; CHECK-NEXT:     (br_if $typed
  ;; CHECK-NEXT:      (i32.eqz
  ;; CHECK-NEXT:       (i32.const 2)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (block (result i32)
  ;; CHECK-NEXT:      (drop
  ;; CHECK-NEXT:       (call $loop-if)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
      )
    )
  )
  ;; CHECK:      (func $block-break (param $0 i32)
  ;; CHECK-NEXT:  (block $block$7$break
  ;; CHECK-NEXT:   (block $shape$6$continue
  ;; CHECK-NEXT:    (call $block-break
  ;; CHECK-NEXT:     (i32.const 1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $block-break (param $0 i32)
    (block $block$7$break
      (block $shape$6$continue
        (call $block-break (i32.const 1))
        (br $block$7$break)
      )
    )
  )
  ;; CHECK:      (func $loop-break (param $0 i32)
  ;; CHECK-NEXT:  (loop $shape$6$continue
  ;; CHECK-NEXT:   (block $block$7$break
  ;; CHECK-NEXT:    (block
  ;; CHECK-NEXT:     (call $loop-break
  ;; CHECK-NEXT:      (i32.const 1)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $shape$6$continue
  ;; CHECK-NEXT:      (local.get $0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
      )
    )
  )
  ;; CHECK:      (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)
  ;; CHECK-NEXT:  (block $label$0 (result i32)
  ;; CHECK-NEXT:   (block $label$1
  ;; CHECK-NEXT:    (br_if $label$1
  ;; CHECK-NEXT:     (local.get $1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (br_if $label$1
  ;; CHECK-NEXT:     (i32.load offset=3 align=1
  ;; CHECK-NEXT:      (select
  ;; CHECK-NEXT:       (call $untaken-brs-might-prevent-block-removal
  ;; CHECK-NEXT:        (f32.const 1.4904844647389837e-07)
  ;; CHECK-NEXT:        (br_if $label$0
  ;; CHECK-NEXT:         (i32.store16 offset=4 align=1
  ;; CHECK-NEXT:          (i32.const 1900641)
  ;; CHECK-NEXT:          (br $label$0
  ;; CHECK-NEXT:           (i32.const 1628075109)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (local.get $1)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (f32.const 1.1910939690100655e-32)
  ;; CHECK-NEXT:        (i32.const 1628057906)
  ;; CHECK-NEXT:        (i32.const 859068982)
  ;; CHECK-NEXT:        (f64.const 2.524518840347722e-258)
  ;; CHECK-NEXT:        (f32.const -nan:0x40a63)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (i32.const 688529440)
  ;; CHECK-NEXT:       (i32.const 1751478890)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (i32.const 1935947830)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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
      (local.get $1)
     )
     (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)
           )
          )
          (local.get $1)
         )
         (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)
   )
  )
  ;; CHECK:      (func $unexitable-loops-result (param $0 i32) (result i64)
  ;; CHECK-NEXT:  (loop $label$0
  ;; CHECK-NEXT:   (loop $label$1
  ;; CHECK-NEXT:    (br_if $label$0
  ;; CHECK-NEXT:     (i32.load8_s
  ;; CHECK-NEXT:      (i32.const 201460482)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (block
  ;; CHECK-NEXT:     (block $label$3
  ;; CHECK-NEXT:      (br_if $label$1
  ;; CHECK-NEXT:       (local.get $0)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $label$1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
    )
   )
  )
  ;; CHECK:      (func $untaken-br-with-concrete-last-element
  ;; CHECK-NEXT:  (block $label$8
  ;; CHECK-NEXT:   (block $label$11
  ;; CHECK-NEXT:    (block $label$14
  ;; CHECK-NEXT:     (br $label$8)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $untaken-br-with-concrete-last-element
   (block $label$8
    (block $label$11
     (block $label$14
      (br_if $label$14
       (br $label$11
       )
      )
     )
    )
   )
  )
  ;; CHECK:      (func $untaken-br-with-concrete-last-element2 (result i32)
  ;; CHECK-NEXT:  (block $label$8 (result i32)
  ;; CHECK-NEXT:   (block $label$11 (result i32)
  ;; CHECK-NEXT:    (block $label$14 (result i32)
  ;; CHECK-NEXT:     (br_if $label$14
  ;; CHECK-NEXT:      (i32.const 102)
  ;; CHECK-NEXT:      (br $label$11
  ;; CHECK-NEXT:       (i32.const 103)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
       )
      )
     )
    )
   )
  )
  ;; CHECK:      (func $untaken-br_if-then-if
  ;; CHECK-NEXT:  (block $label$0
  ;; CHECK-NEXT:   (br_if $label$0
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $untaken-br_if-then-if
   (block $label$0
    (br_if $label$0
     (unreachable)
    )
    (if
     (i32.const 0)
     (then
      (nop)
     )
    )
   )
  )
  ;; CHECK:      (func $unreachable-if-that-could-be-a-br_if (result i64)
  ;; CHECK-NEXT:  (loop $label$3 (result i64)
  ;; CHECK-NEXT:   (drop
  ;; CHECK-NEXT:    (if (result f64)
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:     (then
  ;; CHECK-NEXT:      (f64.const 1)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (else
  ;; CHECK-NEXT:      (br $label$3)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (i64.const 1)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
   )
  )
  ;; CHECK:      (func $nop-br-might-update-type
  ;; CHECK-NEXT:  (block $label$39
  ;; CHECK-NEXT:   (drop
  ;; CHECK-NEXT:    (if (result i32)
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:     (then
  ;; CHECK-NEXT:      (if (result i32)
  ;; CHECK-NEXT:       (i32.const 1)
  ;; CHECK-NEXT:       (then
  ;; CHECK-NEXT:        (br $label$39)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (else
  ;; CHECK-NEXT:        (i32.const 0)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (else
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
      )
     )
    )
   )
  )
  ;; CHECK:      (func $no-flow-through-if-without-else (result f32)
  ;; CHECK-NEXT:  (local $0 i32)
  ;; CHECK-NEXT:  (local $2 f32)
  ;; CHECK-NEXT:  (if (result f32)
  ;; CHECK-NEXT:   (local.get $0)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (block $label$0
  ;; CHECK-NEXT:     (block $label$11
  ;; CHECK-NEXT:      (return
  ;; CHECK-NEXT:       (f32.const 239)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (if
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:       (then
  ;; CHECK-NEXT:        (return
  ;; CHECK-NEXT:         (local.get $2)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (f32.const -9223372036854775808)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
      )
     )
    )
   )
  )
  ;; CHECK:      (func $unreachable-return-loop-value (result i64)
  ;; CHECK-NEXT:  (loop $loop
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 1)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (block $block
  ;; CHECK-NEXT:      (br_if $block
  ;; CHECK-NEXT:       (br $loop)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (br $loop)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (br $loop)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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
   )
  )
  ;; CHECK:      (func $obviously-flows-out-maybe (param $var$0 i32) (result f32)
  ;; CHECK-NEXT:  (block $label$1 (result f32)
  ;; CHECK-NEXT:   (br $label$1
  ;; CHECK-NEXT:    (f32.const 1)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (loop $label$5
  ;; CHECK-NEXT:    (if
  ;; CHECK-NEXT:     (i32.const 11)
  ;; CHECK-NEXT:     (then
  ;; CHECK-NEXT:      (block $label$8
  ;; CHECK-NEXT:       (br_if $label$8
  ;; CHECK-NEXT:        (unreachable)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (br $label$5)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (br $label$5)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
    )
   )
  )
  ;; CHECK:      (func $br-to-table (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (block $tablify|0
  ;; CHECK-NEXT:      (br_table $x $y $z $tablify|0
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $br-to-table-too-few (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (br_if $x
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $x
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (i32.const 1)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)))
        )
      )
    )
  )
  ;; CHECK:      (func $br-to-table-one-more (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (block $tablify|0
  ;; CHECK-NEXT:      (br_table $x $y $z $x $tablify|0
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $br-to-table-overlap (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (br_if $x
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $y
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (i32.const 1)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $z
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (i32.const 1)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $br-to-table-overlap-start (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (br_if $x
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $y
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $z
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (i32.const 1)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $br-to-table-offset (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (block $tablify|0
  ;; CHECK-NEXT:      (br_table $x $y $z $tablify|0
  ;; CHECK-NEXT:       (i32.sub
  ;; CHECK-NEXT:        (local.get $a)
  ;; CHECK-NEXT:        (i32.const 15)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $br-to-table-RANGE-high (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (br_if $x
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $y
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (i32.const 1)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $z
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (i32.const 10)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $br-to-table-RANGE-low (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (block $tablify|0
  ;; CHECK-NEXT:      (br_table $x $tablify|0 $tablify|0 $y $tablify|0 $tablify|0 $tablify|0 $tablify|0 $tablify|0 $z $tablify|0
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $br-to-table-bad (param $a i32) (result i32)
  ;; CHECK-NEXT:  (block $value (result i32)
  ;; CHECK-NEXT:   (block $x
  ;; CHECK-NEXT:    (block $y
  ;; CHECK-NEXT:     (block $z
  ;; CHECK-NEXT:      (nop)
  ;; CHECK-NEXT:      (br $x)
  ;; CHECK-NEXT:      (nop)
  ;; CHECK-NEXT:      (nop)
  ;; CHECK-NEXT:      (block $tablify|0
  ;; CHECK-NEXT:       (br_table $x $y $z $tablify|0
  ;; CHECK-NEXT:        (local.get $a)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (unreachable)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (i32.const 2000)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
    )
  )
  ;; CHECK:      (func $br-to-table-bad2 (param $a i32) (result i32)
  ;; CHECK-NEXT:  (block $value (result i32)
  ;; CHECK-NEXT:   (block $x
  ;; CHECK-NEXT:    (block $y
  ;; CHECK-NEXT:     (block $z
  ;; CHECK-NEXT:      (nop)
  ;; CHECK-NEXT:      (drop
  ;; CHECK-NEXT:       (br_if $value
  ;; CHECK-NEXT:        (i32.const 1000)
  ;; CHECK-NEXT:        (i32.eq
  ;; CHECK-NEXT:         (local.get $a)
  ;; CHECK-NEXT:         (i32.const 0)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (nop)
  ;; CHECK-NEXT:      (nop)
  ;; CHECK-NEXT:      (block $tablify|0
  ;; CHECK-NEXT:       (br_table $x $y $z $tablify|0
  ;; CHECK-NEXT:        (local.get $a)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (unreachable)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (i32.const 2000)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
    )
  )
  ;; CHECK:      (func $br-to-table-bad3 (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (br_if $x
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (i32.const 10)
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (block $tablify|0
  ;; CHECK-NEXT:      (br_table $x $y $z $tablify|0
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $br-to-table-multi (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (block $tablify|0
  ;; CHECK-NEXT:      (br_table $z $y $x $tablify|0
  ;; CHECK-NEXT:       (i32.sub
  ;; CHECK-NEXT:        (i32.const 10)
  ;; CHECK-NEXT:        (i32.const 5)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (block $tablify|00
  ;; CHECK-NEXT:      (br_table $x $y $z $tablify|00
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $br-to-table-bad4 (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (br_if $x
  ;; CHECK-NEXT:      (i32.ne
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $y
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (i32.const 1)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $z
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (i32.const 2)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $br-to-table-bad5 (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (br_if $x
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $y
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $z
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $br-to-table-bad6 (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (br_if $x
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (call $b13)
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $y
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (call $b13)
  ;; CHECK-NEXT:       (i32.const 1)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $z
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (call $b13)
  ;; CHECK-NEXT:       (i32.const 2)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $br-to-table-bad7 (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (br_if $x
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (i32.const -1)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $y
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (i32.const -1)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $z
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (i32.const -1)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $br-to-table-defaultNameOverlaps (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $tablify|0
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (block $tablify|1
  ;; CHECK-NEXT:      (br_table $x $tablify|0 $z $tablify|1
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $br-to-table-unreach (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (br_if $x
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (unreachable)
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $y
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (unreachable)
  ;; CHECK-NEXT:       (i32.const 1)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $z
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (unreachable)
  ;; CHECK-NEXT:       (i32.const 2)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $br-to-table-overlap-but-later (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (br_if $x
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $y
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:       (i32.const 1)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (block $tablify|0
  ;; CHECK-NEXT:      (br_table $z $x $y $tablify|0
  ;; CHECK-NEXT:       (i32.sub
  ;; CHECK-NEXT:        (local.get $a)
  ;; CHECK-NEXT:        (i32.const 1)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $br-to-table-initial-tee (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (block $tablify|0
  ;; CHECK-NEXT:      (br_table $x $y $z $tablify|0
  ;; CHECK-NEXT:       (i32.sub
  ;; CHECK-NEXT:        (local.tee $a
  ;; CHECK-NEXT:         (i32.add
  ;; CHECK-NEXT:          (i32.const 10)
  ;; CHECK-NEXT:          (i32.const 1)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (i32.const 10)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $br-to-table-initial-tee-wrong-index (param $a i32)
  ;; CHECK-NEXT:  (local $b i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (br_if $x
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.tee $a
  ;; CHECK-NEXT:        (i32.const 99)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (i32.const 10)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $y
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $b)
  ;; CHECK-NEXT:       (i32.const 11)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $z
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $b)
  ;; CHECK-NEXT:       (i32.const 12)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $br-to-table-eqz (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (block $tablify|0
  ;; CHECK-NEXT:      (br_table $x $y $z $tablify|0
  ;; CHECK-NEXT:       (local.get $a)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $br-to-table-tee-eqz (param $a i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block $z
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (block $tablify|0
  ;; CHECK-NEXT:      (br_table $x $y $z $tablify|0
  ;; CHECK-NEXT:       (local.tee $a
  ;; CHECK-NEXT:        (i32.add
  ;; CHECK-NEXT:         (i32.const 0)
  ;; CHECK-NEXT:         (i32.const 1)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $tiny-switch
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (i32.const 0)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (block $y
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (block $x
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (block $z
  ;; CHECK-NEXT:   (block
  ;; CHECK-NEXT:    (drop
  ;; CHECK-NEXT:     (i32.const 0)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $tiny-switch
    (block $x
      (block $y
        (br_table $x $y
          (i32.const 0)
        )
      )
    )
    (block $z
      (br_table $z
        (i32.const 0)
      )
    )
  )
  ;; CHECK:      (func $trim-switch
  ;; CHECK-NEXT:  (block $A
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (br_table $A $y $A $y $A $y
  ;; CHECK-NEXT:     (i32.sub
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:      (i32.const 2)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (call $trim-switch)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
    )
  )
  ;; CHECK:      (func $same-target-br_if-and-br
  ;; CHECK-NEXT:  (local $x i32)
  ;; CHECK-NEXT:  (block $x
  ;; CHECK-NEXT:   (drop
  ;; CHECK-NEXT:    (local.get $x)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (br $x)
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $same-target-br_if-and-br
    (local $x i32)
    (block $x
      (br_if $x
        (local.get $x)
      )
      (br $x)
      (unreachable)
    )
  )
  ;; CHECK:      (func $simple-switch (result i32)
  ;; CHECK-NEXT:  (block $A
  ;; CHECK-NEXT:   (block $B
  ;; CHECK-NEXT:    (block $y
  ;; CHECK-NEXT:     (br_table $A $y $y $y $y $y $A $y $y $y $y $A $y
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (return
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (return
  ;; CHECK-NEXT:     (i32.const 1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (return
  ;; CHECK-NEXT:    (i32.const 2)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (i32.const 3)
  ;; CHECK-NEXT: )
  (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))
  )
  ;; CHECK:      (func $simple-switch-2 (result i32)
  ;; CHECK-NEXT:  (block $A
  ;; CHECK-NEXT:   (block $B
  ;; CHECK-NEXT:    (block $y
  ;; CHECK-NEXT:     (br_table $A $y $y $y $y $y $y $y $y $y $y $y $A $y
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (return
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (return
  ;; CHECK-NEXT:     (i32.const 1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (return
  ;; CHECK-NEXT:    (i32.const 2)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (i32.const 3)
  ;; CHECK-NEXT: )
  (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))
  )
  ;; CHECK:      (func $simple-switch-3 (result i32)
  ;; CHECK-NEXT:  (block $A
  ;; CHECK-NEXT:   (block $B
  ;; CHECK-NEXT:    (block $y
  ;; CHECK-NEXT:     (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
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (return
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (return
  ;; CHECK-NEXT:     (i32.const 1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (return
  ;; CHECK-NEXT:    (i32.const 2)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (i32.const 3)
  ;; CHECK-NEXT: )
  (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))
  )
  ;; CHECK:      (func $simple-switch43 (result i32)
  ;; CHECK-NEXT:  (local $0 i32)
  ;; CHECK-NEXT:  (block $A
  ;; CHECK-NEXT:   (block $B
  ;; CHECK-NEXT:    (block $y
  ;; CHECK-NEXT:     (br_if $A
  ;; CHECK-NEXT:      (i32.eqz
  ;; CHECK-NEXT:       (local.tee $0
  ;; CHECK-NEXT:        (i32.const 0)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_if $B
  ;; CHECK-NEXT:      (i32.eq
  ;; CHECK-NEXT:       (local.get $0)
  ;; CHECK-NEXT:       (i32.const 127)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $y)
  ;; CHECK-NEXT:     (return
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (return
  ;; CHECK-NEXT:     (i32.const 1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (return
  ;; CHECK-NEXT:    (i32.const 2)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (i32.const 3)
  ;; CHECK-NEXT: )
  (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))
  )
  ;; CHECK:      (func $simple-switch-5 (result i32)
  ;; CHECK-NEXT:  (block $A
  ;; CHECK-NEXT:   (block $B
  ;; CHECK-NEXT:    (block $y
  ;; CHECK-NEXT:     (br_table $A $y $y $y $y $y $A $y $y $y $y $y $A $y
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (return
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (return
  ;; CHECK-NEXT:     (i32.const 1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (return
  ;; CHECK-NEXT:    (i32.const 2)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (i32.const 3)
  ;; CHECK-NEXT: )
  (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))
  )
  ;; CHECK:      (func $undo-if-return (param $p i32) (result i32)
  ;; CHECK-NEXT:  (local $x i32)
  ;; CHECK-NEXT:  (block $out
  ;; CHECK-NEXT:   (block
  ;; CHECK-NEXT:    (br_if $out
  ;; CHECK-NEXT:     (local.get $p)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (local.set $x
  ;; CHECK-NEXT:     (i32.const 1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (block
  ;; CHECK-NEXT:    (br_if $out
  ;; CHECK-NEXT:     (i32.eqz
  ;; CHECK-NEXT:      (local.get $p)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (local.set $x
  ;; CHECK-NEXT:     (i32.const 2)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (local.tee $x
  ;; CHECK-NEXT:    (if
  ;; CHECK-NEXT:     (local.get $p)
  ;; CHECK-NEXT:     (then
  ;; CHECK-NEXT:      (br $out)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (else
  ;; CHECK-NEXT:      (br $out)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (local.get $p)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (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)
  ;; CHECK-NEXT:  (local $var$6 f64)
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (i32.const 0)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (drop
  ;; CHECK-NEXT:     (loop $label$3 (result i64)
  ;; CHECK-NEXT:      (block $label$4 (result i64)
  ;; CHECK-NEXT:       (block $label$5
  ;; CHECK-NEXT:        (block $label$6
  ;; CHECK-NEXT:         (local.tee $var$1
  ;; CHECK-NEXT:          (if (result f64)
  ;; CHECK-NEXT:           (unreachable)
  ;; CHECK-NEXT:           (then
  ;; CHECK-NEXT:            (br $label$5)
  ;; CHECK-NEXT:           )
  ;; CHECK-NEXT:           (else
  ;; CHECK-NEXT:            (f64.const 1)
  ;; CHECK-NEXT:           )
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (i64.const 1)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (i32.const 0)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $if-flow-1 (result i32)
  ;; CHECK-NEXT:  (select
  ;; CHECK-NEXT:   (i32.const 1)
  ;; CHECK-NEXT:   (i32.const 2)
  ;; CHECK-NEXT:   (i32.const 0)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $if-flow-1 (result i32)
    (if
      (i32.const 0)
      (then
        (return (i32.const 1))
      )
      (else
        (return (i32.const 2))
      )
    )
  )
  ;; CHECK:      (func $if-flow-2 (result i32)
  ;; CHECK-NEXT:  (if (result i32)
  ;; CHECK-NEXT:   (i32.const 0)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (i32.const 2)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $if-flow-2 (result i32)
    (if
      (i32.const 0)
      (then
        (unreachable)
      )
      (else
        (return (i32.const 2))
      )
    )
  )
  ;; CHECK:      (func $if-flow-3 (result i32)
  ;; CHECK-NEXT:  (if (result i32)
  ;; CHECK-NEXT:   (i32.const 0)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (i32.const 1)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $if-flow-3 (result i32)
    (if
      (i32.const 0)
      (then
        (return (i32.const 1))
      )
      (else
        (unreachable)
      )
    )
  )
  ;; CHECK:      (func $if-flow-4 (result i32)
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (return
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (return
  ;; CHECK-NEXT:     (i32.const 1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (return
  ;; CHECK-NEXT:     (i32.const 2)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $if-flow-4 (result i32)
    (if
      (return (i32.const 0))
      (then
        (return (i32.const 1))
      )
      (else
        (return (i32.const 2))
      )
    )
  )
  ;; CHECK:      (func $iff-flow-fuzz-bug (result i32)
  ;; CHECK-NEXT:  (loop $label$1
  ;; CHECK-NEXT:   (br_if $label$1
  ;; CHECK-NEXT:    (i32.eqz
  ;; CHECK-NEXT:     (i32.const 1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (loop $label$2
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:    (if
  ;; CHECK-NEXT:     (i32.const 0)
  ;; CHECK-NEXT:     (then
  ;; CHECK-NEXT:      (nop)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (else
  ;; CHECK-NEXT:      (return
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
   )
  )
  ;; CHECK:      (func $fuzz-block-unreachable-brs-with-values (result i32)
  ;; CHECK-NEXT:  (local $0 i32)
  ;; CHECK-NEXT:  (loop $label$1
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (local.get $0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (block $label$2
  ;; CHECK-NEXT:      (local.tee $0
  ;; CHECK-NEXT:       (loop $label$5
  ;; CHECK-NEXT:        (unreachable)
  ;; CHECK-NEXT:        (drop
  ;; CHECK-NEXT:         (i32.const 0)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (br $label$1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
    )
   )
  )
  ;; CHECK:      (func $drop-restructure-if (param $x i32) (param $y i32) (result i32)
  ;; CHECK-NEXT:  (if (result i32)
  ;; CHECK-NEXT:   (local.get $y)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (local.get $x)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (block $label$2 (result i32)
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (i32.const 0)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
   )
  )
  ;; CHECK:      (func $drop-restructure-if-final (param $x i32) (param $y i32) (result i32)
  ;; CHECK-NEXT:  (if (result i32)
  ;; CHECK-NEXT:   (local.get $y)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (local.get $x)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (block $label$2 (result i32)
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
   )
  )
  ;; CHECK:      (func $drop-restructure-if-middle (param $x i32) (param $y i32) (result i32)
  ;; CHECK-NEXT:  (if (result i32)
  ;; CHECK-NEXT:   (local.get $y)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (local.get $x)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (block $label$2 (result i32)
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:     (i32.const 0)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
   )
  )
  ;; CHECK:      (func $drop-restructure-select (param $x i32) (param $y i32) (result i32)
  ;; CHECK-NEXT:  (select
  ;; CHECK-NEXT:   (local.tee $y
  ;; CHECK-NEXT:    (local.get $x)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (block $label$2 (result i32)
  ;; CHECK-NEXT:    (nop)
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (local.get $y)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
   )
  )
  ;; CHECK:      (func $drop-restructure-if-bad-2 (param $x i32) (param $y i32) (result i32)
  ;; CHECK-NEXT:  (block $label$2 (result i32)
  ;; CHECK-NEXT:   (drop
  ;; CHECK-NEXT:    (br_if $label$2
  ;; CHECK-NEXT:     (local.get $y)
  ;; CHECK-NEXT:     (local.tee $y
  ;; CHECK-NEXT:      (local.get $x)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (i32.const 0)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
   )
  )
  ;; CHECK:      (func $if-block
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (i32.const 1)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (block $label
  ;; CHECK-NEXT:     (block
  ;; CHECK-NEXT:      (drop
  ;; CHECK-NEXT:       (i32.const 2)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (drop
  ;; CHECK-NEXT:       (i32.const 3)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $if-block
   (block $label
    (if
     (i32.const 1)
     (then
      (block
       (drop (i32.const 2))
       (drop (i32.const 3))
      )
     )
    )
   )
  )
  ;; CHECK:      (func $if-block-bad
  ;; CHECK-NEXT:  (block $label
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (br $label)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 2)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 3)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $if-block-bad
   (block $label
    (if
     (br $label) ;; use outside of arm
     (then
      (block
       (drop (i32.const 2))
       (drop (i32.const 3))
      )
     )
    )
   )
  )
  ;; CHECK:      (func $if-block-br
  ;; CHECK-NEXT:  (local $x i32)
  ;; CHECK-NEXT:  (block $label
  ;; CHECK-NEXT:   (br_if $label
  ;; CHECK-NEXT:    (local.get $x)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $if-block-br
   (local $x i32)
   (block $label
    (if
     (local.get $x)
     (then
      (br $label)
     )
    )
   )
  )
  ;; CHECK:      (func $if-block-br-1
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (i32.const 1)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (block $label
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (drop
  ;; CHECK-NEXT:     (i32.const 3)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $if-block-br-1
   (block $label
    (if
     (i32.const 1)
     (then
      (br $label)
     )
     (else
      (drop (i32.const 3))
     )
    )
   )
  )
  ;; CHECK:      (func $if-block-br-2
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (i32.const 1)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (block $label
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 3)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (nop)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $if-block-br-2
   (block $label
    (if
     (i32.const 1)
     (then
      (drop (i32.const 3))
     )
     (else
      (br $label)
     )
    )
   )
  )
  ;; CHECK:      (func $if-block-br-3
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (i32.const 1)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (block $label
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (nop)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $if-block-br-3
   (block $label
    (if
     (i32.const 1)
     (then
      (br $label)
     )
     (else
      (br $label)
     )
    )
   )
  )
  ;; CHECK:      (func $if-block-br-4-eithre
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (i32.const 1)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (block $label
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 2)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (drop
  ;; CHECK-NEXT:     (i32.const 3)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $if-block-br-4-eithre
   (block $label
    (if
     (i32.const 1)
     (then
      (drop (i32.const 2))
     )
     (else
      (drop (i32.const 3))
     )
    )
   )
  )
  ;; CHECK:      (func $if-block-br-5-value (result i32)
  ;; CHECK-NEXT:  (select
  ;; CHECK-NEXT:   (block $label (result i32)
  ;; CHECK-NEXT:    (i32.const 2)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (i32.const 3)
  ;; CHECK-NEXT:   (i32.const 1)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
     )
    )
   )
  )
  ;; CHECK:      (func $restructure-if-outerType-change
  ;; CHECK-NEXT:  (loop $label$1
  ;; CHECK-NEXT:   (br_if $label$1
  ;; CHECK-NEXT:    (block $label$2
  ;; CHECK-NEXT:     (block $label$3
  ;; CHECK-NEXT:      (if
  ;; CHECK-NEXT:       (block $label$4
  ;; CHECK-NEXT:        (unreachable)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (then
  ;; CHECK-NEXT:        (unreachable)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
     )
    )
   )
  )
  ;; CHECK:      (func $if-arm-unreachable
  ;; CHECK-NEXT:  (block $label$1
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $if-arm-unreachable
   (block $label$1
    (if
     (unreachable) ;; unreachable condition
     (then
      (nop)
     )
     (else
      (unreachable)
     )
    )
   )
  )
  ;; CHECK:      (func $propagate-type-if-we-optimize
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (i32.const 1)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (nop)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (drop
  ;; CHECK-NEXT:     (loop $label$3 (result i64)
  ;; CHECK-NEXT:      (if
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:       (then
  ;; CHECK-NEXT:        (block $label$4
  ;; CHECK-NEXT:         (unreachable)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (else
  ;; CHECK-NEXT:        (unreachable)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (i64.const -9)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
     )
    )
   )
  )
  ;; CHECK:      (func $switch-to-br
  ;; CHECK-NEXT:  (block $A
  ;; CHECK-NEXT:   (block $y
  ;; CHECK-NEXT:    (block
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $A)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $switch-to-br
    (block $A
      (block $y
        (br_table $y $y $A $A
          (i32.const 0)
        )
      )
    )
  )
  ;; CHECK:      (func $switch-to-br-value (result i32)
  ;; CHECK-NEXT:  (block $A (result i32)
  ;; CHECK-NEXT:   (block $y (result i32)
  ;; CHECK-NEXT:    (block
  ;; CHECK-NEXT:     (drop
  ;; CHECK-NEXT:      (i32.const 1)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $A
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
        )
      )
    )
  )
  ;; CHECK:      (func $switch-threading-multi (param $x i32) (param $y i32) (result i32)
  ;; CHECK-NEXT:  (block $block$5$break
  ;; CHECK-NEXT:   (block $block$4$break
  ;; CHECK-NEXT:    (loop $shape$1$continue
  ;; CHECK-NEXT:     (block $block$3$break
  ;; CHECK-NEXT:      (block $switch$2$case$5
  ;; CHECK-NEXT:       (block $switch$2$case$4
  ;; CHECK-NEXT:        (block $switch$2$default
  ;; CHECK-NEXT:         (block $switch$2$case$2
  ;; CHECK-NEXT:          (br_table $shape$1$continue $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$5$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$4$break $block$3$break
  ;; CHECK-NEXT:           (local.get $x)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (br $shape$1$continue)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (br $block$3$break)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (br $block$4$break)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (br $block$5$break)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (unreachable)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (local.set $y
  ;; CHECK-NEXT:    (i32.const 1)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (local.set $y
  ;; CHECK-NEXT:   (i32.const 2)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $fuzz-type-changes-in-our-cycles (result i32)
  ;; CHECK-NEXT:  (loop $label$1
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (if
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:      (then
  ;; CHECK-NEXT:       (block $label$3
  ;; CHECK-NEXT:        (block
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (else
  ;; CHECK-NEXT:       (return
  ;; CHECK-NEXT:        (i32.const -8192)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (br $label$1)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
   )
  )
  ;; CHECK:      (func $refinalize-need-br-value (result i32)
  ;; CHECK-NEXT:  (local $x i32)
  ;; CHECK-NEXT:  (loop $label$3 (result i32)
  ;; CHECK-NEXT:   (block $label$6 (result i32)
  ;; CHECK-NEXT:    (block $label$10
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:     (block $label$503
  ;; CHECK-NEXT:      (br_if $label$3
  ;; CHECK-NEXT:       (block $label$530 (result i32)
  ;; CHECK-NEXT:        (br_if $label$503
  ;; CHECK-NEXT:         (local.get $x)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (i32.const 0)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (return
  ;; CHECK-NEXT:       (i32.const 127)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $refinalize-need-br-value (result i32)
   (local $x 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
          (local.get $x)
         )
         (i32.const 0)
        )
       )
       (return
        (i32.const 127)
       )
      )
     )
    )
   )
  )
  ;; CHECK:      (func $selectify (param $x i32)
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (select
  ;; CHECK-NEXT:    (i32.mul
  ;; CHECK-NEXT:     (i32.const 2)
  ;; CHECK-NEXT:     (i32.const 3)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (i32.mul
  ;; CHECK-NEXT:     (i32.const 2)
  ;; CHECK-NEXT:     (i32.const 3)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (i32.eq
  ;; CHECK-NEXT:     (local.get $x)
  ;; CHECK-NEXT:     (i32.const 1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (select
  ;; CHECK-NEXT:    (i32.add
  ;; CHECK-NEXT:     (i32.const 2)
  ;; CHECK-NEXT:     (i32.const 3)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (i32.add
  ;; CHECK-NEXT:     (i32.const 2)
  ;; CHECK-NEXT:     (i32.const 3)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (i32.eq
  ;; CHECK-NEXT:     (local.get $x)
  ;; CHECK-NEXT:     (i32.const 1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
          )
        )
      )
    )
  )
  ;; CHECK:      (func $selectify-even-with-condition-side-effects (param $0 i32)
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (select
  ;; CHECK-NEXT:    (i32.const 1)
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (i32.rem_s
  ;; CHECK-NEXT:     (local.get $0)
  ;; CHECK-NEXT:     (i32.const 2)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
      )
    ))
  )
  ;; CHECK:      (func $no-selectify-when-arm-side-effects (param $0 i32)
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (if (result i32)
  ;; CHECK-NEXT:    (i32.rem_s
  ;; CHECK-NEXT:     (local.get $0)
  ;; CHECK-NEXT:     (i32.const 2)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (local.tee $0
  ;; CHECK-NEXT:      (i32.const 1)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (i32.const 0)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (if (result i32)
  ;; CHECK-NEXT:    (i32.rem_s
  ;; CHECK-NEXT:     (local.get $0)
  ;; CHECK-NEXT:     (i32.const 2)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (i32.const 0)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (local.tee $0
  ;; CHECK-NEXT:      (i32.const 1)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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))
      )
    ))
  )
  ;; CHECK:      (func $no-selectify-when-effects-invalidate (param $0 i32)
  ;; CHECK-NEXT:  (local $1 i32)
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (if (result i32)
  ;; CHECK-NEXT:    (i32.rem_s
  ;; CHECK-NEXT:     (local.tee $0
  ;; CHECK-NEXT:      (i32.const 3)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (i32.const 2)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (local.get $0)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (i32.const 0)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (if (result i32)
  ;; CHECK-NEXT:    (i32.rem_s
  ;; CHECK-NEXT:     (local.tee $0
  ;; CHECK-NEXT:      (i32.const 3)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (i32.const 2)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (i32.const 0)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (local.get $0)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (select
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (local.get $1)
  ;; CHECK-NEXT:    (i32.rem_s
  ;; CHECK-NEXT:     (local.tee $0
  ;; CHECK-NEXT:      (i32.const 3)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (i32.const 2)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
      )
    ))
  )
  ;; CHECK:      (func $if-one-side (result i32)
  ;; CHECK-NEXT:  (local $x i32)
  ;; CHECK-NEXT:  (local.set $x
  ;; CHECK-NEXT:   (select
  ;; CHECK-NEXT:    (i32.const 2)
  ;; CHECK-NEXT:    (local.get $x)
  ;; CHECK-NEXT:    (i32.const 1)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (local.get $x)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $if-one-side-b (result i32)
  ;; CHECK-NEXT:  (local $x i32)
  ;; CHECK-NEXT:  (local.set $x
  ;; CHECK-NEXT:   (select
  ;; CHECK-NEXT:    (local.get $x)
  ;; CHECK-NEXT:    (i32.const 2)
  ;; CHECK-NEXT:    (i32.const 1)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (local.get $x)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $if-one-side-tee-etc (param $0 i32) (result i32)
  ;; CHECK-NEXT:  (local $1 i32)
  ;; CHECK-NEXT:  (local $2 i32)
  ;; CHECK-NEXT:  (local $3 i32)
  ;; CHECK-NEXT:  (local $4 i32)
  ;; CHECK-NEXT:  (local $x i32)
  ;; CHECK-NEXT:  (local $y i32)
  ;; CHECK-NEXT:  (local $z i32)
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (call $if-one-side-tee-etc
  ;; CHECK-NEXT:    (local.tee $x
  ;; CHECK-NEXT:     (select
  ;; CHECK-NEXT:      (i32.const -4)
  ;; CHECK-NEXT:      (local.get $x)
  ;; CHECK-NEXT:      (i32.const -3)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (i32.const 0)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $ifs-copies-recursive (param $20 i32) (result i32)
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (i32.const 1)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (local.set $20
  ;; CHECK-NEXT:     (select
  ;; CHECK-NEXT:      (select
  ;; CHECK-NEXT:       (i32.const 4)
  ;; CHECK-NEXT:       (local.get $20)
  ;; CHECK-NEXT:       (i32.const 3)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (local.get $20)
  ;; CHECK-NEXT:      (i32.const 2)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (local.get $20)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $if-copy1
  ;; CHECK-NEXT:  (local $x i32)
  ;; CHECK-NEXT:  (local $y i32)
  ;; CHECK-NEXT:  (loop $top
  ;; CHECK-NEXT:   (local.set $x
  ;; CHECK-NEXT:    (select
  ;; CHECK-NEXT:     (local.get $x)
  ;; CHECK-NEXT:     (local.get $y)
  ;; CHECK-NEXT:     (i32.const 1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (br $top)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
    )
  )
  ;; CHECK:      (func $if-copy3
  ;; CHECK-NEXT:  (local $x i32)
  ;; CHECK-NEXT:  (local $y i32)
  ;; CHECK-NEXT:  (loop $top
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 1)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (local.tee $x
  ;; CHECK-NEXT:      (unreachable)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (br $top)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
    )
  )
  ;; CHECK:      (func $if-copy4
  ;; CHECK-NEXT:  (local $x i32)
  ;; CHECK-NEXT:  (local $y i32)
  ;; CHECK-NEXT:  (loop $top
  ;; CHECK-NEXT:   (local.set $x
  ;; CHECK-NEXT:    (if (result i32)
  ;; CHECK-NEXT:     (i32.const 1)
  ;; CHECK-NEXT:     (then
  ;; CHECK-NEXT:      (unreachable)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (else
  ;; CHECK-NEXT:      (local.get $y)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (br $top)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
    )
  )
  ;; CHECK:      (func $if-copy-tee
  ;; CHECK-NEXT:  (local $x i32)
  ;; CHECK-NEXT:  (local $y i32)
  ;; CHECK-NEXT:  (loop $top
  ;; CHECK-NEXT:   (drop
  ;; CHECK-NEXT:    (local.tee $x
  ;; CHECK-NEXT:     (select
  ;; CHECK-NEXT:      (local.get $x)
  ;; CHECK-NEXT:      (i32.const 2)
  ;; CHECK-NEXT:      (i32.const 1)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (br $top)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
    )
  )
  ;; CHECK:      (func $loop-end-set (param $x i32) (result i32)
  ;; CHECK-NEXT:  (loop $loop
  ;; CHECK-NEXT:   (nop)
  ;; CHECK-NEXT:   (br_if $loop
  ;; CHECK-NEXT:    (local.get $x)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (local.set $x
  ;; CHECK-NEXT:    (i32.const 1)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (local.get $x)
  ;; CHECK-NEXT: )
  (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)
  )
  ;; CHECK:      (func $loop-end-value (param $x i32) (result i32)
  ;; CHECK-NEXT:  (loop $loop (result i32)
  ;; CHECK-NEXT:   (nop)
  ;; CHECK-NEXT:   (br_if $loop
  ;; CHECK-NEXT:    (local.get $x)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (i32.const 1)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
        )
      )
    )
  )
  ;; CHECK:      (func $do-not-flow-values-through-unreachable-code (result i32)
  ;; CHECK-NEXT:  (unreachable)
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (i32.const 0)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (block $A
  ;; CHECK-NEXT:     (return
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (nop)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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
      )
     )
    )
   )
  )
  ;; CHECK:      (func $do-not-flow-values-through-unreachable-code-b (result i32)
  ;; CHECK-NEXT:  (loop
  ;; CHECK-NEXT:   (unreachable)
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 0)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (block $A
  ;; CHECK-NEXT:      (return
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (nop)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (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)
      )
     )
    )
   )
  )
 ;; CHECK:      (func $if_br_if
 ;; CHECK-NEXT:  (local $0 i32)
 ;; CHECK-NEXT:  (block $label$1
 ;; CHECK-NEXT:   (br_if $label$1
 ;; CHECK-NEXT:    (select
 ;; CHECK-NEXT:     (local.tee $0
 ;; CHECK-NEXT:      (i32.const 1024)
 ;; CHECK-NEXT:     )
 ;; CHECK-NEXT:     (i32.const 0)
 ;; CHECK-NEXT:     (i32.eqz
 ;; CHECK-NEXT:      (i32.const -4)
 ;; CHECK-NEXT:     )
 ;; CHECK-NEXT:    )
 ;; CHECK-NEXT:   )
 ;; CHECK-NEXT:   (br_if $label$1
 ;; CHECK-NEXT:    (select
 ;; CHECK-NEXT:     (i32.const 1025)
 ;; CHECK-NEXT:     (i32.const 0)
 ;; CHECK-NEXT:     (i32.eqz
 ;; CHECK-NEXT:      (i32.const -5)
 ;; CHECK-NEXT:     )
 ;; CHECK-NEXT:    )
 ;; CHECK-NEXT:   )
 ;; CHECK-NEXT:   (br_if $label$1
 ;; CHECK-NEXT:    (select
 ;; CHECK-NEXT:     (local.tee $0
 ;; CHECK-NEXT:      (i32.const 1025)
 ;; CHECK-NEXT:     )
 ;; CHECK-NEXT:     (i32.const 0)
 ;; CHECK-NEXT:     (i32.eqz
 ;; CHECK-NEXT:      (i32.const -6)
 ;; CHECK-NEXT:     )
 ;; CHECK-NEXT:    )
 ;; CHECK-NEXT:   )
 ;; CHECK-NEXT:   (if
 ;; CHECK-NEXT:    (i32.const 1026)
 ;; CHECK-NEXT:    (then
 ;; CHECK-NEXT:     (br_if $label$1
 ;; CHECK-NEXT:      (local.tee $0
 ;; CHECK-NEXT:       (local.get $0)
 ;; CHECK-NEXT:      )
 ;; CHECK-NEXT:     )
 ;; CHECK-NEXT:    )
 ;; CHECK-NEXT:   )
 ;; CHECK-NEXT:   (i32.store
 ;; CHECK-NEXT:    (i32.const 1024)
 ;; CHECK-NEXT:    (i32.add
 ;; CHECK-NEXT:     (local.get $0)
 ;; CHECK-NEXT:     (i32.const 1)
 ;; CHECK-NEXT:    )
 ;; CHECK-NEXT:   )
 ;; CHECK-NEXT:  )
 ;; CHECK-NEXT: )
 (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
        (local.get $0)
      )
     )
    )
   )
   (i32.store
    (i32.const 1024)
    (i32.add
     (local.get $0)
     (i32.const 1)
    )
   )
  )
 )
 ;; CHECK:      (func $unswitch-reordering (param $x i32) (result i32)
 ;; CHECK-NEXT:  (block $label$1 (result i32)
 ;; CHECK-NEXT:   (br_table $label$1
 ;; CHECK-NEXT:    (block $label$2 (result i32)
 ;; CHECK-NEXT:     (i32.store
 ;; CHECK-NEXT:      (i32.const 1)
 ;; CHECK-NEXT:      (i32.const 2)
 ;; CHECK-NEXT:     )
 ;; CHECK-NEXT:     (i32.const 3)
 ;; CHECK-NEXT:    )
 ;; CHECK-NEXT:    (block (result i32)
 ;; CHECK-NEXT:     (if
 ;; CHECK-NEXT:      (local.get $x)
 ;; CHECK-NEXT:      (then
 ;; CHECK-NEXT:       (return
 ;; CHECK-NEXT:        (i32.const 5)
 ;; CHECK-NEXT:       )
 ;; CHECK-NEXT:      )
 ;; CHECK-NEXT:     )
 ;; CHECK-NEXT:     (i32.const 6)
 ;; CHECK-NEXT:    )
 ;; CHECK-NEXT:   )
 ;; CHECK-NEXT:  )
 ;; CHECK-NEXT: )
 (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)
    )
   )
  )
 )
 ;; CHECK:      (func $no-selectify-if-condition-unreachable (result i32)
 ;; CHECK-NEXT:  (select
 ;; CHECK-NEXT:   (if (result i32)
 ;; CHECK-NEXT:    (unreachable)
 ;; CHECK-NEXT:    (then
 ;; CHECK-NEXT:     (i32.const 3)
 ;; CHECK-NEXT:    )
 ;; CHECK-NEXT:    (else
 ;; CHECK-NEXT:     (i32.const 4)
 ;; CHECK-NEXT:    )
 ;; CHECK-NEXT:   )
 ;; CHECK-NEXT:   (i32.const 1)
 ;; CHECK-NEXT:   (i32.const 2)
 ;; CHECK-NEXT:  )
 ;; CHECK-NEXT: )
 (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)
  )
 )
)
