blob: 9e3c6171f4b3ecb0f70c3286a0728dc5ac5e95d1 [file] [edit]
;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited.
;; RUN: wasm-opt -all %s -S -o - | filecheck %s
(module $parse
;; types
;; CHECK: (type $0 (func))
;; CHECK: (type $1 (func (result i32)))
;; CHECK: (type $pair (struct (field $first (mut i32)) (field $second (mut i64))))
;; CHECK: (type $ret2 (func (result i32 i32)))
(type $ret2 (func (result i32 i32)))
(rec
;; CHECK: (type $void (sub (func)))
;; CHECK: (type $5 (func (result i32 i64)))
;; CHECK: (type $a2 (array (mut f32)))
;; CHECK: (type $7 (func (param i32 i64)))
;; CHECK: (type $a1 (array i64))
;; CHECK: (type $9 (func (param anyref)))
;; CHECK: (type $simple (func (param i32 i64) (result f32)))
;; CHECK: (type $simple-cont (cont $simple))
;; CHECK: (type $12 (func (param i32 i64 v128)))
;; CHECK: (rec
;; CHECK-NEXT: (type $s0 (struct))
(type $s0 (struct))
;; CHECK: (type $s1 (struct))
(type $s1 (struct (field)))
)
(rec)
;; CHECK: (type $many (sub (func (param i32 i64 f32 f64) (result anyref (ref func)))))
;; CHECK: (type $packed-i8 (array (mut i8)))
;; CHECK: (type $packed-i16 (array (mut i16)))
;; CHECK: (type $a0 (array i32))
;; CHECK: (type $19 (func (param i32)))
;; CHECK: (type $any-array (array (mut anyref)))
;; CHECK: (type $21 (func (param i32 i64) (result i32 i64)))
;; CHECK: (type $22 (func (result exnref)))
;; CHECK: (type $23 (func (result i64)))
;; CHECK: (type $24 (func (result i64 f32)))
;; CHECK: (type $25 (func (param i32 i32 i32)))
;; CHECK: (type $26 (func (param v128 i32) (result v128)))
;; CHECK: (type $27 (func (param i32) (result i32)))
;; CHECK: (type $28 (func (param i32) (result i32 i64)))
;; CHECK: (type $29 (func (param stringref stringref) (result i32)))
;; CHECK: (type $30 (func (param i64 v128) (result v128)))
;; CHECK: (type $31 (func (param i64 v128)))
;; CHECK: (type $cont-bind-before-func (func (param i32 i64 i32 i64) (result f32)))
;; CHECK: (type $cont-bind-before (cont $cont-bind-before-func))
;; CHECK: (type $to-f32 (func (result f32)))
;; CHECK: (type $s2 (struct (field i32)))
(type $s2 (struct i32))
;; CHECK: (type $s3 (struct (field i64)))
(type $s3 (struct (field i64)))
;; CHECK: (type $s4 (struct (field $x f32)))
(type $s4 (struct (field $x f32)))
;; CHECK: (type $s5 (struct (field i32) (field i64)))
(type $s5 (struct i32 i64))
;; CHECK: (type $s6 (struct (field i64) (field f32)))
(type $s6 (struct (field i64 f32)))
;; CHECK: (type $s7 (struct (field $x f32) (field $y f64)))
(type $s7 (struct (field $x f32) (field $y f64)))
;; CHECK: (type $s8 (struct (field i32) (field i64) (field $z f32) (field f64) (field (mut i32))))
(type $s8 (struct i32 (field) i64 (field $z f32) (field f64 (mut i32))))
(type $a0 (array i32))
(type $a1 (array (field i64)))
(type $a2 (array (mut f32)))
;; CHECK: (type $a3 (array (mut f64)))
(type $a3 (array (field $x (mut f64))))
(type $pair (struct (field $first (mut i32)) (field $second (mut i64))))
(type $packed-i8 (array (mut i8)))
(type $packed-i16 (array (mut i16)))
(type $any-array (array (mut anyref)))
(rec
(type $void (sub (func)))
)
;; CHECK: (type $subvoid (sub final $void (func)))
(type $subvoid (sub final $void (func)))
(type $simple (func (param $x i32) (param $y i64) (result f32)))
(type $to-f32 (func (result f32)))
(type $many (sub (func (param $x i32) (param i64 f32) (param) (param $y f64)
(result anyref (ref func)))))
;; CHECK: (type $submany (sub final $many (func (param i32 i64 f32 f64) (result anyref (ref func)))))
(type $submany (sub final $many (func (param i32 i64 f32 f64) (result anyref (ref func)))))
(type $simple-cont (cont $simple))
;; CHECK: (type $all-types (struct (field externref) (field (ref extern)) (field (ref null (shared extern))) (field (ref (shared extern))) (field funcref) (field (ref func)) (field (ref null (shared func))) (field (ref (shared func))) (field anyref) (field (ref any)) (field (ref null (shared any))) (field (ref (shared any))) (field eqref) (field (ref eq)) (field (ref null (shared eq))) (field (ref (shared eq))) (field i31ref) (field (ref i31)) (field (ref null (shared i31))) (field (ref (shared i31))) (field structref) (field (ref struct)) (field (ref null (shared struct))) (field (ref (shared struct))) (field arrayref) (field (ref array)) (field (ref null (shared array))) (field (ref (shared array))) (field exnref) (field (ref exn)) (field (ref null (shared exn))) (field (ref (shared exn))) (field stringref) (field (ref string)) (field (ref null (shared string))) (field (ref (shared string))) (field contref) (field (ref cont)) (field (ref null (shared cont))) (field (ref (shared cont))) (field nullref) (field (ref none)) (field (ref null (shared none))) (field (ref (shared none))) (field nullexternref) (field (ref noextern)) (field (ref null (shared noextern))) (field (ref (shared noextern))) (field nullfuncref) (field (ref nofunc)) (field (ref null (shared nofunc))) (field (ref (shared nofunc))) (field nullexnref) (field (ref noexn)) (field (ref null (shared noexn))) (field (ref (shared noexn))) (field nullcontref) (field (ref nocont)) (field (ref null (shared nocont))) (field (ref (shared nocont)))))
;; CHECK: (type $46 (func (param i32 i32)))
;; CHECK: (type $47 (func (param exnref)))
;; CHECK: (type $48 (func (result anyref anyref)))
;; CHECK: (type $49 (func (param i32 i32 f64 f64)))
;; CHECK: (type $50 (func (param i64)))
;; CHECK: (type $51 (func (param v128) (result i32)))
;; CHECK: (type $52 (func (param v128 v128) (result v128)))
;; CHECK: (type $53 (func (param v128 v128 v128) (result v128)))
;; CHECK: (type $54 (func (param i32 i32 i64 i64)))
;; CHECK: (type $55 (func (param i64) (result i32 i64)))
;; CHECK: (type $56 (func (param anyref) (result i32)))
;; CHECK: (type $57 (func (param eqref eqref) (result i32)))
;; CHECK: (type $58 (func (param i32) (result i31ref)))
;; CHECK: (type $59 (func (param i31ref)))
;; CHECK: (type $60 (func (param i32 i64) (result (ref $pair))))
;; CHECK: (type $61 (func (result (ref $pair))))
;; CHECK: (type $62 (func (param (ref $pair)) (result i32)))
;; CHECK: (type $63 (func (param (ref $pair)) (result i64)))
;; CHECK: (type $64 (func (param (ref null $pair)) (result i32)))
;; CHECK: (type $65 (func (param (ref $pair) i32)))
;; CHECK: (type $66 (func (param (ref $pair) i64)))
;; CHECK: (type $67 (func (param (ref null $pair) i64)))
;; CHECK: (type $68 (func (param i64 i32) (result (ref $a1))))
;; CHECK: (type $69 (func (param i32) (result (ref $a1))))
;; CHECK: (type $70 (func (param i32 i32) (result (ref $a1))))
;; CHECK: (type $71 (func (param (ref $a1) i32) (result i64)))
;; CHECK: (type $72 (func (param (ref $packed-i8) i32) (result i32)))
;; CHECK: (type $73 (func (param (ref $packed-i16) i32) (result i32)))
;; CHECK: (type $74 (func (param (ref $a2) i32 f32)))
;; CHECK: (type $75 (func (param arrayref) (result i32)))
;; CHECK: (type $76 (func (param (ref $a2) i32 (ref $a2) i32 i32)))
;; CHECK: (type $77 (func (param (ref $a2) i32 f32 i32)))
;; CHECK: (type $78 (func (param (ref $a2) i32 i32 i32)))
;; CHECK: (type $79 (func (param (ref $any-array) i32 i32 i32)))
;; CHECK: (type $80 (func (param externref)))
;; CHECK: (type $81 (func (param (ref $packed-i8) i32 i32) (result stringref)))
;; CHECK: (type $82 (func (param i32) (result stringref)))
;; CHECK: (type $83 (func (result (ref string))))
;; CHECK: (type $84 (func (param stringref)))
;; CHECK: (type $85 (func (param stringref (ref $packed-i16) i32) (result i32)))
;; CHECK: (type $86 (func (param stringref stringref) (result (ref string))))
;; CHECK: (type $87 (func (param stringref i32) (result i32)))
;; CHECK: (type $88 (func (param stringref i32 i32) (result (ref string))))
;; CHECK: (type $89 (func (param (ref $simple-cont))))
;; CHECK: (type $to-f32-cont (cont $to-f32))
(type $to-f32-cont (cont $to-f32))
(type $cont-bind-before-func (func (param i32) (param i64) (param i32) (param i64) (result f32)))
(type $cont-bind-before (cont $cont-bind-before-func))
(type $all-types (struct externref (ref extern) (ref null (shared extern)) (ref (shared extern))
funcref (ref func) (ref null (shared func)) (ref (shared func))
anyref (ref any) (ref null (shared any)) (ref (shared any))
eqref (ref eq) (ref null (shared eq)) (ref (shared eq))
i31ref (ref i31) (ref null (shared i31)) (ref (shared i31))
structref (ref struct) (ref null (shared struct)) (ref (shared struct))
arrayref (ref array) (ref null (shared array)) (ref (shared array))
exnref (ref exn) (ref null (shared exn)) (ref (shared exn))
stringref (ref string) (ref null (shared string)) (ref (shared string))
contref (ref cont) (ref null (shared cont)) (ref (shared cont))
nullref (ref none) (ref null (shared none)) (ref (shared none))
nullexternref (ref noextern) (ref null (shared noextern)) (ref (shared noextern))
nullfuncref (ref nofunc) (ref null (shared nofunc)) (ref (shared nofunc))
nullexnref (ref noexn) (ref null (shared noexn)) (ref (shared noexn))
nullcontref (ref nocont) (ref null (shared nocont)) (ref (shared nocont))))
;; imported memories
(memory (export "mem") (export "mem2") (import "" "mem") 0)
;; CHECK: (type $91 (func (param (ref $simple)) (result (ref $simple-cont))))
;; CHECK: (type $92 (func (param (ref $cont-bind-before)) (result (ref $simple-cont))))
;; CHECK: (type $93 (func (param (ref $s0) (ref $s1) (ref $s2) (ref $s3) (ref $s4) (ref $s5) (ref $s6) (ref $s7) (ref $s8) (ref $a0) (ref $a1) (ref $a2) (ref $a3) (ref $subvoid) (ref $submany) (ref $all-types))))
;; CHECK: (type $94 (func (result structref arrayref)))
;; CHECK: (type $95 (func (result arrayref structref)))
;; CHECK: (type $96 (func (result i32 i64 (ref null $simple-cont))))
;; CHECK: (import "" "mem" (memory $mimport$0 0))
;; CHECK: (import "mod" "imported-m" (memory $m-imported 1 2 shared))
(import "mod" "imported-m" (memory $m-imported 1 2 shared))
;; imported tables
(table (export "tab") (export "tab2") (import "" "tab") 0 funcref)
(import "mod" "imported-tab" (table 2 3 externref))
;; imported globals
(global $g1 (export "g1") (export "g1.1") (import "mod" "g1") i32)
(global $g2 (import "mod" "g2") (mut i64))
(global (import "" "g3") (ref 0))
(global (import "mod" "") (ref null $many))
;; CHECK: (import "" "tab" (table $timport$0 0 funcref))
;; CHECK: (import "mod" "imported-tab" (table $timport$1 2 3 externref))
;; CHECK: (import "mod" "g1" (global $g1 i32))
;; CHECK: (import "mod" "g2" (global $g2 (mut i64)))
;; CHECK: (import "" "g3" (global $gimport$0 (ref $ret2)))
;; CHECK: (import "mod" "" (global $gimport$1 (ref null $many)))
;; CHECK: (import "mod" "imported-g" (global $g-imported (mut i32)))
(import "mod" "imported-g" (global $g-imported (mut i32)))
;; imported functions
(func (export "f5.0") (export "f5.1") (import "mod" "f5"))
(import "mod" "imported-f" (func (param) (result i32 i64)))
;; imported tags
(tag $imported (export "t0.0") (export "t0.1") (import "mod" "t0") (param i32 i64))
(tag (import "mod" "t1"))
(import "mod" "imported-tag" (tag (param) (result)))
;; globals
(global (mut i32) i32.const 0)
;; CHECK: (import "mod" "f5" (func $fimport$0 (type $0)))
;; CHECK: (import "mod" "imported-f" (func $fimport$1 (type $5) (result i32 i64)))
;; CHECK: (import "mod" "t0" (tag $imported (type $7) (param i32 i64)))
;; CHECK: (import "mod" "t1" (tag $eimport$0 (type $0)))
;; CHECK: (import "mod" "imported-tag" (tag $eimport$1 (type $0)))
;; CHECK: (global $global$2 (mut i32) (i32.const 0))
;; CHECK: (global $i32 i32 (i32.const 42))
(global $i32 i32 i32.const 42)
;; CHECK: (global $pair (mut (tuple i32 i64)) (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (i64.const 1)
;; CHECK-NEXT: ))
(global $pair (mut (tuple i32 i64)) (tuple.make 2 (i32.const 0) (i64.const 1)))
;; memories
;; CHECK: (memory $mem 1 1 shared)
(memory $mem 1 1 shared)
(memory 0 1 shared)
;; CHECK: (memory $1 0 1 shared)
;; CHECK: (memory $mem-i32 0 1)
(memory $mem-i32 i32 0 1)
;; CHECK: (memory $mem-i64 i64 2)
(memory $mem-i64 i64 2)
;; CHECK: (memory $mem-init 1 1)
(memory $mem-init (data "hello inline data"))
;; CHECK: (memory $mem-init-32 1 1)
(memory $mem-init-32 i32 (data "hello i32 inline data"))
;; CHECK: (memory $mem-init-64 i64 1 1)
(memory $mem-init-64 i64 (data "hello i64 inline data"))
;; data segments
(data "hello world")
;; CHECK: (data $implicit-data (memory $mem-init) (i32.const 0) "hello inline data")
;; CHECK: (data $implicit-data_1 (memory $mem-init-32) (i32.const 0) "hello i32 inline data")
;; CHECK: (data $implicit-data_2 (memory $mem-init-64) (i64.const 0) "hello i64 inline data")
;; CHECK: (data $0 "hello world")
;; CHECK: (data $passive "hello again")
(data $passive "hello" " " "again")
;; CHECK: (data $active (i32.const 0) "active hello")
(data $active (offset i32.const 0) "active hello" "" "")
;; CHECK: (data $active2 (i32.const 1) "active again!")
(data $active2 (offset (i32.const 1)) "" "active again" "!")
;; CHECK: (data $active3 (memory $mem) (i32.const 42) "active abbreviated")
(data $active3 (memory $mem) (i32.const 42) "" "active abbreviated" "")
;; CHECK: (data $active4 (memory $mem-i32) (i32.const 16) "")
(data $active4 (memory $mem-i32) (i32.const 16) "")
(data (memory 5) (offset i64.const 0) "64-bit")
;; tables
;; CHECK: (data $1 (memory $mem-i64) (i64.const 0) "64-bit")
;; CHECK: (table $funcs 1 2 funcref)
(table $funcs 1 2 (ref null func))
;; CHECK: (table $table-any 3 3 anyref)
(table $table-any anyref (elem (item i32.const 0 ref.i31) (ref.null any) (item (ref.i31 (i32.const 0)))))
;; elems
;; CHECK: (elem $implicit-elem (table $table-any) (i32.const 0) anyref (item (ref.i31
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )) (item (ref.null none)) (item (ref.i31
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )))
;; CHECK: (elem $implicit-table (table $timport$0) (i32.const 0) funcref (item (ref.null nofunc)) (item (ref.null nofunc)) (item (ref.null nofunc)))
(elem $implicit-table (offset i32.const 0) funcref (ref.null func) (item ref.null func) (item (ref.null func)))
;; CHECK: (elem $implicit-table-2 (table $timport$0) (i32.const 1) func)
(elem $implicit-table-2 (i32.const 1) funcref)
;; CHECK: (elem $implicit-table-indices (table $timport$0) (i32.const 2) func $fimport$0 $fimport$1 $2)
(elem $implicit-table-indices (offset (i32.const 2)) func 0 1 2)
;; CHECK: (elem $implicit-table-legacy-indices (table $timport$0) (i32.const 3) func $fimport$0 $fimport$1 $2 $f1)
(elem $implicit-table-legacy-indices (i32.const 3) 0 1 2 3)
;; CHECK: (elem $explicit-table (table $timport$0) (i32.const 0) funcref (item (ref.null nofunc)))
(elem $explicit-table (table 0) (offset (i32.const 0)) funcref (item ref.null func))
;; CHECK: (elem $explicit-table-named (table $table-any) (i32.const 1) anyref)
(elem $explicit-table-named (table $table-any) (i32.const 1) anyref)
;; CHECK: (elem $passive (ref null $s0) (item (struct.new_default $s0)) (item (struct.new_default $s0)))
(elem $passive (ref null $s0) (item struct.new $s0) (struct.new $s0))
;; CHECK: (elem $passive-2 anyref (item (struct.new_default $s0)) (item (struct.new_default $s0)))
(elem $passive-2 anyref (item struct.new $s0) (struct.new $s0))
;; CHECK: (elem declare func $ref-func $table-fill $table-grow $table-set)
(elem declare func 0 1 2 3)
(elem $declare-2 declare funcref (item ref.func 0) (ref.func 1) (item (ref.func 2)))
;; tags
(tag)
;; CHECK: (tag $tag$2 (type $0))
;; CHECK: (tag $empty (type $0))
(tag $empty)
;; CHECK: (tag $tag-i32 (type $19) (param i32))
(tag $tag-i32 (param $x i32))
;; CHECK: (tag $tag-pair (type $7) (param i32 i64))
(tag $tag-pair (param i32 i64))
;; CHECK: (tag $tag-pair-to-pair (type $21) (param i32 i64) (result i32 i64))
(tag $tag-pair-to-pair (param i32 i64) (result i32 i64))
;; explicit exports
(export "exported-func" (func 0))
;; CHECK: (export "mem" (memory $mimport$0))
;; CHECK: (export "mem2" (memory $mimport$0))
;; CHECK: (export "tab" (table $timport$0))
;; CHECK: (export "tab2" (table $timport$0))
;; CHECK: (export "g1" (global $g1))
;; CHECK: (export "g1.1" (global $g1))
;; CHECK: (export "f5.0" (func $fimport$0))
;; CHECK: (export "f5.1" (func $fimport$0))
;; CHECK: (export "t0.0" (tag $imported))
;; CHECK: (export "t0.1" (tag $imported))
;; CHECK: (export "exported-func" (func $fimport$0))
;; CHECK: (export "exported-table" (table $funcs))
(export "exported-table" (table $funcs))
(export "exported-memory" (memory 0))
;; CHECK: (export "exported-memory" (memory $mimport$0))
;; CHECK: (export "exported-global" (global $g1))
(export "exported-global" (global $g1))
(export "exported-tag" (tag 0))
;; start function
;; CHECK: (export "exported-tag" (tag $imported))
;; CHECK: (start $return-none)
(start $return-none)
;; Annotations
(@annotation this is a meaningless (@annotation ) ;; This is still a comment ))
it spans multiple lines just fine and can include $ids 0x42 numbers and "strings"
)
;; functions
(func)
;; CHECK: (func $2 (type $0)
;; CHECK-NEXT: )
;; CHECK: (func $f1 (type $19) (param $0 i32)
;; CHECK-NEXT: )
(func $f1 (param i32))
;; CHECK: (func $f2 (type $19) (param $x i32)
;; CHECK-NEXT: )
(func $f2 (param $x i32))
;; CHECK: (func $f3 (type $1) (result i32)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
(func $f3 (result i32)
i32.const 0
)
;; CHECK: (func $f4 (type $void)
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local $1 i64)
;; CHECK-NEXT: (local $l f32)
;; CHECK-NEXT: )
(func $f4 (type 18) (local i32 i64) (local $l f32))
;; CHECK: (func $"[quoted_name]" (type $0)
;; CHECK-NEXT: )
(func $"[quoted_name]")
;; CHECK: (func $nop-skate (type $0)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
(func $nop-skate
nop
nop
unreachable
nop
nop
)
;; CHECK: (func $nop-ski (type $0)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
(func $nop-ski
(unreachable
(nop
(nop)
(nop)
(nop
(nop)
)
)
(nop)
)
(nop)
)
;; CHECK: (func $nop-sled (type $0)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
(func $nop-sled
nop
(nop
(nop
(unreachable)
)
)
nop
(unreachable)
nop
)
;; CHECK: (func $add (type $1) (result i32)
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $add (result i32)
i32.const 1
i32.const 2
i32.add
)
;; CHECK: (func $add-folded (type $1) (result i32)
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $add-folded (result i32)
(i32.add
(i32.const 1)
(i32.const 2)
)
)
;; CHECK: (func $add-stacky (type $1) (result i32)
;; CHECK-NEXT: (local $scratch i32)
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $add-stacky (result i32)
i32.const 1
nop
i32.const 2
i32.add
)
;; CHECK: (func $add-stacky-2 (type $1) (result i32)
;; CHECK-NEXT: (local $scratch i32)
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $add-stacky-2 (result i32)
i32.const 1
i32.const 2
nop
i32.add
)
;; CHECK: (func $add-stacky-3 (type $1) (result i32)
;; CHECK-NEXT: (local $scratch i32)
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
(func $add-stacky-3 (result i32)
i32.const 1
i32.const 2
i32.add
nop
)
;; CHECK: (func $add-stacky-4 (type $1) (result i32)
;; CHECK-NEXT: (local $scratch i32)
;; CHECK-NEXT: (local $scratch_1 i32)
;; CHECK-NEXT: (local $scratch_2 i32)
;; CHECK-NEXT: (local.set $scratch_2
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_1
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (local.get $scratch_1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (local.get $scratch_2)
;; CHECK-NEXT: )
(func $add-stacky-4 (result i32)
i32.const 1
nop
i32.const 2
nop
i32.add
nop
)
;; CHECK: (func $add-unreachable (type $1) (result i32)
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $add-unreachable (result i32)
unreachable
i32.const 1
i32.add
)
;; CHECK: (func $add-unreachable-2 (type $1) (result i32)
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $add-unreachable-2 (result i32)
i32.const 1
unreachable
i32.add
)
;; CHECK: (func $add-unreachable-3 (type $1) (result i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
(func $add-unreachable-3 (result i32)
i32.const 1
i32.const 2
unreachable
)
;; CHECK: (func $add-twice (type $ret2) (result i32 i32)
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 3)
;; CHECK-NEXT: (i32.const 4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $add-twice (type $ret2)
i32.const 1
i32.const 2
i32.add
i32.const 3
i32.const 4
i32.add
)
;; CHECK: (func $add-twice-stacky (type $ret2) (result i32 i32)
;; CHECK-NEXT: (local $scratch i32)
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 3)
;; CHECK-NEXT: (i32.const 4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $add-twice-stacky (type $ret2)
i32.const 1
i32.const 2
i32.add
nop
i32.const 3
i32.const 4
i32.add
)
;; CHECK: (func $add-twice-stacky-2 (type $ret2) (result i32 i32)
;; CHECK-NEXT: (local $scratch i32)
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 3)
;; CHECK-NEXT: (i32.const 4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $add-twice-stacky-2 (type $ret2)
i32.const 1
i32.const 2
i32.add
i32.const 3
i32.const 4
i32.add
nop
)
;; CHECK: (func $add-twice-unreachable (type $ret2) (result i32 i32)
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 3)
;; CHECK-NEXT: (i32.const 4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $add-twice-unreachable (type $ret2)
unreachable
i32.const 2
i32.add
i32.const 3
i32.const 4
i32.add
)
;; CHECK: (func $add-twice-unreachable-2 (type $ret2) (result i32 i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 3)
;; CHECK-NEXT: (i32.const 4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $add-twice-unreachable-2 (type $ret2)
i32.const 1
i32.const 2
i32.add
unreachable
i32.const 3
i32.const 4
i32.add
)
;; CHECK: (func $add-twice-unreachable-3 (type $ret2) (result i32 i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 3)
;; CHECK-NEXT: (i32.const 4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
(func $add-twice-unreachable-3 (type $ret2)
i32.const 1
i32.const 2
i32.add
i32.const 3
i32.const 4
i32.add
unreachable
)
;; CHECK: (func $big-stack (type $0)
;; CHECK-NEXT: (local $scratch f64)
;; CHECK-NEXT: (local $scratch_1 i64)
;; CHECK-NEXT: (local $scratch_2 f32)
;; CHECK-NEXT: (local $scratch_3 i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_3
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block (result f32)
;; CHECK-NEXT: (local.set $scratch_2
;; CHECK-NEXT: (f32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block (result i64)
;; CHECK-NEXT: (local.set $scratch_1
;; CHECK-NEXT: (i64.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block (result f64)
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (f64.const 3)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (ref.null none)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $big-stack
i32.const 0
f32.const 1
i64.const 2
f64.const 3
ref.null any
drop
drop
drop
drop
drop
)
;; CHECK: (func $locals (type $46) (param $0 i32) (param $x i32)
;; CHECK-NEXT: (local $2 i32)
;; CHECK-NEXT: (local $y i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $x)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $y)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $x
;; CHECK-NEXT: (local.get $x)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.tee $y
;; CHECK-NEXT: (local.get $y)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $locals (param i32) (param $x i32)
(local i32)
(local $y i32)
local.get 0
drop
local.get 1
drop
local.get 2
drop
local.get 3
drop
local.get $x
local.set 1
local.get $y
local.tee 3
drop
)
;; CHECK: (func $tuple-locals (type $0)
;; CHECK-NEXT: (local $0 (tuple i32 i64))
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (local.tee $0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i64.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $tuple-locals
(local (tuple i32 i64))
local.get 0
local.tee 0
local.set 0
i32.const 1
i64.const 2
local.set 0
)
;; CHECK: (func $block (type $0)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (block $l
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $block
nop
block $l (type $void)
nop
nop
nop
end $l
)
;; CHECK: (func $block-folded (type $0)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (tuple.drop 2
;; CHECK-NEXT: (block $l (type $ret2) (result i32 i32)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
(func $block-folded
nop
(block $l (result i32) (result) (result i32)
nop
nop
unreachable
)
unreachable
)
;; CHECK: (func $block-mix (type $0)
;; CHECK-NEXT: (local $scratch i32)
;; CHECK-NEXT: (local $scratch_1 (tuple i32 i32))
;; CHECK-NEXT: (local $scratch_2 i32)
;; CHECK-NEXT: (block $0
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_2
;; CHECK-NEXT: (tuple.extract 2 0
;; CHECK-NEXT: (local.tee $scratch_1
;; CHECK-NEXT: (block $1 (type $ret2) (result i32 i32)
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (block $2 (result i32)
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (block $3 (result i32)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (tuple.extract 2 1
;; CHECK-NEXT: (local.get $scratch_1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
(func $block-mix
(block $0
block $1 (type $ret2)
(block $2 (result i32)
block $3 (result i32)
i32.const 0
end
nop
)
i32.const 1
end $1
drop
drop
)
nop
)
;; CHECK: (func $multivalue-nested (type $ret2) (result i32 i32)
;; CHECK-NEXT: (local $scratch (tuple i32 i32))
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (block (type $ret2) (result i32 i32)
;; CHECK-NEXT: (block (type $ret2) (result i32 i32)
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
(func $multivalue-nested (type $ret2)
block (type $ret2)
nop
block (type $ret2)
block (type $ret2)
i32.const 0
i32.const 1
end
end
nop
end
)
;; CHECK: (func $if-else (type $0)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else
i32.const 0
if
nop
else
nop
end
)
;; CHECK: (func $if-else-empty (type $0)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (then
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-empty
i32.const 0
if
else
end
)
;; CHECK: (func $if-else-many (type $0)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-many
i32.const 0
if
nop
nop
else
nop
nop
end
)
;; CHECK: (func $if-else-single-nested (type $0)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (f32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (f64.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-single-nested
i32.const 0
if
f32.const 1
drop
else
f64.const 2
drop
end
)
;; CHECK: (func $if-else-folded-body (type $0)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (f32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (f32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-folded-body
i32.const 0
if
(drop
(f32.const 1)
)
else
(drop
(f32.const 2)
)
end
)
;; CHECK: (func $if-else-labeled (type $0)
;; CHECK-NEXT: (block $l
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-labeled
i32.const 0
if $l
nop
else $l
nop
end $l
)
;; CHECK: (func $if-no-else (type $0)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-no-else
i32.const 0
if
nop
end
)
;; CHECK: (func $if-else-result (type $1) (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: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-result (result i32)
i32.const 0
if (result i32)
i32.const 1
else
i32.const 2
end
)
;; CHECK: (func $if-else-unreachable (type $1) (result i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (if (result i32)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-unreachable (result i32)
i32.const 0 ;; This will be dropped
unreachable
if (result i32)
i32.const 1
else
i32.const 2
end
)
;; CHECK: (func $if-else-nested-unreachable (type $1) (result i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (if (result i32)
;; CHECK-NEXT: (if (result i32)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (then
;; CHECK-NEXT: (i32.const 3)
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (i32.const 4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-nested-unreachable (result i32)
i32.const 0 ;; This will be dropped
unreachable
if (result i32)
i32.const 1
else
i32.const 2
end
if (result i32)
i32.const 3
else
i32.const 4
end
)
;; CHECK: (func $if-else-labeled-result (type $1) (result i32)
;; CHECK-NEXT: (block $l (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: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-labeled-result (result i32)
i32.const 0
if $l (result i32)
i32.const 1
else
i32.const 2
end
)
;; CHECK: (func $if-else-folded (type $0)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-folded
(if
(i32.const 0)
(then
nop
)
(else
nop
)
)
)
;; CHECK: (func $if-else-folded-empty (type $0)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (then
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-folded-empty
(if
(i32.const 0)
(then)
(else)
)
)
;; CHECK: (func $if-else-folded-many (type $0)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-folded-many
(if
(i32.const 0)
(then
nop
nop
)
(else
nop
nop
)
)
)
;; CHECK: (func $if-else-folded-single-nested (type $0)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.eqz
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (then
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-folded-single-nested
(if
(i32.eqz
(i32.const 0)
)
(then
(drop
(i32.const 1)
)
)
(else
(drop
(i32.const 2)
)
)
)
)
;; CHECK: (func $if-else-folded-labeled (type $0)
;; CHECK-NEXT: (block $l
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-folded-labeled
(if $l
(i32.const 0)
(then
nop
)
(else
nop
)
)
)
;; CHECK: (func $if-no-else-folded (type $0)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-no-else-folded
(if
(i32.const 0)
(then
nop
)
)
)
;; CHECK: (func $if-else-folded-result (type $1) (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: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-folded-result (result i32)
(if (result i32)
(i32.const 0)
(then
i32.const 1
)
(else
i32.const 2
)
)
)
;; CHECK: (func $if-else-folded-labeled-result (type $1) (result i32)
;; CHECK-NEXT: (block $l (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: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-folded-labeled-result (result i32)
(if $l (result i32)
(i32.const 0)
(then
i32.const 1
)
(else
i32.const 2
)
)
)
;; CHECK: (func $if-else-atypical-condition (type $0)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (then
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.eqz
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (then
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-atypical-condition
i32.const 0
(if (then) (else))
(if (i32.const 0) (i32.eqz) (then) (else))
)
;; CHECK: (func $if-else-mixed (type $0)
;; CHECK-NEXT: (if
;; 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: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (then
;; CHECK-NEXT: (if
;; CHECK-NEXT: (if (result i32)
;; CHECK-NEXT: (i32.const 3)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (i32.const 4)
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (i32.const 5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (then
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 6)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-mixed
i32.const 0
if (result i32)
i32.const 1
else
i32.const 2
end
if
(if
(if (result i32)
(i32.const 3)
(then
(i32.const 4)
)
(else
(i32.const 5)
)
)
(then
i32.const 6
if
i32.const 7
drop
end
)
)
end
)
;; CHECK: (func $if-else-brs (type $0)
;; CHECK-NEXT: (block $label
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (br $label)
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (br $label)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-brs
i32.const 0
if
br 0
else
br 0
end
)
;; CHECK: (func $if-else-brs-i32 (type $1) (result i32)
;; CHECK-NEXT: (block $label (result i32)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-brs-i32 (result i32)
i32.const 0
if (result i32)
i32.const 1
br 0
else
i32.const 2
br 0
end
)
;; CHECK: (func $loop (type $0)
;; CHECK-NEXT: (loop
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $loop
loop
nop
end
)
;; CHECK: (func $loop-empty (type $0)
;; CHECK-NEXT: (loop
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $loop-empty
loop
end
)
;; CHECK: (func $loop-many (type $0)
;; CHECK-NEXT: (loop
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $loop-many
loop
nop
nop
end
)
;; CHECK: (func $loop-nested (type $0)
;; CHECK-NEXT: (loop
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $loop-nested
loop
i32.const 0
drop
end
)
;; CHECK: (func $loop-folded-body (type $0)
;; CHECK-NEXT: (loop
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $loop-folded-body
loop
(drop
(i32.const 0)
)
end
)
;; CHECK: (func $loop-labeled (type $0)
;; CHECK-NEXT: (loop $l
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $loop-labeled
loop $l
nop
end $l
)
;; CHECK: (func $loop-result (type $1) (result i32)
;; CHECK-NEXT: (loop (result i32)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $loop-result (result i32)
loop (result i32)
i32.const 0
end
)
;; CHECK: (func $loop-labeled-result (type $1) (result i32)
;; CHECK-NEXT: (loop $l (result i32)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $loop-labeled-result (result i32)
loop $l (result i32)
i32.const 0
end $l
)
;; CHECK: (func $loop-folded (type $0)
;; CHECK-NEXT: (loop
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $loop-folded
(loop
(nop)
)
)
;; CHECK: (func $loop-folded-empty (type $0)
;; CHECK-NEXT: (loop
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $loop-folded-empty
(loop)
)
;; CHECK: (func $loop-folded-many (type $0)
;; CHECK-NEXT: (loop
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $loop-folded-many
(loop
nop
nop
)
)
;; CHECK: (func $loop-folded-nested (type $0)
;; CHECK-NEXT: (loop
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (f32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $loop-folded-nested
(loop
(drop
(f32.const 0)
)
)
)
;; CHECK: (func $loop-folded-labeled (type $0)
;; CHECK-NEXT: (loop $l
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $loop-folded-labeled
(loop $l
nop
)
)
;; CHECK: (func $loop-folded-result (type $1) (result i32)
;; CHECK-NEXT: (loop (result i32)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $loop-folded-result (result i32)
(loop (result i32)
i32.const 0
)
)
;; CHECK: (func $loop-folded-labeled-result (type $1) (result i32)
;; CHECK-NEXT: (loop $l (result i32)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $loop-folded-labeled-result (result i32)
(loop $l (result i32)
i32.const 0
)
)
;; CHECK: (func $try (type $0)
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try
try
nop
end
)
;; CHECK: (func $try-catch (type $0)
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $empty
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-catch
try
catch $empty
end
)
;; CHECK: (func $try-catch-params (type $5) (result i32 i64)
;; CHECK-NEXT: (try (type $5) (result i32 i64)
;; CHECK-NEXT: (do
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (i64.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $tag-pair
;; CHECK-NEXT: (pop (tuple i32 i64))
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-catch-params (result i32 i64)
try (result i32 i64)
i32.const 0
i64.const 1
catch $tag-pair
end
)
;; CHECK: (func $try-catch-pop (type $5) (result i32 i64)
;; CHECK-NEXT: (try (type $5) (result i32 i64)
;; CHECK-NEXT: (do
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (i64.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $tag-pair
;; CHECK-NEXT: (pop (tuple i32 i64))
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-catch-pop (result i32 i64)
try (result i32 i64)
i32.const 0
i64.const 1
catch $tag-pair
pop (tuple i32 i64)
end
)
;; CHECK: (func $try-catch_all (type $0)
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch_all
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-catch_all
try
catch_all
end
)
;; CHECK: (func $try-catch-catch_all (type $0)
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $empty
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $eimport$0
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch_all
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-catch-catch_all
try
catch $empty
catch 1
catch_all
end
)
;; CHECK: (func $try-delegate (type $0)
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (delegate 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-delegate
try
delegate 0
)
;; CHECK: (func $try-delegate-nested-func-direct (type $0)
;; CHECK-NEXT: (block $l
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (delegate 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-delegate-nested-func-direct
block $l
try
delegate 1
end
)
;; CHECK: (func $try-delegate-nested-func-indirect-index (type $0)
;; CHECK-NEXT: (block $l
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (delegate 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-delegate-nested-func-indirect-index
block $l
try
delegate 0
end
)
;; CHECK: (func $try-delegate-nested-func-indirect-name (type $0)
;; CHECK-NEXT: (block $l
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (delegate 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-delegate-nested-func-indirect-name
block $l
try
delegate $l
end
)
;; CHECK: (func $try-delegate-nested-try-direct-index (type $0)
;; CHECK-NEXT: (try $label
;; CHECK-NEXT: (do
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (delegate $label)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-delegate-nested-try-direct-index
try
block
try
delegate 1
end
end
)
;; CHECK: (func $try-delegate-nested-try-direct-name (type $0)
;; CHECK-NEXT: (try $l
;; CHECK-NEXT: (do
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (delegate $l)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-delegate-nested-try-direct-name
try $l
block
try
delegate $l
end
end
)
;; CHECK: (func $try-delegate-nested-try-indirect-index (type $0)
;; CHECK-NEXT: (try $label
;; CHECK-NEXT: (do
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (delegate $label)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-delegate-nested-try-indirect-index
try
block
try
delegate 0
end
end
)
;; CHECK: (func $try-delegate-nested-try-indirect-name (type $0)
;; CHECK-NEXT: (try $label
;; CHECK-NEXT: (do
;; CHECK-NEXT: (block $l
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (delegate $label)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-delegate-nested-try-indirect-name
try
block $l
try
delegate $l
end
end
)
;; CHECK: (func $try-delegate-nested-try-shadowing (type $0)
;; CHECK-NEXT: (try $l
;; CHECK-NEXT: (do
;; CHECK-NEXT: (block $l0
;; CHECK-NEXT: (try $l1
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (delegate $l)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-delegate-nested-try-shadowing
try $l
block $l
try $l
delegate $l
end
end $l
)
;; CHECK: (func $try-delegate-nested-catch-shadowing (type $0)
;; CHECK-NEXT: (try $l
;; CHECK-NEXT: (do
;; CHECK-NEXT: (try $l0
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $empty
;; CHECK-NEXT: (try $l1
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (delegate $l)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-delegate-nested-catch-shadowing
try $l
try $l
catch $empty
try $l
;; goes to the outermost try, not the middle one
delegate $l
end
end
)
;; CHECK: (func $try-delegate-nested-catch_all-shadowing (type $0)
;; CHECK-NEXT: (try $l
;; CHECK-NEXT: (do
;; CHECK-NEXT: (try $l0
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch_all
;; CHECK-NEXT: (try $l1
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (delegate $l)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-delegate-nested-catch_all-shadowing
try $l
try $l
catch_all
try $l
;; goes to the outermost try, not the middle one
delegate $l
end
end
)
;; CHECK: (func $try-br-index (type $0)
;; CHECK-NEXT: (block $label
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: (br $label)
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $empty
;; CHECK-NEXT: (br $label)
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch_all
;; CHECK-NEXT: (br $label)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-br-index
try
br 0
catch $empty
br 0
catch_all
br 0
end
)
;; CHECK: (func $try-br-name (type $0)
;; CHECK-NEXT: (block $label
;; CHECK-NEXT: (try $l
;; CHECK-NEXT: (do
;; CHECK-NEXT: (br $label)
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $empty
;; CHECK-NEXT: (br $label)
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch_all
;; CHECK-NEXT: (br $label)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-br-name
try $l
br $l
catch $l $empty
br $l
catch_all $l
br $l
end $l
)
;; CHECK: (func $try-folded (type $0)
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $empty
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $eimport$0
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch_all
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-folded
(try
(do
nop
(nop)
)
(catch $empty
(nop)
nop
)
(catch 1
nop
(nop)
)
(catch_all
(nop)
nop
)
)
)
;; CHECK: (func $try-delegate-folded (type $0)
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (delegate 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-delegate-folded
(try
(do)
(delegate 0)
)
)
;; CHECK: (func $rethrow (type $0)
;; CHECK-NEXT: (try $label
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $empty
;; CHECK-NEXT: (rethrow $label)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rethrow
try
catch $empty
rethrow 0
end
)
;; CHECK: (func $rethrow-named (type $0)
;; CHECK-NEXT: (try $l
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $empty
;; CHECK-NEXT: (rethrow $l)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rethrow-named
try $l
catch $empty
rethrow $l
end
)
;; CHECK: (func $rethrow-nested (type $0)
;; CHECK-NEXT: (try $label
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $empty
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $empty
;; CHECK-NEXT: (rethrow $label)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rethrow-nested
try
catch $empty
block
try
catch $empty
rethrow 2
end
end
end
)
;; CHECK: (func $rethrow-nested-named (type $0)
;; CHECK-NEXT: (try $l
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $empty
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $empty
;; CHECK-NEXT: (rethrow $l)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rethrow-nested-named
try $l
catch $empty
block
try
catch $empty
rethrow $l
end
end
end
)
;; CHECK: (func $rethrow-try-nested (type $0)
;; CHECK-NEXT: (try $label
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $empty
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: (rethrow $label)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rethrow-try-nested
try
catch $empty
block
try
;; Same as before, but now the rethrow is in the inner try instead of the
;; inner catch.
rethrow 2
end
end
end
)
;; CHECK: (func $rethrow-try-nested-named (type $0)
;; CHECK-NEXT: (try $l
;; CHECK-NEXT: (do
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $empty
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: (rethrow $l)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rethrow-try-nested-named
try $l
catch $empty
block
try
rethrow $l
end
end
end
)
;; CHECK: (func $try-table (type $0)
;; CHECK-NEXT: (try_table
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-table
try_table
nop
end
)
;; CHECK: (func $try-table-catch (type $0)
;; CHECK-NEXT: (block $label
;; CHECK-NEXT: (try_table (catch $empty $label)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-table-catch
try_table (catch $empty 0)
nop
end
)
;; CHECK: (func $try-table-catch-ref (type $22) (result exnref)
;; CHECK-NEXT: (block $label (result exnref)
;; CHECK-NEXT: (try_table (result exnref) (catch_ref $empty $label)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-table-catch-ref (result exnref)
try_table (result exnref) (catch_ref $empty 0)
unreachable
end
)
;; CHECK: (func $try-table-catch-all (type $0)
;; CHECK-NEXT: (block $label
;; CHECK-NEXT: (try_table (catch_all $label)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-table-catch-all
try_table (catch_all 0)
nop
end
)
;; CHECK: (func $try-table-catch-all-ref (type $22) (result exnref)
;; CHECK-NEXT: (block $label (result exnref)
;; CHECK-NEXT: (try_table (result exnref) (catch_all_ref $label)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-table-catch-all-ref (result exnref)
try_table (result exnref) (catch_all_ref 0)
unreachable
end
)
;; CHECK: (func $try-table-all (type $0)
;; CHECK-NEXT: (block $catch
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block $catch_ref (result exnref)
;; CHECK-NEXT: (block $catch_all
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block $catch_all_ref (result exnref)
;; CHECK-NEXT: (block $try
;; CHECK-NEXT: (try_table (catch $empty $catch) (catch_ref $empty $catch_ref) (catch_all $catch_all) (catch_all_ref $catch_all_ref)
;; CHECK-NEXT: (br $try)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-table-all
block $catch
block $catch_ref (result exnref)
block $catch_all
block $catch_all_ref (result exnref)
try_table $try (catch $empty $catch)
(catch_ref $empty $catch_ref)
(catch_all $catch_all)
(catch_all_ref $catch_all_ref)
br $try
end $try
unreachable
end $catch_all_ref
drop
end $catch_all
unreachable
end $catch_ref
drop
end $catch
)
;; CHECK: (func $try-table-folded (type $0)
;; CHECK-NEXT: (block $label
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block $try (result i32)
;; CHECK-NEXT: (try_table (result i32) (catch $empty $label)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-table-folded
(drop
(try_table $try (result i32) (catch $empty 0)
(i32.const 0)
)
)
)
;; CHECK: (func $try-table-throw-ref (type $47) (param $0 exnref)
;; CHECK-NEXT: (throw_ref
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-table-throw-ref (param exnref)
local.get 0
throw_ref
)
;; CHECK: (func $label-siblings (type $0)
;; CHECK-NEXT: (block $l
;; CHECK-NEXT: (br $l)
;; CHECK-NEXT: )
;; CHECK-NEXT: (loop $l0
;; CHECK-NEXT: (br $l0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $l1
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (br $l1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $label-siblings
block $l
br $l
end
loop $l
br $l
end
i32.const 0
if $l
br $l
end
)
;; CHECK: (func $label-shadowed (type $0)
;; CHECK-NEXT: (block $l
;; CHECK-NEXT: (br $l)
;; CHECK-NEXT: (loop $l0
;; CHECK-NEXT: (br $l0)
;; CHECK-NEXT: (block $l1
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (br $l1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $l0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $l)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $label-shadowed
block $l
br $l
loop $l
br $l
i32.const 0
if $l
br $l
end
br $l
end
br $l
end
)
;; CHECK: (func $label-index (type $0)
;; CHECK-NEXT: (block $block2
;; CHECK-NEXT: (block $block
;; CHECK-NEXT: (block $block1
;; CHECK-NEXT: (block $l
;; CHECK-NEXT: (br $block)
;; CHECK-NEXT: (br $block1)
;; CHECK-NEXT: (br $l)
;; CHECK-NEXT: (br $block2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $label-index
block
block
block
block $l
br 2
br 1
br 0
br 3
end
end
end
end
)
;; CHECK: (func $label-func (type $0)
;; CHECK-NEXT: (block $label
;; CHECK-NEXT: (br $label)
;; CHECK-NEXT: (block $a
;; CHECK-NEXT: (br $label)
;; CHECK-NEXT: (block $b
;; CHECK-NEXT: (br $label)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $label-func
br 0
block $a
br 1
block $b
br 2
end
end
)
;; CHECK: (func $br-value (type $1) (result i32)
;; CHECK-NEXT: (block $label (result i32)
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br-value (result i32)
i32.const 0
br 0
)
;; CHECK: (func $br-value-drop (type $1) (result i32)
;; CHECK-NEXT: (block $label (result i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (f32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br-value-drop (result i32)
f32.const 0
i32.const 1
br 0
)
;; CHECK: (func $br-multivalue (type $5) (result i32 i64)
;; CHECK-NEXT: (block $label (type $5) (result i32 i64)
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (i64.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br-multivalue (result i32 i64)
i32.const 0
i64.const 1
br 0
)
;; CHECK: (func $br-multivalue-drop (type $5) (result i32 i64)
;; CHECK-NEXT: (block $label (type $5) (result i32 i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (f32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i64.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br-multivalue-drop (result i32 i64)
f32.const 0
i32.const 1
i64.const 2
br 0
)
;; CHECK: (func $br-mismatch-after (type $1) (result i32)
;; CHECK-NEXT: (block $label (result i32)
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br-mismatch-after (result i32)
i32.const 1
br 0
i32.add
)
;; CHECK: (func $br-mismatch-after-extra (type $1) (result i32)
;; CHECK-NEXT: (block $label (result i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i64.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br-mismatch-after-extra (result i32)
i64.const 0
i32.const 1
br 0
i32.add
)
;; CHECK: (func $br_if (type $0)
;; CHECK-NEXT: (block $l
;; CHECK-NEXT: (br_if $l
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br_if
block $l
i32.const 0
br_if $l
end
)
;; CHECK: (func $br_if-index (type $0)
;; CHECK-NEXT: (block $block
;; CHECK-NEXT: (br_if $block
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br_if-index
block
i32.const 0
br_if 0
end
)
;; CHECK: (func $br_if-return (type $0)
;; CHECK-NEXT: (block $label
;; CHECK-NEXT: (br_if $label
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br_if-return
i32.const 0
br_if 0
)
;; CHECK: (func $br_if-value (type $23) (result i64)
;; CHECK-NEXT: (block $l (result i64)
;; CHECK-NEXT: (br_if $l
;; CHECK-NEXT: (i64.const 0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br_if-value (result i64)
block $l (result i64)
i64.const 0
i32.const 1
br_if $l
end
)
;; CHECK: (func $br_if-multivalue (type $24) (result i64 f32)
;; CHECK-NEXT: (block $l (type $24) (result i64 f32)
;; CHECK-NEXT: (br_if $l
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i64.const 0)
;; CHECK-NEXT: (f32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br_if-multivalue (result i64 f32)
block $l (result i64 f32)
i64.const 0
f32.const 1
i32.const 2
br_if $l
end
)
;; CHECK: (func $br_if-loop (type $23) (result i64)
;; CHECK-NEXT: (local $scratch i64)
;; CHECK-NEXT: (loop $l (result i64)
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (i64.const 42)
;; CHECK-NEXT: )
;; CHECK-NEXT: (br_if $l
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br_if-loop (result i64)
loop $l (result i64)
i64.const 42
i32.const 0
br_if $l
end
)
;; CHECK: (func $br-table (type $0)
;; CHECK-NEXT: (block $a
;; CHECK-NEXT: (block $b
;; CHECK-NEXT: (block $c
;; CHECK-NEXT: (block $d
;; CHECK-NEXT: (br_table $a $b $d $c
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br-table
block $a
block $b
block $c
block $d
i32.const 0
br_table $a $b $d $c
end
end
end
end
)
;; CHECK: (func $br-table-index (type $0)
;; CHECK-NEXT: (block $block
;; CHECK-NEXT: (block $l
;; CHECK-NEXT: (block $block2
;; CHECK-NEXT: (block $block1
;; CHECK-NEXT: (br_table $block $l $block1 $block2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br-table-index
block
block $l
block
block
i32.const 0
br_table 3 2 0 1
end
end
end
end
)
;; CHECK: (func $br-table-return (type $0)
;; CHECK-NEXT: (block $label
;; CHECK-NEXT: (br_table $label $label $label $label $label $label $label $label
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br-table-return
i32.const 0
br_table 0 0 0 0 0 0 0 0
)
;; CHECK: (func $br-table-value (type $1) (result i32)
;; CHECK-NEXT: (block $a (result i32)
;; CHECK-NEXT: (block $b (result i32)
;; CHECK-NEXT: (br_table $a $b
;; CHECK-NEXT: (i32.const 42)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br-table-value (result i32)
block $a (result i32)
block $b (result i32)
i32.const 42
i32.const 0
br_table $a $b
end
end
)
;; CHECK: (func $br-table-multivalue (type $5) (result i32 i64)
;; CHECK-NEXT: (block $a (type $5) (result i32 i64)
;; CHECK-NEXT: (block $b (type $5) (result i32 i64)
;; CHECK-NEXT: (br_table $a $b
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 42)
;; CHECK-NEXT: (i64.const 42)
;; CHECK-NEXT: )
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br-table-multivalue (result i32 i64)
block $a (result i32 i64)
block $b (result i32 i64)
i32.const 42
i64.const 42
i32.const 0
br_table $a $b
end
end
)
;; CHECK: (func $br-table-multivalue-glb (type $48) (result anyref anyref)
;; CHECK-NEXT: (block $a (type $95) (result arrayref structref)
;; CHECK-NEXT: (return
;; CHECK-NEXT: (block $b (type $94) (result structref arrayref)
;; CHECK-NEXT: (br_table $a $b
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (ref.null none)
;; CHECK-NEXT: (ref.null none)
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br-table-multivalue-glb (result anyref anyref)
block $a (result arrayref structref)
block $b (result structref arrayref)
ref.null none
ref.null none
tuple.make 2
unreachable
br_table $a $b
end
return
end
)
;; CHECK: (func $br-table-loop (type $1) (result i32)
;; CHECK-NEXT: (loop $a (result i32)
;; CHECK-NEXT: (loop $b (result i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 42)
;; CHECK-NEXT: )
;; CHECK-NEXT: (br_table $a $b
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br-table-loop (result i32)
loop $a (result i32)
loop $b (result i32)
i32.const 42
i32.const 0
br_table $a $b
end
end
)
;; CHECK: (func $binary (type $49) (param $0 i32) (param $1 i32) (param $2 f64) (param $3 f64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (f64.mul
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: (local.get $3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $binary (param i32 i32 f64 f64)
local.get 0
local.get 1
i32.add
drop
local.get 2
local.get 3
f64.mul
drop
)
;; CHECK: (func $unary (type $50) (param $0 i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i64.eqz
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $unary (param i64)
local.get 0
i64.eqz
drop
)
;; CHECK: (func $select (type $25) (param $0 i32) (param $1 i32) (param $2 i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (select
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (select
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (select
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (select
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $select (param i32 i32 i32)
local.get 0
local.get 1
local.get 2
select
drop
local.get 0
local.get 1
local.get 2
select (result)
drop
local.get 0
local.get 1
local.get 2
select (result i32)
drop
local.get 0
local.get 1
local.get 2
select (result) (result i32) (result)
drop
)
;; CHECK: (func $memory-size (type $0)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (memory.size $mimport$0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (memory.size $m-imported)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (memory.size $mem-i64)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $memory-size
memory.size
drop
memory.size 1
drop
memory.size $mem-i64
drop
)
;; CHECK: (func $memory-grow (type $7) (param $0 i32) (param $1 i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (memory.grow $mimport$0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (memory.grow $m-imported
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (memory.grow $mem-i64
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $memory-grow (param i32 i64)
local.get 0
memory.grow
drop
local.get 0
memory.grow 1
drop
local.get 1
memory.grow $mem-i64
drop
)
;; CHECK: (func $globals (type $0)
;; CHECK-NEXT: (global.set $g-imported
;; CHECK-NEXT: (global.get $i32)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $globals
global.get $i32
global.set 4
)
;; CHECK: (func $tuple-globals (type $0)
;; CHECK-NEXT: (global.set $pair
;; CHECK-NEXT: (global.get $pair)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $pair
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i64.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $tuple-globals
global.get $pair
global.set $pair
i32.const 1
i64.const 2
global.set $pair
)
;; CHECK: (func $load (type $7) (param $0 i32) (param $1 i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.load $mimport$0 offset=42
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i64.load8_s $m-imported
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.atomic.load16_u $mem-i64 offset=42
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $load (param i32 i64)
local.get 0
i32.load offset=42
drop
local.get 0
i64.load8_s 1 align=1
drop
local.get 1
i32.atomic.load16_u $mem-i64 offset=42 align=2
drop
)
;; CHECK: (func $load-v128-unreachable (type $0)
;; CHECK-NEXT: (v128.load $mimport$0
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: (i64.load $mimport$0 align=8
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
(func $load-v128-unreachable
unreachable
v128.load align=16
unreachable
v128.load align=8
unreachable
)
;; CHECK: (func $store (type $7) (param $0 i32) (param $1 i64)
;; CHECK-NEXT: (i32.store $mimport$0 offset=42 align=1
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (i64.atomic.store8 $m-imported
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i64.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (f32.store $mem-i64
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (f32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $store (param i32 i64)
local.get 0
i32.const 0
i32.store offset=42 align=1
local.get 0
i64.const 1
i64.atomic.store8 1
local.get 1
f32.const 2
f32.store $mem-i64
)
;; CHECK: (func $atomic-rmw (type $7) (param $0 i32) (param $1 i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.atomic.rmw16.add_u $mimport$0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i64.atomic.rmw.xor $mem-i64 offset=8
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (i64.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $atomic-rmw (param i32 i64)
local.get 0
i32.const 1
i32.atomic.rmw16.add_u
drop
local.get 1
i64.const 2
i64.atomic.rmw.xor $mem-i64 offset=8 align=8
drop
)
;; CHECK: (func $atomic-cmpxchg (type $7) (param $0 i32) (param $1 i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.atomic.rmw8.cmpxchg_u $mem
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i64.atomic.rmw32.cmpxchg_u $mem-i64 offset=16
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (i64.const 3)
;; CHECK-NEXT: (i64.const 4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $atomic-cmpxchg (param i32 i64)
local.get 0
i32.const 1
i32.const 2
i32.atomic.rmw8.cmpxchg_u 2 align=1
drop
local.get 1
i64.const 3
i64.const 4
i64.atomic.rmw32.cmpxchg_u 5 offset=16
drop
)
;; CHECK: (func $atomic-wait (type $7) (param $0 i32) (param $1 i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (memory.atomic.wait32 $mimport$0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i64.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (memory.atomic.wait64 $mem-i64 offset=8
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (i64.const 3)
;; CHECK-NEXT: (i64.const 4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $atomic-wait (param i32 i64)
local.get 0
i32.const 1
i64.const 2
memory.atomic.wait32
drop
local.get 1
i64.const 3
i64.const 4
memory.atomic.wait64 $mem-i64 offset=8 align=8
drop
)
;; CHECK: (func $atomic-notify (type $7) (param $0 i32) (param $1 i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (memory.atomic.notify $mimport$0 offset=8
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (memory.atomic.notify $mem-i64
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $atomic-notify (param i32 i64)
local.get 0
i32.const 0
memory.atomic.notify offset=8 align=4
drop
local.get 1
i32.const 1
memory.atomic.notify $mem-i64
drop
)
;; CHECK: (func $atomic-fence (type $0)
;; CHECK-NEXT: (atomic.fence)
;; CHECK-NEXT: )
(func $atomic-fence
atomic.fence
)
;; CHECK: (func $simd-const (type $0)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (v128.const i32x4 0x03020100 0x07060504 0x0b0a0908 0x0f0e0d0c)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (v128.const i32x4 0x00010000 0x00030002 0x00050004 0x00070006)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (v128.const i32x4 0x00000000 0x00000001 0x00000002 0x00000003)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (v128.const i32x4 0x00000000 0x00000000 0x00000001 0x00000000)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (v128.const i32x4 0x00000000 0x3f800000 0x40000000 0x40400000)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (v128.const i32x4 0x00000000 0x00000000 0x00000000 0x3ff00000)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $simd-const
v128.const i8x16 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
drop
v128.const i16x8 0 1 2 3 4 5 6 7
drop
v128.const i32x4 0 1 2 3
drop
v128.const i64x2 0 1
drop
v128.const f32x4 0.0 1.0 2.0 3.0
drop
v128.const f64x2 0.0 1.0
drop
)
;; CHECK: (func $simd-extract (type $51) (param $0 v128) (result i32)
;; CHECK-NEXT: (i32x4.extract_lane 3
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $simd-extract (param v128) (result i32)
local.get 0
i32x4.extract_lane 3
)
;; CHECK: (func $simd-replace (type $26) (param $0 v128) (param $1 i32) (result v128)
;; CHECK-NEXT: (i32x4.replace_lane 2
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $simd-replace (param v128 i32) (result v128)
local.get 0
local.get 1
i32x4.replace_lane 2
)
;; CHECK: (func $simd-shuffle (type $52) (param $0 v128) (param $1 v128) (result v128)
;; CHECK-NEXT: (i8x16.shuffle 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $simd-shuffle (param v128 v128) (result v128)
local.get 0
local.get 1
i8x16.shuffle 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23
)
;; CHECK: (func $simd-ternary (type $53) (param $0 v128) (param $1 v128) (param $2 v128) (result v128)
;; CHECK-NEXT: (v128.bitselect
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $simd-ternary (param v128 v128 v128) (result v128)
local.get 0
local.get 1
local.get 2
v128.bitselect
)
;; CHECK: (func $simd-shift (type $26) (param $0 v128) (param $1 i32) (result v128)
;; CHECK-NEXT: (i8x16.shl
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $simd-shift (param v128 i32) (result v128)
local.get 0
local.get 1
i8x16.shl
)
;; CHECK: (func $simd-load (type $7) (param $0 i32) (param $1 i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (v128.load8x8_s $mimport$0 offset=8
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (v128.load16_splat $mem-i64 offset=2 align=1
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $simd-load (param i32 i64)
local.get 0
v128.load8x8_s offset=8 align=8
drop
local.get 1
v128.load16_splat $mem-i64 offset=2 align=1
drop
)
;; CHECK: (func $simd-load-store-lane (type $12) (param $0 i32) (param $1 i64) (param $2 v128)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (v128.load16_lane $mimport$0 7
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (v128.store64_lane $mem-i64 align=4 0
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $simd-load-store-lane (param i32 i64 v128)
local.get 0
local.get 2
v128.load16_lane 7
drop
local.get 1
local.get 2
v128.store64_lane 5 align=4 0
)
;; CHECK: (func $memory-init (type $25) (param $0 i32) (param $1 i32) (param $2 i32)
;; CHECK-NEXT: (memory.init $mem-i32 $passive
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (memory.init $mem-i64 $0
;; CHECK-NEXT: (i64.const 0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (memory.init $mimport$0 $implicit-data
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $memory-init (param i32 i32 i32)
local.get 0
local.get 1
local.get 2
memory.init $mem-i32 $passive
i64.const 0
local.get 1
local.get 2
memory.init 5 3
local.get 0
local.get 1
local.get 2
memory.init 0
)
;; CHECK: (func $data-drop (type $0)
;; CHECK-NEXT: (data.drop $implicit-data)
;; CHECK-NEXT: (data.drop $passive)
;; CHECK-NEXT: )
(func $data-drop
data.drop 0
data.drop $passive
)
;; CHECK: (func $memory-copy (type $54) (param $0 i32) (param $1 i32) (param $2 i64) (param $3 i64)
;; CHECK-NEXT: (memory.copy $mimport$0 $mimport$0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (memory.copy $mem $mem-i32
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (i32.const 3)
;; CHECK-NEXT: )
;; CHECK-NEXT: (memory.copy $mem-i64 $mem-i64
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: (local.get $3)
;; CHECK-NEXT: (i64.const 4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $memory-copy (param i32 i32 i64 i64)
local.get 0
local.get 1
i32.const 2
memory.copy
local.get 0
local.get 1
i32.const 3
memory.copy 2 $mem-i32
local.get 2
local.get 3
i64.const 4
memory.copy $mem-i64 5
)
;; CHECK: (func $memory-fill (type $7) (param $0 i32) (param $1 i64)
;; CHECK-NEXT: (memory.fill $mimport$0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (memory.fill $mimport$0
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 3)
;; CHECK-NEXT: (i32.const 4)
;; CHECK-NEXT: )
;; CHECK-NEXT: (memory.fill $mem-i64
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (i32.const 5)
;; CHECK-NEXT: (i64.const 6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $memory-fill (param i32 i64)
local.get 0
i32.const 1
i32.const 2
memory.fill
local.get 0
i32.const 3
i32.const 4
memory.fill 0
local.get 1
i32.const 5
i64.const 6
memory.fill $mem-i64
)
;; CHECK: (func $return-none (type $0)
;; CHECK-NEXT: (return)
;; CHECK-NEXT: )
(func $return-none
return
)
;; CHECK: (func $return-one (type $27) (param $0 i32) (result i32)
;; CHECK-NEXT: (return
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $return-one (param i32) (result i32)
local.get 0
return
)
;; CHECK: (func $return-two (type $21) (param $0 i32) (param $1 i64) (result i32 i64)
;; CHECK-NEXT: (return
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $return-two (param i32 i64) (result i32 i64)
local.get 0
local.get 1
return
)
;; CHECK: (func $return-two-first-unreachable (type $55) (param $0 i64) (result i32 i64)
;; CHECK-NEXT: (return
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $return-two-first-unreachable (param i64) (result i32 i64)
unreachable
local.get 0
return
)
;; CHECK: (func $return-two-second-unreachable (type $28) (param $0 i32) (result i32 i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $return-two-second-unreachable (param i32) (result i32 i64)
local.get 0
unreachable
return
)
;; CHECK: (func $return-two-second-unreachable-tuple (type $28) (param $0 i32) (result i32 i64)
;; CHECK-NEXT: (return
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $return-two-second-unreachable-tuple (param i32) (result i32 i64)
local.get 0
unreachable
tuple.make 2
return
)
;; CHECK: (func $return-multivalue (type $5) (result i32 i64)
;; CHECK-NEXT: (return
;; CHECK-NEXT: (call $return-multivalue)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $return-multivalue (result i32 i64)
call $return-multivalue
return
)
;; CHECK: (func $ref-is-null (type $56) (param $0 anyref) (result i32)
;; CHECK-NEXT: (ref.is_null
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $ref-is-null (param anyref) (result i32)
local.get 0
ref.is_null
)
;; CHECK: (func $ref-func (type $0)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (ref.func $ref-func)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (ref.func $ref-func)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $ref-func
ref.func $ref-func
drop
ref.func 164
drop
)
;; CHECK: (func $throw (type $0)
;; CHECK-NEXT: (throw $eimport$1)
;; CHECK-NEXT: (throw $tag-i32
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (throw $tag-pair
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i64.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $throw
throw 2
i32.const 0
throw $tag-i32
i32.const 1
i64.const 2
throw $tag-pair
)
;; CHECK: (func $ref-eq (type $57) (param $0 eqref) (param $1 eqref) (result i32)
;; CHECK-NEXT: (ref.eq
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $ref-eq (param eqref eqref) (result i32)
local.get 0
local.get 1
ref.eq
)
;; CHECK: (func $table-get (type $0)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (table.get $timport$0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (table.get $timport$1
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (table.get $table-any
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $table-get
i32.const 0
table.get
drop
i32.const 1
table.get 1
drop
i32.const 2
table.get $table-any
drop
)
;; CHECK: (func $table-set (type $0)
;; CHECK-NEXT: (table.set $timport$0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (ref.null nofunc)
;; CHECK-NEXT: )
;; CHECK-NEXT: (table.set $funcs
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (ref.func $table-set)
;; CHECK-NEXT: )
;; CHECK-NEXT: (table.set $table-any
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: (ref.null none)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $table-set
i32.const 0
ref.null func
table.set
i32.const 1
ref.func $table-set
table.set 2
i32.const 2
ref.null any
table.set $table-any
)
;; CHECK: (func $table-size (type $0)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (table.size $timport$0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (table.size $timport$1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (table.size $table-any)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $table-size
table.size
drop
table.size 1
drop
table.size $table-any
drop
)
;; CHECK: (func $table-grow (type $0)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (table.grow $timport$0
;; CHECK-NEXT: (ref.null nofunc)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (table.grow $funcs
;; CHECK-NEXT: (ref.func $table-grow)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (table.grow $table-any
;; CHECK-NEXT: (ref.null none)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $table-grow
ref.null func
i32.const 0
table.grow
drop
ref.func $table-grow
i32.const 1
table.grow 2
drop
ref.null any
i32.const 2
table.grow $table-any
drop
)
;; CHECK: (func $table-fill (type $0)
;; CHECK-NEXT: (table.fill $timport$0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (ref.null nofunc)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (table.fill $funcs
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: (ref.func $table-fill)
;; CHECK-NEXT: (i32.const 3)
;; CHECK-NEXT: )
;; CHECK-NEXT: (table.fill $table-any
;; CHECK-NEXT: (i32.const 4)
;; CHECK-NEXT: (ref.null none)
;; CHECK-NEXT: (i32.const 5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $table-fill
i32.const 0
ref.null func
i32.const 1
table.fill
i32.const 2
ref.func $table-fill
i32.const 3
table.fill 2
i32.const 4
ref.null any
i32.const 5
table.fill $table-any
)
;; CHECK: (func $table-copy (type $0)
;; CHECK-NEXT: (table.copy $timport$0 $timport$0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (table.copy $funcs $funcs
;; CHECK-NEXT: (i32.const 3)
;; CHECK-NEXT: (i32.const 4)
;; CHECK-NEXT: (i32.const 5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $table-copy
i32.const 0
i32.const 1
i32.const 2
table.copy
i32.const 3
i32.const 4
i32.const 5
table.copy 2 $funcs
)
;; CHECK: (func $i31-new (type $58) (param $0 i32) (result i31ref)
;; CHECK-NEXT: (ref.i31
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $i31-new (param i32) (result i31ref)
local.get 0
ref.i31
)
;; CHECK: (func $i31-get (type $59) (param $0 i31ref)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i31.get_s
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i31.get_u
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $i31-get (param i31ref)
local.get 0
i31.get_s
drop
local.get 0
i31.get_u
drop
)
;; CHECK: (func $call-ref (type $0)
;; CHECK-NEXT: (local $0 (ref null $void))
;; CHECK-NEXT: (local $1 (ref null $ret2))
;; CHECK-NEXT: (local $2 (ref null $many))
;; CHECK-NEXT: (local $scratch (tuple i32 i32))
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 (tuple anyref (ref func)))
;; CHECK-NEXT: (local $scratch_6 anyref)
;; CHECK-NEXT: (call_ref $void
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (tuple.extract 2 0
;; CHECK-NEXT: (local.tee $scratch
;; CHECK-NEXT: (call_ref $ret2
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (tuple.extract 2 1
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block (result anyref)
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (tuple.extract 2 0
;; CHECK-NEXT: (local.tee $scratch_5
;; CHECK-NEXT: (call_ref $many
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (i64.const 1)
;; CHECK-NEXT: (f32.const 2)
;; CHECK-NEXT: (f64.const 3)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (tuple.extract 2 1
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $call-ref
(local (ref null $void) (ref null $ret2) (ref null $many))
local.get 0
call_ref $void
local.get 1
call_ref $ret2
drop
drop
i32.const 0
i64.const 1
f32.const 2
f64.const 3
local.get 2
call_ref $many
drop
drop
)
;; CHECK: (func $ref-test (type $9) (param $0 anyref)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (ref.test i31ref
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (ref.test (ref $s0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $ref-test (param anyref)
local.get 0
ref.test i31ref
drop
local.get 0
ref.test (ref $s0)
drop
)
;; CHECK: (func $ref-cast (type $9) (param $0 anyref)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (ref.cast i31ref
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (ref.cast (ref $s0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $ref-cast (param anyref)
local.get 0
ref.cast i31ref
drop
local.get 0
ref.cast (ref $s0)
drop
)
;; CHECK: (func $br-on-null (type $9) (param $0 anyref)
;; CHECK-NEXT: (block $label
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (br_on_null $label
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br-on-null (param anyref)
local.get 0
br_on_null 0
drop
)
;; CHECK: (func $br-on-non-null (type $9) (param $0 anyref)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block $block (result (ref any))
;; CHECK-NEXT: (br_on_non_null $block
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br-on-non-null (param anyref)
block (result (ref any))
local.get 0
br_on_non_null 0
unreachable
end
drop
)
;; CHECK: (func $br-on-cast (type $9) (param $0 anyref)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block $block (result i31ref)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block (result (ref any))
;; CHECK-NEXT: (br_on_cast $block anyref i31ref
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br-on-cast (param anyref)
block (result i31ref)
block (result (ref any))
local.get 0
br_on_cast 1 anyref i31ref
end
unreachable
end
drop
)
;; CHECK: (func $br-on-cast-unreachable (type $0)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block $block (result i31ref)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block (result (ref any))
;; CHECK-NEXT: (br_on_cast $block i31ref i31ref
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br-on-cast-unreachable
block (result i31ref)
block (result (ref any))
unreachable
br_on_cast 1 anyref i31ref
end
unreachable
end
drop
)
;; CHECK: (func $br-on-cast-fail (type $9) (param $0 anyref)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block $block (result (ref any))
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block (result i31ref)
;; CHECK-NEXT: (br_on_cast_fail $block anyref i31ref
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br-on-cast-fail (param anyref)
block (result (ref any))
block (result i31ref)
local.get 0
br_on_cast_fail 1 anyref i31ref
end
unreachable
end
drop
)
;; CHECK: (func $br-on-cast-fail-unreachable (type $0)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block $block (result (ref any))
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block (result i31ref)
;; CHECK-NEXT: (br_on_cast_fail $block i31ref i31ref
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $br-on-cast-fail-unreachable
block (result (ref any))
block (result i31ref)
unreachable
br_on_cast_fail 1 anyref i31ref
end
unreachable
end
drop
)
;; CHECK: (func $struct-new (type $60) (param $0 i32) (param $1 i64) (result (ref $pair))
;; CHECK-NEXT: (struct.new $pair
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $struct-new (param i32 i64) (result (ref $pair))
local.get 0
local.get 1
struct.new $pair
)
;; CHECK: (func $struct-new-default (type $61) (result (ref $pair))
;; CHECK-NEXT: (struct.new_default $pair)
;; CHECK-NEXT: )
(func $struct-new-default (result (ref $pair))
struct.new_default 14
)
;; CHECK: (func $struct-get-0 (type $62) (param $0 (ref $pair)) (result i32)
;; CHECK-NEXT: (struct.get $pair $first
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $struct-get-0 (param (ref $pair)) (result i32)
local.get 0
struct.get 14 0
)
;; CHECK: (func $struct-get-1 (type $63) (param $0 (ref $pair)) (result i64)
;; CHECK-NEXT: (struct.get $pair $second
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $struct-get-1 (param (ref $pair)) (result i64)
local.get 0
struct.get $pair 1
)
;; CHECK: (func $struct-get-named (type $64) (param $0 (ref null $pair)) (result i32)
;; CHECK-NEXT: (struct.get $pair $first
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $struct-get-named (param (ref null $pair)) (result i32)
local.get 0
struct.get $pair $first
)
;; CHECK: (func $struct-set-0 (type $65) (param $0 (ref $pair)) (param $1 i32)
;; CHECK-NEXT: (struct.set $pair $first
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $struct-set-0 (param (ref $pair) i32)
local.get 0
local.get 1
struct.set $pair 0
)
;; CHECK: (func $struct-set-1 (type $66) (param $0 (ref $pair)) (param $1 i64)
;; CHECK-NEXT: (struct.set $pair $second
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $struct-set-1 (param (ref $pair) i64)
local.get 0
local.get 1
struct.set 14 1
)
;; CHECK: (func $struct-set-named (type $67) (param $0 (ref null $pair)) (param $1 i64)
;; CHECK-NEXT: (struct.set $pair $second
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $struct-set-named (param (ref null $pair) i64)
local.get 0
local.get 1
struct.set 14 $second
)
;; CHECK: (func $array-new (type $68) (param $0 i64) (param $1 i32) (result (ref $a1))
;; CHECK-NEXT: (array.new $a1
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-new (param i64 i32) (result (ref 11))
local.get 0
local.get 1
array.new $a1
)
;; CHECK: (func $array-new-default (type $69) (param $0 i32) (result (ref $a1))
;; CHECK-NEXT: (array.new_default $a1
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-new-default (param i32) (result (ref $a1))
local.get 0
array.new_default 11
)
;; CHECK: (func $array-new-data (type $70) (param $0 i32) (param $1 i32) (result (ref $a1))
;; CHECK-NEXT: (array.new_data $a1 $implicit-data
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-new-data (param i32 i32) (result (ref $a1))
local.get 0
local.get 1
array.new_data $a1 0
)
;; CHECK: (func $array-new-fixed (type $0)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (array.new_fixed $a0 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (array.new_fixed $a0 3
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-new-fixed
array.new_fixed $a0 0
drop
i32.const 0
i32.const 1
i32.const 2
array.new_fixed $a0 3
drop
)
;; CHECK: (func $array-get (type $71) (param $0 (ref $a1)) (param $1 i32) (result i64)
;; CHECK-NEXT: (array.get $a1
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-get (param (ref 11) i32) (result i64)
local.get 0
local.get 1
array.get $a1
)
;; CHECK: (func $array-get-s (type $72) (param $0 (ref $packed-i8)) (param $1 i32) (result i32)
;; CHECK-NEXT: (array.get_s $packed-i8
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-get-s (param (ref $packed-i8) i32) (result i32)
local.get 0
local.get 1
array.get_s 15
)
;; CHECK: (func $array-get-u (type $73) (param $0 (ref $packed-i16)) (param $1 i32) (result i32)
;; CHECK-NEXT: (array.get_u $packed-i16
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-get-u (param (ref 16) i32) (result i32)
local.get 0
local.get 1
array.get_u $packed-i16
)
;; CHECK: (func $array-set (type $74) (param $0 (ref $a2)) (param $1 i32) (param $2 f32)
;; CHECK-NEXT: (array.set $a2
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-set (param (ref $a2) i32 f32)
local.get 0
local.get 1
local.get 2
array.set $a2
)
;; CHECK: (func $array-len (type $75) (param $0 arrayref) (result i32)
;; CHECK-NEXT: (array.len
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-len (param (ref null array)) (result i32)
local.get 0
array.len
)
;; CHECK: (func $array-copy (type $76) (param $0 (ref $a2)) (param $1 i32) (param $2 (ref $a2)) (param $3 i32) (param $4 i32)
;; CHECK-NEXT: (array.copy $a2 $a2
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: (local.get $3)
;; CHECK-NEXT: (local.get $4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-copy (param (ref $a2) i32 (ref $a2) i32 i32)
local.get 0
local.get 1
local.get 2
local.get 3
local.get 4
array.copy $a2 $a2
)
;; CHECK: (func $array-fill (type $77) (param $0 (ref $a2)) (param $1 i32) (param $2 f32) (param $3 i32)
;; CHECK-NEXT: (array.fill $a2
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: (local.get $3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-fill (param (ref $a2) i32 f32 i32)
local.get 0
local.get 1
local.get 2
local.get 3
array.fill $a2
)
;; CHECK: (func $array-init-data (type $78) (param $0 (ref $a2)) (param $1 i32) (param $2 i32) (param $3 i32)
;; CHECK-NEXT: (array.init_data $a2 $implicit-data
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: (local.get $3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-init-data (param (ref $a2) i32 i32 i32)
local.get 0
local.get 1
local.get 2
local.get 3
array.init_data $a2 0
)
;; CHECK: (func $array-init-elem (type $79) (param $0 (ref $any-array)) (param $1 i32) (param $2 i32) (param $3 i32)
;; CHECK-NEXT: (array.init_elem $any-array $passive-2
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: (local.get $3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-init-elem (param (ref $any-array) i32 i32 i32)
local.get 0
local.get 1
local.get 2
local.get 3
array.init_elem $any-array $passive-2
)
;; CHECK: (func $ref-as-non-null (type $9) (param $0 anyref)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (ref.as_non_null
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $ref-as-non-null (param anyref)
local.get 0
ref.as_non_null
drop
)
;; CHECK: (func $any-convert-extern (type $80) (param $0 externref)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (any.convert_extern
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $any-convert-extern (param externref)
local.get 0
any.convert_extern
drop
)
;; CHECK: (func $extern-convert-any (type $9) (param $0 anyref)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (extern.convert_any
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $extern-convert-any (param anyref)
local.get 0
extern.convert_any
drop
)
;; CHECK: (func $string-new-gc (type $81) (param $0 (ref $packed-i8)) (param $1 i32) (param $2 i32) (result stringref)
;; CHECK-NEXT: (string.new_lossy_utf8_array
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $string-new-gc (param (ref $packed-i8) i32 i32) (result stringref)
local.get 0
local.get 1
local.get 2
string.new_lossy_utf8_array
)
;; CHECK: (func $string-new-code-point (type $82) (param $0 i32) (result stringref)
;; CHECK-NEXT: (string.from_code_point
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $string-new-code-point (param i32) (result stringref)
local.get 0
string.from_code_point
)
;; CHECK: (func $string-const (type $83) (result (ref string))
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (string.const "foobar")
;; CHECK-NEXT: )
;; CHECK-NEXT: (string.const "\00\00\00")
;; CHECK-NEXT: )
(func $string-const (result (ref string))
string.const "foobar"
drop
string.const "\00\00\00"
)
;; CHECK: (func $string-measure (type $84) (param $0 stringref)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (string.measure_utf8
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (string.measure_wtf16
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $string-measure (param stringref)
local.get 0
string.measure_utf8
drop
local.get 0
string.measure_wtf16
drop
)
;; CHECK: (func $string-encode-gc (type $85) (param $0 stringref) (param $1 (ref $packed-i16)) (param $2 i32) (result i32)
;; CHECK-NEXT: (string.encode_wtf16_array
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $string-encode-gc (param stringref (ref $packed-i16) i32) (result i32)
local.get 0
local.get 1
local.get 2
string.encode_wtf16_array
)
;; CHECK: (func $string-concat (type $86) (param $0 stringref) (param $1 stringref) (result (ref string))
;; CHECK-NEXT: (string.concat
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $string-concat (param stringref stringref) (result (ref string))
local.get 0
local.get 1
string.concat
)
;; CHECK: (func $string-eq (type $29) (param $0 stringref) (param $1 stringref) (result i32)
;; CHECK-NEXT: (string.eq
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $string-eq (param stringref stringref) (result i32)
local.get 0
local.get 1
string.eq
)
;; CHECK: (func $string-compare (type $29) (param $0 stringref) (param $1 stringref) (result i32)
;; CHECK-NEXT: (string.compare
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $string-compare (param stringref stringref) (result i32)
local.get 0
local.get 1
string.compare
)
;; CHECK: (func $string-get (type $87) (param $0 stringref) (param $1 i32) (result i32)
;; CHECK-NEXT: (stringview_wtf16.get_codeunit
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $string-get (param stringref i32) (result i32)
local.get 0
local.get 1
stringview_wtf16.get_codeunit
)
;; CHECK: (func $string-slice (type $88) (param $0 stringref) (param $1 i32) (param $2 i32) (result (ref string))
;; CHECK-NEXT: (stringview_wtf16.slice
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $string-slice (param stringref i32 i32) (result (ref string))
local.get 0
local.get 1
local.get 2
stringview_wtf16.slice
)
;; CHECK: (func $call (type $simple) (param $0 i32) (param $1 i64) (result f32)
;; CHECK-NEXT: (call $call
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $call (param i32 i64) (result f32)
local.get 0
local.get 1
call $call
)
;; CHECK: (func $return_call (type $simple) (param $0 i32) (param $1 i64) (result f32)
;; CHECK-NEXT: (return_call $return_call
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $return_call (param i32 i64) (result f32)
local.get 0
local.get 1
return_call $return_call
)
;; CHECK: (func $call-indirect (type $12) (param $0 i32) (param $1 i64) (param $2 v128)
;; CHECK-NEXT: (call_indirect $timport$0 (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (call_indirect $funcs (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (call_indirect $funcs (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (call_indirect $timport$0 (type $void)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (call_indirect $funcs (type $void)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (call_indirect $funcs (type $void)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (call_indirect $timport$0 (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (call_indirect $funcs (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (call_indirect $funcs (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (call_indirect $timport$0 (type $30)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $call-indirect (param i32 i64 v128)
local.get 0
call_indirect
local.get 0
call_indirect 2
local.get 0
call_indirect $funcs
local.get 0
call_indirect (type $void)
local.get 0
call_indirect 2 (type $void) (param) (result)
local.get 0
call_indirect $funcs (type $void)
local.get 0
call_indirect (param) (result)
local.get 0
call_indirect 2 (param) (result)
local.get 0
call_indirect $funcs (param) (result)
local.get 1
local.get 2
local.get 0
call_indirect (param i64 v128) (result v128)
drop
)
;; CHECK: (func $call-indirect-folded (type $12) (param $0 i32) (param $1 i64) (param $2 v128)
;; CHECK-NEXT: (call_indirect $timport$0 (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (call_indirect $funcs (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (call_indirect $funcs (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (call_indirect $timport$0 (type $void)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (call_indirect $funcs (type $void)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (call_indirect $funcs (type $void)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (call_indirect $timport$0 (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (call_indirect $funcs (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (call_indirect $funcs (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (call_indirect $timport$0 (type $30)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $call-indirect-folded (param i32 i64 v128)
(call_indirect
(local.get 0)
)
(call_indirect 2
(local.get 0)
)
(call_indirect $funcs
(local.get 0)
)
(call_indirect (type $void)
(local.get 0)
)
(call_indirect 2 (type $void) (param) (result)
(local.get 0)
)
(call_indirect $funcs (type $void)
(local.get 0)
)
(call_indirect (param) (result)
(local.get 0)
)
(call_indirect 2 (param) (result)
(local.get 0)
)
(call_indirect $funcs (param) (result)
(local.get 0)
)
(drop
(call_indirect (param i64 v128) (result v128)
(local.get 1)
(local.get 2)
(local.get 0)
)
)
)
;; CHECK: (func $return-call-indirect (type $12) (param $0 i32) (param $1 i64) (param $2 v128)
;; CHECK-NEXT: (return_call_indirect $timport$0 (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return_call_indirect $funcs (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return_call_indirect $funcs (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return_call_indirect $timport$0 (type $void)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return_call_indirect $funcs (type $void)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return_call_indirect $funcs (type $void)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return_call_indirect $timport$0 (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return_call_indirect $funcs (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return_call_indirect $funcs (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return_call_indirect $timport$0 (type $31)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $return-call-indirect (param i32 i64 v128)
local.get 0
return_call_indirect
local.get 0
return_call_indirect 2
local.get 0
return_call_indirect $funcs
local.get 0
return_call_indirect (type $void)
local.get 0
return_call_indirect 2 (type $void) (param) (result)
local.get 0
return_call_indirect $funcs (type $void)
local.get 0
return_call_indirect (param) (result)
local.get 0
return_call_indirect 2 (param) (result)
local.get 0
return_call_indirect $funcs (param) (result)
local.get 1
local.get 2
local.get 0
return_call_indirect (param i64 v128)
)
;; CHECK: (func $return-call-indirect-folded (type $12) (param $0 i32) (param $1 i64) (param $2 v128)
;; CHECK-NEXT: (return_call_indirect $timport$0 (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return_call_indirect $funcs (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return_call_indirect $funcs (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return_call_indirect $timport$0 (type $void)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return_call_indirect $funcs (type $void)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return_call_indirect $funcs (type $void)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return_call_indirect $timport$0 (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return_call_indirect $funcs (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return_call_indirect $funcs (type $0)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return_call_indirect $timport$0 (type $31)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $return-call-indirect-folded (param i32 i64 v128)
(return_call_indirect
(local.get 0)
)
(return_call_indirect 2
(local.get 0)
)
(return_call_indirect $funcs
(local.get 0)
)
(return_call_indirect (type $void)
(local.get 0)
)
(return_call_indirect 2 (type $void) (param) (result)
(local.get 0)
)
(return_call_indirect $funcs (type $void)
(local.get 0)
)
(return_call_indirect (param) (result)
(local.get 0)
)
(return_call_indirect 2 (param) (result)
(local.get 0)
)
(return_call_indirect $funcs (param) (result)
(local.get 0)
)
(return_call_indirect (param i64 v128)
(local.get 1)
(local.get 2)
(local.get 0)
)
)
;; CHECK: (func $resume (type $89) (param $ct (ref $simple-cont))
;; CHECK-NEXT: (local $f f32)
;; CHECK-NEXT: (block $label
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block $block (result (ref $to-f32-cont))
;; CHECK-NEXT: (tuple.drop 3
;; CHECK-NEXT: (block $block1 (type $96) (result i32 i64 (ref null $simple-cont))
;; CHECK-NEXT: (local.set $f
;; CHECK-NEXT: (resume $simple-cont (on $empty $block) (on $tag-pair-to-pair $block1)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (i64.const 1)
;; CHECK-NEXT: (local.get $ct)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $label)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $resume (param $ct (ref $simple-cont))
(local $f f32)
block (result (ref $to-f32-cont))
block (result i32 i64 (ref null $simple-cont))
i32.const 0
i64.const 1
local.get $ct
resume $simple-cont (on $empty 1) (on $tag-pair-to-pair 0)
local.set $f
unreachable
end
unreachable
end
br 0
)
;; CHECK: (func $contnew (type $91) (param $f (ref $simple)) (result (ref $simple-cont))
;; CHECK-NEXT: (cont.new $simple-cont
;; CHECK-NEXT: (local.get $f)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $contnew (param $f (ref $simple)) (result (ref $simple-cont))
local.get $f
cont.new $simple-cont
)
;; CHECK: (func $contbind (type $92) (param $c (ref $cont-bind-before)) (result (ref $simple-cont))
;; CHECK-NEXT: (cont.bind $cont-bind-before $simple-cont
;; CHECK-NEXT: (i32.const 123)
;; CHECK-NEXT: (i64.const 123)
;; CHECK-NEXT: (local.get $c)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $contbind (param $c (ref $cont-bind-before)) (result (ref $simple-cont))
i32.const 123
i64.const 123
local.get $c
cont.bind $cont-bind-before $simple-cont
)
;; CHECK: (func $suspend (type $5) (result i32 i64)
;; CHECK-NEXT: (suspend $tag-pair-to-pair
;; CHECK-NEXT: (i32.const 123)
;; CHECK-NEXT: (i64.const 456)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $suspend (result i32 i64)
i32.const 123
i64.const 456
suspend $tag-pair-to-pair
)
;; CHECK: (func $source-maps (type $0)
;; CHECK-NEXT: ;;@ src.cpp:40:1
;; CHECK-NEXT: (drop
;; CHECK-NEXT: ;;@ src.cpp:30:1
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: ;;@ src.cpp:10:1
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: ;;@ src.cpp:20:1
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: ;;@ src.cpp:90:1
;; CHECK-NEXT: (drop
;; CHECK-NEXT: ;;@ src.cpp:70:1
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: ;;@ src.cpp:50:1
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: ;;@ src.cpp:60:1
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: ;;@ src.cpp:70:1
;; CHECK-NEXT: (loop (result i32)
;; CHECK-NEXT: ;;@ src.cpp:80:1
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: ;;@ src.cpp:100:1
;; CHECK-NEXT: (block
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $source-maps
;;@ src.cpp:10:1
i32.const 0
;;@ src.cpp:20:1
i32.const 1
(@src src.cpp:30:1)
i32.add
(@src src.cpp:40:1)
drop
;;@ src.cpp:90:1
(drop
(@src src.cpp:70:1)
(i32.add
;;@ src.cpp:50:1
(i32.const 2)
(@src src.cpp:60:1)
(block (result i32)
;;@ src.cpp:70:1
(loop (result i32)
;;@ src.cpp:80:1
(unreachable)
)
)
)
)
;;@ src.cpp:100:1
block
end
)
;; CHECK: (func $source-map-propagation (type $0)
;; CHECK-NEXT: ;;@ src.cpp:20:1
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: ;;@ src.cpp:10:1
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: ;;@ src.cpp:10:1
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: ;;@ src.cpp:20:1
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: ;;@ src.cpp:30:1
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 100)
;; CHECK-NEXT: (i32.const 200)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $source-map-propagation
;;@ src.cpp:10:1
i32.const 0
i32.const 1
i32.add
;;@ src.cpp:20:1
drop
i32.const 2
drop
i32.const 100
i32.const 200
i32.add
;;@ src.cpp:30:1
drop
)
;; CHECK: (func $use-types (type $93) (param $0 (ref $s0)) (param $1 (ref $s1)) (param $2 (ref $s2)) (param $3 (ref $s3)) (param $4 (ref $s4)) (param $5 (ref $s5)) (param $6 (ref $s6)) (param $7 (ref $s7)) (param $8 (ref $s8)) (param $9 (ref $a0)) (param $10 (ref $a1)) (param $11 (ref $a2)) (param $12 (ref $a3)) (param $13 (ref $subvoid)) (param $14 (ref $submany)) (param $15 (ref $all-types))
;; CHECK-NEXT: )
(func $use-types
(param (ref $s0))
(param (ref $s1))
(param (ref $s2))
(param (ref $s3))
(param (ref $s4))
(param (ref $s5))
(param (ref $s6))
(param (ref $s7))
(param (ref $s8))
(param (ref $a0))
(param (ref $a1))
(param (ref $a2))
(param (ref $a3))
(param (ref $subvoid))
(param (ref $submany))
(param (ref $all-types))
)
;; The if is unreachable except through the break; make sure this is
;; parsed correctly
;; CHECK: (func $if-else-br-return (type $27) (param $a i32) (result i32)
;; CHECK-NEXT: (block $label
;; CHECK-NEXT: (if
;; CHECK-NEXT: (local.get $a)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (br $label)
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (return
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
(func $if-else-br-return (param $a i32) (result i32)
(if (local.get $a)
(then
(br 0)
)
(else
(return (i32.const 0))
)
)
(i32.const 1)
)
;; CHECK: (func $if-else-unreachable-br-extra (type $1) (result i32)
;; CHECK-NEXT: (local $scratch nullref)
;; CHECK-NEXT: (local $scratch_1 i32)
;; CHECK-NEXT: (local $scratch_2 i32)
;; CHECK-NEXT: (local $scratch_3 (ref none))
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (block $l (result i32)
;; CHECK-NEXT: (block $l0
;; CHECK-NEXT: (br $l
;; CHECK-NEXT: (if (result i32)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (local.set $scratch_1
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_2
;; CHECK-NEXT: (i32.const 42)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (ref.null none)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_3
;; CHECK-NEXT: (br_on_null $l0
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (local.get $scratch_1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (i32.const 1337)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-unreachable-br-extra (result i32)
;; The condition is unreachable, making the if unreachable.
unreachable
if $l (result i32)
;; Send an extra i32. We should not get confused because the if is
;; unreachable.
i32.const 42
ref.null none
br_on_null $l
drop
else $l
i32.const 1337
end $l
)
;; CHECK: (func $try-br-catch-all-return (type $0)
;; CHECK-NEXT: (block $label
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: (br $label)
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch_all
;; CHECK-NEXT: (return)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-br-catch-all-return
(try
(do
(br 0)
)
(catch_all
(return)
)
)
)
;; CHECK: (func $try-br-catch-return (type $0)
;; CHECK-NEXT: (block $label
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: (br $label)
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $empty
;; CHECK-NEXT: (return)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $try-br-catch-return
(try
(do
(br 0)
)
(catch $empty
(return)
)
)
)
)