| ;; 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) | |
| ) | |
| ) | |
| ) | |
| ) |