summaryrefslogtreecommitdiff
path: root/test/lit/passes/flatten_rereloop.wast
diff options
context:
space:
mode:
Diffstat (limited to 'test/lit/passes/flatten_rereloop.wast')
-rw-r--r--test/lit/passes/flatten_rereloop.wast1975
1 files changed, 1975 insertions, 0 deletions
diff --git a/test/lit/passes/flatten_rereloop.wast b/test/lit/passes/flatten_rereloop.wast
new file mode 100644
index 000000000..436fc930c
--- /dev/null
+++ b/test/lit/passes/flatten_rereloop.wast
@@ -0,0 +1,1975 @@
+;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited.
+;; NOTE: This test was ported using port_test.py and could be cleaned up.
+
+;; RUN: foreach %s %t wasm-opt --flatten --rereloop -S -o - | filecheck %s
+
+(module
+ (memory 1)
+ ;; CHECK: (type $none_=>_none (func))
+
+ ;; CHECK: (type $none_=>_i32 (func (result i32)))
+
+ ;; CHECK: (type $none_=>_f64 (func (result f64)))
+
+ ;; CHECK: (type $i32_=>_none (func (param i32)))
+
+ ;; CHECK: (type $i32_=>_f32 (func (param i32) (result f32)))
+
+ ;; CHECK: (type $none_=>_f32 (func (result f32)))
+
+ ;; CHECK: (global $global (mut i32) (i32.const 0))
+ (global $global (mut i32) (i32.const 0))
+ ;; CHECK: (memory $0 1)
+
+ ;; CHECK: (func $0 (result f64)
+ ;; CHECK-NEXT: (local $0 f64)
+ ;; CHECK-NEXT: (local $1 f64)
+ ;; CHECK-NEXT: (local $2 i32)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (local.set $0
+ ;; CHECK-NEXT: (f64.const -nan:0xfffffd63e4e5a)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $1
+ ;; CHECK-NEXT: (local.get $0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (local.get $1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $0 (result f64)
+ (if
+ (i32.const 0)
+ (loop $label$2
+ (unreachable)
+ )
+ )
+ (f64.const -nan:0xfffffd63e4e5a)
+ )
+ ;; CHECK: (func $1 (result i32)
+ ;; CHECK-NEXT: (local $0 i32)
+ ;; CHECK-NEXT: (local $1 i32)
+ ;; CHECK-NEXT: (local $2 i32)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block $block$6$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block $switch$1$leave
+ ;; CHECK-NEXT: (block $switch$1$default
+ ;; CHECK-NEXT: (block $switch$1$case$4
+ ;; CHECK-NEXT: (br_table $switch$1$case$4 $switch$1$case$4 $switch$1$default
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$6$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block $switch$6$leave
+ ;; CHECK-NEXT: (block $switch$6$default
+ ;; CHECK-NEXT: (block $switch$6$case$3
+ ;; CHECK-NEXT: (br_table $switch$6$case$3 $switch$6$default
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (local.set $0
+ ;; CHECK-NEXT: (i32.const 2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $1
+ ;; CHECK-NEXT: (local.get $0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (local.get $1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $1 (result i32)
+ (block $label$8
+ (block $label$9
+ (block $label$16
+ (block $label$18
+ (block $label$19
+ (br_table $label$18 $label$16 $label$19
+ (i32.const 0)
+ )
+ )
+ (br_table $label$9 $label$8
+ (i32.const 1)
+ )
+ )
+ (unreachable)
+ )
+ (unreachable)
+ )
+ (unreachable)
+ )
+ (i32.const 2)
+ )
+ ;; CHECK: (func $skip-empty
+ ;; CHECK-NEXT: (local $0 i32)
+ ;; CHECK-NEXT: (block $block$2$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$2$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $skip-empty
+ (block $a1
+ (block $a2
+ (block $a3
+ (block $a4
+ (br $a4)
+ )
+ (br $a3)
+ )
+ (br $a2)
+ )
+ (br $a1)
+ )
+ )
+ ;; CHECK: (func $skip-empty-2
+ ;; CHECK-NEXT: (local $0 i32)
+ ;; CHECK-NEXT: (block $block$5$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$5$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block $block$4$break
+ ;; CHECK-NEXT: (call $skip-empty)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$4$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block $block$2$break
+ ;; CHECK-NEXT: (call $skip-empty)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$2$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $skip-empty-2
+ (block $a1
+ (block $a2
+ (block $a3
+ (block $a4
+ (br $a4)
+ )
+ (call $skip-empty)
+ (br $a3)
+ )
+ (call $skip-empty)
+ (br $a2)
+ )
+ (br $a1)
+ )
+ )
+ ;; CHECK: (func $skip-empty-3
+ ;; CHECK-NEXT: (local $0 i32)
+ ;; CHECK-NEXT: (block $block$5$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$5$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block $block$4$break
+ ;; CHECK-NEXT: (call $skip-empty)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$4$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block $block$2$break
+ ;; CHECK-NEXT: (call $skip-empty)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$2$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $skip-empty-3
+ (block $a1
+ (block $a2
+ (block $a3
+ (block $a4
+ (nop)
+ (br $a4)
+ (nop)
+ )
+ (nop)
+ (call $skip-empty)
+ (nop)
+ (br $a3)
+ )
+ (nop)
+ (call $skip-empty)
+ (nop)
+ (br $a2)
+ )
+ (br $a1)
+ )
+ )
+ ;; CHECK: (func $skip-empty-4 (param $x i32)
+ ;; CHECK-NEXT: (local $1 i32)
+ ;; CHECK-NEXT: (local $2 i32)
+ ;; CHECK-NEXT: (block $block$2$break
+ ;; CHECK-NEXT: (local.set $1
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$2$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $skip-empty-4 (param $x i32)
+ (block $a1
+ (block $a2
+ (block $a3
+ (block $a4
+ (br_table $a1 $a2 $a3 $a4 $a1 $a2 $a3 $a4 (local.get $x))
+ )
+ (br $a3)
+ )
+ (br $a2)
+ )
+ (br $a1)
+ )
+ )
+ ;; CHECK: (func $skipping (param $0 i32) (result f32)
+ ;; CHECK-NEXT: (local $1 f32)
+ ;; CHECK-NEXT: (local $2 f32)
+ ;; CHECK-NEXT: (local $3 f32)
+ ;; CHECK-NEXT: (local $4 f32)
+ ;; CHECK-NEXT: (local $5 i32)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (local.set $1
+ ;; CHECK-NEXT: (f32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $2
+ ;; CHECK-NEXT: (local.get $1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $3
+ ;; CHECK-NEXT: (local.get $2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $4
+ ;; CHECK-NEXT: (local.get $3)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (local.get $4)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $skipping (param $0 i32) (result f32)
+ (if
+ (i32.const 0)
+ (unreachable)
+ ) ;; branches joining here lead to skip opportunities
+ (loop $label$2 (result f32)
+ (f32.const 1)
+ )
+ )
+ ;; CHECK: (func $merging
+ ;; CHECK-NEXT: (local $0 i32)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $merging
+ (if
+ (i32.const 0)
+ (return)
+ ;; no else, but the else ends up with a return too, and we can merge them
+ )
+ )
+ ;; CHECK: (func $unswitch
+ ;; CHECK-NEXT: (local $0 i32)
+ ;; CHECK-NEXT: (block $block$2$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$2$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $unswitch
+ (block $label$1
+ (br_table $label$1 $label$1
+ (i32.const 0)
+ )
+ )
+ )
+ ;; CHECK: (func $skip-only-empty
+ ;; CHECK-NEXT: (local $0 i32)
+ ;; CHECK-NEXT: (block $block$3$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (global.set $global
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$3$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (br $block$3$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $skip-only-empty
+ (if
+ (i32.const 1)
+ (global.set $global
+ (i32.const 0)
+ )
+ )
+ )
+ ;; CHECK: (func $skip-only-one-branch-out (result i32)
+ ;; CHECK-NEXT: (local $0 i32)
+ ;; CHECK-NEXT: (local $1 i32)
+ ;; CHECK-NEXT: (local $2 i32)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (local.set $0
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $1
+ ;; CHECK-NEXT: (local.get $0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (local.get $1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $skip-only-one-branch-out (result i32)
+ (block $label$1
+ (nop)
+ )
+ (if
+ (i32.const 1)
+ (unreachable) ;; blocks a path through
+ )
+ (i32.const 0)
+ )
+ ;; CHECK: (func $multipass-for-skips (result f32)
+ ;; CHECK-NEXT: (local $0 f32)
+ ;; CHECK-NEXT: (local $1 f32)
+ ;; CHECK-NEXT: (local $2 f32)
+ ;; CHECK-NEXT: (local $3 f32)
+ ;; CHECK-NEXT: (local $4 i32)
+ ;; CHECK-NEXT: (block $block$7$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (local.set $0
+ ;; CHECK-NEXT: (f32.const 9223372036854775808)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (local.set $1
+ ;; CHECK-NEXT: (local.get $0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $2
+ ;; CHECK-NEXT: (local.get $1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$7$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (local.set $2
+ ;; CHECK-NEXT: (f32.const 65505)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$7$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (local.set $3
+ ;; CHECK-NEXT: (local.get $2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (local.get $3)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $multipass-for-skips (result f32)
+ (if (result f32)
+ (i32.const 0)
+ (block (result f32)
+ (block $label$2
+ (br_if $label$2
+ (i32.const 536870912)
+ )
+ )
+ (f32.const 9223372036854775808)
+ )
+ (f32.const 65505)
+ )
+ )
+ ;; CHECK: (func $branch-merge-vs-replace
+ ;; CHECK-NEXT: (local $0 i32)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $branch-merge-vs-replace
+ (if
+ (i32.const 0)
+ (unreachable)
+ )
+ )
+ ;; CHECK: (func $unswitch-amount
+ ;; CHECK-NEXT: (local $0 i32)
+ ;; CHECK-NEXT: (block $block$2$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const -23)
+ ;; CHECK-NEXT: (br $block$2$break)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block $block$6$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block $switch$4$leave
+ ;; CHECK-NEXT: (block $switch$4$default
+ ;; CHECK-NEXT: (block $switch$4$case$2
+ ;; CHECK-NEXT: (br_table $switch$4$case$2 $switch$4$default
+ ;; CHECK-NEXT: (i32.const 44064)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$2$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$6$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $unswitch-amount
+ (block $label$1
+ (if
+ (i32.const -23)
+ (nop)
+ (block
+ (block $label$4
+ (br_table $label$1 $label$4
+ (i32.const 44064)
+ )
+ )
+ (unreachable)
+ )
+ )
+ )
+ )
+)
+;; manual TODO: merge branches, all the parts
+(module
+ ;; CHECK: (type $3 (func (param i32)))
+
+ ;; CHECK: (type $0 (func))
+ (type $0 (func))
+ ;; CHECK: (type $2 (func (param i32) (result i32)))
+
+ ;; CHECK: (type $1 (func (result i32)))
+ (type $1 (func (result i32)))
+ (type $2 (func (param i32) (result i32)))
+ (type $3 (func (param i32)))
+ ;; CHECK: (func $trivial
+ ;; CHECK-NEXT: (local $0 i32)
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ (func $trivial (; 0 ;) (type $0)
+ (nop)
+ )
+ ;; CHECK: (func $trivial2
+ ;; CHECK-NEXT: (local $0 i32)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $trivial)
+ ;; CHECK-NEXT: (call $trivial)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $trivial2 (; 1 ;) (type $0)
+ (block
+ (call $trivial)
+ (nop)
+ (call $trivial)
+ (nop)
+ )
+ (nop)
+ )
+ ;; CHECK: (func $return-void
+ ;; CHECK-NEXT: (local $0 i32)
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ (func $return-void (; 2 ;) (type $0)
+ (return)
+ (unreachable)
+ )
+ ;; CHECK: (func $return-val (result i32)
+ ;; CHECK-NEXT: (local $0 i32)
+ ;; CHECK-NEXT: (local $1 i32)
+ ;; CHECK-NEXT: (local $2 i32)
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $return-val (; 3 ;) (type $1) (result i32)
+ (return
+ (i32.const 1)
+ )
+ (unreachable)
+ )
+ ;; CHECK: (func $ifs (param $x 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 $5 i32)
+ ;; CHECK-NEXT: (local $6 i32)
+ ;; CHECK-NEXT: (local $7 i32)
+ ;; CHECK-NEXT: (local $8 i32)
+ ;; CHECK-NEXT: (local $9 i32)
+ ;; CHECK-NEXT: (local $10 i32)
+ ;; CHECK-NEXT: (local $11 i32)
+ ;; CHECK-NEXT: (local $12 i32)
+ ;; CHECK-NEXT: (local $13 i32)
+ ;; CHECK-NEXT: (local $14 i32)
+ ;; CHECK-NEXT: (local $15 i32)
+ ;; CHECK-NEXT: (local $16 i32)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (local.set $6
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $1
+ ;; CHECK-NEXT: (local.get $6)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $7
+ ;; CHECK-NEXT: (local.get $1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (local.get $7)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (local.set $8
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $2
+ ;; CHECK-NEXT: (local.get $8)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $9
+ ;; CHECK-NEXT: (local.get $2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (local.get $9)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (i32.const 2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (i32.const 3)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (local.set $10
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $3
+ ;; CHECK-NEXT: (local.get $10)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $11
+ ;; CHECK-NEXT: (local.get $3)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (local.get $11)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (i32.const 4)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (i32.const 5)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $ifs (; 4 ;) (type $2) (param $x i32) (result i32)
+ (local $1 i32)
+ (local $2 i32)
+ (local $3 i32)
+ (local $4 i32)
+ (local $5 i32)
+ (block
+ (block
+ (local.set $1
+ (local.get $x)
+ )
+ (if
+ (local.get $1)
+ (block
+ (block
+ (local.set $2
+ (local.get $x)
+ )
+ (if
+ (local.get $2)
+ (block
+ (return
+ (i32.const 2)
+ )
+ (unreachable)
+ )
+ (block
+ (return
+ (i32.const 3)
+ )
+ (unreachable)
+ )
+ )
+ )
+ (unreachable)
+ )
+ )
+ )
+ (nop)
+ (block
+ (local.set $3
+ (local.get $x)
+ )
+ (if
+ (local.get $3)
+ (block
+ (return
+ (i32.const 4)
+ )
+ (unreachable)
+ )
+ )
+ )
+ (nop)
+ (return
+ (i32.const 5)
+ )
+ (unreachable)
+ )
+ (local.set $5
+ (local.get $4)
+ )
+ (return
+ (local.get $5)
+ )
+ )
+ ;; CHECK: (func $loops (param $x i32)
+ ;; CHECK-NEXT: (local $1 i32)
+ ;; CHECK-NEXT: (local $2 i32)
+ ;; CHECK-NEXT: (local $3 i32)
+ ;; CHECK-NEXT: (local $4 i32)
+ ;; CHECK-NEXT: (local $5 i32)
+ ;; CHECK-NEXT: (local $6 i32)
+ ;; CHECK-NEXT: (local $7 i32)
+ ;; CHECK-NEXT: (local $8 i32)
+ ;; CHECK-NEXT: (local $9 i32)
+ ;; CHECK-NEXT: (local $10 i32)
+ ;; CHECK-NEXT: (block $block$21$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (local.set $4
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $1
+ ;; CHECK-NEXT: (local.get $4)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $5
+ ;; CHECK-NEXT: (local.get $1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (local.get $5)
+ ;; CHECK-NEXT: (loop $shape$2$continue
+ ;; CHECK-NEXT: (call $trivial)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $shape$2$continue)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (br $block$21$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block $block$24$break
+ ;; CHECK-NEXT: (loop $shape$4$continue
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $trivial)
+ ;; CHECK-NEXT: (local.set $6
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $2
+ ;; CHECK-NEXT: (local.get $6)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $7
+ ;; CHECK-NEXT: (local.get $2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (local.get $7)
+ ;; CHECK-NEXT: (br $shape$4$continue)
+ ;; CHECK-NEXT: (br $block$24$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block $block$2$break
+ ;; CHECK-NEXT: (loop $shape$6$continue
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $trivial)
+ ;; CHECK-NEXT: (local.set $8
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $3
+ ;; CHECK-NEXT: (local.get $8)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $9
+ ;; CHECK-NEXT: (local.get $3)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (local.get $9)
+ ;; CHECK-NEXT: (br $shape$6$continue)
+ ;; CHECK-NEXT: (br $block$2$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $loops (; 5 ;) (type $3) (param $x i32)
+ (local $1 i32)
+ (local $2 i32)
+ (local $3 i32)
+ (block
+ (block
+ (local.set $1
+ (local.get $x)
+ )
+ (if
+ (local.get $1)
+ (block
+ (loop $top
+ (block
+ (call $trivial)
+ (nop)
+ (br $top)
+ (unreachable)
+ )
+ (unreachable)
+ )
+ (unreachable)
+ )
+ )
+ )
+ (nop)
+ (loop $top2
+ (block
+ (call $trivial)
+ (nop)
+ (local.set $2
+ (local.get $x)
+ )
+ (br_if $top2
+ (local.get $2)
+ )
+ (nop)
+ )
+ (nop)
+ )
+ (nop)
+ (loop $top3
+ (block
+ (call $trivial)
+ (nop)
+ (block
+ (local.set $3
+ (local.get $x)
+ )
+ (if
+ (local.get $3)
+ (block
+ (br $top3)
+ (unreachable)
+ )
+ )
+ )
+ (nop)
+ )
+ (nop)
+ )
+ (nop)
+ )
+ (nop)
+ )
+ ;; CHECK: (func $br-out (param $x i32)
+ ;; CHECK-NEXT: (local $1 i32)
+ ;; CHECK-NEXT: (block $block$2$break
+ ;; CHECK-NEXT: (call $br-out
+ ;; CHECK-NEXT: (i32.const 5)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$2$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $br-out (; 6 ;) (type $3) (param $x i32)
+ (block $out
+ (call $br-out
+ (i32.const 5)
+ )
+ (nop)
+ (br $out)
+ (unreachable)
+ )
+ (nop)
+ )
+ ;; CHECK: (func $unreachable (param $x i32)
+ ;; CHECK-NEXT: (local $1 i32)
+ ;; CHECK-NEXT: (local $2 i32)
+ ;; CHECK-NEXT: (local $3 i32)
+ ;; CHECK-NEXT: (local $4 i32)
+ ;; CHECK-NEXT: (local $5 i32)
+ ;; CHECK-NEXT: (local $6 i32)
+ ;; CHECK-NEXT: (local $7 i32)
+ ;; CHECK-NEXT: (block $block$4$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (local.set $3
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $1
+ ;; CHECK-NEXT: (local.get $3)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $4
+ ;; CHECK-NEXT: (local.get $1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (local.get $4)
+ ;; CHECK-NEXT: (br $block$4$break)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block $block$2$break
+ ;; CHECK-NEXT: (call $unreachable
+ ;; CHECK-NEXT: (i32.const 5)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$2$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (local.set $5
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $2
+ ;; CHECK-NEXT: (local.get $5)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $6
+ ;; CHECK-NEXT: (local.get $2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (local.get $6)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $unreachable
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $unreachable
+ ;; CHECK-NEXT: (i32.const 3)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $unreachable (; 7 ;) (type $3) (param $x i32)
+ (local $1 i32)
+ (local $2 i32)
+ (block
+ (block
+ (local.set $1
+ (local.get $x)
+ )
+ (if
+ (local.get $1)
+ (block
+ (block
+ (local.set $2
+ (local.get $x)
+ )
+ (if
+ (local.get $2)
+ (block
+ (block $block
+ (call $unreachable
+ (i32.const 1)
+ )
+ (nop)
+ (unreachable)
+ (unreachable)
+ (call $unreachable
+ (i32.const 2)
+ )
+ (nop)
+ )
+ (unreachable)
+ )
+ (block
+ (block $block4
+ (call $unreachable
+ (i32.const 3)
+ )
+ (nop)
+ (return)
+ (unreachable)
+ (call $unreachable
+ (i32.const 4)
+ )
+ (nop)
+ )
+ (unreachable)
+ )
+ )
+ )
+ (unreachable)
+ )
+ )
+ )
+ (nop)
+ (block $out
+ (call $unreachable
+ (i32.const 5)
+ )
+ (nop)
+ (br $out)
+ (unreachable)
+ (call $unreachable
+ (i32.const 6)
+ )
+ (nop)
+ )
+ (nop)
+ )
+ (nop)
+ )
+ ;; CHECK: (func $empty-blocks (param $x i32)
+ ;; CHECK-NEXT: (local $1 i32)
+ ;; CHECK-NEXT: (block $block$2$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$2$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $empty-blocks (; 8 ;) (type $3) (param $x i32)
+ (block
+ (block $block
+ )
+ (nop)
+ (block $block5
+ )
+ (nop)
+ )
+ (nop)
+ )
+ ;; CHECK: (func $before-and-after (param $x i32)
+ ;; CHECK-NEXT: (local $1 i32)
+ ;; CHECK-NEXT: (local $2 i32)
+ ;; CHECK-NEXT: (local $3 i32)
+ ;; CHECK-NEXT: (local $4 i32)
+ ;; CHECK-NEXT: (local $5 i32)
+ ;; CHECK-NEXT: (local $6 i32)
+ ;; CHECK-NEXT: (local $7 i32)
+ ;; CHECK-NEXT: (local $8 i32)
+ ;; CHECK-NEXT: (local $9 i32)
+ ;; CHECK-NEXT: (local $10 i32)
+ ;; CHECK-NEXT: (local $11 i32)
+ ;; CHECK-NEXT: (local $12 i32)
+ ;; CHECK-NEXT: (local $13 i32)
+ ;; CHECK-NEXT: (local $14 i32)
+ ;; CHECK-NEXT: (local $15 i32)
+ ;; CHECK-NEXT: (local $16 i32)
+ ;; CHECK-NEXT: (block $block$4$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 3)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 4)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $6
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $1
+ ;; CHECK-NEXT: (local.get $6)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $7
+ ;; CHECK-NEXT: (local.get $1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (local.get $7)
+ ;; CHECK-NEXT: (br $block$4$break)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 5)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$4$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block $block$8$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 6)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 7)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 8)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$8$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block $block$10$break
+ ;; CHECK-NEXT: (loop $shape$4$continue
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 9)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $8
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $2
+ ;; CHECK-NEXT: (local.get $8)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $9
+ ;; CHECK-NEXT: (local.get $2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (local.get $9)
+ ;; CHECK-NEXT: (br $shape$4$continue)
+ ;; CHECK-NEXT: (br $block$10$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block $block$11$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 10)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 11)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $10
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $3
+ ;; CHECK-NEXT: (local.get $10)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $11
+ ;; CHECK-NEXT: (local.get $3)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (local.get $11)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 12)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$11$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (br $block$11$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block $block$15$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 13)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $12
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $4
+ ;; CHECK-NEXT: (local.get $12)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $13
+ ;; CHECK-NEXT: (local.get $4)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (local.get $13)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 14)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$15$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 15)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$15$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block $block$21$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (local.set $14
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $5
+ ;; CHECK-NEXT: (local.get $14)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $15
+ ;; CHECK-NEXT: (local.get $5)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (local.get $15)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 16)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$21$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (br $block$21$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block $block$28$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 17)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 18)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 19)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 20)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 21)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 22)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$28$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block $block$30$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 23)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 24)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$30$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $before-and-after
+ ;; CHECK-NEXT: (i32.const 25)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $before-and-after (; 9 ;) (type $3) (param $x i32)
+ (local $1 i32)
+ (local $2 i32)
+ (local $3 i32)
+ (local $4 i32)
+ (local $5 i32)
+ (block
+ (call $before-and-after
+ (i32.const 1)
+ )
+ (nop)
+ (block $block
+ (call $before-and-after
+ (i32.const 2)
+ )
+ (nop)
+ )
+ (nop)
+ (call $before-and-after
+ (i32.const 3)
+ )
+ (nop)
+ (block $out
+ (call $before-and-after
+ (i32.const 4)
+ )
+ (nop)
+ (local.set $1
+ (local.get $x)
+ )
+ (br_if $out
+ (local.get $1)
+ )
+ (nop)
+ (call $before-and-after
+ (i32.const 5)
+ )
+ (nop)
+ )
+ (nop)
+ (call $before-and-after
+ (i32.const 6)
+ )
+ (nop)
+ (loop $loop-in
+ (nop)
+ )
+ (nop)
+ (call $before-and-after
+ (i32.const 7)
+ )
+ (nop)
+ (loop $top
+ (nop)
+ )
+ (nop)
+ (call $before-and-after
+ (i32.const 8)
+ )
+ (nop)
+ (loop $top2
+ (block
+ (call $before-and-after
+ (i32.const 9)
+ )
+ (nop)
+ (local.set $2
+ (local.get $x)
+ )
+ (br_if $top2
+ (local.get $2)
+ )
+ (nop)
+ (call $before-and-after
+ (i32.const 10)
+ )
+ (nop)
+ )
+ (nop)
+ )
+ (nop)
+ (call $before-and-after
+ (i32.const 11)
+ )
+ (nop)
+ (block
+ (local.set $3
+ (local.get $x)
+ )
+ (if
+ (local.get $3)
+ (block
+ (call $before-and-after
+ (i32.const 12)
+ )
+ (nop)
+ )
+ )
+ )
+ (nop)
+ (call $before-and-after
+ (i32.const 13)
+ )
+ (nop)
+ (block
+ (local.set $4
+ (local.get $x)
+ )
+ (if
+ (local.get $4)
+ (block
+ (call $before-and-after
+ (i32.const 14)
+ )
+ (nop)
+ )
+ (block
+ (call $before-and-after
+ (i32.const 15)
+ )
+ (nop)
+ )
+ )
+ )
+ (nop)
+ (block
+ (local.set $5
+ (local.get $x)
+ )
+ (if
+ (local.get $5)
+ (block
+ (block $block8
+ (call $before-and-after
+ (i32.const 16)
+ )
+ (nop)
+ )
+ (nop)
+ )
+ )
+ )
+ (nop)
+ (call $before-and-after
+ (i32.const 17)
+ )
+ (nop)
+ (block $block9
+ (call $before-and-after
+ (i32.const 18)
+ )
+ (nop)
+ (block $block10
+ (call $before-and-after
+ (i32.const 19)
+ )
+ (nop)
+ )
+ (nop)
+ (call $before-and-after
+ (i32.const 20)
+ )
+ (nop)
+ )
+ (nop)
+ (call $before-and-after
+ (i32.const 21)
+ )
+ (nop)
+ (block $block11
+ (block $block12
+ (call $before-and-after
+ (i32.const 22)
+ )
+ (nop)
+ )
+ (nop)
+ )
+ (nop)
+ (call $before-and-after
+ (i32.const 23)
+ )
+ (nop)
+ (block $no1
+ (block $no2
+ (call $before-and-after
+ (i32.const 24)
+ )
+ (nop)
+ )
+ (nop)
+ )
+ (nop)
+ (call $before-and-after
+ (i32.const 25)
+ )
+ (nop)
+ )
+ (nop)
+ )
+ ;; CHECK: (func $switch (param $x i32)
+ ;; CHECK-NEXT: (local $1 i32)
+ ;; CHECK-NEXT: (local $2 i32)
+ ;; CHECK-NEXT: (local $3 i32)
+ ;; CHECK-NEXT: (local $4 i32)
+ ;; CHECK-NEXT: (local $5 i32)
+ ;; CHECK-NEXT: (local $6 i32)
+ ;; CHECK-NEXT: (local $7 i32)
+ ;; CHECK-NEXT: (block $block$3$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (local.set $3
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $1
+ ;; CHECK-NEXT: (local.get $3)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $4
+ ;; CHECK-NEXT: (local.get $1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$3$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block $block$9$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $switch
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $5
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $2
+ ;; CHECK-NEXT: (local.get $5)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $6
+ ;; CHECK-NEXT: (local.get $2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block $switch$3$leave
+ ;; CHECK-NEXT: (block $switch$3$default
+ ;; CHECK-NEXT: (block $switch$3$case$9
+ ;; CHECK-NEXT: (br_table $switch$3$case$9 $switch$3$case$9 $switch$3$case$9 $switch$3$default
+ ;; CHECK-NEXT: (local.get $6)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$9$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $switch
+ ;; CHECK-NEXT: (i32.const 2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$9$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $switch
+ ;; CHECK-NEXT: (i32.const 3)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $switch (; 10 ;) (type $3) (param $x i32)
+ (local $1 i32)
+ (local $2 i32)
+ (block $out
+ (block $a
+ (local.set $1
+ (local.get $x)
+ )
+ (br_table $a $a
+ (local.get $1)
+ )
+ (unreachable)
+ )
+ (nop)
+ (call $switch
+ (i32.const 1)
+ )
+ (nop)
+ (block $b
+ (block $c
+ (local.set $2
+ (local.get $x)
+ )
+ (br_table $b $b $b $c
+ (local.get $2)
+ )
+ (unreachable)
+ )
+ (nop)
+ (call $switch
+ (i32.const 2)
+ )
+ (nop)
+ )
+ (nop)
+ (call $switch
+ (i32.const 3)
+ )
+ (nop)
+ )
+ (nop)
+ )
+ ;; CHECK: (func $no-return
+ ;; CHECK-NEXT: (local $0 i32)
+ ;; CHECK-NEXT: (block $block$6$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$6$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 3)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$6$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $no-return (; 11 ;) (type $0)
+ (if
+ (i32.const 1)
+ (block
+ (drop
+ (i32.const 2)
+ )
+ (nop)
+ )
+ (block
+ (drop
+ (i32.const 3)
+ )
+ (nop)
+ )
+ )
+ (nop)
+ )
+ ;; CHECK: (func $if-br-wat (param $x i32)
+ ;; CHECK-NEXT: (local $1 i32)
+ ;; CHECK-NEXT: (local $2 i32)
+ ;; CHECK-NEXT: (local $3 i32)
+ ;; CHECK-NEXT: (local $4 i32)
+ ;; CHECK-NEXT: (local $5 i32)
+ ;; CHECK-NEXT: (local $6 i32)
+ ;; CHECK-NEXT: (local $7 i32)
+ ;; CHECK-NEXT: (block $block$3$break
+ ;; CHECK-NEXT: (block $block$4$break
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $if-br-wat
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $3
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $1
+ ;; CHECK-NEXT: (local.get $3)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $4
+ ;; CHECK-NEXT: (local.get $1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (local.get $4)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $if-br-wat
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$4$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (local.set $5
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $2
+ ;; CHECK-NEXT: (local.get $5)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $6
+ ;; CHECK-NEXT: (local.get $2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (local.get $6)
+ ;; CHECK-NEXT: (br $block$3$break)
+ ;; CHECK-NEXT: (br $block$4$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $if-br-wat
+ ;; CHECK-NEXT: (i32.const 2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (br $block$3$break)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (call $if-br-wat
+ ;; CHECK-NEXT: (i32.const 3)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $if-br-wat (; 12 ;) (type $3) (param $x i32)
+ (local $1 i32)
+ (local $2 i32)
+ (block
+ (call $if-br-wat
+ (i32.const 0)
+ )
+ (nop)
+ (block $label$2
+ (block
+ (local.set $1
+ (local.get $x)
+ )
+ (if
+ (local.get $1)
+ (block
+ (call $if-br-wat
+ (i32.const 1)
+ )
+ (nop)
+ )
+ (block
+ (block
+ (local.set $2
+ (local.get $x)
+ )
+ (if
+ (local.get $2)
+ (block
+ (br $label$2)
+ (unreachable)
+ )
+ )
+ )
+ (nop)
+ )
+ )
+ )
+ (nop)
+ (call $if-br-wat
+ (i32.const 2)
+ )
+ (nop)
+ )
+ (nop)
+ (call $if-br-wat
+ (i32.const 3)
+ )
+ (nop)
+ )
+ (nop)
+ )
+ ;; CHECK: (func $switcher-to-nowhere (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 $5 i32)
+ ;; CHECK-NEXT: (local $6 i32)
+ ;; CHECK-NEXT: (local $7 i32)
+ ;; CHECK-NEXT: (local $8 i32)
+ ;; CHECK-NEXT: (local $9 i32)
+ ;; CHECK-NEXT: (local $10 i32)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (local.set $4
+ ;; CHECK-NEXT: (local.get $0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $1
+ ;; CHECK-NEXT: (local.get $4)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $5
+ ;; CHECK-NEXT: (local.get $1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block $switch$1$leave
+ ;; CHECK-NEXT: (block $switch$1$default
+ ;; CHECK-NEXT: (block $switch$1$case$4
+ ;; CHECK-NEXT: (block $switch$1$case$5
+ ;; CHECK-NEXT: (br_table $switch$1$case$5 $switch$1$case$4 $switch$1$default
+ ;; CHECK-NEXT: (local.get $5)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (i32.const 2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (i32.const 3)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $switcher-to-nowhere (; 13 ;) (type $2) (param $0 i32) (result i32)
+ (local $1 i32)
+ (local $2 i32)
+ (local $3 i32)
+ (block
+ (block $switch
+ (block $switch-case0
+ (block $switch-case
+ (local.set $1
+ (local.get $0)
+ )
+ (br_table $switch-case $switch-case0 $switch
+ (local.get $1)
+ )
+ (unreachable)
+ )
+ (nop)
+ (return
+ (i32.const 1)
+ )
+ (unreachable)
+ )
+ (nop)
+ (return
+ (i32.const 2)
+ )
+ (unreachable)
+ )
+ (nop)
+ (return
+ (i32.const 3)
+ )
+ (unreachable)
+ )
+ (local.set $3
+ (local.get $2)
+ )
+ (return
+ (local.get $3)
+ )
+ )
+)