diff --git a/test/lit/passes/remove-unused-brs_enable-multivalue.wast b/test/lit/passes/remove-unused-brs_enable-multivalue.wast new file mode 100644 index 00000000000..efe701e6fd4 --- /dev/null +++ b/test/lit/passes/remove-unused-brs_enable-multivalue.wast @@ -0,0 +1,5601 @@ +;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. +;; NOTE: This test was ported using port_passes_tests_to_lit.py and could be cleaned up. + +;; RUN: foreach %s %t wasm-opt --remove-unused-brs --enable-multivalue -S -o - | filecheck %s + +(module + (memory 256 256) + ;; CHECK: (type $0 (func (param i32))) + (type $0 (func (param i32))) + ;; CHECK: (type $1 (func)) + (type $1 (func)) + ;; CHECK: (type $2 (func (result i32))) + (type $2 (func (result i32))) + ;; CHECK: (type $3 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $4 (func (param i32) (result i32))) + + ;; CHECK: (type $5 (func (result i32 i64))) + + ;; CHECK: (type $6 (func (result i64))) + + ;; CHECK: (type $7 (func (param i32 i32))) + + ;; CHECK: (type $8 (func (param f32 i32 f32 i32 i32 f64 f32) (result i32))) + + ;; CHECK: (type $9 (func (param i32) (result i64))) + + ;; CHECK: (type $10 (func (result f32))) + + ;; CHECK: (type $11 (func (param i32) (result f32))) + + ;; CHECK: (type $12 (func (param i32 f64 i32 f64 f32 f32) (result i32))) + + ;; CHECK: (memory $0 256 256) + + ;; CHECK: (func $b0-yes (param $i1 i32) + ;; CHECK-NEXT: (block $topmost + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $b0-yes (type $0) (param $i1 i32) + (block $topmost + (br $topmost) + ) + ) + ;; CHECK: (func $b1 (param $i1 i32) + ;; CHECK-NEXT: (block $topmost + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $b1 (type $0) (param $i1 i32) + (block $topmost + (block + (drop + (i32.const 0) + ) + (br $topmost) + ) + ) + ) + ;; CHECK: (func $b2 (param $i1 i32) + ;; CHECK-NEXT: (block $topmost + ;; CHECK-NEXT: (block $inner + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $b2 (type $0) (param $i1 i32) + (block $topmost + (block $inner + (br $topmost) + ) + ) + ) + ;; CHECK: (func $b3-yes (param $i1 i32) + ;; CHECK-NEXT: (block $topmost + ;; CHECK-NEXT: (block $inner + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $b3-yes (type $0) (param $i1 i32) + (block $topmost + (block $inner + (br $inner) + ) + ) + ) + ;; CHECK: (func $b4 (param $i1 i32) + ;; CHECK-NEXT: (block $topmost + ;; CHECK-NEXT: (block $inner + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $b4 (type $0) (param $i1 i32) + (block $topmost + (block $inner + (block + (drop + (i32.const 0) + ) + (br $topmost) + ) + ) + ) + ) + ;; CHECK: (func $b5 (param $i1 i32) + ;; CHECK-NEXT: (block $topmost + ;; CHECK-NEXT: (block $inner + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $b5 (type $0) (param $i1 i32) + (block $topmost + (block $inner + (block + (drop + (i32.const 0) + ) + (br $inner) + ) + ) + ) + ) + ;; CHECK: (func $b6 (param $i1 i32) + ;; CHECK-NEXT: (block $topmost + ;; CHECK-NEXT: (br_if $topmost + ;; CHECK-NEXT: (local.get $i1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $b6 (type $0) (param $i1 i32) + (block $topmost + (br_if $topmost + (local.get $i1) + ) + ) + ) + ;; CHECK: (func $b7 (param $i1 i32) + ;; CHECK-NEXT: (block $topmost + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $topmost + ;; CHECK-NEXT: (local.get $i1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $b7 (type $0) (param $i1 i32) + (block $topmost + (block + (drop + (i32.const 0) + ) + (br_if $topmost + (local.get $i1) + ) + ) + ) + ) + ;; CHECK: (func $b8 (param $i1 i32) + ;; CHECK-NEXT: (block $topmost + ;; CHECK-NEXT: (block $inner + ;; CHECK-NEXT: (br_if $topmost + ;; CHECK-NEXT: (local.get $i1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $b8 (type $0) (param $i1 i32) + (block $topmost + (block $inner + (br_if $topmost + (local.get $i1) + ) + ) + ) + ) + ;; CHECK: (func $b9 (param $i1 i32) + ;; CHECK-NEXT: (block $topmost + ;; CHECK-NEXT: (block $inner + ;; CHECK-NEXT: (br_if $topmost + ;; CHECK-NEXT: (local.get $i1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $b9 (type $0) (param $i1 i32) + (block $topmost + (block $inner + (br_if $topmost + (local.get $i1) + ) + ) + ) + ) + ;; CHECK: (func $b10 (param $i1 i32) + ;; CHECK-NEXT: (block $topmost + ;; CHECK-NEXT: (block $inner + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $topmost + ;; CHECK-NEXT: (local.get $i1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $b10 (type $0) (param $i1 i32) + (block $topmost + (block $inner + (block + (drop + (i32.const 0) + ) + (br_if $topmost + (local.get $i1) + ) + ) + ) + ) + ) + ;; CHECK: (func $b11 (param $i1 i32) + ;; CHECK-NEXT: (block $topmost + ;; CHECK-NEXT: (block $inner + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $topmost + ;; CHECK-NEXT: (local.get $i1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $b11 (type $0) (param $i1 i32) + (block $topmost + (block $inner + (block + (drop + (i32.const 0) + ) + (br_if $inner + (local.get $i1) + ) + ) + ) + ) + ) + ;; CHECK: (func $b12-yes + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $topmost + ;; CHECK-NEXT: (block $block1 + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (block $block3 + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 27) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ) + ) + ) + ;; CHECK: (func $b13 (result i32) + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (block $topmost (result i32) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $block1 + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (br_if $topmost + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (block $block3 + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 27) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $topmost + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $b13 (type $2) (result i32) + (local $x i32) + (block $topmost (result i32) + (if + (i32.const 1) + (then + (block $block1 + (drop + (i32.const 12) + ) + (drop + (br_if $topmost + (local.get $x) + (local.get $x) + ) + ) + ) + ) + (else + (block $block3 + (drop + (i32.const 27) + ) + (br $topmost + (i32.const 2) + ) + ) + ) + ) + (i32.const 3) + ) + ) + ;; CHECK: (func $b14 (result i32) + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (block $topmost (result i32) + ;; CHECK-NEXT: (block $block1 (result i32) + ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $block3 (result i32) + ;; CHECK-NEXT: (i32.const 27) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ) + ) + ;; CHECK: (func $b14-tuple (result i32 i64) + ;; CHECK-NEXT: (if (type $5) (result i32 i64) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $topmost (type $5) (result i32 i64) + ;; CHECK-NEXT: (block $block1 (type $5) (result i32 i64) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: (i64.const 12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (block $block3 (type $5) (result i32 i64) + ;; CHECK-NEXT: (tuple.make 2 + ;; CHECK-NEXT: (i32.const 27) + ;; CHECK-NEXT: (i64.const 27) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ) + ) + ) + ;; CHECK: (func $b15 + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (block $topmost + ;; CHECK-NEXT: (br_if $topmost + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $b15 (type $1) + (local $x i32) + (block $topmost + (if + (local.get $x) + (then + (br $topmost) + ) + ) + ) + ) + ;; CHECK: (func $b15b + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 18) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $topmost + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $b15b (type $1) + (block $topmost + (if + (i32.const 18) + (then + (block + (drop + (i32.const 0) + ) + (br $topmost) + ) + ) + ) + ) + ) + ;; CHECK: (func $b16 + ;; CHECK-NEXT: (block $a + ;; CHECK-NEXT: (block $b + ;; CHECK-NEXT: (block $c + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $a0 + ;; CHECK-NEXT: (block $b0 + ;; CHECK-NEXT: (block $c0 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $a1 + ;; CHECK-NEXT: (block $b1 + ;; CHECK-NEXT: (block $c1 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ;; CHECK: (func $b17 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $a + ;; CHECK-NEXT: (block $block1 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (block $block3 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $a0 + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (block $block6 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $a1 + ;; CHECK-NEXT: (block $block8 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $c + ;; CHECK-NEXT: (block $b + ;; CHECK-NEXT: (block $block11 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (block $block13 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ) + ) + ) + ;; CHECK: (func $ret-1 + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: ) + (func $ret-1 (type $1) + (return) + ) + ;; CHECK: (func $ret-2 + ;; CHECK-NEXT: (block $block0 + ;; CHECK-NEXT: (block $block1 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $ret-2 (type $1) + (block $block0 + (block $block1 + (return) + ) + ) + ) + ;; CHECK: (func $ret-3 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $block0 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (block $block3 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $ret-3 (type $1) + (block $block0 + (if + (i32.const 0) + (then + (return) + ) + (else + (block $block3 + (return) + ) + ) + ) + ) + ) + ;; CHECK: (func $ret-value (result i32) + ;; CHECK-NEXT: (block $block0 (result i32) + ;; CHECK-NEXT: (block $block1 (result i32) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $ret-value (type $2) (result i32) + (block $block0 + (block $block1 + (return + (i32.const 1) + ) + ) + ) + ) + ;; CHECK: (func $no-select-but-the-last + ;; CHECK-NEXT: (block $a + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (block $block2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $block4 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (block $block6 (result i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (block $a0 (result i32) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $a1 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (block $a2 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ) + ) + ) + ;; CHECK: (func $side-effects-and-order (result i32) + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (block $do-once$0 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (call $b13) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $do-once$0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $do-once$00 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (call $b13) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $b14) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $do-once$00) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $do-once$01 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $b14) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $do-once$01) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $do-once$02 (result i32) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.tee $x + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (br $do-once$02 + ;; CHECK-NEXT: (local.tee $x + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ;; CHECK: (func $loops + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (loop $in + ;; CHECK-NEXT: (block $out + ;; CHECK-NEXT: (br_if $in + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in0 + ;; CHECK-NEXT: (br $in0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop + ;; CHECK-NEXT: (block $out0 + ;; CHECK-NEXT: (br_if $out0 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in1 + ;; CHECK-NEXT: (block $out1 + ;; CHECK-NEXT: (br_if $out1 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in2 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in3 + ;; CHECK-NEXT: (block $out2 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in4 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $out3 + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (br_if $in4 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in5 + ;; CHECK-NEXT: (block $out4 + ;; CHECK-NEXT: (br_if $in5 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in6 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $out5 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (br $in6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in7 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $out6 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $loops) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (br $in7) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in-todo + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $out-todo + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (call $loops) + ;; CHECK-NEXT: (br $in-todo) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in8 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $out7 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (call $loops) + ;; CHECK-NEXT: (br $in8) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in9 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (call $loops) + ;; CHECK-NEXT: (br $in9) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (block $out8 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in10 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $loops) + ;; CHECK-NEXT: (br $in10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (block $out9 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in11 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $out10 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (call $loops) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $in11) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in12 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (call $loops) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 101) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $in12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (block $out11 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in13 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $loops) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 102) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $in13) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (block $out12 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in14 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $out13 + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (call $loops) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: (br $in14) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in15 + ;; CHECK-NEXT: (block $out14 + ;; CHECK-NEXT: (br_if $out14 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $loops) + ;; CHECK-NEXT: (br $out14) + ;; CHECK-NEXT: (br $in15) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in16 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $out15 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (call $loops) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block $out20 (result i32) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $in16) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in17 + ;; CHECK-NEXT: (block $out16 + ;; CHECK-NEXT: (br_if $in17 + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in-todo2 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $out-todo2 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (call $loops) + ;; CHECK-NEXT: (br $in-todo2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in18 + ;; CHECK-NEXT: (block $out17 + ;; CHECK-NEXT: (br $out17) + ;; CHECK-NEXT: (br $in18) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in19 + ;; CHECK-NEXT: (block $out18 + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $in19) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in-not + ;; CHECK-NEXT: (block $out-not + ;; CHECK-NEXT: (br_if $out-not + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $out-not + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $loops) + ;; CHECK-NEXT: (br $in-not) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $in-todo20 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $out-todo20 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (call $loops) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $in-todo20) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $loops + (local $x i32) + (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 (local.get $x) (then (br $out))) + (br $out) + ) + ) + (loop $in + (block $out + (if (local.get $x) (then (br $out))) + (br $out) + ) + ) + (loop $in) + (loop $in + (block $out) + ) + (loop $in + (block $out + (if (local.get $x) (then (br $out))) + (br_if $in (local.get $x)) + ) + ) + (loop $in + (block $out + (if (local.get $x) (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 (local.get $x)) + (br $in) + ) + ) + (loop $in-not ;; do NOT if-ify, the block can't be removed + (block $out-not + (br_if $out-not (local.get $x)) + (br_if $out-not (local.get $x)) + (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) + ) + ) + ) + ;; CHECK: (func $br_if_in_block (result i32) + ;; CHECK-NEXT: (block $outval (result i32) + ;; CHECK-NEXT: (block $in + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $in) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $in + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $in + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const 7) + ;; CHECK-NEXT: (i32.const 8) + ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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))) + ) + ) + ;; CHECK: (func $threading + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (block $value-out (result i32) + ;; CHECK-NEXT: (block $value-in (result i32) + ;; CHECK-NEXT: (block $out + ;; CHECK-NEXT: (block $in + ;; CHECK-NEXT: (br_if $out + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $out + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $value-in + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $stack1 + ;; CHECK-NEXT: (block $stack2 + ;; CHECK-NEXT: (block $stack3 + ;; CHECK-NEXT: (block $stack4 + ;; CHECK-NEXT: (br_if $stack1 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $threading + (local $x i32) + (drop + (block $value-out (result i32) + (block $value-in (result i32) + (block $out + (block $in + (if (local.get $x) + (then + (br $in) + ) + ) + (br_if $in (local.get $x)) + (br $value-in (i32.const 3)) + ) + (br $out) + ) + (i32.const 4) + ) + ) + ) + (block $stack1 + (block $stack2 + (block $stack3 + (block $stack4 + (if (local.get $x) + (then + (br $stack4) + ) + ) + (unreachable) + ) + (br $stack3) + ) + (br $stack2) + ) + (br $stack1) + ) + ) + ;; CHECK: (func $if-to-br_if-conflict (param $x i32) (param $y i32) (result i32) + ;; CHECK-NEXT: (block $leave + ;; CHECK-NEXT: (local.set $y + ;; CHECK-NEXT: (block $out (result i32) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (br $out + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (br_if $leave + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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 (local.get $x)) + ) + ) + (unreachable) + ) + ) + ) + (i32.add (local.get $x) (local.get $y)) + ) + ;; CHECK: (func $if-to-br_if-conflict2 (param $x i32) (param $y i32) (result i32) + ;; CHECK-NEXT: (block $leave + ;; CHECK-NEXT: (local.set $y + ;; CHECK-NEXT: (block $out (result i32) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (br_if $leave + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (br $out + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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 (local.get $x)) + ) + (else + (br $out + (block (result i32) + (local.set $x (i32.const 0)) + (i32.const 1) + ) + ) + ) + ) + (unreachable) + ) + ) + ) + (i32.add (local.get $x) (local.get $y)) + ) + ;; CHECK: (func $if-to-br_if-value-sideeffect (param $x i32) (param $y i32) (result i32) + ;; CHECK-NEXT: (block $leave + ;; CHECK-NEXT: (local.set $y + ;; CHECK-NEXT: (block $out (result i32) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (br $out + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $if-to-br_if-value-sideeffect + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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)) + ) + ;; CHECK: (func $fuzz (param $j i32) (param $g i32) + ;; CHECK-NEXT: (loop $label$continue$d + ;; CHECK-NEXT: (block $label$break$c + ;; CHECK-NEXT: (block $label$break$d + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.lt_s + ;; CHECK-NEXT: (local.get $j) + ;; CHECK-NEXT: (i32.const 2147483640) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (br_if $x + ;; CHECK-NEXT: (local.get $j) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (block $switch$26 + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.store + ;; CHECK-NEXT: (i32.const 5724) + ;; CHECK-NEXT: (i32.const -254899267) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $label$continue$d) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ) + ;; CHECK: (func $iffify + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $yes + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $no + ;; CHECK-NEXT: (br_if $no + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $no) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $no2 + ;; CHECK-NEXT: (br_if $no2 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $no3 + ;; CHECK-NEXT: (br $no3) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $no5 + ;; CHECK-NEXT: (block $no4 + ;; CHECK-NEXT: (br_if $no5 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $iffify + (local $x i32) + (block $yes + (br_if $yes + (local.get $x) + ) + (drop (i32.const 1)) + (drop (i32.const 2)) + ) + (block $no + (br_if $no + (local.get $x) + ) + (drop (i32.const 1)) + (br $no) + (drop (i32.const 2)) + ) + (block $no2 + (br_if $no2 + (local.get $x) + ) + ) + (block $no3 + (br $no3) + (drop (i32.const 1)) + (drop (i32.const 2)) + ) + (block $no5 + (block $no4 + (br_if $no5 + (local.get $x) + ) + (drop (i32.const 1)) + (drop (i32.const 2)) + ) + ) + ) + ;; CHECK: (func $loop-if (result i32) + ;; CHECK-NEXT: (loop $typed (result i32) + ;; CHECK-NEXT: (block $outer (result i32) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (br_if $typed + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $loop-if) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ;; CHECK: (func $block-break (param $0 i32) + ;; CHECK-NEXT: (block $block$7$break + ;; CHECK-NEXT: (block $shape$6$continue + ;; CHECK-NEXT: (call $block-break + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $block-break (param $0 i32) + (block $block$7$break + (block $shape$6$continue + (call $block-break (i32.const 1)) + (br $block$7$break) + ) + ) + ) + ;; CHECK: (func $loop-break (param $0 i32) + ;; CHECK-NEXT: (loop $shape$6$continue + ;; CHECK-NEXT: (block $block$7$break + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $loop-break + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $shape$6$continue + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ;; CHECK: (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) + ;; CHECK-NEXT: (block $label$0 (result i32) + ;; CHECK-NEXT: (block $label$1 + ;; CHECK-NEXT: (br_if $label$1 + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $label$1 + ;; CHECK-NEXT: (i32.load offset=3 align=1 + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (call $untaken-brs-might-prevent-block-removal + ;; CHECK-NEXT: (f32.const 1.4904844647389837e-07) + ;; CHECK-NEXT: (br_if $label$0 + ;; CHECK-NEXT: (i32.store16 offset=4 align=1 + ;; CHECK-NEXT: (i32.const 1900641) + ;; CHECK-NEXT: (br $label$0 + ;; CHECK-NEXT: (i32.const 1628075109) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (f32.const 1.1910939690100655e-32) + ;; CHECK-NEXT: (i32.const 1628057906) + ;; CHECK-NEXT: (i32.const 859068982) + ;; CHECK-NEXT: (f64.const 2.524518840347722e-258) + ;; CHECK-NEXT: (f32.const -nan:0x40a63) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 688529440) + ;; CHECK-NEXT: (i32.const 1751478890) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1935947830) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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 + (local.get $1) + ) + (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) + ) + ) + (local.get $1) + ) + (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) + ) + ) + ;; CHECK: (func $unexitable-loops-result (param $0 i32) (result i64) + ;; CHECK-NEXT: (loop $label$0 + ;; CHECK-NEXT: (loop $label$1 + ;; CHECK-NEXT: (br_if $label$0 + ;; CHECK-NEXT: (i32.load8_s + ;; CHECK-NEXT: (i32.const 201460482) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (block $label$3 + ;; CHECK-NEXT: (br_if $label$1 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $label$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ;; CHECK: (func $untaken-br-with-concrete-last-element + ;; CHECK-NEXT: (block $label$8 + ;; CHECK-NEXT: (block $label$11 + ;; CHECK-NEXT: (block $label$14 + ;; CHECK-NEXT: (br $label$8) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $untaken-br-with-concrete-last-element + (block $label$8 + (block $label$11 + (block $label$14 + (br_if $label$14 + (br $label$11 + ) + ) + ) + ) + ) + ) + ;; CHECK: (func $untaken-br-with-concrete-last-element2 (result i32) + ;; CHECK-NEXT: (block $label$8 (result i32) + ;; CHECK-NEXT: (block $label$11 (result i32) + ;; CHECK-NEXT: (block $label$14 (result i32) + ;; CHECK-NEXT: (br_if $label$14 + ;; CHECK-NEXT: (i32.const 102) + ;; CHECK-NEXT: (br $label$11 + ;; CHECK-NEXT: (i32.const 103) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ) + ) + ) + ;; CHECK: (func $untaken-br_if-then-if + ;; CHECK-NEXT: (block $label$0 + ;; CHECK-NEXT: (br_if $label$0 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $untaken-br_if-then-if + (block $label$0 + (br_if $label$0 + (unreachable) + ) + (if + (i32.const 0) + (then + (nop) + ) + ) + ) + ) + ;; CHECK: (func $unreachable-if-that-could-be-a-br_if (result i64) + ;; CHECK-NEXT: (loop $label$3 (result i64) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (if (result f64) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (f64.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (br $label$3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i64.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ;; CHECK: (func $nop-br-might-update-type + ;; CHECK-NEXT: (block $label$39 + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (br $label$39) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ) + ) + ;; CHECK: (func $no-flow-through-if-without-else (result f32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (local $2 f32) + ;; CHECK-NEXT: (if (result f32) + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $label$0 + ;; CHECK-NEXT: (block $label$11 + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (f32.const 239) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (f32.const -9223372036854775808) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ) + ) + ;; CHECK: (func $unreachable-return-loop-value (result i64) + ;; CHECK-NEXT: (loop $loop + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $block + ;; CHECK-NEXT: (br_if $block + ;; CHECK-NEXT: (br $loop) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $loop) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $loop) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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 + ) + ) + ;; CHECK: (func $obviously-flows-out-maybe (param $var$0 i32) (result f32) + ;; CHECK-NEXT: (block $label$1 (result f32) + ;; CHECK-NEXT: (br $label$1 + ;; CHECK-NEXT: (f32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $label$5 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $label$8 + ;; CHECK-NEXT: (br_if $label$8 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $label$5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $label$5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ;; CHECK: (func $br-to-table (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (block $tablify|0 + ;; CHECK-NEXT: (br_table $x $y $z $tablify|0 + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $br-to-table-too-few (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (br_if $x + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $x + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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))) + ) + ) + ) + ) + ;; CHECK: (func $br-to-table-one-more (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (block $tablify|0 + ;; CHECK-NEXT: (br_table $x $y $z $x $tablify|0 + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $br-to-table-overlap (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (br_if $x + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $y + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $z + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $br-to-table-overlap-start (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (br_if $x + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $y + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $z + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $br-to-table-offset (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (block $tablify|0 + ;; CHECK-NEXT: (br_table $x $y $z $tablify|0 + ;; CHECK-NEXT: (i32.sub + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const 15) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $br-to-table-RANGE-high (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (br_if $x + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $y + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $z + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $br-to-table-RANGE-low (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (block $tablify|0 + ;; CHECK-NEXT: (br_table $x $tablify|0 $tablify|0 $y $tablify|0 $tablify|0 $tablify|0 $tablify|0 $tablify|0 $z $tablify|0 + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $br-to-table-bad (param $a i32) (result i32) + ;; CHECK-NEXT: (block $value (result i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (br $x) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (block $tablify|0 + ;; CHECK-NEXT: (br_table $x $y $z $tablify|0 + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 2000) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ;; CHECK: (func $br-to-table-bad2 (param $a i32) (result i32) + ;; CHECK-NEXT: (block $value (result i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (br_if $value + ;; CHECK-NEXT: (i32.const 1000) + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (block $tablify|0 + ;; CHECK-NEXT: (br_table $x $y $z $tablify|0 + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 2000) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ;; CHECK: (func $br-to-table-bad3 (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (br_if $x + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (block $tablify|0 + ;; CHECK-NEXT: (br_table $x $y $z $tablify|0 + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $br-to-table-multi (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (block $tablify|0 + ;; CHECK-NEXT: (br_table $z $y $x $tablify|0 + ;; CHECK-NEXT: (i32.sub + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (block $tablify|00 + ;; CHECK-NEXT: (br_table $x $y $z $tablify|00 + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $br-to-table-bad4 (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (br_if $x + ;; CHECK-NEXT: (i32.ne + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $y + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $z + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $br-to-table-bad5 (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (br_if $x + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $y + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $z + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $br-to-table-bad6 (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (br_if $x + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (call $b13) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $y + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (call $b13) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $z + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (call $b13) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $br-to-table-bad7 (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (br_if $x + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const -1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $y + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const -1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $z + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const -1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $br-to-table-defaultNameOverlaps (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $tablify|0 + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (block $tablify|1 + ;; CHECK-NEXT: (br_table $x $tablify|0 $z $tablify|1 + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $br-to-table-unreach (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (br_if $x + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $y + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $z + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $br-to-table-overlap-but-later (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (br_if $x + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $y + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (block $tablify|0 + ;; CHECK-NEXT: (br_table $z $x $y $tablify|0 + ;; CHECK-NEXT: (i32.sub + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $br-to-table-initial-tee (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (block $tablify|0 + ;; CHECK-NEXT: (br_table $x $y $z $tablify|0 + ;; CHECK-NEXT: (i32.sub + ;; CHECK-NEXT: (local.tee $a + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $br-to-table-initial-tee-wrong-index (param $a i32) + ;; CHECK-NEXT: (local $b i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (br_if $x + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.tee $a + ;; CHECK-NEXT: (i32.const 99) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $y + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $z + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $br-to-table-eqz (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (block $tablify|0 + ;; CHECK-NEXT: (br_table $x $y $z $tablify|0 + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $br-to-table-tee-eqz (param $a i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (block $tablify|0 + ;; CHECK-NEXT: (br_table $x $y $z $tablify|0 + ;; CHECK-NEXT: (local.tee $a + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $tiny-switch + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $z + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $tiny-switch + (block $x + (block $y + (br_table $x $y + (i32.const 0) + ) + ) + ) + (block $z + (br_table $z + (i32.const 0) + ) + ) + ) + ;; CHECK: (func $trim-switch + ;; CHECK-NEXT: (block $A + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (br_table $A $y $A $y $A $y + ;; CHECK-NEXT: (i32.sub + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $trim-switch) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ;; CHECK: (func $same-target-br_if-and-br + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (block $x + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $x) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $same-target-br_if-and-br + (local $x i32) + (block $x + (br_if $x + (local.get $x) + ) + (br $x) + (unreachable) + ) + ) + ;; CHECK: (func $simple-switch (result i32) + ;; CHECK-NEXT: (block $A + ;; CHECK-NEXT: (block $B + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (br_table $A $y $y $y $y $y $A $y $y $y $y $A $y + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + (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)) + ) + ;; CHECK: (func $simple-switch-2 (result i32) + ;; CHECK-NEXT: (block $A + ;; CHECK-NEXT: (block $B + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (br_table $A $y $y $y $y $y $y $y $y $y $y $y $A $y + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + (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)) + ) + ;; CHECK: (func $simple-switch-3 (result i32) + ;; CHECK-NEXT: (block $A + ;; CHECK-NEXT: (block $B + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (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 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + (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)) + ) + ;; CHECK: (func $simple-switch43 (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (block $A + ;; CHECK-NEXT: (block $B + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (br_if $A + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.tee $0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $B + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (i32.const 127) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $y) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + (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)) + ) + ;; CHECK: (func $simple-switch-5 (result i32) + ;; CHECK-NEXT: (block $A + ;; CHECK-NEXT: (block $B + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (br_table $A $y $y $y $y $y $A $y $y $y $y $y $A $y + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + (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)) + ) + ;; CHECK: (func $undo-if-return (param $p i32) (result i32) + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (block $out + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br_if $out + ;; CHECK-NEXT: (local.get $p) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br_if $out + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.get $p) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.tee $x + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $p) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (br $out) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (br $out) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $p) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (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) + ;; CHECK-NEXT: (local $var$6 f64) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (loop $label$3 (result i64) + ;; CHECK-NEXT: (block $label$4 (result i64) + ;; CHECK-NEXT: (block $label$5 + ;; CHECK-NEXT: (block $label$6 + ;; CHECK-NEXT: (local.tee $var$1 + ;; CHECK-NEXT: (if (result f64) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (br $label$5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (f64.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i64.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $if-flow-1 (result i32) + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $if-flow-1 (result i32) + (if + (i32.const 0) + (then + (return (i32.const 1)) + ) + (else + (return (i32.const 2)) + ) + ) + ) + ;; CHECK: (func $if-flow-2 (result i32) + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $if-flow-2 (result i32) + (if + (i32.const 0) + (then + (unreachable) + ) + (else + (return (i32.const 2)) + ) + ) + ) + ;; CHECK: (func $if-flow-3 (result i32) + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $if-flow-3 (result i32) + (if + (i32.const 0) + (then + (return (i32.const 1)) + ) + (else + (unreachable) + ) + ) + ) + ;; CHECK: (func $if-flow-4 (result i32) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $if-flow-4 (result i32) + (if + (return (i32.const 0)) + (then + (return (i32.const 1)) + ) + (else + (return (i32.const 2)) + ) + ) + ) + ;; CHECK: (func $iff-flow-fuzz-bug (result i32) + ;; CHECK-NEXT: (loop $label$1 + ;; CHECK-NEXT: (br_if $label$1 + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (loop $label$2 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ;; CHECK: (func $fuzz-block-unreachable-brs-with-values (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (loop $label$1 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $label$2 + ;; CHECK-NEXT: (local.tee $0 + ;; CHECK-NEXT: (loop $label$5 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (br $label$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ;; CHECK: (func $drop-restructure-if (param $x i32) (param $y i32) (result i32) + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (block $label$2 (result i32) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ;; CHECK: (func $drop-restructure-if-final (param $x i32) (param $y i32) (result i32) + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (block $label$2 (result i32) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ;; CHECK: (func $drop-restructure-if-middle (param $x i32) (param $y i32) (result i32) + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (block $label$2 (result i32) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ;; CHECK: (func $drop-restructure-select (param $x i32) (param $y i32) (result i32) + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (local.tee $y + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $label$2 (result i32) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ;; CHECK: (func $drop-restructure-if-bad-2 (param $x i32) (param $y i32) (result i32) + ;; CHECK-NEXT: (block $label$2 (result i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (br_if $label$2 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (local.tee $y + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ;; CHECK: (func $if-block + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $label + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $if-block + (block $label + (if + (i32.const 1) + (then + (block + (drop (i32.const 2)) + (drop (i32.const 3)) + ) + ) + ) + ) + ) + ;; CHECK: (func $if-block-bad + ;; CHECK-NEXT: (block $label + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (br $label) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $if-block-bad + (block $label + (if + (br $label) ;; use outside of arm + (then + (block + (drop (i32.const 2)) + (drop (i32.const 3)) + ) + ) + ) + ) + ) + ;; CHECK: (func $if-block-br + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (block $label + ;; CHECK-NEXT: (br_if $label + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $if-block-br + (local $x i32) + (block $label + (if + (local.get $x) + (then + (br $label) + ) + ) + ) + ) + ;; CHECK: (func $if-block-br-1 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $label + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $if-block-br-1 + (block $label + (if + (i32.const 1) + (then + (br $label) + ) + (else + (drop (i32.const 3)) + ) + ) + ) + ) + ;; CHECK: (func $if-block-br-2 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $label + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $if-block-br-2 + (block $label + (if + (i32.const 1) + (then + (drop (i32.const 3)) + ) + (else + (br $label) + ) + ) + ) + ) + ;; CHECK: (func $if-block-br-3 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $label + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $if-block-br-3 + (block $label + (if + (i32.const 1) + (then + (br $label) + ) + (else + (br $label) + ) + ) + ) + ) + ;; CHECK: (func $if-block-br-4-eithre + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $label + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $if-block-br-4-eithre + (block $label + (if + (i32.const 1) + (then + (drop (i32.const 2)) + ) + (else + (drop (i32.const 3)) + ) + ) + ) + ) + ;; CHECK: (func $if-block-br-5-value (result i32) + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (block $label (result i32) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ) + ;; CHECK: (func $restructure-if-outerType-change + ;; CHECK-NEXT: (loop $label$1 + ;; CHECK-NEXT: (br_if $label$1 + ;; CHECK-NEXT: (block $label$2 + ;; CHECK-NEXT: (block $label$3 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (block $label$4 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ) + ;; CHECK: (func $if-arm-unreachable + ;; CHECK-NEXT: (block $label$1 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $if-arm-unreachable + (block $label$1 + (if + (unreachable) ;; unreachable condition + (then + (nop) + ) + (else + (unreachable) + ) + ) + ) + ) + ;; CHECK: (func $propagate-type-if-we-optimize + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (loop $label$3 (result i64) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $label$4 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i64.const -9) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ) + ;; CHECK: (func $switch-to-br + ;; CHECK-NEXT: (block $A + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $A) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $switch-to-br + (block $A + (block $y + (br_table $y $y $A $A + (i32.const 0) + ) + ) + ) + ) + ;; CHECK: (func $switch-to-br-value (result i32) + ;; CHECK-NEXT: (block $A (result i32) + ;; CHECK-NEXT: (block $y (result i32) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $A + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ) + ;; CHECK: (func $switch-threading-multi (param $x i32) (param $y i32) (result i32) + ;; CHECK-NEXT: (block $block$5$break + ;; CHECK-NEXT: (block $block$4$break + ;; CHECK-NEXT: (loop $shape$1$continue + ;; CHECK-NEXT: (block $block$3$break + ;; CHECK-NEXT: (block $switch$2$case$5 + ;; CHECK-NEXT: (block $switch$2$case$4 + ;; CHECK-NEXT: (block $switch$2$default + ;; CHECK-NEXT: (block $switch$2$case$2 + ;; CHECK-NEXT: (br_table $shape$1$continue $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$5$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$4$break $block$3$break + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $shape$1$continue) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $block$3$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $block$4$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $block$5$break) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $y + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $y + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $fuzz-type-changes-in-our-cycles (result i32) + ;; CHECK-NEXT: (loop $label$1 + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $label$3 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const -8192) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $label$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ;; CHECK: (func $refinalize-need-br-value (result i32) + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (loop $label$3 (result i32) + ;; CHECK-NEXT: (block $label$6 (result i32) + ;; CHECK-NEXT: (block $label$10 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (block $label$503 + ;; CHECK-NEXT: (br_if $label$3 + ;; CHECK-NEXT: (block $label$530 (result i32) + ;; CHECK-NEXT: (br_if $label$503 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 127) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $refinalize-need-br-value (result i32) + (local $x 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 + (local.get $x) + ) + (i32.const 0) + ) + ) + (return + (i32.const 127) + ) + ) + ) + ) + ) + ) + ;; CHECK: (func $selectify (param $x i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.mul + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.mul + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ) + ) + ;; CHECK: (func $selectify-even-with-condition-side-effects (param $0 i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.rem_s + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + )) + ) + ;; CHECK: (func $no-selectify-when-arm-side-effects (param $0 i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (i32.rem_s + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (local.tee $0 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (i32.rem_s + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (local.tee $0 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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)) + ) + )) + ) + ;; CHECK: (func $no-selectify-when-effects-invalidate (param $0 i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (i32.rem_s + ;; CHECK-NEXT: (local.tee $0 + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (i32.rem_s + ;; CHECK-NEXT: (local.tee $0 + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: (i32.rem_s + ;; CHECK-NEXT: (local.tee $0 + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + )) + ) + ;; CHECK: (func $if-one-side (result i32) + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $if-one-side-b (result i32) + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $if-one-side-tee-etc (param $0 i32) (result i32) + ;; CHECK-NEXT: (local $1 i32) + ;; CHECK-NEXT: (local $2 i32) + ;; CHECK-NEXT: (local $3 i32) + ;; CHECK-NEXT: (local $4 i32) + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (local $y i32) + ;; CHECK-NEXT: (local $z i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $if-one-side-tee-etc + ;; CHECK-NEXT: (local.tee $x + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const -4) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const -3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $ifs-copies-recursive (param $20 i32) (result i32) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (local.set $20 + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: (local.get $20) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $20) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $20) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $if-copy1 + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (local $y i32) + ;; CHECK-NEXT: (loop $top + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $top) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ;; CHECK: (func $if-copy3 + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (local $y i32) + ;; CHECK-NEXT: (loop $top + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (local.tee $x + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $top) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ;; CHECK: (func $if-copy4 + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (local $y i32) + ;; CHECK-NEXT: (loop $top + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $top) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ;; CHECK: (func $if-copy-tee + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (local $y i32) + ;; CHECK-NEXT: (loop $top + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.tee $x + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $top) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ;; CHECK: (func $loop-end-set (param $x i32) (result i32) + ;; CHECK-NEXT: (loop $loop + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (br_if $loop + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.set $x + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + (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) + ) + ;; CHECK: (func $loop-end-value (param $x i32) (result i32) + ;; CHECK-NEXT: (loop $loop (result i32) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (br_if $loop + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ) + ;; CHECK: (func $do-not-flow-values-through-unreachable-code (result i32) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $A + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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 + ) + ) + ) + ) + ) + ;; CHECK: (func $do-not-flow-values-through-unreachable-code-b (result i32) + ;; CHECK-NEXT: (loop + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $A + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ) + ) + ;; CHECK: (func $if_br_if + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (block $label$1 + ;; CHECK-NEXT: (br_if $label$1 + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (local.tee $0 + ;; CHECK-NEXT: (i32.const 1024) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (i32.const -4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $label$1 + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.const 1025) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (i32.const -5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $label$1 + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (local.tee $0 + ;; CHECK-NEXT: (i32.const 1025) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (i32.const -6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.const 1026) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (br_if $label$1 + ;; CHECK-NEXT: (local.tee $0 + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.store + ;; CHECK-NEXT: (i32.const 1024) + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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 + (local.get $0) + ) + ) + ) + ) + (i32.store + (i32.const 1024) + (i32.add + (local.get $0) + (i32.const 1) + ) + ) + ) + ) + ;; CHECK: (func $unswitch-reordering (param $x i32) (result i32) + ;; CHECK-NEXT: (block $label$1 (result i32) + ;; CHECK-NEXT: (br_table $label$1 + ;; CHECK-NEXT: (block $label$2 (result i32) + ;; CHECK-NEXT: (i32.store + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) + ) + ) + ;; CHECK: (func $no-selectify-if-condition-unreachable (result i32) + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (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) + ) + ) +) diff --git a/test/lit/passes/remove-unused-brs_shrink-level=1.wast b/test/lit/passes/remove-unused-brs_shrink-level=1.wast new file mode 100644 index 00000000000..3917c981c26 --- /dev/null +++ b/test/lit/passes/remove-unused-brs_shrink-level=1.wast @@ -0,0 +1,483 @@ +;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. +;; NOTE: This test was ported using port_passes_tests_to_lit.py and could be cleaned up. + +;; RUN: foreach %s %t wasm-opt --remove-unused-brs --shrink-level=1 -S -o - | filecheck %s + +(module + (memory 256 256) + (type $0 (func (param i32))) + ;; CHECK: (type $2 (func (result i32))) + + ;; CHECK: (type $1 (func)) + (type $1 (func)) + (type $2 (func (result i32))) + ;; CHECK: (memory $0 256 256) + + ;; CHECK: (func $b14 (result i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (block $block1 (result i32) + ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $block3 (result i32) + ;; CHECK-NEXT: (i32.const 27) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (i32.load + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (i32.const 27) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.rem_s + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 27) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (i32.trunc_f64_u + ;; CHECK-NEXT: (f64.const 12.34) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (else + ;; CHECK-NEXT: (i32.const 27) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + (func $b14 (type $2) + (drop + (if (result i32) ;; with shrinking, this can become a select + (i32.const 1) + (then + (block $block1 (result i32) + (i32.const 12) + ) + ) + (else + (block $block3 (result i32) + (i32.const 27) + ) + ) + ) + ) + (drop + (if (result i32) + (i32.const 1) + (then + (i32.load (i32.const 10)) ;; load may have side effects, unless ignored + ) + (else + (i32.const 27) + ) + ) + ) + (drop + (if (result i32) + (i32.const 1) + (then + (i32.rem_s (i32.const 11) (i32.const 12)) ;; rem may have side effects, unless ignored + ) + (else + (i32.const 27) + ) + ) + ) + (drop + (if (result i32) + (i32.const 1) + (then + (i32.trunc_f64_u (f64.const 12.34)) ;; float to int may have side effects, unless ignored + ) + (else + (i32.const 27) + ) + ) + ) + (i32.const 0) + ) + ;; CHECK: (func $join-br_ifs + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (block $out + ;; CHECK-NEXT: (br_if $out + ;; CHECK-NEXT: (i32.or + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (br_if $out + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $out2 + ;; CHECK-NEXT: (block $out3 + ;; CHECK-NEXT: (br_if $out2 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $out3 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $out2 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $out4 + ;; CHECK-NEXT: (block $out5 + ;; CHECK-NEXT: (br_if $out4 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $out5 + ;; CHECK-NEXT: (i32.or + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $out6 + ;; CHECK-NEXT: (block $out7 + ;; CHECK-NEXT: (br_if $out6 + ;; CHECK-NEXT: (i32.or + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (br_if $out7 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (i32.or + ;; CHECK-NEXT: (call $b14) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (then + ;; CHECK-NEXT: (block $out8 + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $out80 + ;; CHECK-NEXT: (br_if $out80 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $out80 + ;; CHECK-NEXT: (call $b14) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $join-br_ifs + (local $x i32) + (block $out + (br_if $out (local.get $x)) + (br_if $out (local.get $x)) + (br_if $out (local.get $x)) + ) + (block $out2 + (block $out3 + (br_if $out2 (local.get $x)) + (br_if $out3 (local.get $x)) + (br_if $out2 (local.get $x)) + ) + (unreachable) + ) + (block $out4 + (block $out5 + (br_if $out4 (local.get $x)) + (br_if $out5 (local.get $x)) + (br_if $out5 (local.get $x)) + ) + (unreachable) + ) + (block $out6 + (block $out7 + (br_if $out6 (local.get $x)) + (br_if $out6 (local.get $x)) + (br_if $out7 (local.get $x)) + ) + (unreachable) + ) + (block $out8 + (br_if $out8 (call $b14)) ;; side effect + (br_if $out8 (local.get $x)) + ) + (block $out8 + (br_if $out8 (local.get $x)) + (br_if $out8 (call $b14)) ;; side effect + ) + ) + ;; CHECK: (func $join-and-it-becomes-unreachable + ;; CHECK-NEXT: (block $label$1 + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (br_if $label$1 + ;; CHECK-NEXT: (i32.load8_u + ;; CHECK-NEXT: (i32.const -93487262) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $label$1 + ;; CHECK-NEXT: (loop $label$5 + ;; CHECK-NEXT: (br $label$5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $join-and-it-becomes-unreachable + (block $label$1 + (block + (br_if $label$1 + (i32.load8_u + (i32.const -93487262) + ) + ) + (br_if $label$1 + (loop $label$5 ;; this is unreachable (infinite loop, no exit) + (br $label$5) + ) + ) + ) + ) + ) + ;; CHECK: (func $br-if-unreachable-pair + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (block $label$14 + ;; CHECK-NEXT: (br_if $label$14 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $label$14 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $br-if-unreachable-pair + (local $x i32) + (block $label$14 + (br_if $label$14 + (unreachable) + ) + (br_if $label$14 + (local.get $x) + ) + ) + ) + ;; CHECK: (func $br-if-unreachable-pair2 + ;; CHECK-NEXT: (local $x i32) + ;; CHECK-NEXT: (block $label$14 + ;; CHECK-NEXT: (br_if $label$14 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $label$14 + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $br-if-unreachable-pair2 + (local $x i32) + (block $label$14 + (br_if $label$14 + (local.get $x) + ) + (br_if $label$14 + (unreachable) + ) + ) + ) + ;; CHECK: (func $simple-switch (result i32) + ;; CHECK-NEXT: (block $A + ;; CHECK-NEXT: (block $B + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (br_table $A $y $y $y $y $y $A $y $y $y $y $A $y + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + (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)) + ) + ;; CHECK: (func $simple-switch-2 (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (block $A + ;; CHECK-NEXT: (block $B + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (br_if $A + ;; CHECK-NEXT: (i32.or + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.tee $0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (br $y) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + (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)) + ) + ;; CHECK: (func $simple-switch-3 (result i32) + ;; CHECK-NEXT: (local $0 i32) + ;; CHECK-NEXT: (block $A + ;; CHECK-NEXT: (block $B + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (br_if $A + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.tee $0 + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br_if $B + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (i32.const 1025) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (br $y) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + (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 $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $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)) + ) + ;; CHECK: (func $simple-switch-4 (result i32) + ;; CHECK-NEXT: (block $A + ;; CHECK-NEXT: (block $B + ;; CHECK-NEXT: (block $y + ;; CHECK-NEXT: (br_table $A $y $y $y $y $y $A $y $y $y $y $y $A $y + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (return + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + (func $simple-switch-4 (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)) + ) +) diff --git a/test/passes/remove-unused-brs_enable-multivalue.txt b/test/passes/remove-unused-brs_enable-multivalue.txt deleted file mode 100644 index 0bcfd5e08cb..00000000000 --- a/test/passes/remove-unused-brs_enable-multivalue.txt +++ /dev/null @@ -1,2954 +0,0 @@ -(module - (type $0 (func (param i32))) - (type $1 (func)) - (type $2 (func (result i32))) - (type $3 (func (param i32 i32) (result i32))) - (type $4 (func (param i32) (result i32))) - (type $5 (func (result i32 i64))) - (type $6 (func (result i64))) - (type $7 (func (param i32 i32))) - (type $8 (func (param f32 i32 f32 i32 i32 f64 f32) (result i32))) - (type $9 (func (param i32) (result i64))) - (type $10 (func (result f32))) - (type $11 (func (param i32) (result f32))) - (type $12 (func (param i32 f64 i32 f64 f32 f32) (result i32))) - (memory $0 256 256) - (func $b0-yes (param $i1 i32) - (block $topmost - ) - ) - (func $b1 (param $i1 i32) - (block $topmost - (block - (drop - (i32.const 0) - ) - ) - ) - ) - (func $b2 (param $i1 i32) - (block $topmost - (block $inner - ) - ) - ) - (func $b3-yes (param $i1 i32) - (block $topmost - (block $inner - ) - ) - ) - (func $b4 (param $i1 i32) - (block $topmost - (block $inner - (block - (drop - (i32.const 0) - ) - ) - ) - ) - ) - (func $b5 (param $i1 i32) - (block $topmost - (block $inner - (block - (drop - (i32.const 0) - ) - ) - ) - ) - ) - (func $b6 (param $i1 i32) - (block $topmost - (br_if $topmost - (local.get $i1) - ) - ) - ) - (func $b7 (param $i1 i32) - (block $topmost - (block - (drop - (i32.const 0) - ) - (br_if $topmost - (local.get $i1) - ) - ) - ) - ) - (func $b8 (param $i1 i32) - (block $topmost - (block $inner - (br_if $topmost - (local.get $i1) - ) - ) - ) - ) - (func $b9 (param $i1 i32) - (block $topmost - (block $inner - (br_if $topmost - (local.get $i1) - ) - ) - ) - ) - (func $b10 (param $i1 i32) - (block $topmost - (block $inner - (block - (drop - (i32.const 0) - ) - (br_if $topmost - (local.get $i1) - ) - ) - ) - ) - ) - (func $b11 (param $i1 i32) - (block $topmost - (block $inner - (block - (drop - (i32.const 0) - ) - (br_if $topmost - (local.get $i1) - ) - ) - ) - ) - ) - (func $b12-yes - (if - (i32.const 1) - (then - (block $topmost - (block $block1 - (drop - (i32.const 12) - ) - (block - (drop - (i32.const 1) - ) - ) - ) - ) - ) - (else - (block $block3 - (drop - (i32.const 27) - ) - (block - (drop - (i32.const 2) - ) - ) - ) - ) - ) - ) - (func $b13 (result i32) - (local $x i32) - (block $topmost (result i32) - (if - (i32.const 1) - (then - (block $block1 - (drop - (i32.const 12) - ) - (drop - (br_if $topmost - (local.get $x) - (local.get $x) - ) - ) - ) - ) - (else - (block $block3 - (drop - (i32.const 27) - ) - (br $topmost - (i32.const 2) - ) - ) - ) - ) - (i32.const 3) - ) - ) - (func $b14 (result i32) - (select - (block $topmost (result i32) - (block $block1 (result i32) - (i32.const 12) - ) - ) - (block $block3 (result i32) - (i32.const 27) - ) - (i32.const 1) - ) - ) - (func $b14-tuple (result i32 i64) - (if (type $5) (result i32 i64) - (i32.const 1) - (then - (block $topmost (type $5) (result i32 i64) - (block $block1 (type $5) (result i32 i64) - (tuple.make 2 - (i32.const 12) - (i64.const 12) - ) - ) - ) - ) - (else - (block $block3 (type $5) (result i32 i64) - (tuple.make 2 - (i32.const 27) - (i64.const 27) - ) - ) - ) - ) - ) - (func $b15 - (local $x i32) - (block $topmost - (br_if $topmost - (local.get $x) - ) - ) - ) - (func $b15b - (if - (i32.const 18) - (then - (block $topmost - (block - (drop - (i32.const 0) - ) - ) - ) - ) - ) - ) - (func $b16 - (block $a - (block $b - (block $c - ) - ) - ) - (block $a0 - (block $b0 - (block $c0 - ) - ) - ) - (block $a1 - (block $b1 - (block $c1 - ) - ) - ) - ) - (func $b17 - (if - (i32.const 0) - (then - (block $a - (block $block1 - ) - ) - ) - (else - (block $block3 - ) - ) - ) - (if - (i32.const 0) - (then - (block $a0 - (drop - (i32.const 1) - ) - ) - ) - (else - (block $block6 - ) - ) - ) - (if - (i32.const 0) - (then - (block $a1 - (block $block8 - ) - ) - ) - (else - (drop - (i32.const 1) - ) - ) - ) - (if - (i32.const 0) - (then - (block $c - (block $b - (block $block11 - ) - ) - ) - ) - (else - (block $block13 - ) - ) - ) - ) - (func $ret-1 - (nop) - ) - (func $ret-2 - (block $block0 - (block $block1 - ) - ) - ) - (func $ret-3 - (if - (i32.const 0) - (then - (block $block0 - ) - ) - (else - (block $block3 - ) - ) - ) - ) - (func $ret-value (result i32) - (block $block0 (result i32) - (block $block1 (result i32) - (i32.const 1) - ) - ) - ) - (func $no-select-but-the-last - (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 $a0 (result i32) - (i32.const 0) - ) - (then - (block $a1 - (block - (drop - (i32.const 1) - ) - ) - ) - ) - (else - (block $a2 - (block - (drop - (i32.const 2) - ) - ) - ) - ) - ) - ) - ) - (func $side-effects-and-order (result i32) - (local $x i32) - (block $do-once$0 - (if - (call $b13) - (then - (drop - (i32.const 0) - ) - (br $do-once$0) - ) - ) - (drop - (i32.const 1) - ) - ) - (block $do-once$00 - (if - (call $b13) - (then - (drop - (call $b14) - ) - (br $do-once$00) - ) - ) - (drop - (i32.const 1) - ) - ) - (block $do-once$01 - (if - (i32.const 0) - (then - (drop - (call $b14) - ) - (br $do-once$01) - ) - ) - (drop - (i32.const 1) - ) - ) - (block $do-once$02 (result i32) - (if - (local.tee $x - (i32.const 1) - ) - (then - (br $do-once$02 - (local.tee $x - (i32.const 2) - ) - ) - ) - ) - (i32.const 1) - ) - ) - (func $loops - (local $x i32) - (loop $in - (block $out - (br_if $in - (i32.eqz - (i32.const 0) - ) - ) - ) - ) - (loop $in0 - (br $in0) - ) - (loop - (block $out0 - (br_if $out0 - (local.get $x) - ) - ) - ) - (loop $in1 - (block $out1 - (br_if $out1 - (local.get $x) - ) - ) - ) - (loop $in2 - ) - (loop $in3 - (block $out2 - ) - ) - (loop $in4 - (if - (i32.eqz - (local.get $x) - ) - (then - (block $out3 - (nop) - (br_if $in4 - (local.get $x) - ) - ) - ) - ) - ) - (loop $in5 - (block $out4 - (br_if $in5 - (local.get $x) - ) - ) - ) - (loop $in6 - (if - (i32.const 0) - (then - (block $out5 - (unreachable) - ) - ) - (else - (br $in6) - ) - ) - ) - (loop $in7 - (if - (i32.const 0) - (then - (block $out6 - (block - (call $loops) - ) - ) - ) - (else - (br $in7) - ) - ) - ) - (loop $in-todo - (if - (i32.const 0) - (then - (block $out-todo - ) - ) - (else - (call $loops) - (br $in-todo) - ) - ) - ) - (loop $in8 - (if - (i32.const 0) - (then - (block $out7 - ) - ) - (else - (call $loops) - (br $in8) - ) - ) - ) - (loop $in9 - (if - (i32.const 0) - (then - (call $loops) - (br $in9) - ) - (else - (block $out8 - ) - ) - ) - ) - (loop $in10 - (if - (i32.const 0) - (then - (drop - (i32.const 1) - ) - (call $loops) - (br $in10) - ) - (else - (block $out9 - ) - ) - ) - ) - (loop $in11 - (if - (i32.const 0) - (then - (block $out10 - ) - ) - (else - (call $loops) - (drop - (i32.const 100) - ) - (br $in11) - ) - ) - ) - (loop $in12 - (if - (i32.const 0) - (then - (call $loops) - (drop - (i32.const 101) - ) - (br $in12) - ) - (else - (block $out11 - ) - ) - ) - ) - (loop $in13 - (if - (i32.const 0) - (then - (drop - (i32.const 1) - ) - (call $loops) - (drop - (i32.const 102) - ) - (br $in13) - ) - (else - (block $out12 - ) - ) - ) - ) - (loop $in14 - (if - (i32.eqz - (i32.const 0) - ) - (then - (block $out13 - (nop) - (call $loops) - (return) - (br $in14) - ) - ) - ) - ) - (loop $in15 - (block $out14 - (br_if $out14 - (i32.const 0) - ) - (call $loops) - (br $out14) - (br $in15) - ) - ) - (loop $in16 - (if - (i32.const 0) - (then - (block $out15 - ) - ) - (else - (call $loops) - (drop - (block $out20 (result i32) - (i32.const 1) - ) - ) - (br $in16) - ) - ) - ) - (loop $in17 - (block $out16 - (br_if $in17 - (i32.eqz - (i32.const 0) - ) - ) - ) - ) - (loop $in-todo2 - (if - (i32.const 0) - (then - (block $out-todo2 - ) - ) - (else - (call $loops) - (br $in-todo2) - ) - ) - ) - (loop $in18 - (block $out17 - (br $out17) - (br $in18) - ) - ) - (loop $in19 - (block $out18 - (drop - (local.get $x) - ) - (br $in19) - ) - ) - (loop $in-not - (block $out-not - (br_if $out-not - (local.get $x) - ) - (br_if $out-not - (local.get $x) - ) - (call $loops) - (br $in-not) - ) - ) - (loop $in-todo20 - (if - (i32.const 0) - (then - (block $out-todo20 - ) - ) - (else - (call $loops) - (drop - (i32.const 1) - ) - (br $in-todo20) - ) - ) - ) - ) - (func $br_if_in_block (result i32) - (block $outval (result i32) - (block $in - (drop - (i32.const 1) - ) - (br $in) - (drop - (i32.const 2) - ) - (br_if $in - (i32.eqz - (i32.const 3) - ) - ) - (unreachable) - (drop - (i32.const 4) - ) - (br_if $in - (i32.const 5) - ) - (unreachable) - (drop - (i32.const 6) - ) - ) - (select - (i32.const 7) - (i32.const 8) - (i32.const 6) - ) - ) - ) - (func $threading - (local $x i32) - (drop - (block $value-out (result i32) - (block $value-in (result i32) - (block $out - (block $in - (br_if $out - (local.get $x) - ) - (br_if $out - (local.get $x) - ) - (br $value-in - (i32.const 3) - ) - ) - ) - (i32.const 4) - ) - ) - ) - (block $stack1 - (block $stack2 - (block $stack3 - (block $stack4 - (br_if $stack1 - (local.get $x) - ) - (unreachable) - ) - ) - ) - ) - ) - (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 - (local.get $x) - ) - ) - ) - (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 - (local.get $x) - ) - ) - (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) - (loop $label$continue$d - (block $label$break$c - (block $label$break$d - (if - (i32.lt_s - (local.get $j) - (i32.const 2147483640) - ) - (then - (block $x - (block $y - (block $z - (br_if $x - (local.get $j) - ) - ) - ) - ) - ) - (else - (block $switch$26 - ) - ) - ) - (i32.store - (i32.const 5724) - (i32.const -254899267) - ) - (br $label$continue$d) - ) - ) - ) - ) - (func $iffify - (local $x i32) - (if - (i32.eqz - (local.get $x) - ) - (then - (block $yes - (nop) - (drop - (i32.const 1) - ) - (drop - (i32.const 2) - ) - ) - ) - ) - (block $no - (br_if $no - (local.get $x) - ) - (drop - (i32.const 1) - ) - (br $no) - (drop - (i32.const 2) - ) - ) - (block $no2 - (br_if $no2 - (local.get $x) - ) - ) - (block $no3 - (br $no3) - (drop - (i32.const 1) - ) - (drop - (i32.const 2) - ) - ) - (block $no5 - (block $no4 - (br_if $no5 - (local.get $x) - ) - (drop - (i32.const 1) - ) - (drop - (i32.const 2) - ) - ) - ) - ) - (func $loop-if (result i32) - (loop $typed (result i32) - (block $outer (result i32) - (block (result i32) - (br_if $typed - (i32.eqz - (i32.const 2) - ) - ) - (block (result i32) - (drop - (call $loop-if) - ) - (i32.const 0) - ) - ) - ) - ) - ) - (func $block-break (param $0 i32) - (block $block$7$break - (block $shape$6$continue - (call $block-break - (i32.const 1) - ) - ) - ) - ) - (func $loop-break (param $0 i32) - (loop $shape$6$continue - (block $block$7$break - (block - (call $loop-break - (i32.const 1) - ) - (br_if $shape$6$continue - (local.get $0) - ) - ) - ) - ) - ) - (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 - (br_if $label$1 - (local.get $1) - ) - (br_if $label$1 - (i32.load 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) - ) - ) - (local.get $1) - ) - (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 - (br_if $label$0 - (i32.load8_s - (i32.const 201460482) - ) - ) - (block - (block $label$3 - (br_if $label$1 - (local.get $0) - ) - ) - (br $label$1) - ) - ) - ) - ) - (func $untaken-br-with-concrete-last-element - (block $label$8 - (block $label$11 - (block $label$14 - (br $label$8) - ) - ) - ) - ) - (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) - ) - (else - (i32.const 0) - ) - ) - ) - (else - (i32.const 0) - ) - ) - ) - ) - ) - (func $no-flow-through-if-without-else (result f32) - (local $0 i32) - (local $2 f32) - (if (result f32) - (local.get $0) - (then - (block $label$0 - (block $label$11 - (return - (f32.const 239) - ) - (if - (i32.const 0) - (then - (return - (local.get $2) - ) - ) - ) - ) - ) - ) - (else - (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) - ) - ) - (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 - (br_if $label$8 - (unreachable) - ) - (br $label$5) - ) - ) - ) - (br $label$5) - ) - ) - ) - (func $br-to-table (param $a i32) - (block $x - (block $y - (block $z - (nop) - (nop) - (block $tablify|0 - (br_table $x $y $z $tablify|0 - (local.get $a) - ) - ) - (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 $x - (i32.eq - (local.get $a) - (i32.const 1) - ) - ) - ) - ) - ) - ) - (func $br-to-table-one-more (param $a i32) - (block $x - (block $y - (block $z - (nop) - (nop) - (nop) - (block $tablify|0 - (br_table $x $y $z $x $tablify|0 - (local.get $a) - ) - ) - (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 - (nop) - (nop) - (block $tablify|0 - (br_table $x $y $z $tablify|0 - (i32.sub - (local.get $a) - (i32.const 15) - ) - ) - ) - (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 - (nop) - (nop) - (block $tablify|0 - (br_table $x $tablify|0 $tablify|0 $y $tablify|0 $tablify|0 $tablify|0 $tablify|0 $tablify|0 $z $tablify|0 - (local.get $a) - ) - ) - (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) - (nop) - (nop) - (block $tablify|0 - (br_table $x $y $z $tablify|0 - (local.get $a) - ) - ) - (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) - ) - ) - ) - (nop) - (nop) - (block $tablify|0 - (br_table $x $y $z $tablify|0 - (local.get $a) - ) - ) - (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) - ) - ) - (nop) - (nop) - (block $tablify|0 - (br_table $x $y $z $tablify|0 - (local.get $a) - ) - ) - (unreachable) - ) - (unreachable) - ) - (unreachable) - ) - (unreachable) - ) - (func $br-to-table-multi (param $a i32) - (block $x - (block $y - (block $z - (nop) - (nop) - (block $tablify|0 - (br_table $z $y $x $tablify|0 - (i32.sub - (i32.const 10) - (i32.const 5) - ) - ) - ) - (nop) - (nop) - (block $tablify|00 - (br_table $x $y $z $tablify|00 - (local.get $a) - ) - ) - (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) - ) - ) - (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 - (nop) - (nop) - (block $tablify|1 - (br_table $x $tablify|0 $z $tablify|1 - (local.get $a) - ) - ) - (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) - ) - ) - (nop) - (nop) - (block $tablify|0 - (br_table $z $x $y $tablify|0 - (i32.sub - (local.get $a) - (i32.const 1) - ) - ) - ) - (unreachable) - ) - (unreachable) - ) - (unreachable) - ) - (unreachable) - ) - (func $br-to-table-initial-tee (param $a i32) - (block $x - (block $y - (block $z - (nop) - (nop) - (block $tablify|0 - (br_table $x $y $z $tablify|0 - (i32.sub - (local.tee $a - (i32.add - (i32.const 10) - (i32.const 1) - ) - ) - (i32.const 10) - ) - ) - ) - (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) - ) - ) - (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 - (nop) - (nop) - (block $tablify|0 - (br_table $x $y $z $tablify|0 - (local.get $a) - ) - ) - (unreachable) - ) - (unreachable) - ) - (unreachable) - ) - (unreachable) - ) - (func $br-to-table-tee-eqz (param $a i32) - (block $x - (block $y - (block $z - (nop) - (nop) - (block $tablify|0 - (br_table $x $y $z $tablify|0 - (local.tee $a - (i32.add - (i32.const 0) - (i32.const 1) - ) - ) - ) - ) - (unreachable) - ) - (unreachable) - ) - (unreachable) - ) - (unreachable) - ) - (func $tiny-switch - (if - (i32.const 0) - (then - (block $y - ) - ) - (else - (block $x - ) - ) - ) - (block $z - (block - (drop - (i32.const 0) - ) - ) - ) - ) - (func $trim-switch - (block $A - (block $y - (br_table $A $y $A $y $A $y - (i32.sub - (i32.const 0) - (i32.const 2) - ) - ) - ) - (call $trim-switch) - ) - ) - (func $same-target-br_if-and-br - (local $x i32) - (block $x - (drop - (local.get $x) - ) - (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) - ) - ) - (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) - ) - ) - (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) - ) - ) - (i32.const 3) - ) - (func $simple-switch43 (result i32) - (local $0 i32) - (block $A - (block $B - (block $y - (br_if $A - (i32.eqz - (local.tee $0 - (i32.const 0) - ) - ) - ) - (br_if $B - (i32.eq - (local.get $0) - (i32.const 127) - ) - ) - (br $y) - (return - (i32.const 0) - ) - ) - (return - (i32.const 1) - ) - ) - (return - (i32.const 2) - ) - ) - (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) - ) - ) - (i32.const 3) - ) - (func $undo-if-return (param $p i32) (result i32) - (local $x i32) - (block $out - (block - (br_if $out - (local.get $p) - ) - (local.set $x - (i32.const 1) - ) - ) - (block - (br_if $out - (i32.eqz - (local.get $p) - ) - ) - (local.set $x - (i32.const 2) - ) - ) - (local.tee $x - (if - (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.tee $var$1 - (if (result f64) - (unreachable) - (then - (br $label$5) - ) - (else - (f64.const 1) - ) - ) - ) - ) - ) - (i64.const 1) - ) - ) - ) - ) - ) - (i32.const 0) - ) - (func $if-flow-1 (result i32) - (select - (i32.const 1) - (i32.const 2) - (i32.const 0) - ) - ) - (func $if-flow-2 (result i32) - (if (result i32) - (i32.const 0) - (then - (unreachable) - ) - (else - (i32.const 2) - ) - ) - ) - (func $if-flow-3 (result i32) - (if (result i32) - (i32.const 0) - (then - (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 - (br_if $label$1 - (i32.eqz - (i32.const 1) - ) - ) - (loop $label$2 - (unreachable) - (if - (i32.const 0) - (then - (nop) - ) - (else - (return - (i32.const 0) - ) - ) - ) - ) - ) - ) - (func $fuzz-block-unreachable-brs-with-values (result i32) - (local $0 i32) - (loop $label$1 - (if - (local.get $0) - (then - (block $label$2 - (local.tee $0 - (loop $label$5 - (unreachable) - (drop - (i32.const 0) - ) - ) - ) - ) - ) - (else - (br $label$1) - ) - ) - ) - ) - (func $drop-restructure-if (param $x i32) (param $y i32) (result i32) - (if (result i32) - (local.get $y) - (then - (local.get $x) - ) - (else - (block $label$2 (result i32) - (nop) - (i32.const 0) - ) - ) - ) - ) - (func $drop-restructure-if-final (param $x i32) (param $y i32) (result i32) - (if (result i32) - (local.get $y) - (then - (local.get $x) - ) - (else - (block $label$2 (result i32) - (nop) - (unreachable) - ) - ) - ) - ) - (func $drop-restructure-if-middle (param $x i32) (param $y i32) (result i32) - (if (result i32) - (local.get $y) - (then - (local.get $x) - ) - (else - (block $label$2 (result i32) - (nop) - (nop) - (i32.const 0) - ) - ) - ) - ) - (func $drop-restructure-select (param $x i32) (param $y i32) (result i32) - (select - (local.tee $y - (local.get $x) - ) - (block $label$2 (result i32) - (nop) - (i32.const 0) - ) - (local.get $y) - ) - ) - (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 - (if - (i32.const 1) - (then - (block $label - (block - (drop - (i32.const 2) - ) - (drop - (i32.const 3) - ) - ) - ) - ) - ) - ) - (func $if-block-bad - (block $label - (if - (br $label) - (then - (drop - (i32.const 2) - ) - (drop - (i32.const 3) - ) - ) - ) - ) - ) - (func $if-block-br - (local $x i32) - (block $label - (br_if $label - (local.get $x) - ) - ) - ) - (func $if-block-br-1 - (if - (i32.const 1) - (then - (block $label - ) - ) - (else - (drop - (i32.const 3) - ) - ) - ) - ) - (func $if-block-br-2 - (if - (i32.const 1) - (then - (block $label - (drop - (i32.const 3) - ) - ) - ) - (else - (nop) - ) - ) - ) - (func $if-block-br-3 - (if - (i32.const 1) - (then - (block $label - ) - ) - (else - (nop) - ) - ) - ) - (func $if-block-br-4-eithre - (if - (i32.const 1) - (then - (block $label - (drop - (i32.const 2) - ) - ) - ) - (else - (drop - (i32.const 3) - ) - ) - ) - ) - (func $if-block-br-5-value (result i32) - (select - (block $label (result i32) - (i32.const 2) - ) - (i32.const 3) - (i32.const 1) - ) - ) - (func $restructure-if-outerType-change - (loop $label$1 - (br_if $label$1 - (block $label$2 - (block $label$3 - (if - (block $label$4 - (unreachable) - ) - (then - (unreachable) - ) - ) - ) - (unreachable) - ) - ) - ) - ) - (func $if-arm-unreachable - (block $label$1 - (if - (unreachable) - (then - (nop) - ) - (else - (unreachable) - ) - ) - ) - ) - (func $propagate-type-if-we-optimize - (if - (i32.const 1) - (then - (nop) - ) - (else - (drop - (loop $label$3 (result i64) - (if - (i32.const 0) - (then - (block $label$4 - (unreachable) - ) - ) - (else - (unreachable) - ) - ) - (i64.const -9) - ) - ) - (unreachable) - ) - ) - ) - (func $switch-to-br - (block $A - (block $y - (block - (drop - (i32.const 0) - ) - (br $A) - ) - ) - ) - ) - (func $switch-to-br-value (result i32) - (block $A (result i32) - (block $y (result i32) - (block - (drop - (i32.const 1) - ) - (br $A - (i32.const 0) - ) - ) - ) - ) - ) - (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 $shape$1$continue $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$5$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$3$break $block$4$break $block$3$break - (local.get $x) - ) - ) - (br $shape$1$continue) - ) - (br $block$3$break) - ) - (br $block$4$break) - ) - (br $block$5$break) - ) - ) - (unreachable) - ) - (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 - (if - (i32.const 0) - (then - (block $label$3 - (block - ) - ) - ) - (else - (return - (i32.const -8192) - ) - ) - ) - ) - ) - (br $label$1) - ) - ) - (func $refinalize-need-br-value (result i32) - (local $x i32) - (loop $label$3 (result i32) - (block $label$6 (result i32) - (block $label$10 - (unreachable) - (block $label$503 - (br_if $label$3 - (block $label$530 (result i32) - (br_if $label$503 - (local.get $x) - ) - (i32.const 0) - ) - ) - (return - (i32.const 127) - ) - ) - ) - ) - ) - ) - (func $selectify (param $x i32) - (drop - (select - (i32.mul - (i32.const 2) - (i32.const 3) - ) - (i32.mul - (i32.const 2) - (i32.const 3) - ) - (i32.eq - (local.get $x) - (i32.const 1) - ) - ) - ) - (drop - (select - (i32.add - (i32.const 2) - (i32.const 3) - ) - (i32.add - (i32.const 2) - (i32.const 3) - ) - (i32.eq - (local.get $x) - (i32.const 1) - ) - ) - ) - ) - (func $selectify-even-with-condition-side-effects (param $0 i32) - (drop - (select - (i32.const 1) - (i32.const 0) - (i32.rem_s - (local.get $0) - (i32.const 2) - ) - ) - ) - ) - (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) - ) - ) - ) - (drop - (select - (i32.const 0) - (local.get $1) - (i32.rem_s - (local.tee $0 - (i32.const 3) - ) - (i32.const 2) - ) - ) - ) - ) - (func $if-one-side (result i32) - (local $x i32) - (local.set $x - (select - (i32.const 2) - (local.get $x) - (i32.const 1) - ) - ) - (local.get $x) - ) - (func $if-one-side-b (result i32) - (local $x i32) - (local.set $x - (select - (local.get $x) - (i32.const 2) - (i32.const 1) - ) - ) - (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 - (select - (i32.const -4) - (local.get $x) - (i32.const -3) - ) - ) - ) - ) - (i32.const 0) - ) - (func $ifs-copies-recursive (param $20 i32) (result i32) - (if - (i32.const 1) - (then - (local.set $20 - (select - (select - (i32.const 4) - (local.get $20) - (i32.const 3) - ) - (local.get $20) - (i32.const 2) - ) - ) - ) - ) - (local.get $20) - ) - (func $if-copy1 - (local $x i32) - (local $y i32) - (loop $top - (local.set $x - (select - (local.get $x) - (local.get $y) - (i32.const 1) - ) - ) - (br $top) - ) - ) - (func $if-copy3 - (local $x i32) - (local $y i32) - (loop $top - (if - (i32.const 1) - (then - (local.tee $x - (unreachable) - ) - ) - ) - (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 - (select - (local.get $x) - (i32.const 2) - (i32.const 1) - ) - ) - ) - (br $top) - ) - ) - (func $loop-end-set (param $x i32) (result i32) - (loop $loop - (nop) - (br_if $loop - (local.get $x) - ) - (local.set $x - (i32.const 1) - ) - ) - (local.get $x) - ) - (func $loop-end-value (param $x i32) (result i32) - (loop $loop (result i32) - (nop) - (br_if $loop - (local.get $x) - ) - (i32.const 1) - ) - ) - (func $do-not-flow-values-through-unreachable-code (result i32) - (unreachable) - (if - (i32.const 0) - (then - (block $A - (return - (i32.const 0) - ) - ) - ) - (else - (nop) - ) - ) - ) - (func $do-not-flow-values-through-unreachable-code-b (result i32) - (loop - (unreachable) - (if - (i32.const 0) - (then - (block $A - (return - (i32.const 0) - ) - ) - ) - (else - (nop) - ) - ) - ) - ) - (func $if_br_if - (local $0 i32) - (block $label$1 - (br_if $label$1 - (select - (local.tee $0 - (i32.const 1024) - ) - (i32.const 0) - (i32.eqz - (i32.const -4) - ) - ) - ) - (br_if $label$1 - (select - (i32.const 1025) - (i32.const 0) - (i32.eqz - (i32.const -5) - ) - ) - ) - (br_if $label$1 - (select - (local.tee $0 - (i32.const 1025) - ) - (i32.const 0) - (i32.eqz - (i32.const -6) - ) - ) - ) - (if - (i32.const 1026) - (then - (br_if $label$1 - (local.tee $0 - (local.get $0) - ) - ) - ) - ) - (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 - (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) - ) - ) -) diff --git a/test/passes/remove-unused-brs_enable-multivalue.wast b/test/passes/remove-unused-brs_enable-multivalue.wast deleted file mode 100644 index acbd3781ab9..00000000000 --- a/test/passes/remove-unused-brs_enable-multivalue.wast +++ /dev/null @@ -1,2633 +0,0 @@ -(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 - (local.get $i1) - ) - ) - ) - (func $b7 (type $0) (param $i1 i32) - (block $topmost - (block - (drop - (i32.const 0) - ) - (br_if $topmost - (local.get $i1) - ) - ) - ) - ) - (func $b8 (type $0) (param $i1 i32) - (block $topmost - (block $inner - (br_if $topmost - (local.get $i1) - ) - ) - ) - ) - (func $b9 (type $0) (param $i1 i32) - (block $topmost - (block $inner - (br_if $topmost - (local.get $i1) - ) - ) - ) - ) - (func $b10 (type $0) (param $i1 i32) - (block $topmost - (block $inner - (block - (drop - (i32.const 0) - ) - (br_if $topmost - (local.get $i1) - ) - ) - ) - ) - ) - (func $b11 (type $0) (param $i1 i32) - (block $topmost - (block $inner - (block - (drop - (i32.const 0) - ) - (br_if $inner - (local.get $i1) - ) - ) - ) - ) - ) - (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) - (local $x i32) - (block $topmost (result i32) - (if - (i32.const 1) - (then - (block $block1 - (drop - (i32.const 12) - ) - (drop - (br_if $topmost - (local.get $x) - (local.get $x) - ) - ) - ) - ) - (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) - (local $x i32) - (block $topmost - (if - (local.get $x) - (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 - (local $x i32) - (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 (local.get $x) (then (br $out))) - (br $out) - ) - ) - (loop $in - (block $out - (if (local.get $x) (then (br $out))) - (br $out) - ) - ) - (loop $in) - (loop $in - (block $out) - ) - (loop $in - (block $out - (if (local.get $x) (then (br $out))) - (br_if $in (local.get $x)) - ) - ) - (loop $in - (block $out - (if (local.get $x) (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 (local.get $x)) - (br $in) - ) - ) - (loop $in-not ;; do NOT if-ify, the block can't be removed - (block $out-not - (br_if $out-not (local.get $x)) - (br_if $out-not (local.get $x)) - (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 - (local $x i32) - (drop - (block $value-out (result i32) - (block $value-in (result i32) - (block $out - (block $in - (if (local.get $x) - (then - (br $in) - ) - ) - (br_if $in (local.get $x)) - (br $value-in (i32.const 3)) - ) - (br $out) - ) - (i32.const 4) - ) - ) - ) - (block $stack1 - (block $stack2 - (block $stack3 - (block $stack4 - (if (local.get $x) - (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 (local.get $x)) - ) - ) - (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 (local.get $x)) - ) - (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 - (local $x i32) - (block $yes - (br_if $yes - (local.get $x) - ) - (drop (i32.const 1)) - (drop (i32.const 2)) - ) - (block $no - (br_if $no - (local.get $x) - ) - (drop (i32.const 1)) - (br $no) - (drop (i32.const 2)) - ) - (block $no2 - (br_if $no2 - (local.get $x) - ) - ) - (block $no3 - (br $no3) - (drop (i32.const 1)) - (drop (i32.const 2)) - ) - (block $no5 - (block $no4 - (br_if $no5 - (local.get $x) - ) - (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 - (local.get $1) - ) - (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) - ) - ) - (local.get $1) - ) - (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 - (local $x i32) - (block $x - (br_if $x - (local.get $x) - ) - (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 - (local $x i32) - (block $label - (if - (local.get $x) - (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) - (local $x 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 - (local.get $x) - ) - (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 - (local.get $0) - ) - ) - ) - ) - (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) - ) - ) -) diff --git a/test/passes/remove-unused-brs_shrink-level=1.txt b/test/passes/remove-unused-brs_shrink-level=1.txt deleted file mode 100644 index 127f30508d7..00000000000 --- a/test/passes/remove-unused-brs_shrink-level=1.txt +++ /dev/null @@ -1,283 +0,0 @@ -(module - (type $2 (func (result i32))) - (type $1 (func)) - (memory $0 256 256) - (func $b14 (result i32) - (drop - (select - (block $block1 (result i32) - (i32.const 12) - ) - (block $block3 (result i32) - (i32.const 27) - ) - (i32.const 1) - ) - ) - (drop - (if (result i32) - (i32.const 1) - (then - (i32.load - (i32.const 10) - ) - ) - (else - (i32.const 27) - ) - ) - ) - (drop - (select - (i32.rem_s - (i32.const 11) - (i32.const 12) - ) - (i32.const 27) - (i32.const 1) - ) - ) - (drop - (if (result i32) - (i32.const 1) - (then - (i32.trunc_f64_u - (f64.const 12.34) - ) - ) - (else - (i32.const 27) - ) - ) - ) - (i32.const 0) - ) - (func $join-br_ifs - (local $x i32) - (block $out - (br_if $out - (i32.or - (local.get $x) - (local.get $x) - ) - ) - (nop) - (br_if $out - (local.get $x) - ) - ) - (block $out2 - (block $out3 - (br_if $out2 - (local.get $x) - ) - (br_if $out3 - (local.get $x) - ) - (br_if $out2 - (local.get $x) - ) - ) - (unreachable) - ) - (block $out4 - (block $out5 - (br_if $out4 - (local.get $x) - ) - (br_if $out5 - (i32.or - (local.get $x) - (local.get $x) - ) - ) - (nop) - ) - (unreachable) - ) - (block $out6 - (block $out7 - (br_if $out6 - (i32.or - (local.get $x) - (local.get $x) - ) - ) - (nop) - (br_if $out7 - (local.get $x) - ) - ) - (unreachable) - ) - (if - (i32.eqz - (i32.or - (call $b14) - (local.get $x) - ) - ) - (then - (block $out8 - (nop) - (nop) - ) - ) - ) - (block $out80 - (br_if $out80 - (local.get $x) - ) - (br_if $out80 - (call $b14) - ) - ) - ) - (func $join-and-it-becomes-unreachable - (block $label$1 - (block - (br_if $label$1 - (i32.load8_u - (i32.const -93487262) - ) - ) - (br_if $label$1 - (loop $label$5 - (br $label$5) - ) - ) - ) - ) - ) - (func $br-if-unreachable-pair - (local $x i32) - (block $label$14 - (br_if $label$14 - (unreachable) - ) - (br_if $label$14 - (local.get $x) - ) - ) - ) - (func $br-if-unreachable-pair2 - (local $x i32) - (block $label$14 - (br_if $label$14 - (local.get $x) - ) - (br_if $label$14 - (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) - ) - ) - (i32.const 3) - ) - (func $simple-switch-2 (result i32) - (local $0 i32) - (block $A - (block $B - (block $y - (br_if $A - (i32.or - (i32.eqz - (local.tee $0 - (i32.const 0) - ) - ) - (i32.eq - (local.get $0) - (i32.const 12) - ) - ) - ) - (nop) - (br $y) - (return - (i32.const 0) - ) - ) - (return - (i32.const 1) - ) - ) - (return - (i32.const 2) - ) - ) - (i32.const 3) - ) - (func $simple-switch-3 (result i32) - (local $0 i32) - (block $A - (block $B - (block $y - (br_if $A - (i32.eqz - (local.tee $0 - (i32.const 0) - ) - ) - ) - (br_if $B - (i32.eq - (local.get $0) - (i32.const 1025) - ) - ) - (br $y) - (return - (i32.const 0) - ) - ) - (return - (i32.const 1) - ) - ) - (return - (i32.const 2) - ) - ) - (i32.const 3) - ) - (func $simple-switch-4 (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) - ) - ) - (i32.const 3) - ) -) diff --git a/test/passes/remove-unused-brs_shrink-level=1.wast b/test/passes/remove-unused-brs_shrink-level=1.wast deleted file mode 100644 index 00d29376b06..00000000000 --- a/test/passes/remove-unused-brs_shrink-level=1.wast +++ /dev/null @@ -1,195 +0,0 @@ -(module - (memory 256 256) - (type $0 (func (param i32))) - (type $1 (func)) - (type $2 (func (result i32))) - (func $b14 (type $2) - (drop - (if (result i32) ;; with shrinking, this can become a select - (i32.const 1) - (then - (block $block1 (result i32) - (i32.const 12) - ) - ) - (else - (block $block3 (result i32) - (i32.const 27) - ) - ) - ) - ) - (drop - (if (result i32) - (i32.const 1) - (then - (i32.load (i32.const 10)) ;; load may have side effects, unless ignored - ) - (else - (i32.const 27) - ) - ) - ) - (drop - (if (result i32) - (i32.const 1) - (then - (i32.rem_s (i32.const 11) (i32.const 12)) ;; rem may have side effects, unless ignored - ) - (else - (i32.const 27) - ) - ) - ) - (drop - (if (result i32) - (i32.const 1) - (then - (i32.trunc_f64_u (f64.const 12.34)) ;; float to int may have side effects, unless ignored - ) - (else - (i32.const 27) - ) - ) - ) - (i32.const 0) - ) - (func $join-br_ifs - (local $x i32) - (block $out - (br_if $out (local.get $x)) - (br_if $out (local.get $x)) - (br_if $out (local.get $x)) - ) - (block $out2 - (block $out3 - (br_if $out2 (local.get $x)) - (br_if $out3 (local.get $x)) - (br_if $out2 (local.get $x)) - ) - (unreachable) - ) - (block $out4 - (block $out5 - (br_if $out4 (local.get $x)) - (br_if $out5 (local.get $x)) - (br_if $out5 (local.get $x)) - ) - (unreachable) - ) - (block $out6 - (block $out7 - (br_if $out6 (local.get $x)) - (br_if $out6 (local.get $x)) - (br_if $out7 (local.get $x)) - ) - (unreachable) - ) - (block $out8 - (br_if $out8 (call $b14)) ;; side effect - (br_if $out8 (local.get $x)) - ) - (block $out8 - (br_if $out8 (local.get $x)) - (br_if $out8 (call $b14)) ;; side effect - ) - ) - (func $join-and-it-becomes-unreachable - (block $label$1 - (block - (br_if $label$1 - (i32.load8_u - (i32.const -93487262) - ) - ) - (br_if $label$1 - (loop $label$5 ;; this is unreachable (infinite loop, no exit) - (br $label$5) - ) - ) - ) - ) - ) - (func $br-if-unreachable-pair - (local $x i32) - (block $label$14 - (br_if $label$14 - (unreachable) - ) - (br_if $label$14 - (local.get $x) - ) - ) - ) - (func $br-if-unreachable-pair2 - (local $x i32) - (block $label$14 - (br_if $label$14 - (local.get $x) - ) - (br_if $label$14 - (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 $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $y $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-4 (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)) - ) -)