;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited.

;; RUN: wasm-opt %s -all -S -o - | filecheck %s
;; RUN: wasm-opt %s -all -O -S -o - -O | filecheck %s --check-prefix=OPT_O

(module
  ;; CHECK:      (import "env" "i32" (global $i32 (mut i32)))
  ;; OPT_O:      (import "env" "i32" (global $i32 (mut i32)))
  (import "env" "i32" (global $i32 (mut i32)))
  ;; CHECK:      (import "env" "i64" (global $i64 (mut i64)))
  ;; OPT_O:      (import "env" "i64" (global $i64 (mut i64)))
  (import "env" "i64" (global $i64 (mut i64)))
  ;; CHECK:      (import "env" "any" (global $any (mut (ref any))))
  ;; OPT_O:      (import "env" "any" (global $any (mut (ref any))))
  (import "env" "any" (global $any (mut (ref any))))
  ;; CHECK:      (import "env" "anyref" (global $anyref (mut anyref)))
  ;; OPT_O:      (import "env" "anyref" (global $anyref (mut anyref)))
  (import "env" "anyref" (global $anyref (mut anyref)))
  ;; CHECK:      (import "env" "eq" (global $eq (mut (ref eq))))
  ;; OPT_O:      (import "env" "eq" (global $eq (mut (ref eq))))
  (import "env" "eq" (global $eq (mut (ref eq))))
  ;; CHECK:      (import "env" "eqref" (global $eqref (mut eqref)))
  ;; OPT_O:      (import "env" "eqref" (global $eqref (mut eqref)))
  (import "env" "eqref" (global $eqref (mut eqref)))

  ;; CHECK:      (import "env" "use-i32-any" (func $use-i32-any (type $13) (param i32 (ref any))))
  ;; OPT_O:      (import "env" "use-i32-any" (func $use-i32-any (type $11) (param i32 (ref any))))
  (import "env" "use-i32-any" (func $use-i32-any (param i32 (ref any))))

  ;; CHECK:      (tag $e (type $4) (param i32))
  ;; OPT_O:      (tag $e (type $4) (param i32))
  (tag $e (param i32))
  ;; CHECK:      (tag $e2 (type $4) (param i32))
  ;; OPT_O:      (tag $e2 (type $4) (param i32))
  (tag $e2 (param i32))

  ;; CHECK:      (func $br_on_null-one (type $5) (param $0 i32) (param $1 anyref) (result i32)
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_3 i32)
  ;; CHECK-NEXT:  (local $scratch_4 i32)
  ;; CHECK-NEXT:  (local $scratch_5 (ref any))
  ;; CHECK-NEXT:  (local $scratch_6 i32)
  ;; CHECK-NEXT:  (block $block (result i32)
  ;; CHECK-NEXT:   (block $block0
  ;; CHECK-NEXT:    (local.set $scratch_3
  ;; CHECK-NEXT:     (block (result i32)
  ;; CHECK-NEXT:      (local.set $scratch_4
  ;; CHECK-NEXT:       (local.get $0)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (local.set $scratch
  ;; CHECK-NEXT:       (local.get $1)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (local.get $scratch_4)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (local.set $scratch_5
  ;; CHECK-NEXT:     (br_on_null $block0
  ;; CHECK-NEXT:      (local.get $scratch)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (global.set $i32
  ;; CHECK-NEXT:     (block (result i32)
  ;; CHECK-NEXT:      (local.set $scratch_6
  ;; CHECK-NEXT:       (local.get $scratch_3)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (global.set $any
  ;; CHECK-NEXT:       (local.get $scratch_5)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (local.get $scratch_6)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (br $block
  ;; CHECK-NEXT:     (i32.const 1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (local.get $scratch_3)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $br_on_null-one (type $5) (param $0 i32) (param $1 anyref) (result i32)
  ;; OPT_O-NEXT:  (block $block (result i32)
  ;; OPT_O-NEXT:   (block $block0
  ;; OPT_O-NEXT:    (global.set $any
  ;; OPT_O-NEXT:     (br_on_null $block0
  ;; OPT_O-NEXT:      (local.get $1)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:    (global.set $i32
  ;; OPT_O-NEXT:     (local.get $0)
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:    (br $block
  ;; OPT_O-NEXT:     (i32.const 1)
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:   (local.get $0)
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $br_on_null-one (export "br_on_null-one") (param i32 anyref) (result i32)
    block (result i32)
      local.get 0
      local.get 1
      br_on_null 0
      global.set $any
      global.set $i32
      i32.const 1
    end
  )

  ;; CHECK:      (func $br_on_null-two (type $14) (param $0 i32) (param $1 i64) (param $2 anyref) (result i32 i64)
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_4 (tuple i32 i64))
  ;; CHECK-NEXT:  (local $scratch_5 i64)
  ;; CHECK-NEXT:  (local $scratch_6 (ref any))
  ;; CHECK-NEXT:  (local $scratch_7 (tuple i32 i64))
  ;; CHECK-NEXT:  (local $scratch_8 i32)
  ;; CHECK-NEXT:  (block $block (type $26) (result i32 i64)
  ;; CHECK-NEXT:   (block $block0
  ;; CHECK-NEXT:    (local.set $scratch_4
  ;; CHECK-NEXT:     (tuple.make 2
  ;; CHECK-NEXT:      (local.get $0)
  ;; CHECK-NEXT:      (block (result i64)
  ;; CHECK-NEXT:       (local.set $scratch_5
  ;; CHECK-NEXT:        (local.get $1)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.set $scratch
  ;; CHECK-NEXT:        (local.get $2)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_5)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (local.set $scratch_6
  ;; CHECK-NEXT:     (br_on_null $block0
  ;; CHECK-NEXT:      (local.get $scratch)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (global.set $i32
  ;; CHECK-NEXT:     (block (result i32)
  ;; CHECK-NEXT:      (local.set $scratch_8
  ;; CHECK-NEXT:       (block (result i32)
  ;; CHECK-NEXT:        (local.set $scratch_7
  ;; CHECK-NEXT:         (local.get $scratch_4)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (global.set $any
  ;; CHECK-NEXT:         (local.get $scratch_6)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (tuple.extract 2 0
  ;; CHECK-NEXT:         (local.get $scratch_7)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (global.set $i64
  ;; CHECK-NEXT:       (tuple.extract 2 1
  ;; CHECK-NEXT:        (local.get $scratch_7)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (local.get $scratch_8)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (br $block
  ;; CHECK-NEXT:     (tuple.make 2
  ;; CHECK-NEXT:      (i32.const 0)
  ;; CHECK-NEXT:      (i64.const 1)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (local.get $scratch_4)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $br_on_null-two (type $12) (param $0 i32) (param $1 i64) (param $2 anyref) (result i32 i64)
  ;; OPT_O-NEXT:  (local $3 (tuple i32 i64))
  ;; OPT_O-NEXT:  (block $block (type $24) (result i32 i64)
  ;; OPT_O-NEXT:   (local.set $3
  ;; OPT_O-NEXT:    (tuple.make 2
  ;; OPT_O-NEXT:     (local.get $0)
  ;; OPT_O-NEXT:     (local.get $1)
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:   (block $block0
  ;; OPT_O-NEXT:    (global.set $any
  ;; OPT_O-NEXT:     (br_on_null $block0
  ;; OPT_O-NEXT:      (local.get $2)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:    (global.set $i64
  ;; OPT_O-NEXT:     (tuple.extract 2 1
  ;; OPT_O-NEXT:      (local.get $3)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:    (global.set $i32
  ;; OPT_O-NEXT:     (tuple.extract 2 0
  ;; OPT_O-NEXT:      (local.get $3)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:    (br $block
  ;; OPT_O-NEXT:     (tuple.make 2
  ;; OPT_O-NEXT:      (i32.const 0)
  ;; OPT_O-NEXT:      (i64.const 1)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:   (local.get $3)
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $br_on_null-two (export "br_on_null-two") (param i32 i64 anyref) (result i32 i64)
    block (result i32 i64)
      local.get 0
      local.get 1
      local.get 2
      br_on_null 0
      global.set $any
      global.set $i64
      global.set $i32
      i32.const 0
      i64.const 1
    end
  )

  ;; CHECK:      (func $br_on_non_null-one (type $6) (param $0 i32) (param $1 anyref) (result i32 (ref any))
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_3 i32)
  ;; CHECK-NEXT:  (local $scratch_4 i32)
  ;; CHECK-NEXT:  (local $scratch_5 (ref any))
  ;; CHECK-NEXT:  (block $block (type $3) (result i32 (ref any))
  ;; CHECK-NEXT:   (local.set $scratch_5
  ;; CHECK-NEXT:    (block $block0 (result (ref any))
  ;; CHECK-NEXT:     (local.set $scratch_3
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_4
  ;; CHECK-NEXT:        (local.get $0)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.set $scratch
  ;; CHECK-NEXT:        (local.get $1)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_4)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_on_non_null $block0
  ;; CHECK-NEXT:      (local.get $scratch)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (global.set $i32
  ;; CHECK-NEXT:      (local.get $scratch_3)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $block
  ;; CHECK-NEXT:      (tuple.make 2
  ;; CHECK-NEXT:       (i32.const 1)
  ;; CHECK-NEXT:       (global.get $any)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 2
  ;; CHECK-NEXT:    (local.get $scratch_3)
  ;; CHECK-NEXT:    (local.get $scratch_5)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $br_on_non_null-one (type $6) (param $0 i32) (param $1 anyref) (result i32 (ref any))
  ;; OPT_O-NEXT:  (block $block (type $2) (result i32 (ref any))
  ;; OPT_O-NEXT:   (tuple.make 2
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (block $block0 (result (ref any))
  ;; OPT_O-NEXT:     (br_on_non_null $block0
  ;; OPT_O-NEXT:      (local.get $1)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (global.set $i32
  ;; OPT_O-NEXT:      (local.get $0)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (br $block
  ;; OPT_O-NEXT:      (tuple.make 2
  ;; OPT_O-NEXT:       (i32.const 1)
  ;; OPT_O-NEXT:       (global.get $any)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $br_on_non_null-one (export "br_on_non_null-one") (param i32 anyref) (result i32 (ref any))
    block (result i32 (ref any))
      local.get 0
      local.get 1
      br_on_non_null 0
      global.set $i32
      i32.const 1
      global.get $any
    end
  )

  ;; CHECK:      (func $br_on_non_null-two (type $7) (param $0 i32) (param $1 i64) (param $2 anyref) (result i32 i64 (ref any))
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_4 (tuple i32 i64))
  ;; CHECK-NEXT:  (local $scratch_5 i64)
  ;; CHECK-NEXT:  (local $scratch_6 (tuple i32 i64))
  ;; CHECK-NEXT:  (local $scratch_7 i32)
  ;; CHECK-NEXT:  (local $scratch_8 (ref any))
  ;; CHECK-NEXT:  (block $block (type $10) (result i32 i64 (ref any))
  ;; CHECK-NEXT:   (local.set $scratch_8
  ;; CHECK-NEXT:    (block $block0 (result (ref any))
  ;; CHECK-NEXT:     (local.set $scratch_4
  ;; CHECK-NEXT:      (tuple.make 2
  ;; CHECK-NEXT:       (local.get $0)
  ;; CHECK-NEXT:       (block (result i64)
  ;; CHECK-NEXT:        (local.set $scratch_5
  ;; CHECK-NEXT:         (local.get $1)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (local.set $scratch
  ;; CHECK-NEXT:         (local.get $2)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (local.get $scratch_5)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br_on_non_null $block0
  ;; CHECK-NEXT:      (local.get $scratch)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (global.set $i32
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_7
  ;; CHECK-NEXT:        (tuple.extract 2 0
  ;; CHECK-NEXT:         (local.tee $scratch_6
  ;; CHECK-NEXT:          (local.get $scratch_4)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (global.set $i64
  ;; CHECK-NEXT:        (tuple.extract 2 1
  ;; CHECK-NEXT:         (local.get $scratch_6)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_7)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $block
  ;; CHECK-NEXT:      (tuple.make 3
  ;; CHECK-NEXT:       (i32.const 1)
  ;; CHECK-NEXT:       (i64.const 2)
  ;; CHECK-NEXT:       (global.get $any)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 3
  ;; CHECK-NEXT:    (tuple.extract 2 0
  ;; CHECK-NEXT:     (local.get $scratch_4)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (tuple.extract 2 1
  ;; CHECK-NEXT:     (local.get $scratch_4)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (local.get $scratch_8)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $br_on_non_null-two (type $7) (param $0 i32) (param $1 i64) (param $2 anyref) (result i32 i64 (ref any))
  ;; OPT_O-NEXT:  (block $block (type $10) (result i32 i64 (ref any))
  ;; OPT_O-NEXT:   (tuple.make 3
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (local.get $1)
  ;; OPT_O-NEXT:    (block $block0 (result (ref any))
  ;; OPT_O-NEXT:     (br_on_non_null $block0
  ;; OPT_O-NEXT:      (local.get $2)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (global.set $i64
  ;; OPT_O-NEXT:      (local.get $1)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (global.set $i32
  ;; OPT_O-NEXT:      (local.get $0)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (br $block
  ;; OPT_O-NEXT:      (tuple.make 3
  ;; OPT_O-NEXT:       (i32.const 1)
  ;; OPT_O-NEXT:       (i64.const 2)
  ;; OPT_O-NEXT:       (global.get $any)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $br_on_non_null-two (export "br_on_non_null-two") (param i32 i64 anyref) (result i32 i64 (ref any))
    block (result i32 i64 (ref any))
      local.get 0
      local.get 1
      local.get 2
      br_on_non_null 0
      global.set $i64
      global.set $i32
      i32.const 1
      i64.const 2
      global.get $any
    end
  )

  ;; CHECK:      (func $br_on_cast-one (type $1) (param $0 i32) (param $1 anyref) (result i32 eqref)
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_3 i32)
  ;; CHECK-NEXT:  (local $scratch_4 i32)
  ;; CHECK-NEXT:  (local $scratch_5 (ref any))
  ;; CHECK-NEXT:  (local $scratch_6 i32)
  ;; CHECK-NEXT:  (local $scratch_7 eqref)
  ;; CHECK-NEXT:  (block $block (type $0) (result i32 eqref)
  ;; CHECK-NEXT:   (local.set $scratch_7
  ;; CHECK-NEXT:    (block $block0 (result eqref)
  ;; CHECK-NEXT:     (local.set $scratch_3
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_4
  ;; CHECK-NEXT:        (local.get $0)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.set $scratch
  ;; CHECK-NEXT:        (local.get $1)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_4)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (local.set $scratch_5
  ;; CHECK-NEXT:      (br_on_cast $block0 anyref eqref
  ;; CHECK-NEXT:       (local.get $scratch)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (global.set $i32
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_6
  ;; CHECK-NEXT:        (local.get $scratch_3)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (global.set $any
  ;; CHECK-NEXT:        (local.get $scratch_5)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_6)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $block
  ;; CHECK-NEXT:      (tuple.make 2
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:       (global.get $eq)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 2
  ;; CHECK-NEXT:    (local.get $scratch_3)
  ;; CHECK-NEXT:    (local.get $scratch_7)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $br_on_cast-one (type $1) (param $0 i32) (param $1 anyref) (result i32 eqref)
  ;; OPT_O-NEXT:  (block $block (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:   (tuple.make 2
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (block $block0 (result eqref)
  ;; OPT_O-NEXT:     (global.set $any
  ;; OPT_O-NEXT:      (br_on_cast $block0 anyref eqref
  ;; OPT_O-NEXT:       (local.get $1)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (global.set $i32
  ;; OPT_O-NEXT:      (local.get $0)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (br $block
  ;; OPT_O-NEXT:      (tuple.make 2
  ;; OPT_O-NEXT:       (i32.const 0)
  ;; OPT_O-NEXT:       (global.get $eq)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $br_on_cast-one (export "br_on_cast-one") (param i32 anyref) (result i32 eqref)
    block (result i32 eqref)
      local.get 0
      local.get 1
      br_on_cast 0 anyref eqref
      global.set $any
      global.set $i32
      i32.const 0
      global.get $eq
    end
  )

  ;; CHECK:      (func $br_on_cast-two (type $15) (param $0 i32) (param $1 i64) (param $2 anyref) (result i32 i64 eqref)
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_4 (tuple i32 i64))
  ;; CHECK-NEXT:  (local $scratch_5 i64)
  ;; CHECK-NEXT:  (local $scratch_6 (ref any))
  ;; CHECK-NEXT:  (local $scratch_7 (tuple i32 i64))
  ;; CHECK-NEXT:  (local $scratch_8 i32)
  ;; CHECK-NEXT:  (local $scratch_9 eqref)
  ;; CHECK-NEXT:  (block $block (type $27) (result i32 i64 eqref)
  ;; CHECK-NEXT:   (local.set $scratch_9
  ;; CHECK-NEXT:    (block $block0 (result eqref)
  ;; CHECK-NEXT:     (local.set $scratch_4
  ;; CHECK-NEXT:      (tuple.make 2
  ;; CHECK-NEXT:       (local.get $0)
  ;; CHECK-NEXT:       (block (result i64)
  ;; CHECK-NEXT:        (local.set $scratch_5
  ;; CHECK-NEXT:         (local.get $1)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (local.set $scratch
  ;; CHECK-NEXT:         (local.get $2)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (local.get $scratch_5)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (local.set $scratch_6
  ;; CHECK-NEXT:      (br_on_cast $block0 anyref eqref
  ;; CHECK-NEXT:       (local.get $scratch)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (global.set $i32
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_8
  ;; CHECK-NEXT:        (block (result i32)
  ;; CHECK-NEXT:         (local.set $scratch_7
  ;; CHECK-NEXT:          (local.get $scratch_4)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (global.set $any
  ;; CHECK-NEXT:          (local.get $scratch_6)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (tuple.extract 2 0
  ;; CHECK-NEXT:          (local.get $scratch_7)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (global.set $i64
  ;; CHECK-NEXT:        (tuple.extract 2 1
  ;; CHECK-NEXT:         (local.get $scratch_7)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_8)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $block
  ;; CHECK-NEXT:      (tuple.make 3
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:       (i64.const 1)
  ;; CHECK-NEXT:       (global.get $eq)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 3
  ;; CHECK-NEXT:    (tuple.extract 2 0
  ;; CHECK-NEXT:     (local.get $scratch_4)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (tuple.extract 2 1
  ;; CHECK-NEXT:     (local.get $scratch_4)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (local.get $scratch_9)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $br_on_cast-two (type $13) (param $0 i32) (param $1 i64) (param $2 anyref) (result i32 i64 eqref)
  ;; OPT_O-NEXT:  (block $block (type $25) (result i32 i64 eqref)
  ;; OPT_O-NEXT:   (tuple.make 3
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (local.get $1)
  ;; OPT_O-NEXT:    (block $block0 (result eqref)
  ;; OPT_O-NEXT:     (global.set $any
  ;; OPT_O-NEXT:      (br_on_cast $block0 anyref eqref
  ;; OPT_O-NEXT:       (local.get $2)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (global.set $i64
  ;; OPT_O-NEXT:      (local.get $1)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (global.set $i32
  ;; OPT_O-NEXT:      (local.get $0)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (br $block
  ;; OPT_O-NEXT:      (tuple.make 3
  ;; OPT_O-NEXT:       (i32.const 0)
  ;; OPT_O-NEXT:       (i64.const 1)
  ;; OPT_O-NEXT:       (global.get $eq)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $br_on_cast-two (export "br_on_cast-two") (param i32 i64 anyref) (result i32 i64 eqref)
    block (result i32 i64 eqref)
      local.get 0
      local.get 1
      local.get 2
      br_on_cast 0 anyref eqref
      global.set $any
      global.set $i64
      global.set $i32
      i32.const 0
      i64.const 1
      global.get $eq
    end
  )

  ;; CHECK:      (func $br_on_cast-nn (type $16) (param $0 i32) (param $1 (ref any)) (result i32 (ref eq))
  ;; CHECK-NEXT:  (local $scratch (ref any))
  ;; CHECK-NEXT:  (local $scratch_3 i32)
  ;; CHECK-NEXT:  (local $scratch_4 i32)
  ;; CHECK-NEXT:  (local $scratch_5 (ref any))
  ;; CHECK-NEXT:  (local $scratch_6 i32)
  ;; CHECK-NEXT:  (local $scratch_7 (ref eq))
  ;; CHECK-NEXT:  (block $block (type $11) (result i32 (ref eq))
  ;; CHECK-NEXT:   (local.set $scratch_7
  ;; CHECK-NEXT:    (block $block0 (result (ref eq))
  ;; CHECK-NEXT:     (local.set $scratch_3
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_4
  ;; CHECK-NEXT:        (local.get $0)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.set $scratch
  ;; CHECK-NEXT:        (local.get $1)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_4)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (local.set $scratch_5
  ;; CHECK-NEXT:      (br_on_cast $block0 (ref any) (ref eq)
  ;; CHECK-NEXT:       (local.get $scratch)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (global.set $i32
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_6
  ;; CHECK-NEXT:        (local.get $scratch_3)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (global.set $any
  ;; CHECK-NEXT:        (local.get $scratch_5)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_6)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $block
  ;; CHECK-NEXT:      (tuple.make 2
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:       (global.get $eq)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 2
  ;; CHECK-NEXT:    (local.get $scratch_3)
  ;; CHECK-NEXT:    (local.get $scratch_7)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $br_on_cast-nn (type $14) (param $0 i32) (param $1 (ref any)) (result i32 (ref eq))
  ;; OPT_O-NEXT:  (block $block (type $3) (result i32 (ref eq))
  ;; OPT_O-NEXT:   (tuple.make 2
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (block $block0 (result (ref eq))
  ;; OPT_O-NEXT:     (global.set $any
  ;; OPT_O-NEXT:      (br_on_cast $block0 (ref any) (ref eq)
  ;; OPT_O-NEXT:       (local.get $1)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (global.set $i32
  ;; OPT_O-NEXT:      (local.get $0)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (br $block
  ;; OPT_O-NEXT:      (tuple.make 2
  ;; OPT_O-NEXT:       (i32.const 0)
  ;; OPT_O-NEXT:       (global.get $eq)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $br_on_cast-nn (export "br_on_cast-nn") (param i32 (ref any)) (result i32 (ref eq))
    block (result i32 (ref eq))
      local.get 0
      local.get 1
      br_on_cast 0 (ref any) (ref eq)
      global.set $any
      global.set $i32
      i32.const 0
      global.get $eq
    end
  )

  ;; CHECK:      (func $br_on_cast-to-nn (type $17) (param $0 i32) (param $1 anyref) (result i32 (ref eq))
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_3 i32)
  ;; CHECK-NEXT:  (local $scratch_4 i32)
  ;; CHECK-NEXT:  (local $scratch_5 anyref)
  ;; CHECK-NEXT:  (local $scratch_6 i32)
  ;; CHECK-NEXT:  (local $scratch_7 (ref eq))
  ;; CHECK-NEXT:  (block $block (type $11) (result i32 (ref eq))
  ;; CHECK-NEXT:   (local.set $scratch_7
  ;; CHECK-NEXT:    (block $block0 (result (ref eq))
  ;; CHECK-NEXT:     (local.set $scratch_3
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_4
  ;; CHECK-NEXT:        (local.get $0)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.set $scratch
  ;; CHECK-NEXT:        (local.get $1)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_4)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (local.set $scratch_5
  ;; CHECK-NEXT:      (br_on_cast $block0 anyref (ref eq)
  ;; CHECK-NEXT:       (local.get $scratch)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (global.set $i32
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_6
  ;; CHECK-NEXT:        (local.get $scratch_3)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (global.set $anyref
  ;; CHECK-NEXT:        (local.get $scratch_5)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_6)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $block
  ;; CHECK-NEXT:      (tuple.make 2
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:       (global.get $eq)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 2
  ;; CHECK-NEXT:    (local.get $scratch_3)
  ;; CHECK-NEXT:    (local.get $scratch_7)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $br_on_cast-to-nn (type $15) (param $0 i32) (param $1 anyref) (result i32 (ref eq))
  ;; OPT_O-NEXT:  (block $block (type $3) (result i32 (ref eq))
  ;; OPT_O-NEXT:   (tuple.make 2
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (block $block0 (result (ref eq))
  ;; OPT_O-NEXT:     (global.set $anyref
  ;; OPT_O-NEXT:      (br_on_cast $block0 anyref (ref eq)
  ;; OPT_O-NEXT:       (local.get $1)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (global.set $i32
  ;; OPT_O-NEXT:      (local.get $0)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (br $block
  ;; OPT_O-NEXT:      (tuple.make 2
  ;; OPT_O-NEXT:       (i32.const 0)
  ;; OPT_O-NEXT:       (global.get $eq)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $br_on_cast-to-nn (export "br_on_cast-to-nn") (param i32 anyref) (result i32 (ref eq))
    block (result i32 (ref eq))
      local.get 0
      local.get 1
      br_on_cast 0 anyref (ref eq)
      global.set $anyref
      global.set $i32
      i32.const 0
      global.get $eq
    end
  )

  ;; CHECK:      (func $br_on_cast_fail-one (type $6) (param $0 i32) (param $1 anyref) (result i32 (ref any))
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_3 i32)
  ;; CHECK-NEXT:  (local $scratch_4 i32)
  ;; CHECK-NEXT:  (local $scratch_5 eqref)
  ;; CHECK-NEXT:  (local $scratch_6 i32)
  ;; CHECK-NEXT:  (local $scratch_7 (ref any))
  ;; CHECK-NEXT:  (block $block (type $3) (result i32 (ref any))
  ;; CHECK-NEXT:   (local.set $scratch_7
  ;; CHECK-NEXT:    (block $block0 (result (ref any))
  ;; CHECK-NEXT:     (local.set $scratch_3
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_4
  ;; CHECK-NEXT:        (local.get $0)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.set $scratch
  ;; CHECK-NEXT:        (local.get $1)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_4)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (local.set $scratch_5
  ;; CHECK-NEXT:      (br_on_cast_fail $block0 anyref eqref
  ;; CHECK-NEXT:       (local.get $scratch)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (global.set $i32
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_6
  ;; CHECK-NEXT:        (local.get $scratch_3)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (global.set $eqref
  ;; CHECK-NEXT:        (local.get $scratch_5)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_6)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $block
  ;; CHECK-NEXT:      (tuple.make 2
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:       (global.get $any)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 2
  ;; CHECK-NEXT:    (local.get $scratch_3)
  ;; CHECK-NEXT:    (local.get $scratch_7)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $br_on_cast_fail-one (type $6) (param $0 i32) (param $1 anyref) (result i32 (ref any))
  ;; OPT_O-NEXT:  (block $block (type $2) (result i32 (ref any))
  ;; OPT_O-NEXT:   (tuple.make 2
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (block $block0 (result (ref any))
  ;; OPT_O-NEXT:     (global.set $eqref
  ;; OPT_O-NEXT:      (br_on_cast_fail $block0 anyref eqref
  ;; OPT_O-NEXT:       (local.get $1)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (global.set $i32
  ;; OPT_O-NEXT:      (local.get $0)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (br $block
  ;; OPT_O-NEXT:      (tuple.make 2
  ;; OPT_O-NEXT:       (i32.const 0)
  ;; OPT_O-NEXT:       (global.get $any)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $br_on_cast_fail-one (export "br_on_cast_fail-one") (param i32 anyref) (result i32 (ref any))
    block (result i32 (ref any))
      local.get 0
      local.get 1
      br_on_cast_fail 0 anyref eqref
      global.set $eqref
      global.set $i32
      i32.const 0
      global.get $any
    end
  )

  ;; CHECK:      (func $br_on_cast_fail-two (type $7) (param $0 i32) (param $1 i64) (param $2 anyref) (result i32 i64 (ref any))
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_4 (tuple i32 i64))
  ;; CHECK-NEXT:  (local $scratch_5 i64)
  ;; CHECK-NEXT:  (local $scratch_6 eqref)
  ;; CHECK-NEXT:  (local $scratch_7 (tuple i32 i64))
  ;; CHECK-NEXT:  (local $scratch_8 i32)
  ;; CHECK-NEXT:  (local $scratch_9 (ref any))
  ;; CHECK-NEXT:  (block $block (type $10) (result i32 i64 (ref any))
  ;; CHECK-NEXT:   (local.set $scratch_9
  ;; CHECK-NEXT:    (block $block0 (result (ref any))
  ;; CHECK-NEXT:     (local.set $scratch_4
  ;; CHECK-NEXT:      (tuple.make 2
  ;; CHECK-NEXT:       (local.get $0)
  ;; CHECK-NEXT:       (block (result i64)
  ;; CHECK-NEXT:        (local.set $scratch_5
  ;; CHECK-NEXT:         (local.get $1)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (local.set $scratch
  ;; CHECK-NEXT:         (local.get $2)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (local.get $scratch_5)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (local.set $scratch_6
  ;; CHECK-NEXT:      (br_on_cast_fail $block0 anyref eqref
  ;; CHECK-NEXT:       (local.get $scratch)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (global.set $i32
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_8
  ;; CHECK-NEXT:        (block (result i32)
  ;; CHECK-NEXT:         (local.set $scratch_7
  ;; CHECK-NEXT:          (local.get $scratch_4)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (global.set $eqref
  ;; CHECK-NEXT:          (local.get $scratch_6)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (tuple.extract 2 0
  ;; CHECK-NEXT:          (local.get $scratch_7)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (global.set $i64
  ;; CHECK-NEXT:        (tuple.extract 2 1
  ;; CHECK-NEXT:         (local.get $scratch_7)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_8)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $block
  ;; CHECK-NEXT:      (tuple.make 3
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:       (i64.const 1)
  ;; CHECK-NEXT:       (global.get $any)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 3
  ;; CHECK-NEXT:    (tuple.extract 2 0
  ;; CHECK-NEXT:     (local.get $scratch_4)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (tuple.extract 2 1
  ;; CHECK-NEXT:     (local.get $scratch_4)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (local.get $scratch_9)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $br_on_cast_fail-two (type $7) (param $0 i32) (param $1 i64) (param $2 anyref) (result i32 i64 (ref any))
  ;; OPT_O-NEXT:  (block $block (type $10) (result i32 i64 (ref any))
  ;; OPT_O-NEXT:   (tuple.make 3
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (local.get $1)
  ;; OPT_O-NEXT:    (block $block0 (result (ref any))
  ;; OPT_O-NEXT:     (global.set $eqref
  ;; OPT_O-NEXT:      (br_on_cast_fail $block0 anyref eqref
  ;; OPT_O-NEXT:       (local.get $2)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (global.set $i64
  ;; OPT_O-NEXT:      (local.get $1)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (global.set $i32
  ;; OPT_O-NEXT:      (local.get $0)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (br $block
  ;; OPT_O-NEXT:      (tuple.make 3
  ;; OPT_O-NEXT:       (i32.const 0)
  ;; OPT_O-NEXT:       (i64.const 1)
  ;; OPT_O-NEXT:       (global.get $any)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $br_on_cast_fail-two (export "br_on_cast_fail-two") (param i32 i64 anyref) (result i32 i64 (ref any))
    block (result i32 i64 (ref any))
      local.get 0
      local.get 1
      local.get 2
      br_on_cast_fail 0 anyref eqref
      global.set $eqref
      global.set $i64
      global.set $i32
      i32.const 0
      i64.const 1
      global.get $any
    end
  )

  ;; CHECK:      (func $br_on_cast_fail-nn (type $18) (param $0 i32) (param $1 (ref any)) (result i32 (ref any))
  ;; CHECK-NEXT:  (local $scratch (ref any))
  ;; CHECK-NEXT:  (local $scratch_3 i32)
  ;; CHECK-NEXT:  (local $scratch_4 i32)
  ;; CHECK-NEXT:  (local $scratch_5 (ref eq))
  ;; CHECK-NEXT:  (local $scratch_6 i32)
  ;; CHECK-NEXT:  (local $scratch_7 (ref any))
  ;; CHECK-NEXT:  (block $block (type $3) (result i32 (ref any))
  ;; CHECK-NEXT:   (local.set $scratch_7
  ;; CHECK-NEXT:    (block $block0 (result (ref any))
  ;; CHECK-NEXT:     (local.set $scratch_3
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_4
  ;; CHECK-NEXT:        (local.get $0)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.set $scratch
  ;; CHECK-NEXT:        (local.get $1)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_4)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (local.set $scratch_5
  ;; CHECK-NEXT:      (br_on_cast_fail $block0 (ref any) (ref eq)
  ;; CHECK-NEXT:       (local.get $scratch)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (global.set $i32
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_6
  ;; CHECK-NEXT:        (local.get $scratch_3)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (global.set $eq
  ;; CHECK-NEXT:        (local.get $scratch_5)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_6)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $block
  ;; CHECK-NEXT:      (tuple.make 2
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:       (global.get $any)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 2
  ;; CHECK-NEXT:    (local.get $scratch_3)
  ;; CHECK-NEXT:    (local.get $scratch_7)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $br_on_cast_fail-nn (type $16) (param $0 i32) (param $1 (ref any)) (result i32 (ref any))
  ;; OPT_O-NEXT:  (block $block (type $2) (result i32 (ref any))
  ;; OPT_O-NEXT:   (tuple.make 2
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (block $block0 (result (ref any))
  ;; OPT_O-NEXT:     (global.set $eq
  ;; OPT_O-NEXT:      (br_on_cast_fail $block0 (ref any) (ref eq)
  ;; OPT_O-NEXT:       (local.get $1)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (global.set $i32
  ;; OPT_O-NEXT:      (local.get $0)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (br $block
  ;; OPT_O-NEXT:      (tuple.make 2
  ;; OPT_O-NEXT:       (i32.const 0)
  ;; OPT_O-NEXT:       (global.get $any)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $br_on_cast_fail-nn (export "br_on_cast_fail-nn") (param i32 (ref any)) (result i32 (ref any))
    block (result i32 (ref any))
      local.get 0
      local.get 1
      br_on_cast_fail 0 (ref any) (ref eq)
      global.set $eq
      global.set $i32
      i32.const 0
      global.get $any
    end
  )

  ;; CHECK:      (func $br_on_cast_fail-to-nn (type $8) (param $0 i32) (param $1 anyref) (result i32 anyref)
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_3 i32)
  ;; CHECK-NEXT:  (local $scratch_4 i32)
  ;; CHECK-NEXT:  (local $scratch_5 (ref eq))
  ;; CHECK-NEXT:  (local $scratch_6 i32)
  ;; CHECK-NEXT:  (local $scratch_7 anyref)
  ;; CHECK-NEXT:  (block $block (type $2) (result i32 anyref)
  ;; CHECK-NEXT:   (local.set $scratch_7
  ;; CHECK-NEXT:    (block $block0 (result anyref)
  ;; CHECK-NEXT:     (local.set $scratch_3
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_4
  ;; CHECK-NEXT:        (local.get $0)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.set $scratch
  ;; CHECK-NEXT:        (local.get $1)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_4)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (local.set $scratch_5
  ;; CHECK-NEXT:      (br_on_cast_fail $block0 anyref (ref eq)
  ;; CHECK-NEXT:       (local.get $scratch)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (global.set $i32
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_6
  ;; CHECK-NEXT:        (local.get $scratch_3)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (global.set $eq
  ;; CHECK-NEXT:        (local.get $scratch_5)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_6)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $block
  ;; CHECK-NEXT:      (tuple.make 2
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:       (global.get $any)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 2
  ;; CHECK-NEXT:    (local.get $scratch_3)
  ;; CHECK-NEXT:    (local.get $scratch_7)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $br_on_cast_fail-to-nn (type $8) (param $0 i32) (param $1 anyref) (result i32 anyref)
  ;; OPT_O-NEXT:  (block $block (type $26) (result i32 anyref)
  ;; OPT_O-NEXT:   (tuple.make 2
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (block $block0 (result anyref)
  ;; OPT_O-NEXT:     (global.set $eq
  ;; OPT_O-NEXT:      (br_on_cast_fail $block0 anyref (ref eq)
  ;; OPT_O-NEXT:       (local.get $1)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (global.set $i32
  ;; OPT_O-NEXT:      (local.get $0)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (br $block
  ;; OPT_O-NEXT:      (tuple.make 2
  ;; OPT_O-NEXT:       (i32.const 0)
  ;; OPT_O-NEXT:       (global.get $any)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $br_on_cast_fail-to-nn (export "br_on_cast_fail-to-nn") (param i32 anyref) (result i32 anyref)
    block (result i32 anyref)
      local.get 0
      local.get 1
      br_on_cast_fail 0 anyref (ref eq)
      global.set $eq
      global.set $i32
      i32.const 0
      global.get $any
    end
  )

  ;; CHECK:      (func $unreachable-fallthrough (type $5) (param $0 i32) (param $1 anyref) (result i32)
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_3 i32)
  ;; CHECK-NEXT:  (local $scratch_4 i32)
  ;; CHECK-NEXT:  (local $scratch_5 (ref any))
  ;; CHECK-NEXT:  (local $scratch_6 (tuple i32 (ref any)))
  ;; CHECK-NEXT:  (local $scratch_7 i32)
  ;; CHECK-NEXT:  (local.set $scratch_7
  ;; CHECK-NEXT:   (tuple.extract 2 0
  ;; CHECK-NEXT:    (local.tee $scratch_6
  ;; CHECK-NEXT:     (block $l (type $3) (result i32 (ref any))
  ;; CHECK-NEXT:      (local.set $scratch_5
  ;; CHECK-NEXT:       (block $l0 (result (ref any))
  ;; CHECK-NEXT:        (local.set $scratch_3
  ;; CHECK-NEXT:         (block (result i32)
  ;; CHECK-NEXT:          (local.set $scratch_4
  ;; CHECK-NEXT:           (local.get $0)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (local.set $scratch
  ;; CHECK-NEXT:           (local.get $1)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (local.get $scratch_4)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (br_on_non_null $l0
  ;; CHECK-NEXT:         (local.get $scratch)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (br $l
  ;; CHECK-NEXT:         (return
  ;; CHECK-NEXT:          (local.get $scratch_3)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (tuple.make 2
  ;; CHECK-NEXT:       (local.get $scratch_3)
  ;; CHECK-NEXT:       (local.get $scratch_5)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (tuple.extract 2 1
  ;; CHECK-NEXT:    (local.get $scratch_6)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (local.get $scratch_7)
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $unreachable-fallthrough (type $5) (param $0 i32) (param $1 anyref) (result i32)
  ;; OPT_O-NEXT:  (drop
  ;; OPT_O-NEXT:   (block $l0 (result (ref any))
  ;; OPT_O-NEXT:    (br_on_non_null $l0
  ;; OPT_O-NEXT:     (local.get $1)
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:    (return
  ;; OPT_O-NEXT:     (local.get $0)
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT:  (local.get $0)
  ;; OPT_O-NEXT: )
  (func $unreachable-fallthrough (export "unreachable-fallthrough") (param i32 anyref) (result i32)
    block $l (result i32 (ref any))
      local.get 0
      local.get 1
      br_on_non_null $l
      return
    end
    drop
  )

  ;; CHECK:      (func $matching-branches (type $19) (param $0 i32) (param $1 anyref) (param $2 i32) (param $3 anyref) (result i32 eqref)
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_5 i32)
  ;; CHECK-NEXT:  (local $scratch_6 i32)
  ;; CHECK-NEXT:  (local $scratch_7 (ref any))
  ;; CHECK-NEXT:  (local $scratch_8 i32)
  ;; CHECK-NEXT:  (local $scratch_9 anyref)
  ;; CHECK-NEXT:  (local $scratch_10 i32)
  ;; CHECK-NEXT:  (local $scratch_11 (ref any))
  ;; CHECK-NEXT:  (local $scratch_12 i32)
  ;; CHECK-NEXT:  (local $scratch_13 eqref)
  ;; CHECK-NEXT:  (block $block (type $0) (result i32 eqref)
  ;; CHECK-NEXT:   (local.set $scratch_13
  ;; CHECK-NEXT:    (block $block0 (result eqref)
  ;; CHECK-NEXT:     (local.set $scratch_5
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_6
  ;; CHECK-NEXT:        (local.get $0)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.set $scratch
  ;; CHECK-NEXT:        (local.get $1)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_6)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (local.set $scratch_7
  ;; CHECK-NEXT:      (br_on_cast $block0 anyref eqref
  ;; CHECK-NEXT:       (local.get $scratch)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (global.set $i32
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_8
  ;; CHECK-NEXT:        (local.get $scratch_5)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (global.set $any
  ;; CHECK-NEXT:        (local.get $scratch_7)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_8)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (local.set $scratch_5
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_10
  ;; CHECK-NEXT:        (local.get $2)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.set $scratch_9
  ;; CHECK-NEXT:        (local.get $3)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_10)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (local.set $scratch_11
  ;; CHECK-NEXT:      (br_on_cast $block0 anyref eqref
  ;; CHECK-NEXT:       (local.get $scratch_9)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (global.set $i32
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_12
  ;; CHECK-NEXT:        (local.get $scratch_5)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (global.set $any
  ;; CHECK-NEXT:        (local.get $scratch_11)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_12)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $block
  ;; CHECK-NEXT:      (tuple.make 2
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:       (global.get $eqref)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 2
  ;; CHECK-NEXT:    (local.get $scratch_5)
  ;; CHECK-NEXT:    (local.get $scratch_13)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $matching-branches (type $17) (param $0 i32) (param $1 anyref) (param $2 i32) (param $3 anyref) (result i32 eqref)
  ;; OPT_O-NEXT:  (local $4 eqref)
  ;; OPT_O-NEXT:  (block $block (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:   (local.set $4
  ;; OPT_O-NEXT:    (block $block0 (result eqref)
  ;; OPT_O-NEXT:     (global.set $any
  ;; OPT_O-NEXT:      (br_on_cast $block0 anyref eqref
  ;; OPT_O-NEXT:       (local.get $1)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (global.set $i32
  ;; OPT_O-NEXT:      (local.get $0)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (local.set $0
  ;; OPT_O-NEXT:      (local.get $2)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (global.set $any
  ;; OPT_O-NEXT:      (br_on_cast $block0 anyref eqref
  ;; OPT_O-NEXT:       (local.get $3)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (global.set $i32
  ;; OPT_O-NEXT:      (local.get $0)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (br $block
  ;; OPT_O-NEXT:      (tuple.make 2
  ;; OPT_O-NEXT:       (i32.const 0)
  ;; OPT_O-NEXT:       (global.get $eqref)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:   (tuple.make 2
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (local.get $4)
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $matching-branches (export "matching-branches") (param i32 anyref i32 anyref) (result i32 eqref)
    block (result i32 eqref)
      local.get 0
      local.get 1
      br_on_cast 0 anyref eqref
      global.set $any
      global.set $i32
      local.get 2
      local.get 3
      br_on_cast 0 anyref eqref
      global.set $any
      global.set $i32
      i32.const 0
      global.get $eqref
    end
  )

  ;; CHECK:      (func $different-branches (type $20) (param $0 i32) (param $1 anyref) (param $2 i32) (param $3 eqref) (param $4 anyref) (result i32 eqref)
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_6 i32)
  ;; CHECK-NEXT:  (local $scratch_7 i32)
  ;; CHECK-NEXT:  (local $scratch_8 (ref any))
  ;; CHECK-NEXT:  (local $scratch_9 i32)
  ;; CHECK-NEXT:  (local $scratch_10 anyref)
  ;; CHECK-NEXT:  (local $scratch_11 (tuple i32 eqref))
  ;; CHECK-NEXT:  (local $scratch_12 eqref)
  ;; CHECK-NEXT:  (local $scratch_13 (ref any))
  ;; CHECK-NEXT:  (local $scratch_14 (tuple i32 eqref))
  ;; CHECK-NEXT:  (local $scratch_15 i32)
  ;; CHECK-NEXT:  (local $scratch_16 eqref)
  ;; CHECK-NEXT:  (block $block (type $0) (result i32 eqref)
  ;; CHECK-NEXT:   (block $block1
  ;; CHECK-NEXT:    (local.set $scratch_16
  ;; CHECK-NEXT:     (block $block0 (result eqref)
  ;; CHECK-NEXT:      (local.set $scratch_6
  ;; CHECK-NEXT:       (block (result i32)
  ;; CHECK-NEXT:        (local.set $scratch_7
  ;; CHECK-NEXT:         (local.get $0)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (local.set $scratch
  ;; CHECK-NEXT:         (local.get $1)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (local.get $scratch_7)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (local.set $scratch_8
  ;; CHECK-NEXT:       (br_on_cast $block0 anyref eqref
  ;; CHECK-NEXT:        (local.get $scratch)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (global.set $i32
  ;; CHECK-NEXT:       (block (result i32)
  ;; CHECK-NEXT:        (local.set $scratch_9
  ;; CHECK-NEXT:         (local.get $scratch_6)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (global.set $any
  ;; CHECK-NEXT:         (local.get $scratch_8)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (local.get $scratch_9)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (local.set $scratch_11
  ;; CHECK-NEXT:       (tuple.make 2
  ;; CHECK-NEXT:        (local.get $2)
  ;; CHECK-NEXT:        (block (result eqref)
  ;; CHECK-NEXT:         (local.set $scratch_12
  ;; CHECK-NEXT:          (local.get $3)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (local.set $scratch_10
  ;; CHECK-NEXT:          (local.get $4)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (local.get $scratch_12)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (local.set $scratch_13
  ;; CHECK-NEXT:       (br_on_null $block1
  ;; CHECK-NEXT:        (local.get $scratch_10)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (global.set $i32
  ;; CHECK-NEXT:       (block (result i32)
  ;; CHECK-NEXT:        (local.set $scratch_15
  ;; CHECK-NEXT:         (block (result i32)
  ;; CHECK-NEXT:          (local.set $scratch_14
  ;; CHECK-NEXT:           (local.get $scratch_11)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (global.set $any
  ;; CHECK-NEXT:           (local.get $scratch_13)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (tuple.extract 2 0
  ;; CHECK-NEXT:           (local.get $scratch_14)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (global.set $eqref
  ;; CHECK-NEXT:         (tuple.extract 2 1
  ;; CHECK-NEXT:          (local.get $scratch_14)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (local.get $scratch_15)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (br $block
  ;; CHECK-NEXT:       (tuple.make 2
  ;; CHECK-NEXT:        (i32.const 0)
  ;; CHECK-NEXT:        (global.get $eqref)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (br $block
  ;; CHECK-NEXT:     (tuple.make 2
  ;; CHECK-NEXT:      (local.get $scratch_6)
  ;; CHECK-NEXT:      (local.get $scratch_16)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (local.get $scratch_11)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $different-branches (type $18) (param $0 i32) (param $1 anyref) (param $2 i32) (param $3 eqref) (param $4 anyref) (result i32 eqref)
  ;; OPT_O-NEXT:  (local $5 (tuple i32 eqref))
  ;; OPT_O-NEXT:  (block $block (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:   (block $block1
  ;; OPT_O-NEXT:    (br $block
  ;; OPT_O-NEXT:     (tuple.make 2
  ;; OPT_O-NEXT:      (local.get $0)
  ;; OPT_O-NEXT:      (block $block0 (result eqref)
  ;; OPT_O-NEXT:       (global.set $any
  ;; OPT_O-NEXT:        (br_on_cast $block0 anyref eqref
  ;; OPT_O-NEXT:         (local.get $1)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (global.set $i32
  ;; OPT_O-NEXT:        (local.get $0)
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (local.set $5
  ;; OPT_O-NEXT:        (tuple.make 2
  ;; OPT_O-NEXT:         (local.get $2)
  ;; OPT_O-NEXT:         (local.get $3)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (global.set $any
  ;; OPT_O-NEXT:        (br_on_null $block1
  ;; OPT_O-NEXT:         (local.get $4)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (global.set $eqref
  ;; OPT_O-NEXT:        (tuple.extract 2 1
  ;; OPT_O-NEXT:         (local.get $5)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (global.set $i32
  ;; OPT_O-NEXT:        (tuple.extract 2 0
  ;; OPT_O-NEXT:         (local.get $5)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (br $block
  ;; OPT_O-NEXT:        (tuple.make 2
  ;; OPT_O-NEXT:         (i32.const 0)
  ;; OPT_O-NEXT:         (global.get $eqref)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:   (local.get $5)
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $different-branches (export "different-branches") (param i32 anyref i32 eqref anyref) (result i32 eqref)
    block (result i32 eqref)
      local.get 0
      local.get 1
      br_on_cast 0 anyref eqref
      global.set $any
      global.set $i32
      local.get 2
      local.get 3
      local.get 4
      br_on_null 0
      global.set $any
      global.set $eqref
      global.set $i32
      i32.const 0
      global.get $eqref
    end
  )

  ;; CHECK:      (func $different-branches-2 (type $21) (param $0 i32) (param $1 eqref) (param $2 anyref) (param $3 i32) (param $4 anyref) (result i32 eqref)
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_6 (tuple i32 eqref))
  ;; CHECK-NEXT:  (local $scratch_7 eqref)
  ;; CHECK-NEXT:  (local $scratch_8 (ref any))
  ;; CHECK-NEXT:  (local $scratch_9 (tuple i32 eqref))
  ;; CHECK-NEXT:  (local $scratch_10 i32)
  ;; CHECK-NEXT:  (local $scratch_11 anyref)
  ;; CHECK-NEXT:  (local $scratch_12 i32)
  ;; CHECK-NEXT:  (local $scratch_13 i32)
  ;; CHECK-NEXT:  (local $scratch_14 (ref any))
  ;; CHECK-NEXT:  (local $scratch_15 i32)
  ;; CHECK-NEXT:  (local $scratch_16 eqref)
  ;; CHECK-NEXT:  (block $block (type $0) (result i32 eqref)
  ;; CHECK-NEXT:   (block $block0
  ;; CHECK-NEXT:    (local.set $scratch_16
  ;; CHECK-NEXT:     (block $block1 (result eqref)
  ;; CHECK-NEXT:      (local.set $scratch_6
  ;; CHECK-NEXT:       (tuple.make 2
  ;; CHECK-NEXT:        (local.get $0)
  ;; CHECK-NEXT:        (block (result eqref)
  ;; CHECK-NEXT:         (local.set $scratch_7
  ;; CHECK-NEXT:          (local.get $1)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (local.set $scratch
  ;; CHECK-NEXT:          (local.get $2)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (local.get $scratch_7)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (local.set $scratch_8
  ;; CHECK-NEXT:       (br_on_null $block0
  ;; CHECK-NEXT:        (local.get $scratch)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (global.set $i32
  ;; CHECK-NEXT:       (block (result i32)
  ;; CHECK-NEXT:        (local.set $scratch_10
  ;; CHECK-NEXT:         (block (result i32)
  ;; CHECK-NEXT:          (local.set $scratch_9
  ;; CHECK-NEXT:           (local.get $scratch_6)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (global.set $any
  ;; CHECK-NEXT:           (local.get $scratch_8)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (tuple.extract 2 0
  ;; CHECK-NEXT:           (local.get $scratch_9)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (global.set $eqref
  ;; CHECK-NEXT:         (tuple.extract 2 1
  ;; CHECK-NEXT:          (local.get $scratch_9)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (local.get $scratch_10)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (local.set $scratch_12
  ;; CHECK-NEXT:       (block (result i32)
  ;; CHECK-NEXT:        (local.set $scratch_13
  ;; CHECK-NEXT:         (local.get $3)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (local.set $scratch_11
  ;; CHECK-NEXT:         (local.get $4)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (local.get $scratch_13)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (local.set $scratch_14
  ;; CHECK-NEXT:       (br_on_cast $block1 anyref eqref
  ;; CHECK-NEXT:        (local.get $scratch_11)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (global.set $i32
  ;; CHECK-NEXT:       (block (result i32)
  ;; CHECK-NEXT:        (local.set $scratch_15
  ;; CHECK-NEXT:         (local.get $scratch_12)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (global.set $any
  ;; CHECK-NEXT:         (local.get $scratch_14)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (local.get $scratch_15)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (br $block
  ;; CHECK-NEXT:       (tuple.make 2
  ;; CHECK-NEXT:        (i32.const 0)
  ;; CHECK-NEXT:        (global.get $eqref)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (br $block
  ;; CHECK-NEXT:     (tuple.make 2
  ;; CHECK-NEXT:      (local.get $scratch_12)
  ;; CHECK-NEXT:      (local.get $scratch_16)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (local.get $scratch_6)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $different-branches-2 (type $19) (param $0 i32) (param $1 eqref) (param $2 anyref) (param $3 i32) (param $4 anyref) (result i32 eqref)
  ;; OPT_O-NEXT:  (local $5 (tuple i32 eqref))
  ;; OPT_O-NEXT:  (block $block (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:   (block $block0
  ;; OPT_O-NEXT:    (br $block
  ;; OPT_O-NEXT:     (tuple.make 2
  ;; OPT_O-NEXT:      (local.get $3)
  ;; OPT_O-NEXT:      (block $block1 (result eqref)
  ;; OPT_O-NEXT:       (local.set $5
  ;; OPT_O-NEXT:        (tuple.make 2
  ;; OPT_O-NEXT:         (local.get $0)
  ;; OPT_O-NEXT:         (local.get $1)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (global.set $any
  ;; OPT_O-NEXT:        (br_on_null $block0
  ;; OPT_O-NEXT:         (local.get $2)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (global.set $eqref
  ;; OPT_O-NEXT:        (tuple.extract 2 1
  ;; OPT_O-NEXT:         (local.get $5)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (global.set $i32
  ;; OPT_O-NEXT:        (tuple.extract 2 0
  ;; OPT_O-NEXT:         (local.get $5)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (global.set $any
  ;; OPT_O-NEXT:        (br_on_cast $block1 anyref eqref
  ;; OPT_O-NEXT:         (local.get $4)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (global.set $i32
  ;; OPT_O-NEXT:        (local.get $3)
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (br $block
  ;; OPT_O-NEXT:        (tuple.make 2
  ;; OPT_O-NEXT:         (i32.const 0)
  ;; OPT_O-NEXT:         (global.get $eqref)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:   (local.get $5)
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $different-branches-2 (export "different-branches-2") (param i32 eqref anyref i32 anyref) (result i32 eqref)
    block (result i32 eqref)
      local.get 0
      local.get 1
      local.get 2
      br_on_null 0
      global.set $any
      global.set $eqref
      global.set $i32
      local.get 3
      local.get 4
      br_on_cast 0 anyref eqref
      global.set $any
      global.set $i32
      i32.const 0
      global.get $eqref
    end
  )

  ;; CHECK:      (func $nested-branches (type $22) (param $0 i32) (param $1 anyref) (param $2 anyref) (result i32)
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_4 i32)
  ;; CHECK-NEXT:  (local $scratch_5 i32)
  ;; CHECK-NEXT:  (local $scratch_6 (ref any))
  ;; CHECK-NEXT:  (local $scratch_7 anyref)
  ;; CHECK-NEXT:  (local $scratch_8 i32)
  ;; CHECK-NEXT:  (local $scratch_9 i32)
  ;; CHECK-NEXT:  (local $scratch_10 (ref any))
  ;; CHECK-NEXT:  (local $scratch_11 i32)
  ;; CHECK-NEXT:  (local $scratch_12 eqref)
  ;; CHECK-NEXT:  (local $scratch_13 (tuple i32 eqref))
  ;; CHECK-NEXT:  (local $scratch_14 i32)
  ;; CHECK-NEXT:  (block $block1 (result i32)
  ;; CHECK-NEXT:   (block $block10
  ;; CHECK-NEXT:    (local.set $scratch_14
  ;; CHECK-NEXT:     (tuple.extract 2 0
  ;; CHECK-NEXT:      (local.tee $scratch_13
  ;; CHECK-NEXT:       (block $block (type $0) (result i32 eqref)
  ;; CHECK-NEXT:        (local.set $scratch_12
  ;; CHECK-NEXT:         (block $block0 (result eqref)
  ;; CHECK-NEXT:          (local.set $scratch_4
  ;; CHECK-NEXT:           (block (result i32)
  ;; CHECK-NEXT:            (local.set $scratch_5
  ;; CHECK-NEXT:             (local.get $0)
  ;; CHECK-NEXT:            )
  ;; CHECK-NEXT:            (local.set $scratch
  ;; CHECK-NEXT:             (local.get $1)
  ;; CHECK-NEXT:            )
  ;; CHECK-NEXT:            (local.get $scratch_5)
  ;; CHECK-NEXT:           )
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (local.set $scratch_6
  ;; CHECK-NEXT:           (br_on_cast $block0 anyref eqref
  ;; CHECK-NEXT:            (local.get $scratch)
  ;; CHECK-NEXT:           )
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (local.set $scratch_8
  ;; CHECK-NEXT:           (block (result i32)
  ;; CHECK-NEXT:            (local.set $scratch_9
  ;; CHECK-NEXT:             (local.get $scratch_4)
  ;; CHECK-NEXT:            )
  ;; CHECK-NEXT:            (global.set $any
  ;; CHECK-NEXT:             (local.get $scratch_6)
  ;; CHECK-NEXT:            )
  ;; CHECK-NEXT:            (local.set $scratch_7
  ;; CHECK-NEXT:             (local.get $2)
  ;; CHECK-NEXT:            )
  ;; CHECK-NEXT:            (local.get $scratch_9)
  ;; CHECK-NEXT:           )
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (local.set $scratch_10
  ;; CHECK-NEXT:           (br_on_null $block10
  ;; CHECK-NEXT:            (local.get $scratch_7)
  ;; CHECK-NEXT:           )
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (drop
  ;; CHECK-NEXT:           (block (result i32)
  ;; CHECK-NEXT:            (local.set $scratch_11
  ;; CHECK-NEXT:             (local.get $scratch_8)
  ;; CHECK-NEXT:            )
  ;; CHECK-NEXT:            (drop
  ;; CHECK-NEXT:             (local.get $scratch_10)
  ;; CHECK-NEXT:            )
  ;; CHECK-NEXT:            (local.get $scratch_11)
  ;; CHECK-NEXT:           )
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (br $block
  ;; CHECK-NEXT:           (tuple.make 2
  ;; CHECK-NEXT:            (i32.const 0)
  ;; CHECK-NEXT:            (global.get $eqref)
  ;; CHECK-NEXT:           )
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (tuple.make 2
  ;; CHECK-NEXT:         (local.get $scratch_4)
  ;; CHECK-NEXT:         (local.get $scratch_12)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (drop
  ;; CHECK-NEXT:     (tuple.extract 2 1
  ;; CHECK-NEXT:      (local.get $scratch_13)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (br $block1
  ;; CHECK-NEXT:     (local.get $scratch_14)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (local.get $scratch_8)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $nested-branches (type $20) (param $0 i32) (param $1 anyref) (param $2 anyref) (result i32)
  ;; OPT_O-NEXT:  (block $block1 (result i32)
  ;; OPT_O-NEXT:   (block $block10
  ;; OPT_O-NEXT:    (br $block1
  ;; OPT_O-NEXT:     (tuple.extract 2 0
  ;; OPT_O-NEXT:      (block $block (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:       (tuple.make 2
  ;; OPT_O-NEXT:        (local.get $0)
  ;; OPT_O-NEXT:        (block $block0 (result eqref)
  ;; OPT_O-NEXT:         (global.set $any
  ;; OPT_O-NEXT:          (br_on_cast $block0 anyref eqref
  ;; OPT_O-NEXT:           (local.get $1)
  ;; OPT_O-NEXT:          )
  ;; OPT_O-NEXT:         )
  ;; OPT_O-NEXT:         (drop
  ;; OPT_O-NEXT:          (br_on_null $block10
  ;; OPT_O-NEXT:           (local.get $2)
  ;; OPT_O-NEXT:          )
  ;; OPT_O-NEXT:         )
  ;; OPT_O-NEXT:         (br $block
  ;; OPT_O-NEXT:          (tuple.make 2
  ;; OPT_O-NEXT:           (i32.const 0)
  ;; OPT_O-NEXT:           (global.get $eqref)
  ;; OPT_O-NEXT:          )
  ;; OPT_O-NEXT:         )
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:   (local.get $0)
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $nested-branches (export "nested-branches") (param i32 anyref anyref) (result i32)
    block (result i32)
      block (result i32 eqref)
        local.get 0
        local.get 1
        br_on_cast 0 anyref eqref
        global.set $any
        local.get 2
        br_on_null 1
        drop
        drop
        i32.const 0
        global.get $eqref
      end
      drop
    end
  )

  ;; CHECK:      (func $with-block-param (type $23) (param $0 i64) (param $1 anyref) (result i64 eqref)
  ;; CHECK-NEXT:  (local $scratch i64)
  ;; CHECK-NEXT:  (local $scratch_3 anyref)
  ;; CHECK-NEXT:  (local $scratch_4 i64)
  ;; CHECK-NEXT:  (local $scratch_5 i64)
  ;; CHECK-NEXT:  (local $scratch_6 (ref any))
  ;; CHECK-NEXT:  (local $scratch_7 i64)
  ;; CHECK-NEXT:  (local $scratch_8 eqref)
  ;; CHECK-NEXT:  (local.set $scratch
  ;; CHECK-NEXT:   (local.get $0)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (block $block (type $12) (result i64 eqref)
  ;; CHECK-NEXT:   (local.set $scratch_8
  ;; CHECK-NEXT:    (block $block0 (result eqref)
  ;; CHECK-NEXT:     (local.set $scratch_4
  ;; CHECK-NEXT:      (block (result i64)
  ;; CHECK-NEXT:       (local.set $scratch_5
  ;; CHECK-NEXT:        (local.get $scratch)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.set $scratch_3
  ;; CHECK-NEXT:        (local.get $1)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_5)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (local.set $scratch_6
  ;; CHECK-NEXT:      (br_on_cast $block0 anyref eqref
  ;; CHECK-NEXT:       (local.get $scratch_3)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (global.set $i64
  ;; CHECK-NEXT:      (block (result i64)
  ;; CHECK-NEXT:       (local.set $scratch_7
  ;; CHECK-NEXT:        (local.get $scratch_4)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (global.set $any
  ;; CHECK-NEXT:        (local.get $scratch_6)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_7)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $block
  ;; CHECK-NEXT:      (tuple.make 2
  ;; CHECK-NEXT:       (i64.const 1)
  ;; CHECK-NEXT:       (global.get $eqref)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 2
  ;; CHECK-NEXT:    (local.get $scratch_4)
  ;; CHECK-NEXT:    (local.get $scratch_8)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $with-block-param (type $21) (param $0 i64) (param $1 anyref) (result i64 eqref)
  ;; OPT_O-NEXT:  (block $block (type $27) (result i64 eqref)
  ;; OPT_O-NEXT:   (tuple.make 2
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (block $block0 (result eqref)
  ;; OPT_O-NEXT:     (global.set $any
  ;; OPT_O-NEXT:      (br_on_cast $block0 anyref eqref
  ;; OPT_O-NEXT:       (local.get $1)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (global.set $i64
  ;; OPT_O-NEXT:      (local.get $0)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (br $block
  ;; OPT_O-NEXT:      (tuple.make 2
  ;; OPT_O-NEXT:       (i64.const 1)
  ;; OPT_O-NEXT:       (global.get $eqref)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $with-block-param (export "with-block-param") (param i64 anyref) (result i64 eqref)
    local.get 0
    block (param i64) (result i64 eqref)
      local.get 1
      br_on_cast 0 anyref eqref
      global.set $any
      global.set $i64
      i64.const 1
      global.get $eqref
    end
  )

  ;; CHECK:      (func $loop (type $24) (param $0 i32) (param $1 anyref)
  ;; CHECK-NEXT:  (local $scratch (tuple i32 anyref))
  ;; CHECK-NEXT:  (local $scratch_3 (tuple i32 anyref))
  ;; CHECK-NEXT:  (local $scratch_4 anyref)
  ;; CHECK-NEXT:  (local $scratch_5 i32)
  ;; CHECK-NEXT:  (local $scratch_6 i32)
  ;; CHECK-NEXT:  (local $scratch_7 (ref any))
  ;; CHECK-NEXT:  (local $scratch_8 i32)
  ;; CHECK-NEXT:  (local $scratch_9 anyref)
  ;; CHECK-NEXT:  (local.set $scratch
  ;; CHECK-NEXT:   (tuple.make 2
  ;; CHECK-NEXT:    (local.get $0)
  ;; CHECK-NEXT:    (local.get $1)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $label2
  ;; CHECK-NEXT:   (block $label3
  ;; CHECK-NEXT:    (local.set $scratch
  ;; CHECK-NEXT:     (block $label (type $2) (result i32 anyref)
  ;; CHECK-NEXT:      (block $label1
  ;; CHECK-NEXT:       (local.set $scratch_9
  ;; CHECK-NEXT:        (block $label0 (result anyref)
  ;; CHECK-NEXT:         (local.set $scratch_5
  ;; CHECK-NEXT:          (block (result i32)
  ;; CHECK-NEXT:           (local.set $scratch_6
  ;; CHECK-NEXT:            (tuple.extract 2 0
  ;; CHECK-NEXT:             (local.tee $scratch_3
  ;; CHECK-NEXT:              (local.get $scratch)
  ;; CHECK-NEXT:             )
  ;; CHECK-NEXT:            )
  ;; CHECK-NEXT:           )
  ;; CHECK-NEXT:           (local.set $scratch_4
  ;; CHECK-NEXT:            (tuple.extract 2 1
  ;; CHECK-NEXT:             (local.get $scratch_3)
  ;; CHECK-NEXT:            )
  ;; CHECK-NEXT:           )
  ;; CHECK-NEXT:           (local.get $scratch_6)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (local.set $scratch_7
  ;; CHECK-NEXT:          (br_on_cast $label0 anyref eqref
  ;; CHECK-NEXT:           (local.get $scratch_4)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (global.set $i32
  ;; CHECK-NEXT:          (block (result i32)
  ;; CHECK-NEXT:           (local.set $scratch_8
  ;; CHECK-NEXT:            (local.get $scratch_5)
  ;; CHECK-NEXT:           )
  ;; CHECK-NEXT:           (global.set $any
  ;; CHECK-NEXT:            (local.get $scratch_7)
  ;; CHECK-NEXT:           )
  ;; CHECK-NEXT:           (local.get $scratch_8)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (br $label1)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (br $label
  ;; CHECK-NEXT:        (tuple.make 2
  ;; CHECK-NEXT:         (local.get $scratch_5)
  ;; CHECK-NEXT:         (local.get $scratch_9)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:      (br $label3)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (br $label2)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $loop (type $22) (param $0 i32) (param $1 anyref)
  ;; OPT_O-NEXT:  (loop $label2
  ;; OPT_O-NEXT:   (block $label3
  ;; OPT_O-NEXT:    (local.set $1
  ;; OPT_O-NEXT:     (block $label0 (result eqref)
  ;; OPT_O-NEXT:      (global.set $any
  ;; OPT_O-NEXT:       (br_on_cast $label0 anyref eqref
  ;; OPT_O-NEXT:        (local.get $1)
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:      (global.set $i32
  ;; OPT_O-NEXT:       (local.get $0)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:      (br $label3)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:    (br $label2)
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $loop (export "loop") (param i32 anyref)
    local.get 0
    local.get 1
    loop (param i32 anyref)
      br_on_cast 0 anyref eqref
      global.set $any
      global.set $i32
    end
  )

  ;; CHECK:      (func $loop-results (type $8) (param $0 i32) (param $1 anyref) (result i32 anyref)
  ;; CHECK-NEXT:  (local $scratch (tuple i32 anyref))
  ;; CHECK-NEXT:  (local $scratch_3 (tuple i32 anyref))
  ;; CHECK-NEXT:  (local $scratch_4 anyref)
  ;; CHECK-NEXT:  (local $scratch_5 i32)
  ;; CHECK-NEXT:  (local $scratch_6 i32)
  ;; CHECK-NEXT:  (local $scratch_7 (ref any))
  ;; CHECK-NEXT:  (local $scratch_8 anyref)
  ;; CHECK-NEXT:  (local.set $scratch
  ;; CHECK-NEXT:   (tuple.make 2
  ;; CHECK-NEXT:    (local.get $0)
  ;; CHECK-NEXT:    (local.get $1)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (loop $label2 (type $2) (result i32 anyref)
  ;; CHECK-NEXT:   (block $label3 (type $2) (result i32 anyref)
  ;; CHECK-NEXT:    (local.set $scratch
  ;; CHECK-NEXT:     (block $label (type $2) (result i32 anyref)
  ;; CHECK-NEXT:      (br $label3
  ;; CHECK-NEXT:       (block $label1 (type $2) (result i32 anyref)
  ;; CHECK-NEXT:        (local.set $scratch_8
  ;; CHECK-NEXT:         (block $label0 (result anyref)
  ;; CHECK-NEXT:          (local.set $scratch_5
  ;; CHECK-NEXT:           (block (result i32)
  ;; CHECK-NEXT:            (local.set $scratch_6
  ;; CHECK-NEXT:             (tuple.extract 2 0
  ;; CHECK-NEXT:              (local.tee $scratch_3
  ;; CHECK-NEXT:               (local.get $scratch)
  ;; CHECK-NEXT:              )
  ;; CHECK-NEXT:             )
  ;; CHECK-NEXT:            )
  ;; CHECK-NEXT:            (local.set $scratch_4
  ;; CHECK-NEXT:             (tuple.extract 2 1
  ;; CHECK-NEXT:              (local.get $scratch_3)
  ;; CHECK-NEXT:             )
  ;; CHECK-NEXT:            )
  ;; CHECK-NEXT:            (local.get $scratch_6)
  ;; CHECK-NEXT:           )
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (local.set $scratch_7
  ;; CHECK-NEXT:           (br_on_cast $label0 anyref eqref
  ;; CHECK-NEXT:            (local.get $scratch_4)
  ;; CHECK-NEXT:           )
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (br $label1
  ;; CHECK-NEXT:           (tuple.make 2
  ;; CHECK-NEXT:            (local.get $scratch_5)
  ;; CHECK-NEXT:            (local.get $scratch_7)
  ;; CHECK-NEXT:           )
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (br $label
  ;; CHECK-NEXT:         (tuple.make 2
  ;; CHECK-NEXT:          (local.get $scratch_5)
  ;; CHECK-NEXT:          (local.get $scratch_8)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (br $label2)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $loop-results (type $8) (param $0 i32) (param $1 anyref) (result i32 anyref)
  ;; OPT_O-NEXT:  (local $2 (tuple i32 anyref))
  ;; OPT_O-NEXT:  (local $3 eqref)
  ;; OPT_O-NEXT:  (local.set $2
  ;; OPT_O-NEXT:   (tuple.make 2
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (local.get $1)
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT:  (loop $label2 (type $2) (result i32 (ref any))
  ;; OPT_O-NEXT:   (block $label3 (type $2) (result i32 (ref any))
  ;; OPT_O-NEXT:    (local.set $2
  ;; OPT_O-NEXT:     (block $label (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:      (br $label3
  ;; OPT_O-NEXT:       (block $label1 (type $2) (result i32 (ref any))
  ;; OPT_O-NEXT:        (local.set $3
  ;; OPT_O-NEXT:         (block $label0 (result eqref)
  ;; OPT_O-NEXT:          (br $label1
  ;; OPT_O-NEXT:           (tuple.make 2
  ;; OPT_O-NEXT:            (local.tee $0
  ;; OPT_O-NEXT:             (tuple.extract 2 0
  ;; OPT_O-NEXT:              (local.get $2)
  ;; OPT_O-NEXT:             )
  ;; OPT_O-NEXT:            )
  ;; OPT_O-NEXT:            (br_on_cast $label0 anyref eqref
  ;; OPT_O-NEXT:             (tuple.extract 2 1
  ;; OPT_O-NEXT:              (local.get $2)
  ;; OPT_O-NEXT:             )
  ;; OPT_O-NEXT:            )
  ;; OPT_O-NEXT:           )
  ;; OPT_O-NEXT:          )
  ;; OPT_O-NEXT:         )
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:        (br $label
  ;; OPT_O-NEXT:         (tuple.make 2
  ;; OPT_O-NEXT:          (local.get $0)
  ;; OPT_O-NEXT:          (local.get $3)
  ;; OPT_O-NEXT:         )
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:    (br $label2)
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $loop-results (export "loop-results") (param i32 anyref) (result i32 anyref)
    local.get 0
    local.get 1
    loop (param i32 anyref) (result i32 anyref)
      br_on_cast 0 anyref eqref
    end
  )

  ;; CHECK:      (func $if (type $9) (param $0 i32) (param $1 i32) (param $2 anyref) (result i32 eqref)
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_4 i32)
  ;; CHECK-NEXT:  (local $scratch_5 i32)
  ;; CHECK-NEXT:  (local $scratch_6 (ref any))
  ;; CHECK-NEXT:  (local $scratch_7 i32)
  ;; CHECK-NEXT:  (local $scratch_8 eqref)
  ;; CHECK-NEXT:  (block $label (type $0) (result i32 eqref)
  ;; CHECK-NEXT:   (local.set $scratch_8
  ;; CHECK-NEXT:    (block $label0 (result eqref)
  ;; CHECK-NEXT:     (br $label
  ;; CHECK-NEXT:      (if (type $0) (result i32 eqref)
  ;; CHECK-NEXT:       (local.get $0)
  ;; CHECK-NEXT:       (then
  ;; CHECK-NEXT:        (local.set $scratch_4
  ;; CHECK-NEXT:         (block (result i32)
  ;; CHECK-NEXT:          (local.set $scratch_5
  ;; CHECK-NEXT:           (local.get $1)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (local.set $scratch
  ;; CHECK-NEXT:           (local.get $2)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (local.get $scratch_5)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (local.set $scratch_6
  ;; CHECK-NEXT:         (br_on_cast $label0 anyref eqref
  ;; CHECK-NEXT:          (local.get $scratch)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (global.set $i32
  ;; CHECK-NEXT:         (block (result i32)
  ;; CHECK-NEXT:          (local.set $scratch_7
  ;; CHECK-NEXT:           (local.get $scratch_4)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (global.set $any
  ;; CHECK-NEXT:           (local.get $scratch_6)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (local.get $scratch_7)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (tuple.make 2
  ;; CHECK-NEXT:         (i32.const 0)
  ;; CHECK-NEXT:         (global.get $eqref)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (else
  ;; CHECK-NEXT:        (tuple.make 2
  ;; CHECK-NEXT:         (i32.const 1)
  ;; CHECK-NEXT:         (global.get $eq)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 2
  ;; CHECK-NEXT:    (local.get $scratch_4)
  ;; CHECK-NEXT:    (local.get $scratch_8)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $if (type $9) (param $0 i32) (param $1 i32) (param $2 anyref) (result i32 eqref)
  ;; OPT_O-NEXT:  (block $label (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:   (tuple.make 2
  ;; OPT_O-NEXT:    (local.get $1)
  ;; OPT_O-NEXT:    (block $label0 (result eqref)
  ;; OPT_O-NEXT:     (br $label
  ;; OPT_O-NEXT:      (if (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:       (local.get $0)
  ;; OPT_O-NEXT:       (then
  ;; OPT_O-NEXT:        (global.set $any
  ;; OPT_O-NEXT:         (br_on_cast $label0 anyref eqref
  ;; OPT_O-NEXT:          (local.get $2)
  ;; OPT_O-NEXT:         )
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:        (global.set $i32
  ;; OPT_O-NEXT:         (local.get $1)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:        (tuple.make 2
  ;; OPT_O-NEXT:         (i32.const 0)
  ;; OPT_O-NEXT:         (global.get $eqref)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (else
  ;; OPT_O-NEXT:        (tuple.make 2
  ;; OPT_O-NEXT:         (i32.const 1)
  ;; OPT_O-NEXT:         (global.get $eq)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $if (export "if") (param i32 i32 anyref) (result i32 eqref)
    local.get 0
    if (result i32 eqref)
      local.get 1
      local.get 2
      br_on_cast 0 anyref eqref
      global.set $any
      global.set $i32
      i32.const 0
      global.get $eqref
    else
      i32.const 1
      global.get $eq
    end
 )

 ;; CHECK:      (func $else (type $9) (param $0 i32) (param $1 i32) (param $2 anyref) (result i32 eqref)
 ;; CHECK-NEXT:  (local $scratch anyref)
 ;; CHECK-NEXT:  (local $scratch_4 i32)
 ;; CHECK-NEXT:  (local $scratch_5 i32)
 ;; CHECK-NEXT:  (local $scratch_6 (ref any))
 ;; CHECK-NEXT:  (local $scratch_7 i32)
 ;; CHECK-NEXT:  (local $scratch_8 eqref)
 ;; CHECK-NEXT:  (block $label (type $0) (result i32 eqref)
 ;; CHECK-NEXT:   (local.set $scratch_8
 ;; CHECK-NEXT:    (block $label0 (result eqref)
 ;; CHECK-NEXT:     (br $label
 ;; CHECK-NEXT:      (if (type $0) (result i32 eqref)
 ;; CHECK-NEXT:       (local.get $0)
 ;; CHECK-NEXT:       (then
 ;; CHECK-NEXT:        (tuple.make 2
 ;; CHECK-NEXT:         (i32.const 0)
 ;; CHECK-NEXT:         (global.get $eqref)
 ;; CHECK-NEXT:        )
 ;; CHECK-NEXT:       )
 ;; CHECK-NEXT:       (else
 ;; CHECK-NEXT:        (local.set $scratch_4
 ;; CHECK-NEXT:         (block (result i32)
 ;; CHECK-NEXT:          (local.set $scratch_5
 ;; CHECK-NEXT:           (local.get $1)
 ;; CHECK-NEXT:          )
 ;; CHECK-NEXT:          (local.set $scratch
 ;; CHECK-NEXT:           (local.get $2)
 ;; CHECK-NEXT:          )
 ;; CHECK-NEXT:          (local.get $scratch_5)
 ;; CHECK-NEXT:         )
 ;; CHECK-NEXT:        )
 ;; CHECK-NEXT:        (local.set $scratch_6
 ;; CHECK-NEXT:         (br_on_cast $label0 anyref eqref
 ;; CHECK-NEXT:          (local.get $scratch)
 ;; CHECK-NEXT:         )
 ;; CHECK-NEXT:        )
 ;; CHECK-NEXT:        (global.set $i32
 ;; CHECK-NEXT:         (block (result i32)
 ;; CHECK-NEXT:          (local.set $scratch_7
 ;; CHECK-NEXT:           (local.get $scratch_4)
 ;; CHECK-NEXT:          )
 ;; CHECK-NEXT:          (global.set $any
 ;; CHECK-NEXT:           (local.get $scratch_6)
 ;; CHECK-NEXT:          )
 ;; CHECK-NEXT:          (local.get $scratch_7)
 ;; CHECK-NEXT:         )
 ;; CHECK-NEXT:        )
 ;; CHECK-NEXT:        (tuple.make 2
 ;; CHECK-NEXT:         (i32.const 1)
 ;; CHECK-NEXT:         (global.get $eq)
 ;; CHECK-NEXT:        )
 ;; CHECK-NEXT:       )
 ;; CHECK-NEXT:      )
 ;; CHECK-NEXT:     )
 ;; CHECK-NEXT:    )
 ;; CHECK-NEXT:   )
 ;; CHECK-NEXT:   (tuple.make 2
 ;; CHECK-NEXT:    (local.get $scratch_4)
 ;; CHECK-NEXT:    (local.get $scratch_8)
 ;; CHECK-NEXT:   )
 ;; CHECK-NEXT:  )
 ;; CHECK-NEXT: )
 ;; OPT_O:      (func $else (type $9) (param $0 i32) (param $1 i32) (param $2 anyref) (result i32 eqref)
 ;; OPT_O-NEXT:  (block $label (type $0) (result i32 eqref)
 ;; OPT_O-NEXT:   (tuple.make 2
 ;; OPT_O-NEXT:    (local.get $1)
 ;; OPT_O-NEXT:    (block $label0 (result eqref)
 ;; OPT_O-NEXT:     (br $label
 ;; OPT_O-NEXT:      (if (type $0) (result i32 eqref)
 ;; OPT_O-NEXT:       (local.get $0)
 ;; OPT_O-NEXT:       (then
 ;; OPT_O-NEXT:        (tuple.make 2
 ;; OPT_O-NEXT:         (i32.const 0)
 ;; OPT_O-NEXT:         (global.get $eqref)
 ;; OPT_O-NEXT:        )
 ;; OPT_O-NEXT:       )
 ;; OPT_O-NEXT:       (else
 ;; OPT_O-NEXT:        (global.set $any
 ;; OPT_O-NEXT:         (br_on_cast $label0 anyref eqref
 ;; OPT_O-NEXT:          (local.get $2)
 ;; OPT_O-NEXT:         )
 ;; OPT_O-NEXT:        )
 ;; OPT_O-NEXT:        (global.set $i32
 ;; OPT_O-NEXT:         (local.get $1)
 ;; OPT_O-NEXT:        )
 ;; OPT_O-NEXT:        (tuple.make 2
 ;; OPT_O-NEXT:         (i32.const 1)
 ;; OPT_O-NEXT:         (global.get $eq)
 ;; OPT_O-NEXT:        )
 ;; OPT_O-NEXT:       )
 ;; OPT_O-NEXT:      )
 ;; OPT_O-NEXT:     )
 ;; OPT_O-NEXT:    )
 ;; OPT_O-NEXT:   )
 ;; OPT_O-NEXT:  )
 ;; OPT_O-NEXT: )
 (func $else (export "else") (param i32 i32 anyref) (result i32 eqref)
   local.get 0
   if (result i32 eqref)
     i32.const 0
     global.get $eqref
   else
     local.get 1
     local.get 2
     br_on_cast 0 anyref eqref
     global.set $any
     global.set $i32
     i32.const 1
     global.get $eq
   end
 )

 ;; CHECK:      (func $if-else-params (type $25) (param $0 i32) (param $1 i32) (param $2 anyref) (param $3 anyref) (result i32 eqref)
 ;; CHECK-NEXT:  (local $scratch i32)
 ;; CHECK-NEXT:  (local $scratch_5 anyref)
 ;; CHECK-NEXT:  (local $scratch_6 i32)
 ;; CHECK-NEXT:  (local $scratch_7 i32)
 ;; CHECK-NEXT:  (local $scratch_8 (ref any))
 ;; CHECK-NEXT:  (local $scratch_9 i32)
 ;; CHECK-NEXT:  (local $scratch_10 anyref)
 ;; CHECK-NEXT:  (local $scratch_11 i32)
 ;; CHECK-NEXT:  (local $scratch_12 (ref any))
 ;; CHECK-NEXT:  (local $scratch_13 i32)
 ;; CHECK-NEXT:  (local $scratch_14 eqref)
 ;; CHECK-NEXT:  (local.set $scratch
 ;; CHECK-NEXT:   (local.get $0)
 ;; CHECK-NEXT:  )
 ;; CHECK-NEXT:  (block $label (type $0) (result i32 eqref)
 ;; CHECK-NEXT:   (local.set $scratch_14
 ;; CHECK-NEXT:    (block $label0 (result eqref)
 ;; CHECK-NEXT:     (br $label
 ;; CHECK-NEXT:      (if (type $0) (result i32 eqref)
 ;; CHECK-NEXT:       (local.get $1)
 ;; CHECK-NEXT:       (then
 ;; CHECK-NEXT:        (local.set $scratch_6
 ;; CHECK-NEXT:         (block (result i32)
 ;; CHECK-NEXT:          (local.set $scratch_7
 ;; CHECK-NEXT:           (local.get $scratch)
 ;; CHECK-NEXT:          )
 ;; CHECK-NEXT:          (local.set $scratch_5
 ;; CHECK-NEXT:           (local.get $2)
 ;; CHECK-NEXT:          )
 ;; CHECK-NEXT:          (local.get $scratch_7)
 ;; CHECK-NEXT:         )
 ;; CHECK-NEXT:        )
 ;; CHECK-NEXT:        (local.set $scratch_8
 ;; CHECK-NEXT:         (br_on_cast $label0 anyref eqref
 ;; CHECK-NEXT:          (local.get $scratch_5)
 ;; CHECK-NEXT:         )
 ;; CHECK-NEXT:        )
 ;; CHECK-NEXT:        (tuple.make 2
 ;; CHECK-NEXT:         (block (result i32)
 ;; CHECK-NEXT:          (local.set $scratch_9
 ;; CHECK-NEXT:           (local.get $scratch_6)
 ;; CHECK-NEXT:          )
 ;; CHECK-NEXT:          (global.set $any
 ;; CHECK-NEXT:           (local.get $scratch_8)
 ;; CHECK-NEXT:          )
 ;; CHECK-NEXT:          (local.get $scratch_9)
 ;; CHECK-NEXT:         )
 ;; CHECK-NEXT:         (global.get $eq)
 ;; CHECK-NEXT:        )
 ;; CHECK-NEXT:       )
 ;; CHECK-NEXT:       (else
 ;; CHECK-NEXT:        (local.set $scratch_6
 ;; CHECK-NEXT:         (block (result i32)
 ;; CHECK-NEXT:          (local.set $scratch_11
 ;; CHECK-NEXT:           (local.get $scratch)
 ;; CHECK-NEXT:          )
 ;; CHECK-NEXT:          (local.set $scratch_10
 ;; CHECK-NEXT:           (local.get $3)
 ;; CHECK-NEXT:          )
 ;; CHECK-NEXT:          (local.get $scratch_11)
 ;; CHECK-NEXT:         )
 ;; CHECK-NEXT:        )
 ;; CHECK-NEXT:        (local.set $scratch_12
 ;; CHECK-NEXT:         (br_on_cast $label0 anyref eqref
 ;; CHECK-NEXT:          (local.get $scratch_10)
 ;; CHECK-NEXT:         )
 ;; CHECK-NEXT:        )
 ;; CHECK-NEXT:        (tuple.make 2
 ;; CHECK-NEXT:         (block (result i32)
 ;; CHECK-NEXT:          (local.set $scratch_13
 ;; CHECK-NEXT:           (local.get $scratch_6)
 ;; CHECK-NEXT:          )
 ;; CHECK-NEXT:          (global.set $any
 ;; CHECK-NEXT:           (local.get $scratch_12)
 ;; CHECK-NEXT:          )
 ;; CHECK-NEXT:          (local.get $scratch_13)
 ;; CHECK-NEXT:         )
 ;; CHECK-NEXT:         (global.get $eqref)
 ;; CHECK-NEXT:        )
 ;; CHECK-NEXT:       )
 ;; CHECK-NEXT:      )
 ;; CHECK-NEXT:     )
 ;; CHECK-NEXT:    )
 ;; CHECK-NEXT:   )
 ;; CHECK-NEXT:   (tuple.make 2
 ;; CHECK-NEXT:    (local.get $scratch_6)
 ;; CHECK-NEXT:    (local.get $scratch_14)
 ;; CHECK-NEXT:   )
 ;; CHECK-NEXT:  )
 ;; CHECK-NEXT: )
 ;; OPT_O:      (func $if-else-params (type $23) (param $0 i32) (param $1 i32) (param $2 anyref) (param $3 anyref) (result i32 eqref)
 ;; OPT_O-NEXT:  (block $label (type $0) (result i32 eqref)
 ;; OPT_O-NEXT:   (tuple.make 2
 ;; OPT_O-NEXT:    (local.get $0)
 ;; OPT_O-NEXT:    (block $label0 (result eqref)
 ;; OPT_O-NEXT:     (br $label
 ;; OPT_O-NEXT:      (if (type $0) (result i32 eqref)
 ;; OPT_O-NEXT:       (local.get $1)
 ;; OPT_O-NEXT:       (then
 ;; OPT_O-NEXT:        (global.set $any
 ;; OPT_O-NEXT:         (br_on_cast $label0 anyref eqref
 ;; OPT_O-NEXT:          (local.get $2)
 ;; OPT_O-NEXT:         )
 ;; OPT_O-NEXT:        )
 ;; OPT_O-NEXT:        (tuple.make 2
 ;; OPT_O-NEXT:         (local.get $0)
 ;; OPT_O-NEXT:         (global.get $eq)
 ;; OPT_O-NEXT:        )
 ;; OPT_O-NEXT:       )
 ;; OPT_O-NEXT:       (else
 ;; OPT_O-NEXT:        (global.set $any
 ;; OPT_O-NEXT:         (br_on_cast $label0 anyref eqref
 ;; OPT_O-NEXT:          (local.get $3)
 ;; OPT_O-NEXT:         )
 ;; OPT_O-NEXT:        )
 ;; OPT_O-NEXT:        (tuple.make 2
 ;; OPT_O-NEXT:         (local.get $0)
 ;; OPT_O-NEXT:         (global.get $eqref)
 ;; OPT_O-NEXT:        )
 ;; OPT_O-NEXT:       )
 ;; OPT_O-NEXT:      )
 ;; OPT_O-NEXT:     )
 ;; OPT_O-NEXT:    )
 ;; OPT_O-NEXT:   )
 ;; OPT_O-NEXT:  )
 ;; OPT_O-NEXT: )
 (func $if-else-params (export "if-else-params") (param i32 i32 anyref anyref) (result i32 eqref)
   local.get 0
   local.get 1
   if (param i32) (result i32 eqref)
     local.get 2
     br_on_cast 0 anyref eqref
     global.set $any
     global.get $eq
   else
     local.get 3
     br_on_cast 0 anyref eqref
     global.set $any
     global.get $eqref
   end
 )

  ;; CHECK:      (func $try-catch (type $1) (param $0 i32) (param $1 anyref) (result i32 eqref)
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_3 i32)
  ;; CHECK-NEXT:  (local $scratch_4 i32)
  ;; CHECK-NEXT:  (local $scratch_5 (ref any))
  ;; CHECK-NEXT:  (local $scratch_6 eqref)
  ;; CHECK-NEXT:  (block $label (type $0) (result i32 eqref)
  ;; CHECK-NEXT:   (local.set $scratch_6
  ;; CHECK-NEXT:    (block $label0 (result eqref)
  ;; CHECK-NEXT:     (br $label
  ;; CHECK-NEXT:      (try (type $0) (result i32 eqref)
  ;; CHECK-NEXT:       (do
  ;; CHECK-NEXT:        (local.set $scratch_3
  ;; CHECK-NEXT:         (block (result i32)
  ;; CHECK-NEXT:          (local.set $scratch_4
  ;; CHECK-NEXT:           (local.get $0)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (local.set $scratch
  ;; CHECK-NEXT:           (local.get $1)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (local.get $scratch_4)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (local.set $scratch_5
  ;; CHECK-NEXT:         (br_on_cast $label0 anyref eqref
  ;; CHECK-NEXT:          (local.get $scratch)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (call $use-i32-any
  ;; CHECK-NEXT:         (local.get $scratch_3)
  ;; CHECK-NEXT:         (local.get $scratch_5)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (tuple.make 2
  ;; CHECK-NEXT:         (i32.const 0)
  ;; CHECK-NEXT:         (global.get $eqref)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (catch $e
  ;; CHECK-NEXT:        (tuple.make 2
  ;; CHECK-NEXT:         (pop i32)
  ;; CHECK-NEXT:         (global.get $eq)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 2
  ;; CHECK-NEXT:    (local.get $scratch_3)
  ;; CHECK-NEXT:    (local.get $scratch_6)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $try-catch (type $1) (param $0 i32) (param $1 anyref) (result i32 eqref)
  ;; OPT_O-NEXT:  (block $label (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:   (tuple.make 2
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (block $label0 (result eqref)
  ;; OPT_O-NEXT:     (br $label
  ;; OPT_O-NEXT:      (try (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:       (do
  ;; OPT_O-NEXT:        (call $use-i32-any
  ;; OPT_O-NEXT:         (local.get $0)
  ;; OPT_O-NEXT:         (br_on_cast $label0 anyref eqref
  ;; OPT_O-NEXT:          (local.get $1)
  ;; OPT_O-NEXT:         )
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:        (tuple.make 2
  ;; OPT_O-NEXT:         (i32.const 0)
  ;; OPT_O-NEXT:         (global.get $eqref)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (catch $e
  ;; OPT_O-NEXT:        (tuple.make 2
  ;; OPT_O-NEXT:         (pop i32)
  ;; OPT_O-NEXT:         (global.get $eq)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $try-catch (export "try-catch") (param i32 anyref) (result i32 eqref)
    try (result i32 eqref)
      local.get 0
      local.get 1
      br_on_cast 0 anyref eqref
      call $use-i32-any
      i32.const 0
      global.get $eqref
    catch $e
      global.get $eq
    end
  )

  ;; CHECK:      (func $try-catch_all (type $1) (param $0 i32) (param $1 anyref) (result i32 eqref)
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_3 i32)
  ;; CHECK-NEXT:  (local $scratch_4 i32)
  ;; CHECK-NEXT:  (local $scratch_5 (ref any))
  ;; CHECK-NEXT:  (local $scratch_6 eqref)
  ;; CHECK-NEXT:  (block $label (type $0) (result i32 eqref)
  ;; CHECK-NEXT:   (local.set $scratch_6
  ;; CHECK-NEXT:    (block $label0 (result eqref)
  ;; CHECK-NEXT:     (br $label
  ;; CHECK-NEXT:      (try (type $0) (result i32 eqref)
  ;; CHECK-NEXT:       (do
  ;; CHECK-NEXT:        (local.set $scratch_3
  ;; CHECK-NEXT:         (block (result i32)
  ;; CHECK-NEXT:          (local.set $scratch_4
  ;; CHECK-NEXT:           (local.get $0)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (local.set $scratch
  ;; CHECK-NEXT:           (local.get $1)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (local.get $scratch_4)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (local.set $scratch_5
  ;; CHECK-NEXT:         (br_on_cast $label0 anyref eqref
  ;; CHECK-NEXT:          (local.get $scratch)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (call $use-i32-any
  ;; CHECK-NEXT:         (local.get $scratch_3)
  ;; CHECK-NEXT:         (local.get $scratch_5)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (tuple.make 2
  ;; CHECK-NEXT:         (i32.const 0)
  ;; CHECK-NEXT:         (global.get $eqref)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (catch_all
  ;; CHECK-NEXT:        (tuple.make 2
  ;; CHECK-NEXT:         (i32.const 1)
  ;; CHECK-NEXT:         (global.get $eq)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 2
  ;; CHECK-NEXT:    (local.get $scratch_3)
  ;; CHECK-NEXT:    (local.get $scratch_6)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $try-catch_all (type $1) (param $0 i32) (param $1 anyref) (result i32 eqref)
  ;; OPT_O-NEXT:  (block $label (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:   (tuple.make 2
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (block $label0 (result eqref)
  ;; OPT_O-NEXT:     (br $label
  ;; OPT_O-NEXT:      (try (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:       (do
  ;; OPT_O-NEXT:        (call $use-i32-any
  ;; OPT_O-NEXT:         (local.get $0)
  ;; OPT_O-NEXT:         (br_on_cast $label0 anyref eqref
  ;; OPT_O-NEXT:          (local.get $1)
  ;; OPT_O-NEXT:         )
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:        (tuple.make 2
  ;; OPT_O-NEXT:         (i32.const 0)
  ;; OPT_O-NEXT:         (global.get $eqref)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (catch_all
  ;; OPT_O-NEXT:        (tuple.make 2
  ;; OPT_O-NEXT:         (i32.const 1)
  ;; OPT_O-NEXT:         (global.get $eq)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $try-catch_all (export "try-catch_all") (param i32 anyref) (result i32 eqref)
    try (result i32 eqref)
      local.get 0
      local.get 1
      br_on_cast 0 anyref eqref
      call $use-i32-any
      i32.const 0
      global.get $eqref
    catch_all
      i32.const 1
      global.get $eq
    end
  )

  ;; CHECK:      (func $try-delegate (type $1) (param $0 i32) (param $1 anyref) (result i32 eqref)
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_3 i32)
  ;; CHECK-NEXT:  (local $scratch_4 i32)
  ;; CHECK-NEXT:  (local $scratch_5 (ref any))
  ;; CHECK-NEXT:  (local $scratch_6 eqref)
  ;; CHECK-NEXT:  (block $label (type $0) (result i32 eqref)
  ;; CHECK-NEXT:   (local.set $scratch_6
  ;; CHECK-NEXT:    (block $label0 (result eqref)
  ;; CHECK-NEXT:     (br $label
  ;; CHECK-NEXT:      (try (type $0) (result i32 eqref)
  ;; CHECK-NEXT:       (do
  ;; CHECK-NEXT:        (local.set $scratch_3
  ;; CHECK-NEXT:         (block (result i32)
  ;; CHECK-NEXT:          (local.set $scratch_4
  ;; CHECK-NEXT:           (local.get $0)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (local.set $scratch
  ;; CHECK-NEXT:           (local.get $1)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (local.get $scratch_4)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (local.set $scratch_5
  ;; CHECK-NEXT:         (br_on_cast $label0 anyref eqref
  ;; CHECK-NEXT:          (local.get $scratch)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (call $use-i32-any
  ;; CHECK-NEXT:         (local.get $scratch_3)
  ;; CHECK-NEXT:         (local.get $scratch_5)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (tuple.make 2
  ;; CHECK-NEXT:         (i32.const 0)
  ;; CHECK-NEXT:         (global.get $eqref)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (delegate 2)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 2
  ;; CHECK-NEXT:    (local.get $scratch_3)
  ;; CHECK-NEXT:    (local.get $scratch_6)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $try-delegate (type $1) (param $0 i32) (param $1 anyref) (result i32 eqref)
  ;; OPT_O-NEXT:  (block $label (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:   (tuple.make 2
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (block $label0 (result eqref)
  ;; OPT_O-NEXT:     (br $label
  ;; OPT_O-NEXT:      (try (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:       (do
  ;; OPT_O-NEXT:        (call $use-i32-any
  ;; OPT_O-NEXT:         (local.get $0)
  ;; OPT_O-NEXT:         (br_on_cast $label0 anyref eqref
  ;; OPT_O-NEXT:          (local.get $1)
  ;; OPT_O-NEXT:         )
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:        (tuple.make 2
  ;; OPT_O-NEXT:         (i32.const 0)
  ;; OPT_O-NEXT:         (global.get $eqref)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (delegate 2)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $try-delegate (export "try-delegate") (param i32 anyref) (result i32 eqref)
    try (result i32 eqref)
      local.get 0
      local.get 1
      br_on_cast 0 anyref eqref
      call $use-i32-any
      i32.const 0
      global.get $eqref
    delegate 0
  )

  ;; CHECK:      (func $try-everything-params (type $1) (param $0 i32) (param $1 anyref) (result i32 eqref)
  ;; CHECK-NEXT:  (local $scratch i32)
  ;; CHECK-NEXT:  (local $scratch_3 anyref)
  ;; CHECK-NEXT:  (local $scratch_4 i32)
  ;; CHECK-NEXT:  (local $scratch_5 i32)
  ;; CHECK-NEXT:  (local $scratch_6 (ref any))
  ;; CHECK-NEXT:  (local $scratch_7 eqref)
  ;; CHECK-NEXT:  (local.set $scratch
  ;; CHECK-NEXT:   (local.get $0)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (block $label (type $0) (result i32 eqref)
  ;; CHECK-NEXT:   (local.set $scratch_7
  ;; CHECK-NEXT:    (block $label0 (result eqref)
  ;; CHECK-NEXT:     (br $label
  ;; CHECK-NEXT:      (try (type $0) (result i32 eqref)
  ;; CHECK-NEXT:       (do
  ;; CHECK-NEXT:        (local.set $scratch_4
  ;; CHECK-NEXT:         (block (result i32)
  ;; CHECK-NEXT:          (local.set $scratch_5
  ;; CHECK-NEXT:           (local.get $scratch)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (local.set $scratch_3
  ;; CHECK-NEXT:           (local.get $1)
  ;; CHECK-NEXT:          )
  ;; CHECK-NEXT:          (local.get $scratch_5)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (local.set $scratch_6
  ;; CHECK-NEXT:         (br_on_cast $label0 anyref eqref
  ;; CHECK-NEXT:          (local.get $scratch_3)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (call $use-i32-any
  ;; CHECK-NEXT:         (local.get $scratch_4)
  ;; CHECK-NEXT:         (local.get $scratch_6)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:        (tuple.make 2
  ;; CHECK-NEXT:         (i32.const 0)
  ;; CHECK-NEXT:         (global.get $eqref)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (catch $e
  ;; CHECK-NEXT:        (tuple.make 2
  ;; CHECK-NEXT:         (pop i32)
  ;; CHECK-NEXT:         (global.get $eqref)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (catch $e2
  ;; CHECK-NEXT:        (tuple.make 2
  ;; CHECK-NEXT:         (pop i32)
  ;; CHECK-NEXT:         (global.get $eqref)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (catch_all
  ;; CHECK-NEXT:        (tuple.make 2
  ;; CHECK-NEXT:         (i32.const 1)
  ;; CHECK-NEXT:         (global.get $eqref)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 2
  ;; CHECK-NEXT:    (local.get $scratch_4)
  ;; CHECK-NEXT:    (local.get $scratch_7)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $try-everything-params (type $1) (param $0 i32) (param $1 anyref) (result i32 eqref)
  ;; OPT_O-NEXT:  (block $label (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:   (tuple.make 2
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (block $label0 (result eqref)
  ;; OPT_O-NEXT:     (br $label
  ;; OPT_O-NEXT:      (try (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:       (do
  ;; OPT_O-NEXT:        (call $use-i32-any
  ;; OPT_O-NEXT:         (local.get $0)
  ;; OPT_O-NEXT:         (br_on_cast $label0 anyref eqref
  ;; OPT_O-NEXT:          (local.get $1)
  ;; OPT_O-NEXT:         )
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:        (tuple.make 2
  ;; OPT_O-NEXT:         (i32.const 0)
  ;; OPT_O-NEXT:         (global.get $eqref)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (catch $e
  ;; OPT_O-NEXT:        (tuple.make 2
  ;; OPT_O-NEXT:         (pop i32)
  ;; OPT_O-NEXT:         (global.get $eqref)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (catch $e2
  ;; OPT_O-NEXT:        (tuple.make 2
  ;; OPT_O-NEXT:         (pop i32)
  ;; OPT_O-NEXT:         (global.get $eqref)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (catch_all
  ;; OPT_O-NEXT:        (tuple.make 2
  ;; OPT_O-NEXT:         (i32.const 1)
  ;; OPT_O-NEXT:         (global.get $eqref)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $try-everything-params (export "try-everything-params") (param i32 anyref) (result i32 eqref)
    local.get 0
    try (param i32) (result i32 eqref)
      local.get 1
      br_on_cast 0 anyref eqref
      call $use-i32-any
      i32.const 0
      global.get $eqref
    catch $e
      global.get $eqref
    catch $e2
      global.get $eqref
    catch_all
      i32.const 1
      global.get $eqref
    end
  )

  ;; CHECK:      (func $try_table (type $1) (param $0 i32) (param $1 anyref) (result i32 eqref)
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_3 i32)
  ;; CHECK-NEXT:  (local $scratch_4 i32)
  ;; CHECK-NEXT:  (local $scratch_5 (ref any))
  ;; CHECK-NEXT:  (local $scratch_6 eqref)
  ;; CHECK-NEXT:  (block $label (type $0) (result i32 eqref)
  ;; CHECK-NEXT:   (local.set $scratch_6
  ;; CHECK-NEXT:    (block $label0 (result eqref)
  ;; CHECK-NEXT:     (br $label
  ;; CHECK-NEXT:      (try_table (type $0) (result i32 eqref)
  ;; CHECK-NEXT:       (local.set $scratch_3
  ;; CHECK-NEXT:        (block (result i32)
  ;; CHECK-NEXT:         (local.set $scratch_4
  ;; CHECK-NEXT:          (local.get $0)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (local.set $scratch
  ;; CHECK-NEXT:          (local.get $1)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (local.get $scratch_4)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.set $scratch_5
  ;; CHECK-NEXT:        (br_on_cast $label0 anyref eqref
  ;; CHECK-NEXT:         (local.get $scratch)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (call $use-i32-any
  ;; CHECK-NEXT:        (local.get $scratch_3)
  ;; CHECK-NEXT:        (local.get $scratch_5)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (tuple.make 2
  ;; CHECK-NEXT:        (i32.const 0)
  ;; CHECK-NEXT:        (global.get $eqref)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 2
  ;; CHECK-NEXT:    (local.get $scratch_3)
  ;; CHECK-NEXT:    (local.get $scratch_6)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $try_table (type $1) (param $0 i32) (param $1 anyref) (result i32 eqref)
  ;; OPT_O-NEXT:  (block $label (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:   (tuple.make 2
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (block $label0 (result eqref)
  ;; OPT_O-NEXT:     (br $label
  ;; OPT_O-NEXT:      (try_table (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:       (call $use-i32-any
  ;; OPT_O-NEXT:        (local.get $0)
  ;; OPT_O-NEXT:        (br_on_cast $label0 anyref eqref
  ;; OPT_O-NEXT:         (local.get $1)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (tuple.make 2
  ;; OPT_O-NEXT:        (i32.const 0)
  ;; OPT_O-NEXT:        (global.get $eqref)
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $try_table (export "try_table") (param i32 anyref) (result i32 eqref)
    try_table (result i32 eqref)
      local.get 0
      local.get 1
      br_on_cast 0 anyref eqref
      call $use-i32-any
      i32.const 0
      global.get $eqref
    end
  )

  ;; CHECK:      (func $try_table-params (type $1) (param $0 i32) (param $1 anyref) (result i32 eqref)
  ;; CHECK-NEXT:  (local $scratch i32)
  ;; CHECK-NEXT:  (local $scratch_3 anyref)
  ;; CHECK-NEXT:  (local $scratch_4 i32)
  ;; CHECK-NEXT:  (local $scratch_5 i32)
  ;; CHECK-NEXT:  (local $scratch_6 (ref any))
  ;; CHECK-NEXT:  (local $scratch_7 eqref)
  ;; CHECK-NEXT:  (local.set $scratch
  ;; CHECK-NEXT:   (local.get $0)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (block $label (type $0) (result i32 eqref)
  ;; CHECK-NEXT:   (local.set $scratch_7
  ;; CHECK-NEXT:    (block $label0 (result eqref)
  ;; CHECK-NEXT:     (br $label
  ;; CHECK-NEXT:      (try_table (type $0) (result i32 eqref)
  ;; CHECK-NEXT:       (local.set $scratch_4
  ;; CHECK-NEXT:        (block (result i32)
  ;; CHECK-NEXT:         (local.set $scratch_5
  ;; CHECK-NEXT:          (local.get $scratch)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (local.set $scratch_3
  ;; CHECK-NEXT:          (local.get $1)
  ;; CHECK-NEXT:         )
  ;; CHECK-NEXT:         (local.get $scratch_5)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.set $scratch_6
  ;; CHECK-NEXT:        (br_on_cast $label0 anyref eqref
  ;; CHECK-NEXT:         (local.get $scratch_3)
  ;; CHECK-NEXT:        )
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (call $use-i32-any
  ;; CHECK-NEXT:        (local.get $scratch_4)
  ;; CHECK-NEXT:        (local.get $scratch_6)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (tuple.make 2
  ;; CHECK-NEXT:        (i32.const 0)
  ;; CHECK-NEXT:        (global.get $eq)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 2
  ;; CHECK-NEXT:    (local.get $scratch_4)
  ;; CHECK-NEXT:    (local.get $scratch_7)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $try_table-params (type $1) (param $0 i32) (param $1 anyref) (result i32 eqref)
  ;; OPT_O-NEXT:  (block $label (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:   (tuple.make 2
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (block $label0 (result eqref)
  ;; OPT_O-NEXT:     (br $label
  ;; OPT_O-NEXT:      (try_table (type $3) (result i32 (ref eq))
  ;; OPT_O-NEXT:       (call $use-i32-any
  ;; OPT_O-NEXT:        (local.get $0)
  ;; OPT_O-NEXT:        (br_on_cast $label0 anyref eqref
  ;; OPT_O-NEXT:         (local.get $1)
  ;; OPT_O-NEXT:        )
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:       (tuple.make 2
  ;; OPT_O-NEXT:        (i32.const 0)
  ;; OPT_O-NEXT:        (global.get $eq)
  ;; OPT_O-NEXT:       )
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $try_table-params (export "try_table-params") (param i32 anyref) (result i32 eqref)
    local.get 0
    try_table (param i32) (result i32 eqref)
      local.get 1
      br_on_cast 0 anyref eqref
      call $use-i32-any
      i32.const 0
      global.get $eq
    end
  )

  ;; CHECK:      (func $branch-to-func (type $1) (param $0 i32) (param $1 anyref) (result i32 eqref)
  ;; CHECK-NEXT:  (local $scratch anyref)
  ;; CHECK-NEXT:  (local $scratch_3 i32)
  ;; CHECK-NEXT:  (local $scratch_4 i32)
  ;; CHECK-NEXT:  (local $scratch_5 (ref any))
  ;; CHECK-NEXT:  (local $scratch_6 i32)
  ;; CHECK-NEXT:  (local $scratch_7 eqref)
  ;; CHECK-NEXT:  (block $label (type $0) (result i32 eqref)
  ;; CHECK-NEXT:   (local.set $scratch_7
  ;; CHECK-NEXT:    (block $label0 (result eqref)
  ;; CHECK-NEXT:     (local.set $scratch_3
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_4
  ;; CHECK-NEXT:        (local.get $0)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.set $scratch
  ;; CHECK-NEXT:        (local.get $1)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_4)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (local.set $scratch_5
  ;; CHECK-NEXT:      (br_on_cast $label0 anyref eqref
  ;; CHECK-NEXT:       (local.get $scratch)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (global.set $i32
  ;; CHECK-NEXT:      (block (result i32)
  ;; CHECK-NEXT:       (local.set $scratch_6
  ;; CHECK-NEXT:        (local.get $scratch_3)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (global.set $any
  ;; CHECK-NEXT:        (local.get $scratch_5)
  ;; CHECK-NEXT:       )
  ;; CHECK-NEXT:       (local.get $scratch_6)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:     (br $label
  ;; CHECK-NEXT:      (tuple.make 2
  ;; CHECK-NEXT:       (i32.const 0)
  ;; CHECK-NEXT:       (global.get $eqref)
  ;; CHECK-NEXT:      )
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (tuple.make 2
  ;; CHECK-NEXT:    (local.get $scratch_3)
  ;; CHECK-NEXT:    (local.get $scratch_7)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; OPT_O:      (func $branch-to-func (type $1) (param $0 i32) (param $1 anyref) (result i32 eqref)
  ;; OPT_O-NEXT:  (block $label (type $0) (result i32 eqref)
  ;; OPT_O-NEXT:   (tuple.make 2
  ;; OPT_O-NEXT:    (local.get $0)
  ;; OPT_O-NEXT:    (block $label0 (result eqref)
  ;; OPT_O-NEXT:     (global.set $any
  ;; OPT_O-NEXT:      (br_on_cast $label0 anyref eqref
  ;; OPT_O-NEXT:       (local.get $1)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (global.set $i32
  ;; OPT_O-NEXT:      (local.get $0)
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:     (br $label
  ;; OPT_O-NEXT:      (tuple.make 2
  ;; OPT_O-NEXT:       (i32.const 0)
  ;; OPT_O-NEXT:       (global.get $eqref)
  ;; OPT_O-NEXT:      )
  ;; OPT_O-NEXT:     )
  ;; OPT_O-NEXT:    )
  ;; OPT_O-NEXT:   )
  ;; OPT_O-NEXT:  )
  ;; OPT_O-NEXT: )
  (func $branch-to-func (export "branch-to-func") (param i32 anyref) (result i32 eqref)
    local.get 0
    local.get 1
    br_on_cast 0 anyref eqref
    global.set $any
    global.set $i32
    i32.const 0
    global.get $eqref
  )
)
