| (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) |
| (then |
| (block $block1 |
| (drop |
| (i32.const 12) |
| ) |
| (block |
| (drop |
| (i32.const 1) |
| ) |
| (br $topmost) |
| ) |
| ) |
| ) |
| (else |
| (block $block3 |
| (drop |
| (i32.const 27) |
| ) |
| (block |
| (drop |
| (i32.const 2) |
| ) |
| (br $topmost) |
| ) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (func $b13 (type $2) (result i32) |
| (block $topmost (result i32) |
| (if |
| (i32.const 1) |
| (then |
| (block $block1 |
| (drop |
| (i32.const 12) |
| ) |
| (drop |
| (br_if $topmost |
| (i32.const 1) |
| (i32.const 1) |
| ) |
| ) |
| ) |
| ) |
| (else |
| (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) |
| (then |
| (block $block1 (result i32) |
| (i32.const 12) |
| ) |
| ) |
| (else |
| (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) |
| (then |
| (block $block1 (result i32 i64) |
| (tuple.make 2 |
| (i32.const 12) |
| (i64.const 12) |
| ) |
| ) |
| ) |
| (else |
| (block $block3 (result i32 i64) |
| (tuple.make 2 |
| (i32.const 27) |
| (i64.const 27) |
| ) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (func $b15 (type $1) |
| (block $topmost |
| (if |
| (i32.const 17) |
| (then |
| (br $topmost) |
| ) |
| ) |
| ) |
| ) |
| (func $b15b (type $1) |
| (block $topmost |
| (if |
| (i32.const 18) |
| (then |
| (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) |
| (then |
| (block $block1 |
| (br $a) |
| ) |
| ) |
| (else |
| (block $block3 |
| (br $a) |
| ) |
| ) |
| ) |
| ) |
| (block $a |
| (if |
| (i32.const 0) |
| (then |
| (drop |
| (i32.const 1) |
| ) |
| ) |
| (else |
| (block $block6 |
| (br $a) |
| ) |
| ) |
| ) |
| ) |
| (block $a |
| (if |
| (i32.const 0) |
| (then |
| (block $block8 |
| (br $a) |
| ) |
| ) |
| (else |
| (drop |
| (i32.const 1) |
| ) |
| ) |
| ) |
| ) |
| (block $c |
| (block $b |
| (if |
| (i32.const 0) |
| (then |
| (block $block11 |
| (br $b) |
| ) |
| ) |
| (else |
| (block $block13 |
| (br $c) |
| ) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (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) |
| (then |
| (return) |
| ) |
| (else |
| (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) |
| (then |
| (drop |
| (i32.const 1) |
| ) |
| ) |
| (else |
| (block $block2 |
| (block |
| (drop |
| (i32.const 2) |
| ) |
| (br $a) |
| ) |
| (drop |
| (i32.const 3) |
| ) |
| ) |
| ) |
| ) |
| (if |
| (i32.const 0) |
| (then |
| (block $block4 |
| (block |
| (drop |
| (i32.const 2) |
| ) |
| (br $a) |
| ) |
| (drop |
| (i32.const 3) |
| ) |
| ) |
| ) |
| (else |
| (drop |
| (i32.const 1) |
| ) |
| ) |
| ) |
| (if |
| (block $block6 (result i32) |
| (block |
| (drop |
| (i32.const 2) |
| ) |
| (br $a) |
| ) |
| (i32.const 3) |
| ) |
| (then |
| (drop |
| (i32.const 0) |
| ) |
| ) |
| (else |
| (drop |
| (i32.const 1) |
| ) |
| ) |
| ) |
| (if |
| (block $a (result i32) |
| (br $a |
| (i32.const 0) |
| ) |
| ) |
| (then |
| (block $a |
| (block |
| (drop |
| (i32.const 1) |
| ) |
| (br $a) |
| ) |
| ) |
| ) |
| (else |
| (block $a |
| (block |
| (drop |
| (i32.const 2) |
| ) |
| (br $a) |
| ) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (func $side-effects-and-order (type $2) (result i32) |
| (local $x i32) |
| (block $do-once$0 |
| (if |
| (call $b13) |
| (then |
| (block |
| (drop |
| (i32.const 0) |
| ) |
| (br $do-once$0) |
| ) |
| ) |
| ) |
| (drop |
| (i32.const 1) |
| ) |
| ) |
| (block $do-once$0 |
| (if |
| (call $b13) |
| (then |
| (block |
| (drop |
| (call $b14) |
| ) |
| (br $do-once$0) |
| ) |
| ) |
| ) |
| (drop |
| (i32.const 1) |
| ) |
| ) |
| (block $do-once$0 |
| (if |
| (i32.const 0) |
| (then |
| (block |
| (drop |
| (call $b14) |
| ) |
| (br $do-once$0) |
| ) |
| ) |
| ) |
| (drop |
| (i32.const 1) |
| ) |
| ) |
| (block $do-once$0 (result i32) |
| (if |
| (local.tee $x |
| (i32.const 1) |
| ) |
| (then |
| (br $do-once$0 |
| (local.tee $x |
| (i32.const 2) |
| ) |
| ) |
| ) |
| ) |
| (i32.const 1) |
| ) |
| ) |
| (func $loops |
| (loop $in |
| (block $out |
| (if (i32.const 0) (then (br $out))) |
| (br $in) ;; we can conditionalize this, and then the br out can vanish |
| ) |
| ) |
| (loop $in |
| (br $in) |
| ) |
| (loop |
| (block $out |
| (if (i32.const 0) (then (br $out))) |
| (br $out) |
| ) |
| ) |
| (loop $in |
| (block $out |
| (if (i32.const 0) (then (br $out))) |
| (br $out) |
| ) |
| ) |
| (loop $in) |
| (loop $in |
| (block $out) |
| ) |
| (loop $in |
| (block $out |
| (if (i32.const 0) (then (br $out))) |
| (br_if $in (i32.const 1)) |
| ) |
| ) |
| (loop $in |
| (block $out |
| (if (i32.const 0) (then (br $in))) |
| (br $out) |
| ) |
| ) |
| (loop $in |
| (block $out |
| (if (i32.const 0) (then (unreachable))) |
| (br $in) |
| ) |
| ) |
| (loop $in |
| (block $out |
| (if (i32.const 0) |
| (then |
| (block |
| (call $loops) |
| (br $out) |
| ) |
| ) |
| ) |
| (br $in) |
| ) |
| ) |
| (loop $in-todo ;; br_if into if |
| (block $out-todo |
| (if (i32.const 0) (then (br $out-todo))) |
| (call $loops) |
| (br $in-todo) |
| ) |
| ) |
| (loop $in |
| (block $out |
| (if (i32.const 0) |
| (then |
| (br $out) |
| ) |
| (else |
| (call $loops) |
| ) |
| ) |
| (br $in) |
| ) |
| ) |
| (loop $in |
| (block $out |
| (if (i32.const 0) |
| (then |
| (call $loops) |
| ) |
| (else |
| (br $out) |
| ) |
| ) |
| (br $in) |
| ) |
| ) |
| (loop $in |
| (block $out |
| (if (i32.const 0) |
| (then |
| (block |
| (drop (i32.const 1)) |
| (call $loops) |
| ) |
| ) |
| (else |
| (br $out) |
| ) |
| ) |
| (br $in) |
| ) |
| ) |
| (loop $in |
| (block $out |
| (if (i32.const 0) |
| (then |
| (br $out) |
| ) |
| (else |
| (call $loops) |
| ) |
| ) |
| (drop (i32.const 100)) |
| (br $in) |
| ) |
| ) |
| (loop $in |
| (block $out |
| (if (i32.const 0) |
| (then |
| (call $loops) |
| ) |
| (else |
| (br $out) |
| ) |
| ) |
| (drop (i32.const 101)) |
| (br $in) |
| ) |
| ) |
| (loop $in |
| (block $out |
| (if (i32.const 0) |
| (then |
| (block |
| (drop (i32.const 1)) |
| (call $loops) |
| ) |
| ) |
| (else |
| (br $out) |
| ) |
| ) |
| (drop (i32.const 102)) |
| (br $in) |
| ) |
| ) |
| (loop $in |
| (block $out |
| (if (i32.const 0) |
| (then |
| (br $out) |
| ) |
| (else |
| (call $loops) |
| ) |
| ) |
| (return) |
| (br $in) |
| ) |
| ) |
| (loop $in |
| (block $out |
| (if (i32.const 0) |
| (then |
| (br $out) |
| ) |
| (else |
| (call $loops) |
| ) |
| ) |
| (br $out) |
| (br $in) |
| ) |
| ) |
| (loop $in |
| (block $out |
| (if (i32.const 0) |
| (then |
| (br $out) |
| ) |
| (else |
| (call $loops) |
| ) |
| ) |
| (drop |
| (block $out2 (result i32) |
| (br $out2 (i32.const 1)) |
| ) |
| ) |
| (br $in) |
| ) |
| ) |
| (loop $in |
| (block $out |
| (br_if $out (i32.const 0)) |
| (br $in) |
| ) |
| ) |
| (loop $in-todo2 ;; if-ify |
| (block $out-todo2 |
| (br_if $out-todo2 (i32.const 0)) |
| (call $loops) |
| (br $in-todo2) |
| ) |
| ) |
| (loop $in |
| (block $out |
| (br $out) |
| (br $in) |
| ) |
| ) |
| (loop $in |
| (block $out |
| (br_if $in (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) (then (br $in) )(else (br $in))) |
| (drop (i32.const 2)) |
| (if (i32.const 3) (then (unreachable) )(else (br $in))) |
| (drop (i32.const 4)) |
| (if (i32.const 5) (then (br $in) )(else (unreachable))) |
| (drop (i32.const 6)) |
| ) |
| (if (result i32) (i32.const 6) (then (br $outval (i32.const 7)) )(else (i32.const 8))) |
| ) |
| ) |
| (func $threading |
| (drop |
| (block $value-out (result i32) |
| (block $value-in (result i32) |
| (block $out |
| (block $in |
| (if (i32.const 1) |
| (then |
| (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) |
| (then |
| (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) |
| (then |
| (br $out |
| (block (result i32) |
| (local.set $x (i32.const 0)) |
| (i32.const 1) |
| ) |
| ) |
| ) |
| (else |
| (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) |
| (then |
| (br_if $leave (i32.const 1)) |
| ) |
| (else |
| (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) |
| (then |
| (br $out |
| (block (result i32) |
| (drop (call $if-to-br_if-value-sideeffect (i32.const 0) (i32.const 1))) |
| (nop) |
| (i32.const 1) |
| ) |
| ) |
| ) |
| ) |
| (unreachable) |
| ) |
| ) |
| ) |
| (i32.add (local.get $x) (local.get $y)) |
| ) |
| (func $fuzz (param $j i32) (param $g i32) |
| (block $label$break$c |
| (loop $label$continue$d |
| (block $label$break$d |
| (if |
| (i32.lt_s |
| (local.get $j) |
| (i32.const 2147483640) |
| ) |
| (then |
| (block $x |
| (block $y |
| (block $z |
| (br_if $y |
| (local.get $j) |
| ) |
| (br $x) ;; don't be confused by this |
| ) |
| (nop) ;; get me to the store! |
| ) |
| ) |
| ) |
| (else |
| (block $switch$26 |
| (nop) |
| ) |
| ) |
| ) |
| (i32.store |
| (i32.const 5724) |
| (i32.const -254899267) |
| ) |
| (br $label$continue$d) |
| ) |
| ) |
| ) |
| ) |
| (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) |
| (then |
| (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) |
| ) |
| (then |
| (br $label$0) |
| ) |
| (else |
| (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) |
| (then |
| (nop) |
| ) |
| ) |
| ) |
| ) |
| (func $unreachable-if-that-could-be-a-br_if (result i64) |
| (loop $label$3 (result i64) |
| (drop |
| (if (result f64) |
| (unreachable) |
| (then |
| (f64.const 1) |
| ) |
| (else |
| (br $label$3) |
| ) |
| ) |
| ) |
| (i64.const 1) |
| ) |
| ) |
| (func $nop-br-might-update-type |
| (block $label$39 |
| (drop |
| (if (result i32) |
| (unreachable) |
| (then |
| (if (result i32) |
| (i32.const 1) |
| (then |
| (br $label$39) ;; if we nop this, then the parent type must change |
| ) |
| (else |
| (i32.const 0) |
| ) |
| ) |
| ) |
| (else |
| (i32.const 0) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (func $no-flow-through-if-without-else (result f32) |
| (local $0 i32) |
| (local $2 f32) |
| (block $label$0 |
| (if |
| (local.get $0) |
| (then |
| (block $label$11 |
| (return |
| (f32.const 239) |
| ) |
| (if |
| (i32.const 0) |
| (then |
| (return |
| (local.get $2) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (else |
| (return |
| (f32.const -9223372036854775808) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (func $unreachable-return-loop-value (result i64) |
| (loop $loop |
| (if |
| (i32.const 1) |
| (then |
| (block $block |
| (br_if $block |
| (br $loop) |
| ) |
| (br $loop) |
| ) |
| ) |
| ) |
| (br $loop) ;; we 100% go back to the loop top, the loop is never exited. but opts move code around so that is not obvious anymore, and the loop becomes a nop, but the func has a return value |
| ) |
| ) |
| (func $obviously-flows-out-maybe (param $var$0 i32) (result f32) |
| (block $label$1 (result f32) |
| (br $label$1 |
| (f32.const 1) |
| ) |
| (loop $label$5 |
| (if |
| (i32.const 11) |
| (then |
| (block $label$8 ;; this block is none - it has a break, even if not taken - and so looks like it might flow out, |
| (br_if $label$8 ;; and so we can't move it outside to be the end of the loop's block |
| (unreachable) |
| ) |
| (br $label$5) |
| ) |
| ) |
| ) |
| (br $label$5) |
| ) |
| ) |
| ) |
| (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 $br-to-table-initial-tee (param $a i32) |
| (block $x |
| (block $y |
| (block $z |
| (br_if $x |
| (i32.eq |
| (local.tee $a |
| (i32.add |
| (i32.const 10) |
| (i32.const 1) |
| ) |
| ) |
| (i32.const 10) |
| ) |
| ) |
| (br_if $y (i32.eq (local.get $a) (i32.const 11))) |
| (br_if $z (i32.eq (local.get $a) (i32.const 12))) |
| (unreachable) |
| ) |
| (unreachable) |
| ) |
| (unreachable) |
| ) |
| (unreachable) |
| ) |
| (func $br-to-table-initial-tee-wrong-index (param $a i32) |
| (local $b i32) |
| (block $x |
| (block $y |
| (block $z |
| (br_if $x |
| (i32.eq |
| (local.tee $a (i32.const 99)) |
| (i32.const 10) |
| ) |
| ) |
| ;; The subsequent conditions use a different local, $b, so we cannot |
| ;; optimize here. |
| (br_if $y (i32.eq (local.get $b) (i32.const 11))) |
| (br_if $z (i32.eq (local.get $b) (i32.const 12))) |
| (unreachable) |
| ) |
| (unreachable) |
| ) |
| (unreachable) |
| ) |
| (unreachable) |
| ) |
| (func $br-to-table-eqz (param $a i32) |
| (block $x |
| (block $y |
| (block $z |
| (br_if $x (i32.eqz (local.get $a))) |
| (br_if $y (i32.eq (local.get $a) (i32.const 1))) |
| (br_if $z (i32.eq (local.get $a) (i32.const 2))) |
| (unreachable) |
| ) |
| (unreachable) |
| ) |
| (unreachable) |
| ) |
| (unreachable) |
| ) |
| (func $br-to-table-tee-eqz (param $a i32) |
| (block $x |
| (block $y |
| (block $z |
| (br_if $x |
| (i32.eqz |
| (local.tee $a |
| (i32.add |
| (i32.const 0) |
| (i32.const 1) |
| ) |
| ) |
| ) |
| ) |
| (br_if $y (i32.eq (local.get $a) (i32.const 1))) |
| (br_if $z (i32.eq (local.get $a) (i32.const 2))) |
| (unreachable) |
| ) |
| (unreachable) |
| ) |
| (unreachable) |
| ) |
| (unreachable) |
| ) |
| (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) |
| (then |
| (br $out) |
| ) |
| (else |
| (i32.const 1) |
| ) |
| ) |
| ) |
| (local.set $x |
| (if (result i32) |
| (local.get $p) |
| (then |
| (i32.const 2) |
| ) |
| (else |
| (br $out) |
| ) |
| ) |
| ) |
| (local.set $x |
| (if (result i32) |
| (local.get $p) |
| (then |
| (br $out) |
| ) |
| (else |
| (br $out) |
| ) |
| ) |
| ) |
| ) |
| (local.get $p) |
| ) |
| (func $if-unreachable-but-declares-value (param $var$0 i32) (param $var$1 f64) (param $var$2 i32) (param $var$3 f64) (param $var$4 f32) (param $var$5 f32) (result i32) |
| (local $var$6 f64) |
| (if |
| (i32.const 0) |
| (then |
| (drop |
| (loop $label$3 (result i64) |
| (block $label$4 (result i64) |
| (block $label$5 |
| (block $label$6 |
| (local.set $var$1 |
| (if (result f64) |
| (unreachable) |
| (then |
| (br $label$5) |
| ) |
| (else |
| (f64.const 1) |
| ) |
| ) |
| ) |
| ) |
| (nop) |
| ) |
| (i64.const 1) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (i32.const 0) |
| ) |
| (func $if-flow-1 (result i32) |
| (if |
| (i32.const 0) |
| (then |
| (return (i32.const 1)) |
| ) |
| (else |
| (return (i32.const 2)) |
| ) |
| ) |
| ) |
| (func $if-flow-2 (result i32) |
| (if |
| (i32.const 0) |
| (then |
| (unreachable) |
| ) |
| (else |
| (return (i32.const 2)) |
| ) |
| ) |
| ) |
| (func $if-flow-3 (result i32) |
| (if |
| (i32.const 0) |
| (then |
| (return (i32.const 1)) |
| ) |
| (else |
| (unreachable) |
| ) |
| ) |
| ) |
| (func $if-flow-4 (result i32) |
| (if |
| (return (i32.const 0)) |
| (then |
| (return (i32.const 1)) |
| ) |
| (else |
| (return (i32.const 2)) |
| ) |
| ) |
| ) |
| (func $iff-flow-fuzz-bug (result i32) |
| (loop $label$1 |
| (if |
| (i32.const 1) |
| (then |
| (loop $label$2 |
| (unreachable) |
| (if ;; a loop that is never reached at the end of a loop |
| (i32.const 0) |
| (then |
| (nop) |
| ) |
| (else |
| (return |
| (i32.const 0) |
| ) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (br $label$1) |
| ) |
| ) |
| (func $fuzz-block-unreachable-brs-with-values (result i32) |
| (local $0 i32) |
| (loop $label$1 (result i32) |
| (block $label$2 (result i32) |
| (if |
| (local.get $0) |
| (then |
| (local.set $0 |
| (loop $label$5 |
| (br_if $label$5 |
| (br_if $label$2 |
| (unreachable) |
| (i32.const 0) |
| ) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (br $label$1) |
| ) |
| ) |
| ) |
| (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-select (param $x i32) (param $y i32) (result i32) |
| (block $label$2 (result i32) |
| (drop |
| (br_if $label$2 |
| (local.tee $y (local.get $x)) |
| (local.get $y) |
| ) |
| ) |
| (i32.const 0) |
| ) |
| ) |
| (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) |
| (then |
| (block |
| (drop (i32.const 2)) |
| (drop (i32.const 3)) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (func $if-block-bad |
| (block $label |
| (if |
| (br $label) ;; use outside of arm |
| (then |
| (block |
| (drop (i32.const 2)) |
| (drop (i32.const 3)) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (func $if-block-br |
| (block $label |
| (if |
| (i32.const 1) |
| (then |
| (br $label) |
| ) |
| ) |
| ) |
| ) |
| (func $if-block-br-1 |
| (block $label |
| (if |
| (i32.const 1) |
| (then |
| (br $label) |
| ) |
| (else |
| (drop (i32.const 3)) |
| ) |
| ) |
| ) |
| ) |
| (func $if-block-br-2 |
| (block $label |
| (if |
| (i32.const 1) |
| (then |
| (drop (i32.const 3)) |
| ) |
| (else |
| (br $label) |
| ) |
| ) |
| ) |
| ) |
| (func $if-block-br-3 |
| (block $label |
| (if |
| (i32.const 1) |
| (then |
| (br $label) |
| ) |
| (else |
| (br $label) |
| ) |
| ) |
| ) |
| ) |
| (func $if-block-br-4-eithre |
| (block $label |
| (if |
| (i32.const 1) |
| (then |
| (drop (i32.const 2)) |
| ) |
| (else |
| (drop (i32.const 3)) |
| ) |
| ) |
| ) |
| ) |
| (func $if-block-br-5-value (result i32) |
| (block $label (result i32) |
| (if (result i32) |
| (i32.const 1) |
| (then |
| (i32.const 2) |
| ) |
| (else |
| (i32.const 3) |
| ) |
| ) |
| ) |
| ) |
| (func $restructure-if-outerType-change |
| (loop $label$1 |
| (br_if $label$1 |
| (block $label$2 |
| (block $label$3 |
| (if |
| (block $label$4 |
| (unreachable) |
| ) |
| (then |
| (br $label$3) |
| ) |
| ) |
| ) |
| (unreachable) |
| ) |
| ) |
| ) |
| ) |
| (func $if-arm-unreachable |
| (block $label$1 |
| (if |
| (unreachable) ;; unreachable condition |
| (then |
| (nop) |
| ) |
| (else |
| (unreachable) |
| ) |
| ) |
| ) |
| ) |
| (func $propagate-type-if-we-optimize |
| (if |
| (i32.const 1) |
| (then |
| (nop) |
| ) |
| (else |
| (block |
| (drop |
| (loop $label$3 (result i64) |
| (br_if $label$3 |
| (block $label$4 (result i32) |
| (if |
| (i32.const 0) |
| (then |
| (unreachable) |
| ) |
| (else |
| (unreachable) |
| ) |
| ) |
| ) |
| ) |
| (i64.const -9) |
| ) |
| ) |
| (unreachable) |
| ) |
| ) |
| ) |
| ) |
| (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) |
| (then |
| (block $label$3 |
| (if |
| (i32.const 0) |
| (then |
| (block |
| (nop) |
| (br $label$3) |
| ) |
| ) |
| (else |
| (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) |
| ) |
| (then |
| (i32.mul |
| (i32.const 2) |
| (i32.const 3) |
| ) |
| ) |
| (else |
| (i32.mul |
| (i32.const 2) |
| (i32.const 3) |
| ) |
| ) |
| ) |
| ) |
| (drop |
| (if (result i32) |
| (i32.eq |
| (local.get $x) |
| (i32.const 1) |
| ) |
| (then |
| (i32.add |
| (i32.const 2) |
| (i32.const 3) |
| ) |
| ) |
| (else |
| (i32.add |
| (i32.const 2) |
| (i32.const 3) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (func $selectify-even-with-condition-side-effects (param $0 i32) |
| (drop (if (result i32) |
| (i32.rem_s |
| (local.get $0) |
| (i32.const 2) |
| ) |
| (then |
| (i32.const 1) |
| ) |
| (else |
| (i32.const 0) |
| ) |
| )) |
| ) |
| (func $no-selectify-when-arm-side-effects (param $0 i32) |
| (drop (if (result i32) |
| (i32.rem_s |
| (local.get $0) |
| (i32.const 2) |
| ) |
| (then |
| (local.tee $0 (i32.const 1)) |
| ) |
| (else |
| (i32.const 0) |
| ) |
| )) |
| (drop (if (result i32) |
| (i32.rem_s |
| (local.get $0) |
| (i32.const 2) |
| ) |
| (then |
| (i32.const 0) |
| ) |
| (else |
| (local.tee $0 (i32.const 1)) |
| ) |
| )) |
| ) |
| (func $no-selectify-when-effects-invalidate (param $0 i32) |
| (local $1 i32) |
| (drop (if (result i32) |
| (i32.rem_s |
| (local.tee $0 (i32.const 3)) |
| (i32.const 2) |
| ) |
| (then |
| (local.get $0) |
| ) |
| (else |
| (i32.const 0) |
| ) |
| )) |
| (drop (if (result i32) |
| (i32.rem_s |
| (local.tee $0 (i32.const 3)) |
| (i32.const 2) |
| ) |
| (then |
| (i32.const 0) |
| ) |
| (else |
| (local.get $0) |
| ) |
| )) |
| ;; but different locals do not invalidate |
| (drop (if (result i32) |
| (i32.rem_s |
| (local.tee $0 (i32.const 3)) |
| (i32.const 2) |
| ) |
| (then |
| (i32.const 0) |
| ) |
| (else |
| (local.get $1) |
| ) |
| )) |
| ) |
| (func $if-one-side (result i32) |
| (local $x i32) |
| (local.set $x |
| (if (result i32) |
| (i32.const 1) |
| (then |
| (i32.const 2) |
| ) |
| (else |
| (local.get $x) |
| ) |
| ) |
| ) |
| (local.get $x) |
| ) |
| (func $if-one-side-b (result i32) |
| (local $x i32) |
| (local.set $x |
| (if (result i32) |
| (i32.const 1) |
| (then |
| (local.get $x) |
| ) |
| (else |
| (i32.const 2) |
| ) |
| ) |
| ) |
| (local.get $x) |
| ) |
| (func $if-one-side-tee-etc (param $0 i32) (result i32) |
| (local $1 i32) |
| (local $2 i32) |
| (local $3 i32) |
| (local $4 i32) |
| (local $x i32) |
| (local $y i32) |
| (local $z i32) |
| (drop |
| (call $if-one-side-tee-etc |
| (local.tee $x |
| (if (result i32) |
| (i32.const -3) |
| (then |
| (i32.const -4) |
| ) |
| (else |
| (local.get $x) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (i32.const 0) |
| ) |
| (func $ifs-copies-recursive (param $20 i32) (result i32) |
| (local.set $20 |
| (if (result i32) |
| (i32.const 1) |
| (then |
| (if (result i32) |
| (i32.const 2) |
| (then |
| (if (result i32) |
| (i32.const 3) |
| (then |
| (i32.const 4) |
| ) |
| (else |
| (local.get $20) |
| ) |
| ) |
| ) |
| (else |
| (local.get $20) |
| ) |
| ) |
| ) |
| (else |
| (local.get $20) |
| ) |
| ) |
| ) |
| (local.get $20) |
| ) |
| (func $if-copy1 |
| (local $x i32) |
| (local $y i32) |
| (loop $top |
| (local.set $x |
| (if (result i32) |
| (i32.const 1) |
| (then |
| (local.get $x) |
| ) |
| (else |
| (local.get $y) |
| ) |
| ) |
| ) |
| (br $top) |
| ) |
| ) |
| (func $if-copy3 |
| (local $x i32) |
| (local $y i32) |
| (loop $top |
| (local.set $x |
| (if (result i32) |
| (i32.const 1) |
| (then |
| (unreachable) |
| ) |
| (else |
| (local.get $x) |
| ) |
| ) |
| ) |
| (br $top) |
| ) |
| ) |
| (func $if-copy4 |
| (local $x i32) |
| (local $y i32) |
| (loop $top |
| (local.set $x |
| (if (result i32) |
| (i32.const 1) |
| (then |
| (unreachable) |
| ) |
| (else |
| (local.get $y) |
| ) |
| ) |
| ) |
| (br $top) |
| ) |
| ) |
| (func $if-copy-tee |
| (local $x i32) |
| (local $y i32) |
| (loop $top |
| (drop |
| (local.tee $x |
| (if (result i32) |
| (i32.const 1) |
| (then |
| (local.get $x) |
| ) |
| (else |
| (i32.const 2) |
| ) |
| ) |
| ) |
| ) |
| (br $top) |
| ) |
| ) |
| (func $loop-end-set (param $x i32) (result i32) |
| (loop $loop |
| (nop) |
| (if |
| (local.get $x) |
| (then |
| (br $loop) |
| ) |
| (else |
| (local.set $x (i32.const 1)) |
| ) |
| ) |
| ) |
| (local.get $x) |
| ) |
| (func $loop-end-value (param $x i32) (result i32) |
| (loop $loop (result i32) |
| (nop) |
| (if (result i32) |
| (local.get $x) |
| (then |
| (br $loop) |
| ) |
| (else |
| (i32.const 1) |
| ) |
| ) |
| ) |
| ) |
| (func $do-not-flow-values-through-unreachable-code (result i32) |
| (block |
| (unreachable) |
| (block $A |
| (if |
| (i32.const 0) |
| (then |
| (return |
| (i32.const 0) ;; seems to flow out, but we are in unreachable code, and do not actually reach anywhere |
| ) |
| ) |
| (else |
| (br $A) ;; can be a nop |
| ) |
| ) |
| ) |
| ) |
| ) |
| (func $do-not-flow-values-through-unreachable-code-b (result i32) |
| (loop |
| (unreachable) |
| (block $A |
| (if |
| (i32.const 0) |
| (then |
| (return |
| (i32.const 0) |
| ) |
| ) |
| (else |
| (br $A) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (func $if_br_if |
| (local $0 i32) |
| (block $label$1 |
| (if |
| (local.tee $0 ;; note side effect; it's ok |
| (i32.const 1024) |
| ) |
| (then |
| (br_if $label$1 |
| (i32.eqz |
| (i32.const -4) |
| ) |
| ) |
| ) |
| ) |
| (if |
| (i32.const 1025) |
| (then |
| (br_if $label$1 |
| (i32.eqz |
| (i32.const -5) |
| ) |
| ) |
| ) |
| ) |
| (if |
| (local.tee $0 ;; note side effect; it's ok |
| (i32.const 1025) |
| ) |
| (then |
| (br_if $label$1 |
| (i32.eqz |
| (i32.const -6) |
| ) |
| ) |
| ) |
| ) |
| (if |
| (i32.const 1026) |
| (then |
| (br_if $label$1 |
| (local.tee $0 ;; but here it is *not* ok |
| (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) |
| (then |
| (return |
| (i32.const 5) |
| ) |
| ) |
| ) |
| (i32.const 6) |
| ) |
| ) |
| ) |
| ) |
| (func $no-selectify-if-condition-unreachable (result i32) |
| (select |
| (if (result i32) |
| (unreachable) |
| (then |
| (i32.const 3) |
| ) |
| (else |
| (i32.const 4) |
| ) |
| ) |
| (i32.const 1) |
| (i32.const 2) |
| ) |
| ) |
| ) |