(module (memory (shared 256 256)) (type $i (func (param i32))) (type $ii (func (param i32 i32))) (type $iii (func (param i32 i32 i32))) (type $3 (func)) (table 1 1 funcref) (elem (i32.const 0) $call-i) (func $call-i (type $i) (param $0 i32) (nop) ) (func $call-ii (type $ii) (param $0 i32) (param $1 i32) (nop) ) (func $call-iii (type $iii) (param $0 i32) (param $1 i32) (param $2 i32) (nop) ) (func $b0-yes (type $i) (param $i1 i32) (block $topmost (block $block0 (drop (i32.const 10) ) ) ) ) (func $b0-no (type $i) (param $i1 i32) (block $topmost (block $block0 (br $block0) ) (br $topmost) ) ) (func $b0-br-but-ok (type $i) (param $i1 i32) (block $topmost (block $block0 (br $topmost) ) ) ) (func $b1-yes (type $i) (param $i1 i32) (block $topmost (block $block0 (block $block1 (drop (i32.const 10) ) ) ) ) ) (func $b2-yes (type $i) (param $i1 i32) (block $topmost (drop (i32.const 5) ) (block $block0 (drop (i32.const 10) ) ) (drop (i32.const 15) ) ) ) (func $b3-yes (type $i) (param $i1 i32) (block $topmost (drop (i32.const 3) ) (block $block0 (drop (i32.const 6) ) (block $block1 (drop (i32.const 10) ) ) (drop (i32.const 15) ) ) (drop (i32.const 20) ) ) ) (func $b4 (type $i) (param $i1 i32) (block $topmost (block $inner (drop (i32.const 10) ) (br $inner) ) ) ) (func $b5 (type $i) (param $i1 i32) (block $topmost (block $middle (block $inner (drop (i32.const 10) ) (br $inner) ) (br $middle) ) ) ) (func $b6 (type $i) (param $i1 i32) (block $topmost (drop (i32.const 5) ) (block $inner (drop (i32.const 10) ) (br $inner) ) (drop (i32.const 15) ) ) ) (func $b7 (type $i) (param $i1 i32) (block $topmost (drop (i32.const 3) ) (block $middle (drop (i32.const 6) ) (block $inner (drop (i32.const 10) ) (br $inner) ) (drop (i32.const 15) ) (br $middle) ) (drop (i32.const 20) ) ) ) (func $unary (type $3) (local $x i32) (drop (i32.eqz (block $block0 (result i32) (i32.const 10) ) ) ) (drop (i32.eqz (block $block1 (result i32) (drop (i32.const 10) ) (i32.const 20) ) ) ) (drop (i32.eqz (block $block2 (result i32) (drop (i32.const 10) ) (drop (i32.const 20) ) (i32.const 30) ) ) ) (local.set $x (block $block3 (result i32) (drop (i32.const 10) ) (i32.const 20) ) ) (drop (i32.load (block $block4 (result i32) (drop (i32.const 10) ) (i32.const 20) ) ) ) (return (block $block5 (drop (i32.const 10) ) (unreachable) ) ) ) (func $binary (type $3) (drop (i32.add (block $block0 (result i32) (i32.const 10) ) (i32.const 20) ) ) (drop (i32.add (block $block1 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (i32.const 30) ) ) (drop (i32.add (block $block2 (result i32) (drop (i32.const 10) ) (drop (i32.const 20) ) (i32.const 30) ) (i32.const 40) ) ) (drop (i32.add (i32.const 10) (block $block3 (result i32) (i32.const 20) ) ) ) (drop (i32.add (i32.const 10) (block $block4 (result i32) (drop (i32.const 20) ) (i32.const 30) ) ) ) (drop (i32.add (i32.const 10) (block $block5 (result i32) (drop (i32.const 20) ) (drop (i32.const 30) ) (i32.const 40) ) ) ) (drop (i32.add (block $block6 (result i32) (i32.const 10) ) (block $block7 (result i32) (i32.const 20) ) ) ) (drop (i32.add (block $block8 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (block $block9 (result i32) (drop (i32.const 30) ) (i32.const 40) ) ) ) (drop (i32.add (block $block10 (result i32) (drop (i32.const 10) ) (drop (i32.const 20) ) (i32.const 30) ) (block $block11 (result i32) (drop (i32.const 40) ) (drop (i32.const 50) ) (i32.const 60) ) ) ) (i32.store (i32.const 10) (block $block12 (result i32) (drop (i32.const 20) ) (i32.const 30) ) ) (i32.store (block $block13 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (i32.const 30) ) (drop (i32.add (unreachable) (block $block14 (result i32) (drop (i32.const 10) ) (i32.const 20) ) ) ) (drop (i32.add (block $block15 (result i32) (unreachable) (i32.const 10) ) (block $block16 (result i32) (drop (i32.const 20) ) (i32.const 30) ) ) ) ) (func $trinary (type $3) (drop (select (block $block0 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (block $block1 (result i32) (drop (i32.const 30) ) (i32.const 40) ) (block $block2 (result i32) (drop (i32.const 50) ) (i32.const 60) ) ) ) (drop (select (block $block3 (result i32) (i32.const 10) ) (block $block4 (result i32) (drop (i32.const 20) ) (i32.const 30) ) (block $block5 (result i32) (drop (i32.const 40) ) (i32.const 50) ) ) ) (drop (select (block $block6 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (block $block7 (result i32) (i32.const 30) ) (block $block8 (result i32) (drop (i32.const 40) ) (i32.const 50) ) ) ) (drop (select (block $block9 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (block $block10 (result i32) (drop (i32.const 30) ) (i32.const 40) ) (block $block11 (result i32) (i32.const 50) ) ) ) (drop (select (block $block12 (result i32) (i32.const 10) ) (block $block13 (result i32) (i32.const 20) ) (block $block14 (result i32) (drop (i32.const 30) ) (i32.const 40) ) ) ) (drop (select (block $block15 (result i32) (i32.const 10) ) (block $block16 (result i32) (drop (i32.const 20) ) (i32.const 30) ) (block $block17 (result i32) (i32.const 40) ) ) ) (drop (select (block $block18 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (block $block19 (result i32) (i32.const 30) ) (block $block20 (result i32) (i32.const 40) ) ) ) (drop (select (block $block21 (result i32) (unreachable) (i32.const 20) ) (block $block22 (result i32) (drop (i32.const 30) ) (i32.const 40) ) (block $block23 (result i32) (drop (i32.const 50) ) (i32.const 60) ) ) ) (drop (select (block $block24 (result i32) (drop (i32.const 10) ) (unreachable) ) (block $block25 (result i32) (drop (i32.const 30) ) (i32.const 40) ) (block $block26 (result i32) (drop (i32.const 50) ) (i32.const 60) ) ) ) (drop (select (block $block27 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (block $block28 (result i32) (unreachable) (i32.const 40) ) (block $block29 (result i32) (drop (i32.const 50) ) (i32.const 60) ) ) ) (drop (select (block $block30 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (block $block31 (result i32) (drop (i32.const 30) ) (unreachable) ) (block $block32 (result i32) (drop (i32.const 50) ) (i32.const 60) ) ) ) (drop (select (block $block33 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (block $block34 (result i32) (drop (i32.const 30) ) (i32.const 40) ) (block $block35 (result i32) (unreachable) (i32.const 60) ) ) ) (drop (select (block $block36 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (block $block37 (result i32) (drop (i32.const 30) ) (i32.const 40) ) (block $block38 (result i32) (drop (i32.const 50) ) (unreachable) ) ) ) ) (func $breaks (type $3) (block $out (block (drop (block $block0 (result i32) (drop (i32.const 10) ) (i32.const 20) ) ) (br $out) ) (br_if $out (block $block1 (result i32) (drop (i32.const 10) ) (i32.const 20) ) ) (block (drop (block $block2 (result i32) (drop (i32.const 10) ) (i32.const 20) ) ) (br_if $out (block $block3 (result i32) (drop (i32.const 30) ) (i32.const 40) ) ) ) (br_table $out $out (block $block4 (result i32) (drop (i32.const 10) ) (i32.const 20) ) ) (drop (block $out2 (result i32) (br_table $out2 $out2 (block $block5 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (block $block6 (result i32) (drop (i32.const 30) ) (i32.const 40) ) ) ) ) (unreachable) ) ) (func $calls (type $3) (call $call-i (block $block0 (result i32) (i32.const 10) ) ) (call $call-i (block $block1 (result i32) (drop (i32.const 10) ) (i32.const 20) ) ) (call $call-i (block $block2 (result i32) (drop (i32.const 10) ) (drop (i32.const 20) ) (i32.const 30) ) ) (call $call-ii (block $block3 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (block $block4 (result i32) (drop (i32.const 30) ) (i32.const 40) ) ) (call $call-ii (block $block5 (result i32) (unreachable) (i32.const 10) ) (block $block6 (result i32) (drop (i32.const 20) ) (i32.const 30) ) ) (call $call-ii (block $block7 (result i32) (drop (i32.const 10) ) (unreachable) ) (block $block8 (result i32) (drop (i32.const 20) ) (i32.const 30) ) ) (call $call-ii (block $block9 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (block $block10 (result i32) (unreachable) (i32.const 30) ) ) (call $call-ii (block $block11 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (block $block12 (result i32) (drop (i32.const 30) ) (unreachable) ) ) (call $call-iii (block $block13 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (block $block14 (result i32) (drop (i32.const 30) ) (i32.const 40) ) (block $block15 (result i32) (drop (i32.const 50) ) (i32.const 60) ) ) (call $call-iii (block $block16 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (i32.const 30) (block $block17 (result i32) (drop (i32.const 40) ) (i32.const 50) ) ) (call_indirect (type $ii) (block $block18 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (block $block19 (result i32) (drop (i32.const 30) ) (i32.const 40) ) (block $block20 (result i32) (drop (i32.const 50) ) (i32.const 60) ) ) (call_indirect (type $ii) (unreachable) (block $block21 (result i32) (drop (i32.const 30) ) (i32.const 40) ) (block $block22 (result i32) (drop (i32.const 50) ) (i32.const 60) ) ) (call_indirect (type $ii) (block $block21 (result i32) (drop (i32.const 31) ) (i32.const 41) ) (unreachable) (block $block22 (result i32) (drop (i32.const 51) ) (i32.const 61) ) ) (call_indirect (type $ii) (block $block21 (result i32) (drop (i32.const 32) ) (i32.const 42) ) (block $block22 (result i32) (drop (i32.const 52) ) (i32.const 62) ) (unreachable) ) ) (func $atomics (type $3) (drop (i32.atomic.rmw.cmpxchg ;; mergeblock logic should be same as select (block $block0 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (block $block1 (result i32) (drop (i32.const 30) ) (i32.const 40) ) (block $block2 (result i32) (drop (i32.const 50) ) (i32.const 60) ) ) ) (drop (i32.atomic.rmw.add ;; atomicrmw is like a binary (block $block1 (result i32) (drop (i32.const 10) ) (i32.const 20) ) (i32.const 30) ) ) ) (func $mix-select (param $x i32) (drop (select (local.get $x) (local.get $x) (block (result i32) (local.set $x ;; cannot be moved before the gets (i32.const 1) ) (i32.const 2) ) ) ) ) (func $block-type-change (type $3) (local $0 f64) (local $1 f64) (if (f64.gt (local.get $0) (block $block0 (result f64) (nop) (local.get $1) ) ) (nop) ) ) (func $do-reorder (param $x i32) (local $y i32) (if (i32.const 1) (block (local.set $x (i32.le_u (local.get $x) (block (result i32) (local.set $y (i32.const 5)) (i32.const 10) ) ) ) ) ) ) (func $do-not-reorder (param $x i32) (local $y i32) (if (i32.const 1) (block (local.set $x (i32.le_u (local.get $y) (block (result i32) (local.set $y (i32.const 5)) (i32.const 10) ) ) ) ) ) ) (func $return-different-type (result i32) (drop (f64.abs (return (block (result i32) ;; when we flip the block out, it should have an ok type for the (dead) f64 op (drop (i32.const 2)) (i32.const 1) ) ) ) ) (unreachable) ) (func $drop-unreachable (result i32) (local $0 i32) (block $label$1 (result i32) (drop (block (result i32) (unreachable) ) ) (unreachable) ) ) (func $concrete_finale_in_unreachable (result f64) (block $label$0 (result f64) (drop (block (result f64) (unreachable) (f64.const 6.322092475576799e-96) ) ) (f64.const -1) ) ) (func $dont-move-unreachable (loop $label$0 (drop (block $label$3 (result i32) (br $label$0) (i32.const 1) ) ) ) ) (func $dont-move-unreachable-last (loop $label$0 (drop (block $label$3 (result i32) (call $dont-move-unreachable-last) (br $label$0) ) ) ) ) (func $move-around-unreachable-in-middle (loop $label$0 (drop (block $label$2 (result i32) (block $block2 (nop) ) (block $label$3 (result i32) (drop (br_if $label$3 (br $label$0) (i32.const 0) ) ) (i32.const 1) ) ) ) ) ) (func $drop-unreachable-block-with-concrete-final (drop (block (result i32) (drop (block (drop (return) ) ) ) (i32.const -452) ) ) ) (func $merging-with-unreachable-in-middle (result i32) (block $label$1 (result i32) (block (result i32) (return (i32.const 21536) ) (block $label$15 (br $label$15) ) (i32.const 19299) ) ) ) (func $remove-br-after-unreachable (block $label$9 (drop (block (block (return) (br $label$9) ;; removing this leads to the block becoming unreachable ) ) ) ) ) (func $block-tails (block $l1 (drop (i32.const -2)) (drop (i32.const -1)) (br $l1) (drop (i32.const 0)) (drop (i32.const 1)) ) (block $l2 (br_if $l2 (i32.const 2)) (drop (i32.const 3)) ) (block $b1 (block $l3 (br_if $b1 (i32.const 4)) (br_if $l3 (i32.const 5)) (drop (i32.const 6)) ) ) (block $b2 (block $l4 (br_if $l4 (i32.const 7)) (br_if $b2 (i32.const 8)) (drop (i32.const 9)) ) ) (block $l5 (if (i32.const 10) (br_if $l5 (i32.const 11)) ) (drop (i32.const 12)) ) (block $l6 (block $l7 (block $l8 (br_if $l6 (i32.const 13)) (br_if $l7 (i32.const 14)) (br_if $l8 (i32.const 15)) (drop (i32.const 16)) ) ) ) (block $l9 (block $l10 (block $l11 (br_if $l11 (i32.const 17)) (br_if $l10 (i32.const 18)) (br_if $l9 (i32.const 19)) (drop (i32.const 20)) ) ) ) (block $l12 (block $l13 (block $l14 (br_if $l12 (i32.const 21)) (br_if $l13 (i32.const 22)) (br_if $l14 (i32.const 23)) (drop (i32.const 24)) ) (drop (i32.const 25)) ) (drop (i32.const 26)) ) (block $l15 (block $l16 (block $l17 (drop (i32.const 27)) (br_if $l17 (i32.const 28)) (drop (i32.const 29)) ) (br_if $l16 (i32.const 30)) (drop (i32.const 31)) ) (br_if $l15 (i32.const 32)) (drop (i32.const 33)) ) ) (func $loop-tails (loop $l1 (drop (i32.const -2)) (drop (i32.const -1)) (br $l1) (drop (i32.const 0)) (drop (i32.const 1)) ) (loop $l2 (br_if $l2 (i32.const 2)) (drop (i32.const 3)) ) (block $b1 (loop $l3 (br_if $b1 (i32.const 4)) (br_if $l3 (i32.const 5)) (drop (i32.const 6)) ) ) (block $b2 (loop $l4 (br_if $l4 (i32.const 7)) (br_if $b2 (i32.const 8)) (drop (i32.const 9)) ) ) (loop $l5 (if (i32.const 10) (br_if $l5 (i32.const 11)) ) (drop (i32.const 12)) ) (loop $l6 (loop $l7 (loop $l8 (br_if $l6 (i32.const 13)) (br_if $l7 (i32.const 14)) (br_if $l8 (i32.const 15)) (drop (i32.const 16)) ) ) ) (loop $l9 (loop $l10 (loop $l11 (br_if $l11 (i32.const 17)) (br_if $l10 (i32.const 18)) (br_if $l9 (i32.const 19)) (drop (i32.const 20)) ) ) ) (loop $l12 (loop $l13 (loop $l14 (br_if $l12 (i32.const 21)) (br_if $l13 (i32.const 22)) (br_if $l14 (i32.const 23)) (drop (i32.const 24)) ) (drop (i32.const 25)) ) (drop (i32.const 26)) ) (loop $l15 (loop $l16 (loop $l17 (drop (i32.const 27)) (br_if $l17 (i32.const 28)) (drop (i32.const 29)) ) (br_if $l16 (i32.const 30)) (drop (i32.const 31)) ) (br_if $l15 (i32.const 32)) (drop (i32.const 33)) ) ) (func $block-tail-one (block $outer (block $l1 (drop (i32.const -2)) (drop (i32.const -1)) (br $l1) (drop (i32.const 0)) (drop (i32.const 1)) ) (drop (i32.const 2)) ) ) (func $loop-tail-one (block $outer (loop $l1 (drop (i32.const -2)) (drop (i32.const -1)) (br $l1) (drop (i32.const 0)) (drop (i32.const 1)) ) (drop (i32.const 2)) ) ) (func $block-tail-value (result i32) (block $outer (result i32) (block $l1 (result i32) (drop (i32.const -1)) (br $l1 (i32.const 0)) (drop (i32.const 1)) (i32.const 2) ) ) ) (func $block-tail-empty (block $outer (block $l1 (drop (i32.const -1)) (br $l1) ) ) ) (func $loop-tail-empty (block $outer (loop $l1 (drop (i32.const -1)) (br $l1) ) ) ) (func $block-tail-unreachable (result i32) (block $outer (result i32) (block $l1 (result i32) (drop (i32.const -1)) (drop (br_if $l1 (i32.const 0) (i32.const 1))) (drop (i32.const 1)) (unreachable) ) ) ) (func $loop-tail-unreachable (result i32) (block $outer (result i32) (loop $l1 (result i32) (drop (i32.const -1)) (br_if $l1 (i32.const 1)) (drop (i32.const 1)) (unreachable) ) ) ) ) (module (func $unreachable-in-sub-block (param $0 f64) (param $1 i32) (result i32) (local $2 i32) (local $9 i32) (loop $label$1 (local.set $9 (local.tee $2 (block $label$2 (result i32) (block (drop (br_if $label$2 (local.tee $2 (i32.const 0) ) (i32.const 0) ) ) ) (br_if $label$1 (i32.const 0) ) (block (unreachable) (nop) ;; bad if moved out to the outer block which is i32. current state works since this block is unreachable! ) ) ) ) ) (nop) (local.get $9) ) (func $trivial (result i32) (block (result i32) (block (unreachable) (nop) ) ) ) (func $trivial-more (result i32) (block (result i32) (block (nop) (unreachable) (nop) (nop) (nop) ) (block (nop) (unreachable) (nop) ) ) ) ) (module (func $merge-some-block (block $b1 (drop (i32.const 1)) (br_if $b1 (i32.const 0)) ) (block $b2 (br_if $b2 (i32.const 0)) (drop (i32.const 2)) ) (block $b3 (drop (i32.const 3)) (br_if $b3 (i32.const 0)) (drop (i32.const 4)) ) (block $b3-dead-code-so-ignore (drop (i32.const 3)) (br $b3-dead-code-so-ignore) (drop (i32.const 4)) ) (block $b4 (drop (i32.const 5)) (br_if $b4 (i32.const 0)) (drop (i32.const 6)) (br_if $b4 (i32.const 0)) ) (block $b5 (br_if $b5 (i32.const 0)) (drop (i32.const 7)) (br_if $b5 (i32.const 0)) (drop (i32.const 8)) ) (block $b6 (drop (i32.const 9)) (drop (i32.const 10)) (br_if $b6 (i32.const 0)) ) ) (func $merge-some-loop (loop $l1 (block $b1 (drop (i32.const 1)) (br_if $b1 (i32.const 0)) ) ) (loop $l2 (block $b2 (br_if $b2 (i32.const 0)) (drop (i32.const 2)) ) ) (loop $l3 (block $b3 (drop (i32.const 3)) (br_if $b3 (i32.const 0)) (drop (i32.const 4)) ) ) (loop $l4 (block $b4 (drop (i32.const 5)) (br_if $b4 (i32.const 0)) (drop (i32.const 6)) (br_if $b4 (i32.const 0)) ) ) (loop $l5 (block $b5 (br_if $b5 (i32.const 0)) (drop (i32.const 7)) (br_if $b5 (i32.const 0)) (drop (i32.const 8)) ) ) (loop $l6 (block $b6 (drop (i32.const 9)) (drop (i32.const 10)) (br_if $b6 (i32.const 0)) ) ) ) (func $merge-some-loop-taken (loop $l1 (block $b1 (drop (i32.const 1)) (br_if $l1 (i32.const 0)) (drop (i32.const 2)) (br_if $b1 (i32.const 0)) (drop (i32.const 3)) ) ) (loop $l2 (block $b2 (drop (i32.const 4)) (br_if $b2 (i32.const 0)) (drop (i32.const 5)) (br_if $l2 (i32.const 0)) (drop (i32.const 6)) ) ) (loop $l3 (block $b3 (drop (i32.const 7)) (br_if $b3 (i32.const 0)) (drop (i32.const 8)) (br_if $l3 (i32.const 0)) ) ) (loop $l4 (block $b4 (br_if $l4 (i32.const 0)) (drop (i32.const 9)) (br_if $b4 (i32.const 0)) (drop (i32.const 10)) ) ) (loop $l5 (block $b5 (drop (i32.const 7)) (br_if $b5 (i32.const 0)) (br_if $l5 (i32.const 0)) ) ) (loop $l6 (block $b6 (br_if $l6 (i32.const 0)) (br_if $b6 (i32.const 0)) (drop (i32.const 10)) ) ) (loop $l7 (block $b7 (drop (i32.const 11)) (br_if $l7 (i32.const 0)) (br_if $b7 (i32.const 0)) (drop (i32.const 13)) ) ) (loop $l8 (block $b8 (drop (i32.const 14)) (br_if $b8 (i32.const 0)) (br_if $l8 (i32.const 0)) (drop (i32.const 16)) ) ) (loop $l9 (block $b9 (drop (i32.const 17)) (br_if $l9 (i32.const 0)) (drop (i32.const 18)) (br_if $l9 (i32.const 0)) (drop (i32.const 19)) ) ) (loop $l10 (block $b10 (drop (i32.const 20)) (br_if $l10 (i32.const 0)) (drop (i32.const 21)) ) ) (loop $l11 (block $b11 (br_if $l11 (i32.const 0)) (drop (i32.const 23)) ) ) (loop $l12 (block $b12 (drop (i32.const 24)) (br_if $l12 (i32.const 0)) ) ) ) ) (module (event $e (attr 0) (param i32)) (func $foo) ;; 'nop' within 'block' of `throw' can be hoisted (func $throw (throw $e (block (result i32) (nop) (i32.const 3) ) ) ) ;; 'call $foo' within 'block' of `rethrow' can be hoisted (func $rethrow (local $0 exnref) (rethrow (block (result exnref) (call $foo) (local.get $0) ) ) ) ;; 'call $foo' within 'block' of `br_on_exn' can be hoisted (func $br_on_exn (result i32) (local $0 exnref) (block $label$0 (result i32) (drop (br_on_exn $label$0 $e (block (result exnref) (call $foo) (local.get $0) ) ) ) (i32.const 3) ) ) ;; Unlike br_if, br_on_exn's exnref argument itself cannot be extracted. ;; Without proper handling for br_on_exn in ProblemFinder, this crashes. (func $cannot_extract_br_on_exn_exnref (local $0 exnref) (block (drop (block $label$0 (result i32) (drop (br_on_exn $label$0 $e (local.get $0) ) ) (i32.const 5) ) ) ) ) )