(module (type $none_=>_none (func)) (type $none_=>_i32 (func (result i32))) (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) (type $none_=>_exnref (func (result exnref))) (event $e (attr 0) (param)) (func $ifs (if (i32.const 0) (nop) ) (block (drop (i32.const 0) ) (nop) ) (if (i32.const 0) (nop) (unreachable) ) (drop (block (result i32) (drop (i32.const 0) ) (i32.add (i32.const 1) (i32.const 2) ) ) ) (drop (if (result i32) (i32.const 0) (i32.add (i32.const 1) (i32.const 2) ) (i32.add (i32.const 1) (i32.const 333333333) ) ) ) ) (func $ifs-blocks (block (drop (i32.const 0) ) (block (nop) ) ) (block (if (i32.const 0) (unreachable) (block ) ) (nop) ) (block (if (i32.const 0) (block ) (unreachable) ) (nop) ) (if (i32.const 0) (block (nop) (unreachable) ) (nop) ) (if (i32.const 0) (nop) (block (nop) (unreachable) ) ) ) (func $ifs-blocks-big (block (drop (i32.const 0) ) (block (drop (i32.add (i32.const 1) (i32.const 2) ) ) ) ) (block (if (i32.const 0) (unreachable) (block ) ) (drop (i32.add (i32.const 1) (i32.const 2) ) ) ) (block (if (i32.const 0) (block ) (unreachable) ) (drop (i32.add (i32.const 1) (i32.const 2) ) ) ) (if (i32.const 0) (block (drop (i32.add (i32.const 1) (i32.const 2) ) ) (unreachable) ) (drop (i32.add (i32.const 1) (i32.const 2) ) ) ) (if (i32.const 0) (drop (i32.add (i32.const 1) (i32.const 2) ) ) (block (drop (i32.add (i32.const 1) (i32.const 2) ) ) (unreachable) ) ) ) (func $ifs-blocks-long (block (if (i32.const 1) (block (drop (i32.const -1234) ) (drop (i32.const -1000) ) ) (drop (i32.const 999) ) ) (drop (i32.const 1) ) (nop) (unreachable) ) (drop (block (result i32) (if (i32.const 2) (block (drop (i32.const -1234) ) (drop (i32.const -1000) ) ) (drop (i32.const 999) ) ) (drop (i32.const 1) ) (nop) (unreachable) (i32.const 2) ) ) (drop (block (result i32) (if (i32.const 3) (block (drop (i32.const -1234) ) (drop (i32.const -1000) ) ) (drop (i32.const 999) ) ) (drop (i32.const 1) ) (nop) (i32.const 2) ) ) ) (func $if-worth-it-i-dunno (block $folding-inner0 (block (if (i32.const 0) (if (i32.const 0) (block (drop (i32.const -1234) ) (drop (i32.const -1000) ) (br $folding-inner0) ) (block (drop (i32.const 999) ) (drop (i32.const 1) ) (br $folding-inner0) ) ) ) (if (i32.const 0) (block (if (i32.const 0) (block (drop (i32.const -1234) ) (drop (i32.const -1000) ) ) (block (drop (i32.const 999) ) (drop (i32.const 1) ) ) ) (unreachable) (br $folding-inner0) ) ) (if (i32.const 0) (block (if (i32.const 0) (block ) (block (drop (i32.const 999) ) (drop (i32.const 1) ) ) ) (br $folding-inner0) ) ) (if (i32.const 0) (block (if (i32.const 0) (block (drop (i32.const -1234) ) (drop (i32.const -1000) ) ) (block ) ) (br $folding-inner0) ) ) (block (block (if (i32.const 9999) (block (drop (i32.const -51234) ) (drop (i32.const -51000) ) ) (block (drop (i32.const 5999) ) (drop (i32.const 51) ) ) ) (br $folding-inner0) ) ) (drop (block (result i32) (block (result i32) (if (i32.const 9999) (block (drop (i32.const -51234) ) (drop (i32.const -51000) ) ) (block (drop (i32.const 5999) ) (drop (i32.const 51) ) ) ) (unreachable) (i32.const 10) ) ) ) (block (drop (if (result i32) (i32.const 9999) (block (result i32) (drop (i32.const -51234) ) (drop (i32.const -51000) ) (unreachable) (i32.const 10) ) (block (result i32) (drop (i32.const 5999) ) (drop (i32.const 51) ) (unreachable) (i32.const 10) ) ) ) ) ) ) (unreachable) (unreachable) ) (func $no-grandparent (if (i32.const 9999) (block (drop (i32.const -51234) ) (drop (i32.const -51000) ) (unreachable) (unreachable) ) (block (drop (i32.const 5999) ) (drop (i32.const 51) ) (unreachable) (unreachable) ) ) ) (func $yes-grandparent (block (if (i32.const 9999) (block (drop (i32.const -51234) ) (drop (i32.const -51000) ) ) (block (drop (i32.const 5999) ) (drop (i32.const 51) ) ) ) (unreachable) (unreachable) ) ) (func $ifs-named-block (param $x i32) (param $y i32) (result i32) (block $out (block $out2 (block (drop (local.get $x) ) (block (br_if $out (local.get $y) ) (nop) ) ) (block (if (local.get $x) (br_if $out (local.get $y) ) (br_if $out2 (local.get $y) ) ) (nop) ) (if (i32.const 1234) (if (local.get $x) (block (nop) (br_if $out (local.get $y) ) (nop) ) (block (nop) (br_if $out2 (local.get $y) ) (nop) ) ) ) (if (local.get $x) (block $left (br_if $left (local.get $y) ) (nop) ) (block (br_if $out (local.get $y) ) (nop) ) ) (if (local.get $x) (block (br_if $out (local.get $y) ) (nop) ) (block $right (br_if $right (local.get $y) ) (nop) ) ) ) (return (i32.const 10) ) ) (return (i32.const 20) ) ) (func $block (block $x (if (i32.const 0) (br $x) ) (if (i32.const 0) (br $x) ) (br $x) ) (drop (i32.const 1) ) (drop (i32.const 2) ) ) (func $block2 (block $x (if (i32.const 0) (block (drop (i32.const 1) ) (drop (i32.const 333333) ) (br $x) ) ) (if (i32.const 0) (block (drop (i32.const 1) ) (drop (i32.const 2) ) (br $x) ) ) (drop (i32.const 1) ) (drop (i32.const 2) ) (br $x) ) ) (func $block3 (block $x (if (i32.const 0) (block (drop (i32.const 1000) ) (br $x) ) ) (if (i32.const 0) (block (drop (i32.const 2000) ) (drop (i32.const 3000) ) (br $x) ) ) (drop (i32.const 4000) ) (drop (i32.const 5000) ) (drop (i32.const 6000) ) (br $x) ) (drop (i32.const 1) ) (drop (i32.const 2) ) ) (func $mixture (block $out (block (drop (i32.const 1) ) (block (drop (i32.const 2) ) (nop) (nop) (nop) (nop) (nop) (nop) (br $out) ) ) ) (block $out2 (block (if (i32.const 1) (drop (i32.const 3) ) (block (drop (i32.const 4) ) (drop (i32.const 5) ) ) ) (drop (i32.const 2) ) (nop) (nop) (nop) (nop) (nop) (nop) (br $out2) ) ) (block (block $out3 (block (drop (i32.const 1) ) (block (br $out3) ) ) (block (drop (i32.const 1) ) (block (br $out3) ) ) (br $out3) ) (drop (i32.const 2) ) (nop) (nop) (nop) (nop) (nop) (nop) ) ) (func $block-corners (block (block $x (if (i32.const 0) (br $x) ) ) (drop (i32.const 1) ) (drop (i32.const 2) ) ) (drop (block $y (result i32) (if (i32.const 0) (block (drop (i32.const 1) ) (drop (i32.const 2) ) (br $y (i32.const 3) ) ) ) (drop (i32.const 1) ) (drop (i32.const 2) ) (br $y (i32.const 3) ) ) ) (drop (block $z (result i32) (if (i32.const 0) (block (drop (i32.const 1) ) (drop (i32.const 2) ) (br $z (i32.const 2) ) ) ) (drop (i32.const 1) ) (drop (i32.const 2) ) (i32.const 3) ) ) (block $w (if (i32.const 0) (block (drop (i32.const 1) ) (drop (i32.const 2) ) (br_if $w (i32.const 3) ) ) ) (drop (i32.const 1) ) (drop (i32.const 2) ) ) (block $x1 (if (i32.const 0) (block (drop (i32.const 1) ) (drop (i32.const 2) ) (br $x1) (nop) ) ) (drop (i32.const 1) ) (drop (i32.const 2) ) ) (block $side (block $x2 (br_table $x2 $side (i32.const 0) ) (if (i32.const 0) (block (drop (i32.const 1) ) (drop (i32.const 2) ) (br $x2) ) ) (drop (i32.const 1) ) (drop (i32.const 2) ) ) (block $x3 (br_table $side $x3 (i32.const 0) ) (if (i32.const 0) (block (drop (i32.const 1) ) (drop (i32.const 2) ) (br $x3) ) ) (drop (i32.const 1) ) (drop (i32.const 2) ) ) ) ) (func $terminating (block $folding-inner0 (block (if (i32.const 1) (br $folding-inner0) ) (if (i32.const 2) (br $folding-inner0) ) (if (i32.const 3) (br $folding-inner0) ) ) (return) ) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (unreachable) ) (func $terminating-unreachable (block $folding-inner0 (block (if (i32.const 1) (br $folding-inner0) ) (if (i32.const 2) (br $folding-inner0) ) (if (i32.const 3) (br $folding-inner0) ) (unreachable) ) ) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (unreachable) ) (func $terminating-value (result i32) (block $folding-inner0 (return (block (result i32) (if (i32.const 1) (br $folding-inner0) ) (if (i32.const 2) (br $folding-inner0) ) (if (i32.const 3) (br $folding-inner0) ) (i32.const 4) ) ) ) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (unreachable) ) (func $terminating-just-2 (block $folding-inner0 (block (if (i32.const 1) (br $folding-inner0) ) (if (i32.const 2) (br $folding-inner0) ) (if (i32.const 3) (block (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (drop (i32.const 10) ) (unreachable) ) ) ) (return) ) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (unreachable) ) (func $terminating-shortness (block $folding-inner1 (block (block $folding-inner0 (block (if (i32.const 1) (br $folding-inner0) ) (if (i32.const 2) (br $folding-inner1) ) (if (i32.const 3) (block (drop (i32.const 10) ) (br $folding-inner0) ) ) ) (return) ) (nop) (br $folding-inner1) ) ) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (unreachable) ) (func $terminating-multiple-separate (block $folding-inner1 (block (block $folding-inner0 (block (if (i32.const 1) (br $folding-inner0) ) (if (i32.const 1) (br $folding-inner0) ) (if (i32.const 1) (br $folding-inner1) ) (if (i32.const 1) (br $folding-inner1) ) ) (return) ) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (drop (i32.const 1) ) (unreachable) ) ) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (drop (i32.const 2) ) (unreachable) ) (func $terminating-just-worth-it (block $folding-inner0 (block (if (i32.const 1) (br $folding-inner0) ) (if (i32.const 2) (br $folding-inner0) ) (if (i32.const 3) (br $folding-inner0) ) ) (return) ) (nop) (nop) (nop) (unreachable) ) (func $terminating-not-worth-it (if (i32.const 1) (block (nop) (nop) (unreachable) ) ) (if (i32.const 2) (block (nop) (nop) (unreachable) ) ) (if (i32.const 3) (block (nop) (nop) (unreachable) ) ) ) (func $terminating-return (block $folding-inner0 (block (if (i32.const 1) (br $folding-inner0) ) (if (i32.const 2) (br $folding-inner0) ) (if (i32.const 3) (br $folding-inner0) ) ) (return) ) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (nop) (return) ) (func $terminating-return-value (result i32) (block $folding-inner0 (block (if (i32.const 1) (br $folding-inner0) ) (if (i32.const 2) (br $folding-inner0) ) (if (i32.const 3) (br $folding-inner0) ) (if (i32.const 3) (block (nop) (return (i32.add (i32.const 111111111) (i32.const 2222222) ) ) ) ) (return (i32.const 1234) ) ) ) (nop) (return (i32.add (i32.const 1) (i32.const 2) ) ) ) (func $terminating-fallthrough-value (result i32) (block $folding-inner0 (return (block (result i32) (if (i32.const 1) (br $folding-inner0) ) (if (i32.const 2) (br $folding-inner0) ) (if (i32.const 3) (br $folding-inner0) ) (if (i32.const 3) (block (nop) (return (i32.add (i32.const 111111111) (i32.const 2222222) ) ) ) ) (i32.const 1234) ) ) ) (nop) (return (i32.add (i32.const 1) (i32.const 2) ) ) ) (func $big-return (result i32) (block $folding-inner0 (block (if (i32.const 1) (br $folding-inner0) ) (if (i32.const 2) (br $folding-inner0) ) (if (i32.const 3) (br $folding-inner0) ) (if (i32.const 4) (br $folding-inner0) ) (if (i32.const 5) (br $folding-inner0) ) (if (i32.const 6) (br $folding-inner0) ) (unreachable) ) ) (return (i32.add (i32.const 1) (i32.const 2) ) ) ) (func $return-mix (result i32) (block $folding-inner0 (block (if (i32.const 1) (br $folding-inner0) ) (if (i32.const 2) (br $folding-inner0) ) (if (i32.const 3) (br $folding-inner0) ) (if (i32.const 4) (br $folding-inner0) ) (if (i32.const 3) (return (i32.add (i32.const 1) (i32.const 234567) ) ) ) (br $folding-inner0) ) ) (return (i32.add (i32.const 1) (i32.const 2) ) ) ) (func $just-unreachable (unreachable) ) (func $just-return (result i32) (return (i32.add (i32.const 1) (i32.const 2) ) ) ) (func $drop-if-with-value-but-unreachable (if (i32.const 0) (nop) ) (block (drop (i32.const 0) ) (block (nop) ) ) (if (i32.const 0) (nop) (unreachable) ) (nop) (drop (block (result i32) (drop (unreachable) ) (block (result i32) (i32.add (i32.const 1) (i32.const 2) ) ) ) ) (drop (if (result i32) (i32.const 0) (i32.add (i32.const 1) (i32.const 2) ) (i32.add (i32.const 1) (i32.const 333333333) ) ) ) ) (func $nested-control-flow (block $out (block (block $x (if (i32.const 0) (br $x) ) (if (i32.const 0) (br $x) ) (br $x) ) (if (i32.const 1) (br $out) ) (drop (i32.const 1) ) (drop (i32.const 2) ) ) (drop (i32.const 3) ) ) ) (func $nested-control-flow-dangerous (block $folding-inner0 (block $out (block (if (i32.const 0) (block (if (i32.const 1) (br $out) ) (br $folding-inner0) ) ) (if (i32.const 0) (block (if (i32.const 1) (br $out) ) (br $folding-inner0) ) ) (if (i32.const 1) (br $out) ) (br $folding-inner0) ) (drop (i32.const 3) ) ) (return) ) (drop (i32.const 1) ) (drop (i32.const 2) ) (return) ) (func $nested-control-flow-dangerous-but-ok (block $folding-inner0 (block (block $middle (block (if (i32.const 0) (block (if (i32.add (i32.const 0) (i32.const 1) ) (br $middle) ) (br $folding-inner0) ) ) (if (i32.const 0) (block (if (i32.add (i32.const 0) (i32.const 1) ) (br $middle) ) (br $folding-inner0) ) ) (if (i32.add (i32.const 0) (i32.const 1) ) (br $middle) ) (br $folding-inner0) ) ) (drop (i32.const 3) ) ) (return) ) (drop (i32.const 1) ) (drop (i32.const 2) ) (return) ) (func $nested-control-flow-dangerous-but-ok-b (block $out (block $middle (block (if (i32.const 0) (block (if (i32.add (i32.const 0) (i32.const 1) ) (br $middle) ) (br $out) ) ) (if (i32.const 0) (block (if (i32.add (i32.const 0) (i32.const 1) ) (br $middle) ) (br $out) ) ) (if (i32.add (i32.const 0) (i32.const 1) ) (br $middle) ) ) ) (unreachable) ) (drop (i32.const 1) ) (drop (i32.const 2) ) (drop (i32.const 3) ) (drop (i32.const 4) ) (drop (i32.const 1) ) (drop (i32.const 2) ) (drop (i32.const 3) ) (drop (i32.const 4) ) ) (func $nested-control-flow-dangerous-but-ok-c (block $x (block (block $out (block (if (i32.const 0) (br $out) ) (if (i32.const 0) (br $out) ) (br $out) ) (unreachable) ) (if (i32.add (i32.const 0) (i32.const 1) ) (br $x) ) (drop (i32.const 1) ) (drop (i32.const 2) ) ) (unreachable) ) (drop (i32.const 5) ) ) (func $nested-control-flow-dangerous-but-ok-d (block (block $out (block (if (i32.const 0) (br $out) ) (if (i32.const 0) (br $out) ) (br $out) ) ) (block $x (if (i32.add (i32.const 0) (i32.const 1) ) (br $x) ) ) (drop (i32.const 1) ) (drop (i32.const 2) ) ) (drop (i32.const 3) ) ) (func $if-suffix (param $x i32) (result i32) (block (if (local.get $x) (block ) (drop (call $if-suffix (i32.const -1) ) ) ) (local.set $x (i32.const 1) ) ) (block (result i32) (if (local.get $x) (block ) (drop (call $if-suffix (i32.const -2) ) ) ) (i32.const 2) ) ) (func $exnref_pop-test (local $exn exnref) (block $folding-inner0 (try (do (try (do (nop) ) (catch (local.set $exn (pop exnref) ) (br $folding-inner0) ) ) ) (catch (local.set $exn (pop exnref) ) (br $folding-inner0) ) ) (return) ) (drop (i32.const 111) ) (drop (i32.const 222) ) (drop (i32.const 333) ) (unreachable) ) (func $br_on_exn-target-block (local $exn exnref) (block $x (if (i32.const 0) (block (drop (i32.const 1) ) (drop (i32.const 2) ) (br $x) ) ) (if (i32.const 0) (block (drop (i32.const 1) ) (drop (i32.const 2) ) (br $x) ) ) (drop (br_on_exn $x $e (local.get $exn) ) ) (drop (i32.const 1) ) (drop (i32.const 2) ) (br $x) ) ) (func $foo (nop) ) (func $try-call-optimize-terminating-tails (result exnref) (try (do (call $foo) (call $foo) (call $foo) (call $foo) (return (ref.null exn) ) ) (catch (drop (pop exnref) ) (call $foo) (call $foo) (call $foo) (call $foo) (return (ref.null exn) ) ) ) (ref.null exn) ) (func $try-call-optimize-expression-tails (local $exn exnref) (block $x (try (do (call $foo) (call $foo) (call $foo) (br $x) ) (catch (local.set $exn (pop exnref) ) (call $foo) (call $foo) (call $foo) (br $x) ) ) (unreachable) ) ) )