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