blob: 6989bf62ca98428a20a5c27796afc1496d719acf [file] [log] [blame] [edit]
;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited.
;; RUN: wasm-opt %s -all -S -o - | filecheck %s
;; RUN: wasm-opt %s -all -O -S -o - -O | filecheck %s --check-prefix=OPT_O
(module
;; CHECK: (import "env" "i32" (global $i32 (mut i32)))
;; OPT_O: (import "env" "i32" (global $i32 (mut i32)))
(import "env" "i32" (global $i32 (mut i32)))
;; CHECK: (import "env" "i64" (global $i64 (mut i64)))
;; OPT_O: (import "env" "i64" (global $i64 (mut i64)))
(import "env" "i64" (global $i64 (mut i64)))
;; CHECK: (import "env" "any" (global $any (mut (ref any))))
;; OPT_O: (import "env" "any" (global $any (mut (ref any))))
(import "env" "any" (global $any (mut (ref any))))
;; CHECK: (import "env" "anyref" (global $anyref (mut anyref)))
;; OPT_O: (import "env" "anyref" (global $anyref (mut anyref)))
(import "env" "anyref" (global $anyref (mut anyref)))
;; CHECK: (import "env" "eq" (global $eq (mut (ref eq))))
;; OPT_O: (import "env" "eq" (global $eq (mut (ref eq))))
(import "env" "eq" (global $eq (mut (ref eq))))
;; CHECK: (import "env" "eqref" (global $eqref (mut eqref)))
;; OPT_O: (import "env" "eqref" (global $eqref (mut eqref)))
(import "env" "eqref" (global $eqref (mut eqref)))
;; CHECK: (import "env" "use-i32-any" (func $use-i32-any (type $15) (param i32 (ref any))))
;; OPT_O: (import "env" "use-i32-any" (func $use-i32-any (type $15) (param i32 (ref any))))
(import "env" "use-i32-any" (func $use-i32-any (param i32 (ref any))))
;; CHECK: (tag $e (type $7) (param i32))
;; OPT_O: (tag $e (type $5) (param i32))
(tag $e (param i32))
;; CHECK: (tag $e2 (type $7) (param i32))
;; OPT_O: (tag $e2 (type $5) (param i32))
(tag $e2 (param i32))
;; CHECK: (func $br_on_null-one (type $8) (param $0 i32) (param $1 anyref) (result i32)
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_3 i32)
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 (ref any))
;; CHECK-NEXT: (local $scratch_6 i32)
;; CHECK-NEXT: (block $block (result i32)
;; CHECK-NEXT: (block $block0
;; CHECK-NEXT: (local.set $scratch_3
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (br_on_null $block0
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $any
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $br_on_null-one (type $6) (param $0 i32) (param $1 anyref) (result i32)
;; OPT_O-NEXT: (block $block (result i32)
;; OPT_O-NEXT: (block $block0
;; OPT_O-NEXT: (global.set $any
;; OPT_O-NEXT: (br_on_null $block0
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $block
;; OPT_O-NEXT: (i32.const 1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $br_on_null-one (export "br_on_null-one") (param i32 anyref) (result i32)
block (result i32)
local.get 0
local.get 1
br_on_null 0
global.set $any
global.set $i32
i32.const 1
end
)
;; CHECK: (func $br_on_null-two (type $16) (param $0 i32) (param $1 i64) (param $2 anyref) (result i32 i64)
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_4 (tuple i32 i64))
;; CHECK-NEXT: (local $scratch_5 i64)
;; CHECK-NEXT: (local $scratch_6 (ref any))
;; CHECK-NEXT: (local $scratch_7 (tuple i32 i64))
;; CHECK-NEXT: (local $scratch_8 i32)
;; CHECK-NEXT: (block $block (type $13) (result i32 i64)
;; CHECK-NEXT: (block $block0
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (block (result i64)
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (br_on_null $block0
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_8
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $any
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.extract 2 0
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i64
;; CHECK-NEXT: (tuple.extract 2 1
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_8)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (i64.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $br_on_null-two (type $16) (param $0 i32) (param $1 i64) (param $2 anyref) (result i32 i64)
;; OPT_O-NEXT: (local $3 (tuple i32 i64))
;; OPT_O-NEXT: (block $block (type $11) (result i32 i64)
;; OPT_O-NEXT: (local.set $3
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (block $block0
;; OPT_O-NEXT: (global.set $any
;; OPT_O-NEXT: (br_on_null $block0
;; OPT_O-NEXT: (local.get $2)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i64
;; OPT_O-NEXT: (tuple.extract 2 1
;; OPT_O-NEXT: (local.get $3)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (tuple.extract 2 0
;; OPT_O-NEXT: (local.get $3)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $block
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (i64.const 1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (local.get $3)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $br_on_null-two (export "br_on_null-two") (param i32 i64 anyref) (result i32 i64)
block (result i32 i64)
local.get 0
local.get 1
local.get 2
br_on_null 0
global.set $any
global.set $i64
global.set $i32
i32.const 0
i64.const 1
end
)
;; CHECK: (func $br_on_non_null-one (type $9) (param $0 i32) (param $1 anyref) (result i32 (ref any))
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_3 i32)
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 (ref any))
;; CHECK-NEXT: (block $block (type $3) (result i32 (ref any))
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (block $block0 (result (ref any))
;; CHECK-NEXT: (local.set $scratch_3
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br_on_non_null $block0
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (global.get $any)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $br_on_non_null-one (type $7) (param $0 i32) (param $1 anyref) (result i32 (ref any))
;; OPT_O-NEXT: (block $block (type $1) (result i32 (ref any))
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (block $block0 (result (ref any))
;; OPT_O-NEXT: (br_on_non_null $block0
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $block
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 1)
;; OPT_O-NEXT: (global.get $any)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $br_on_non_null-one (export "br_on_non_null-one") (param i32 anyref) (result i32 (ref any))
block (result i32 (ref any))
local.get 0
local.get 1
br_on_non_null 0
global.set $i32
i32.const 1
global.get $any
end
)
;; CHECK: (func $br_on_non_null-two (type $10) (param $0 i32) (param $1 i64) (param $2 anyref) (result i32 i64 (ref any))
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_4 (tuple i32 i64))
;; CHECK-NEXT: (local $scratch_5 i64)
;; CHECK-NEXT: (local $scratch_6 (tuple i32 i64))
;; CHECK-NEXT: (local $scratch_7 i32)
;; CHECK-NEXT: (local $scratch_8 (ref any))
;; CHECK-NEXT: (block $block (type $4) (result i32 i64 (ref any))
;; CHECK-NEXT: (local.set $scratch_8
;; CHECK-NEXT: (block $block0 (result (ref any))
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (block (result i64)
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br_on_non_null $block0
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (tuple.extract 2 0
;; CHECK-NEXT: (local.tee $scratch_6
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i64
;; CHECK-NEXT: (tuple.extract 2 1
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block
;; CHECK-NEXT: (tuple.make 3
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i64.const 2)
;; CHECK-NEXT: (global.get $any)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 3
;; CHECK-NEXT: (tuple.extract 2 0
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.extract 2 1
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_8)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $br_on_non_null-two (type $8) (param $0 i32) (param $1 i64) (param $2 anyref) (result i32 i64 (ref any))
;; OPT_O-NEXT: (block $block (type $4) (result i32 i64 (ref any))
;; OPT_O-NEXT: (tuple.make 3
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: (block $block0 (result (ref any))
;; OPT_O-NEXT: (br_on_non_null $block0
;; OPT_O-NEXT: (local.get $2)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i64
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $block
;; OPT_O-NEXT: (tuple.make 3
;; OPT_O-NEXT: (i32.const 1)
;; OPT_O-NEXT: (i64.const 2)
;; OPT_O-NEXT: (global.get $any)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $br_on_non_null-two (export "br_on_non_null-two") (param i32 i64 anyref) (result i32 i64 (ref any))
block (result i32 i64 (ref any))
local.get 0
local.get 1
local.get 2
br_on_non_null 0
global.set $i64
global.set $i32
i32.const 1
i64.const 2
global.get $any
end
)
;; CHECK: (func $br_on_cast-one (type $2) (param $0 i32) (param $1 anyref) (result i32 eqref)
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_3 i32)
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 (ref any))
;; CHECK-NEXT: (local $scratch_6 i32)
;; CHECK-NEXT: (local $scratch_7 eqref)
;; CHECK-NEXT: (block $block (type $0) (result i32 eqref)
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (block $block0 (result eqref)
;; CHECK-NEXT: (local.set $scratch_3
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (br_on_cast $block0 anyref eqref
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $any
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (global.get $eq)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $br_on_cast-one (type $3) (param $0 i32) (param $1 anyref) (result i32 eqref)
;; OPT_O-NEXT: (block $block (type $0) (result i32 eqref)
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (block $block0 (result eqref)
;; OPT_O-NEXT: (global.set $any
;; OPT_O-NEXT: (br_on_cast $block0 anyref eqref
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $block
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (global.get $eq)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $br_on_cast-one (export "br_on_cast-one") (param i32 anyref) (result i32 eqref)
block (result i32 eqref)
local.get 0
local.get 1
br_on_cast 0 anyref eqref
global.set $any
global.set $i32
i32.const 0
global.get $eq
end
)
;; CHECK: (func $br_on_cast-two (type $17) (param $0 i32) (param $1 i64) (param $2 anyref) (result i32 i64 eqref)
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_4 (tuple i32 i64))
;; CHECK-NEXT: (local $scratch_5 i64)
;; CHECK-NEXT: (local $scratch_6 (ref any))
;; CHECK-NEXT: (local $scratch_7 (tuple i32 i64))
;; CHECK-NEXT: (local $scratch_8 i32)
;; CHECK-NEXT: (local $scratch_9 eqref)
;; CHECK-NEXT: (block $block (type $14) (result i32 i64 eqref)
;; CHECK-NEXT: (local.set $scratch_9
;; CHECK-NEXT: (block $block0 (result eqref)
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (block (result i64)
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (br_on_cast $block0 anyref eqref
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_8
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $any
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.extract 2 0
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i64
;; CHECK-NEXT: (tuple.extract 2 1
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_8)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block
;; CHECK-NEXT: (tuple.make 3
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (i64.const 1)
;; CHECK-NEXT: (global.get $eq)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 3
;; CHECK-NEXT: (tuple.extract 2 0
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.extract 2 1
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_9)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $br_on_cast-two (type $17) (param $0 i32) (param $1 i64) (param $2 anyref) (result i32 i64 eqref)
;; OPT_O-NEXT: (block $block (type $12) (result i32 i64 eqref)
;; OPT_O-NEXT: (tuple.make 3
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: (block $block0 (result eqref)
;; OPT_O-NEXT: (global.set $any
;; OPT_O-NEXT: (br_on_cast $block0 anyref eqref
;; OPT_O-NEXT: (local.get $2)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i64
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $block
;; OPT_O-NEXT: (tuple.make 3
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (i64.const 1)
;; OPT_O-NEXT: (global.get $eq)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $br_on_cast-two (export "br_on_cast-two") (param i32 i64 anyref) (result i32 i64 eqref)
block (result i32 i64 eqref)
local.get 0
local.get 1
local.get 2
br_on_cast 0 anyref eqref
global.set $any
global.set $i64
global.set $i32
i32.const 0
i64.const 1
global.get $eq
end
)
;; CHECK: (func $br_on_cast-nn (type $18) (param $0 i32) (param $1 (ref any)) (result i32 (ref eq))
;; CHECK-NEXT: (local $scratch (ref any))
;; CHECK-NEXT: (local $scratch_3 i32)
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 (ref any))
;; CHECK-NEXT: (local $scratch_6 i32)
;; CHECK-NEXT: (local $scratch_7 (ref eq))
;; CHECK-NEXT: (block $block (type $5) (result i32 (ref eq))
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (block $block0 (result (ref eq))
;; CHECK-NEXT: (local.set $scratch_3
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (br_on_cast $block0 (ref any) (ref eq)
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $any
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (global.get $eq)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $br_on_cast-nn (type $18) (param $0 i32) (param $1 (ref any)) (result i32 (ref eq))
;; OPT_O-NEXT: (block $block (type $2) (result i32 (ref eq))
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (block $block0 (result (ref eq))
;; OPT_O-NEXT: (global.set $any
;; OPT_O-NEXT: (br_on_cast $block0 (ref any) (ref eq)
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $block
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (global.get $eq)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $br_on_cast-nn (export "br_on_cast-nn") (param i32 (ref any)) (result i32 (ref eq))
block (result i32 (ref eq))
local.get 0
local.get 1
br_on_cast 0 (ref any) (ref eq)
global.set $any
global.set $i32
i32.const 0
global.get $eq
end
)
;; CHECK: (func $br_on_cast-to-nn (type $19) (param $0 i32) (param $1 anyref) (result i32 (ref eq))
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_3 i32)
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 anyref)
;; CHECK-NEXT: (local $scratch_6 i32)
;; CHECK-NEXT: (local $scratch_7 (ref eq))
;; CHECK-NEXT: (block $block (type $5) (result i32 (ref eq))
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (block $block0 (result (ref eq))
;; CHECK-NEXT: (local.set $scratch_3
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (br_on_cast $block0 anyref (ref eq)
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $anyref
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (global.get $eq)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $br_on_cast-to-nn (type $19) (param $0 i32) (param $1 anyref) (result i32 (ref eq))
;; OPT_O-NEXT: (block $block (type $2) (result i32 (ref eq))
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (block $block0 (result (ref eq))
;; OPT_O-NEXT: (global.set $anyref
;; OPT_O-NEXT: (br_on_cast $block0 anyref (ref eq)
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $block
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (global.get $eq)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $br_on_cast-to-nn (export "br_on_cast-to-nn") (param i32 anyref) (result i32 (ref eq))
block (result i32 (ref eq))
local.get 0
local.get 1
br_on_cast 0 anyref (ref eq)
global.set $anyref
global.set $i32
i32.const 0
global.get $eq
end
)
;; CHECK: (func $br_on_cast_fail-one (type $9) (param $0 i32) (param $1 anyref) (result i32 (ref any))
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_3 i32)
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 eqref)
;; CHECK-NEXT: (local $scratch_6 i32)
;; CHECK-NEXT: (local $scratch_7 (ref any))
;; CHECK-NEXT: (block $block (type $3) (result i32 (ref any))
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (block $block0 (result (ref any))
;; CHECK-NEXT: (local.set $scratch_3
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (br_on_cast_fail $block0 anyref eqref
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $eqref
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (global.get $any)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $br_on_cast_fail-one (type $7) (param $0 i32) (param $1 anyref) (result i32 (ref any))
;; OPT_O-NEXT: (block $block (type $1) (result i32 (ref any))
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (block $block0 (result (ref any))
;; OPT_O-NEXT: (global.set $eqref
;; OPT_O-NEXT: (br_on_cast_fail $block0 anyref eqref
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $block
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (global.get $any)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $br_on_cast_fail-one (export "br_on_cast_fail-one") (param i32 anyref) (result i32 (ref any))
block (result i32 (ref any))
local.get 0
local.get 1
br_on_cast_fail 0 anyref eqref
global.set $eqref
global.set $i32
i32.const 0
global.get $any
end
)
;; CHECK: (func $br_on_cast_fail-two (type $10) (param $0 i32) (param $1 i64) (param $2 anyref) (result i32 i64 (ref any))
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_4 (tuple i32 i64))
;; CHECK-NEXT: (local $scratch_5 i64)
;; CHECK-NEXT: (local $scratch_6 eqref)
;; CHECK-NEXT: (local $scratch_7 (tuple i32 i64))
;; CHECK-NEXT: (local $scratch_8 i32)
;; CHECK-NEXT: (local $scratch_9 (ref any))
;; CHECK-NEXT: (block $block (type $4) (result i32 i64 (ref any))
;; CHECK-NEXT: (local.set $scratch_9
;; CHECK-NEXT: (block $block0 (result (ref any))
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (block (result i64)
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (br_on_cast_fail $block0 anyref eqref
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_8
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $eqref
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.extract 2 0
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i64
;; CHECK-NEXT: (tuple.extract 2 1
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_8)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block
;; CHECK-NEXT: (tuple.make 3
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (i64.const 1)
;; CHECK-NEXT: (global.get $any)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 3
;; CHECK-NEXT: (tuple.extract 2 0
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.extract 2 1
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_9)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $br_on_cast_fail-two (type $8) (param $0 i32) (param $1 i64) (param $2 anyref) (result i32 i64 (ref any))
;; OPT_O-NEXT: (block $block (type $4) (result i32 i64 (ref any))
;; OPT_O-NEXT: (tuple.make 3
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: (block $block0 (result (ref any))
;; OPT_O-NEXT: (global.set $eqref
;; OPT_O-NEXT: (br_on_cast_fail $block0 anyref eqref
;; OPT_O-NEXT: (local.get $2)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i64
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $block
;; OPT_O-NEXT: (tuple.make 3
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (i64.const 1)
;; OPT_O-NEXT: (global.get $any)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $br_on_cast_fail-two (export "br_on_cast_fail-two") (param i32 i64 anyref) (result i32 i64 (ref any))
block (result i32 i64 (ref any))
local.get 0
local.get 1
local.get 2
br_on_cast_fail 0 anyref eqref
global.set $eqref
global.set $i64
global.set $i32
i32.const 0
i64.const 1
global.get $any
end
)
;; CHECK: (func $br_on_cast_fail-nn (type $20) (param $0 i32) (param $1 (ref any)) (result i32 (ref any))
;; CHECK-NEXT: (local $scratch (ref any))
;; CHECK-NEXT: (local $scratch_3 i32)
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 (ref eq))
;; CHECK-NEXT: (local $scratch_6 i32)
;; CHECK-NEXT: (local $scratch_7 (ref any))
;; CHECK-NEXT: (block $block (type $3) (result i32 (ref any))
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (block $block0 (result (ref any))
;; CHECK-NEXT: (local.set $scratch_3
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (br_on_cast_fail $block0 (ref any) (ref eq)
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $eq
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (global.get $any)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $br_on_cast_fail-nn (type $20) (param $0 i32) (param $1 (ref any)) (result i32 (ref any))
;; OPT_O-NEXT: (block $block (type $1) (result i32 (ref any))
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (block $block0 (result (ref any))
;; OPT_O-NEXT: (global.set $eq
;; OPT_O-NEXT: (br_on_cast_fail $block0 (ref any) (ref eq)
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $block
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (global.get $any)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $br_on_cast_fail-nn (export "br_on_cast_fail-nn") (param i32 (ref any)) (result i32 (ref any))
block (result i32 (ref any))
local.get 0
local.get 1
br_on_cast_fail 0 (ref any) (ref eq)
global.set $eq
global.set $i32
i32.const 0
global.get $any
end
)
;; CHECK: (func $br_on_cast_fail-to-nn (type $11) (param $0 i32) (param $1 anyref) (result i32 anyref)
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_3 i32)
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 (ref eq))
;; CHECK-NEXT: (local $scratch_6 i32)
;; CHECK-NEXT: (local $scratch_7 anyref)
;; CHECK-NEXT: (block $block (type $1) (result i32 anyref)
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (block $block0 (result anyref)
;; CHECK-NEXT: (local.set $scratch_3
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (br_on_cast_fail $block0 anyref (ref eq)
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $eq
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (global.get $any)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $br_on_cast_fail-to-nn (type $9) (param $0 i32) (param $1 anyref) (result i32 anyref)
;; OPT_O-NEXT: (block $block (type $13) (result i32 anyref)
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (block $block0 (result anyref)
;; OPT_O-NEXT: (global.set $eq
;; OPT_O-NEXT: (br_on_cast_fail $block0 anyref (ref eq)
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $block
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (global.get $any)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $br_on_cast_fail-to-nn (export "br_on_cast_fail-to-nn") (param i32 anyref) (result i32 anyref)
block (result i32 anyref)
local.get 0
local.get 1
br_on_cast_fail 0 anyref (ref eq)
global.set $eq
global.set $i32
i32.const 0
global.get $any
end
)
;; CHECK: (func $unreachable-fallthrough (type $8) (param $0 i32) (param $1 anyref) (result i32)
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_3 i32)
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 (ref any))
;; CHECK-NEXT: (local $scratch_6 (tuple i32 (ref any)))
;; CHECK-NEXT: (local $scratch_7 i32)
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (tuple.extract 2 0
;; CHECK-NEXT: (local.tee $scratch_6
;; CHECK-NEXT: (block $l (type $3) (result i32 (ref any))
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (block $l0 (result (ref any))
;; CHECK-NEXT: (local.set $scratch_3
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br_on_non_null $l0
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $l
;; CHECK-NEXT: (return
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (tuple.extract 2 1
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; OPT_O: (func $unreachable-fallthrough (type $6) (param $0 i32) (param $1 anyref) (result i32)
;; OPT_O-NEXT: (drop
;; OPT_O-NEXT: (block $l0 (result (ref any))
;; OPT_O-NEXT: (br_on_non_null $l0
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (return
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
(func $unreachable-fallthrough (export "unreachable-fallthrough") (param i32 anyref) (result i32)
block $l (result i32 (ref any))
local.get 0
local.get 1
br_on_non_null $l
return
end
drop
)
;; CHECK: (func $matching-branches (type $21) (param $0 i32) (param $1 anyref) (param $2 i32) (param $3 anyref) (result i32 eqref)
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_5 i32)
;; CHECK-NEXT: (local $scratch_6 i32)
;; CHECK-NEXT: (local $scratch_7 (ref any))
;; CHECK-NEXT: (local $scratch_8 i32)
;; CHECK-NEXT: (local $scratch_9 anyref)
;; CHECK-NEXT: (local $scratch_10 i32)
;; CHECK-NEXT: (local $scratch_11 (ref any))
;; CHECK-NEXT: (local $scratch_12 i32)
;; CHECK-NEXT: (local $scratch_13 eqref)
;; CHECK-NEXT: (block $block (type $0) (result i32 eqref)
;; CHECK-NEXT: (local.set $scratch_13
;; CHECK-NEXT: (block $block0 (result eqref)
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (br_on_cast $block0 anyref eqref
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_8
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $any
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_8)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_10
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_9
;; CHECK-NEXT: (local.get $3)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_10)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_11
;; CHECK-NEXT: (br_on_cast $block0 anyref eqref
;; CHECK-NEXT: (local.get $scratch_9)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_12
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $any
;; CHECK-NEXT: (local.get $scratch_11)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_12)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (global.get $eqref)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: (local.get $scratch_13)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $matching-branches (type $21) (param $0 i32) (param $1 anyref) (param $2 i32) (param $3 anyref) (result i32 eqref)
;; OPT_O-NEXT: (local $4 eqref)
;; OPT_O-NEXT: (block $block (type $0) (result i32 eqref)
;; OPT_O-NEXT: (local.set $4
;; OPT_O-NEXT: (block $block0 (result eqref)
;; OPT_O-NEXT: (global.set $any
;; OPT_O-NEXT: (br_on_cast $block0 anyref eqref
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (local.set $0
;; OPT_O-NEXT: (local.get $2)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $any
;; OPT_O-NEXT: (br_on_cast $block0 anyref eqref
;; OPT_O-NEXT: (local.get $3)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $block
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (global.get $eqref)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (local.get $4)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $matching-branches (export "matching-branches") (param i32 anyref i32 anyref) (result i32 eqref)
block (result i32 eqref)
local.get 0
local.get 1
br_on_cast 0 anyref eqref
global.set $any
global.set $i32
local.get 2
local.get 3
br_on_cast 0 anyref eqref
global.set $any
global.set $i32
i32.const 0
global.get $eqref
end
)
;; CHECK: (func $different-branches (type $22) (param $0 i32) (param $1 anyref) (param $2 i32) (param $3 eqref) (param $4 anyref) (result i32 eqref)
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_6 i32)
;; CHECK-NEXT: (local $scratch_7 i32)
;; CHECK-NEXT: (local $scratch_8 (ref any))
;; CHECK-NEXT: (local $scratch_9 i32)
;; CHECK-NEXT: (local $scratch_10 anyref)
;; CHECK-NEXT: (local $scratch_11 (tuple i32 eqref))
;; CHECK-NEXT: (local $scratch_12 eqref)
;; CHECK-NEXT: (local $scratch_13 (ref any))
;; CHECK-NEXT: (local $scratch_14 (tuple i32 eqref))
;; CHECK-NEXT: (local $scratch_15 i32)
;; CHECK-NEXT: (local $scratch_16 eqref)
;; CHECK-NEXT: (block $block (type $0) (result i32 eqref)
;; CHECK-NEXT: (block $block1
;; CHECK-NEXT: (local.set $scratch_16
;; CHECK-NEXT: (block $block0 (result eqref)
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_8
;; CHECK-NEXT: (br_on_cast $block0 anyref eqref
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_9
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $any
;; CHECK-NEXT: (local.get $scratch_8)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_9)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_11
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: (block (result eqref)
;; CHECK-NEXT: (local.set $scratch_12
;; CHECK-NEXT: (local.get $3)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_10
;; CHECK-NEXT: (local.get $4)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_12)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_13
;; CHECK-NEXT: (br_on_null $block1
;; CHECK-NEXT: (local.get $scratch_10)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_15
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_14
;; CHECK-NEXT: (local.get $scratch_11)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $any
;; CHECK-NEXT: (local.get $scratch_13)
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.extract 2 0
;; CHECK-NEXT: (local.get $scratch_14)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $eqref
;; CHECK-NEXT: (tuple.extract 2 1
;; CHECK-NEXT: (local.get $scratch_14)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_15)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (global.get $eqref)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: (local.get $scratch_16)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_11)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $different-branches (type $22) (param $0 i32) (param $1 anyref) (param $2 i32) (param $3 eqref) (param $4 anyref) (result i32 eqref)
;; OPT_O-NEXT: (local $5 (tuple i32 eqref))
;; OPT_O-NEXT: (block $block (type $0) (result i32 eqref)
;; OPT_O-NEXT: (block $block1
;; OPT_O-NEXT: (br $block
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (block $block0 (result eqref)
;; OPT_O-NEXT: (global.set $any
;; OPT_O-NEXT: (br_on_cast $block0 anyref eqref
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (local.set $5
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $2)
;; OPT_O-NEXT: (local.get $3)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $any
;; OPT_O-NEXT: (br_on_null $block1
;; OPT_O-NEXT: (local.get $4)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $eqref
;; OPT_O-NEXT: (tuple.extract 2 1
;; OPT_O-NEXT: (local.get $5)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (tuple.extract 2 0
;; OPT_O-NEXT: (local.get $5)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $block
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (global.get $eqref)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (local.get $5)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $different-branches (export "different-branches") (param i32 anyref i32 eqref anyref) (result i32 eqref)
block (result i32 eqref)
local.get 0
local.get 1
br_on_cast 0 anyref eqref
global.set $any
global.set $i32
local.get 2
local.get 3
local.get 4
br_on_null 0
global.set $any
global.set $eqref
global.set $i32
i32.const 0
global.get $eqref
end
)
;; CHECK: (func $different-branches-2 (type $23) (param $0 i32) (param $1 eqref) (param $2 anyref) (param $3 i32) (param $4 anyref) (result i32 eqref)
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_6 (tuple i32 eqref))
;; CHECK-NEXT: (local $scratch_7 eqref)
;; CHECK-NEXT: (local $scratch_8 (ref any))
;; CHECK-NEXT: (local $scratch_9 (tuple i32 eqref))
;; CHECK-NEXT: (local $scratch_10 i32)
;; CHECK-NEXT: (local $scratch_11 anyref)
;; CHECK-NEXT: (local $scratch_12 i32)
;; CHECK-NEXT: (local $scratch_13 i32)
;; CHECK-NEXT: (local $scratch_14 (ref any))
;; CHECK-NEXT: (local $scratch_15 i32)
;; CHECK-NEXT: (local $scratch_16 eqref)
;; CHECK-NEXT: (block $block (type $0) (result i32 eqref)
;; CHECK-NEXT: (block $block0
;; CHECK-NEXT: (local.set $scratch_16
;; CHECK-NEXT: (block $block1 (result eqref)
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (block (result eqref)
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_8
;; CHECK-NEXT: (br_on_null $block0
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_10
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_9
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $any
;; CHECK-NEXT: (local.get $scratch_8)
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.extract 2 0
;; CHECK-NEXT: (local.get $scratch_9)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $eqref
;; CHECK-NEXT: (tuple.extract 2 1
;; CHECK-NEXT: (local.get $scratch_9)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_10)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_12
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_13
;; CHECK-NEXT: (local.get $3)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_11
;; CHECK-NEXT: (local.get $4)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_13)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_14
;; CHECK-NEXT: (br_on_cast $block1 anyref eqref
;; CHECK-NEXT: (local.get $scratch_11)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_15
;; CHECK-NEXT: (local.get $scratch_12)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $any
;; CHECK-NEXT: (local.get $scratch_14)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_15)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (global.get $eqref)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_12)
;; CHECK-NEXT: (local.get $scratch_16)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $different-branches-2 (type $23) (param $0 i32) (param $1 eqref) (param $2 anyref) (param $3 i32) (param $4 anyref) (result i32 eqref)
;; OPT_O-NEXT: (local $5 (tuple i32 eqref))
;; OPT_O-NEXT: (block $block (type $0) (result i32 eqref)
;; OPT_O-NEXT: (block $block0
;; OPT_O-NEXT: (br $block
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $3)
;; OPT_O-NEXT: (block $block1 (result eqref)
;; OPT_O-NEXT: (local.set $5
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $any
;; OPT_O-NEXT: (br_on_null $block0
;; OPT_O-NEXT: (local.get $2)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $eqref
;; OPT_O-NEXT: (tuple.extract 2 1
;; OPT_O-NEXT: (local.get $5)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (tuple.extract 2 0
;; OPT_O-NEXT: (local.get $5)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $any
;; OPT_O-NEXT: (br_on_cast $block1 anyref eqref
;; OPT_O-NEXT: (local.get $4)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (local.get $3)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $block
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (global.get $eqref)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (local.get $5)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $different-branches-2 (export "different-branches-2") (param i32 eqref anyref i32 anyref) (result i32 eqref)
block (result i32 eqref)
local.get 0
local.get 1
local.get 2
br_on_null 0
global.set $any
global.set $eqref
global.set $i32
local.get 3
local.get 4
br_on_cast 0 anyref eqref
global.set $any
global.set $i32
i32.const 0
global.get $eqref
end
)
;; CHECK: (func $nested-branches (type $24) (param $0 i32) (param $1 anyref) (param $2 anyref) (result i32)
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 i32)
;; CHECK-NEXT: (local $scratch_6 (ref any))
;; CHECK-NEXT: (local $scratch_7 anyref)
;; CHECK-NEXT: (local $scratch_8 i32)
;; CHECK-NEXT: (local $scratch_9 i32)
;; CHECK-NEXT: (local $scratch_10 (ref any))
;; CHECK-NEXT: (local $scratch_11 i32)
;; CHECK-NEXT: (local $scratch_12 eqref)
;; CHECK-NEXT: (local $scratch_13 (tuple i32 eqref))
;; CHECK-NEXT: (local $scratch_14 i32)
;; CHECK-NEXT: (block $block1 (result i32)
;; CHECK-NEXT: (block $block10
;; CHECK-NEXT: (local.set $scratch_14
;; CHECK-NEXT: (tuple.extract 2 0
;; CHECK-NEXT: (local.tee $scratch_13
;; CHECK-NEXT: (block $block (type $0) (result i32 eqref)
;; CHECK-NEXT: (local.set $scratch_12
;; CHECK-NEXT: (block $block0 (result eqref)
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (br_on_cast $block0 anyref eqref
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_8
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_9
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $any
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_9)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_10
;; CHECK-NEXT: (br_on_null $block10
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_11
;; CHECK-NEXT: (local.get $scratch_8)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $scratch_10)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_11)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (global.get $eqref)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: (local.get $scratch_12)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (tuple.extract 2 1
;; CHECK-NEXT: (local.get $scratch_13)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block1
;; CHECK-NEXT: (local.get $scratch_14)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_8)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $nested-branches (type $24) (param $0 i32) (param $1 anyref) (param $2 anyref) (result i32)
;; OPT_O-NEXT: (block $block1 (result i32)
;; OPT_O-NEXT: (block $block10
;; OPT_O-NEXT: (br $block1
;; OPT_O-NEXT: (tuple.extract 2 0
;; OPT_O-NEXT: (block $block (type $0) (result i32 eqref)
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (block $block0 (result eqref)
;; OPT_O-NEXT: (global.set $any
;; OPT_O-NEXT: (br_on_cast $block0 anyref eqref
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (drop
;; OPT_O-NEXT: (br_on_null $block10
;; OPT_O-NEXT: (local.get $2)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $block
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (global.get $eqref)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $nested-branches (export "nested-branches") (param i32 anyref anyref) (result i32)
block (result i32)
block (result i32 eqref)
local.get 0
local.get 1
br_on_cast 0 anyref eqref
global.set $any
local.get 2
br_on_null 1
drop
drop
i32.const 0
global.get $eqref
end
drop
end
)
;; CHECK: (func $with-block-param (type $25) (param $0 i64) (param $1 anyref) (result i64 eqref)
;; CHECK-NEXT: (local $scratch i64)
;; CHECK-NEXT: (local $scratch_3 anyref)
;; CHECK-NEXT: (local $scratch_4 i64)
;; CHECK-NEXT: (local $scratch_5 i64)
;; CHECK-NEXT: (local $scratch_6 (ref any))
;; CHECK-NEXT: (local $scratch_7 i64)
;; CHECK-NEXT: (local $scratch_8 eqref)
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $block (type $6) (result i64 eqref)
;; CHECK-NEXT: (local.set $scratch_8
;; CHECK-NEXT: (block $block0 (result eqref)
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (block (result i64)
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_3
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (br_on_cast $block0 anyref eqref
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i64
;; CHECK-NEXT: (block (result i64)
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $any
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i64.const 1)
;; CHECK-NEXT: (global.get $eqref)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: (local.get $scratch_8)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $with-block-param (type $25) (param $0 i64) (param $1 anyref) (result i64 eqref)
;; OPT_O-NEXT: (block $block (type $14) (result i64 eqref)
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (block $block0 (result eqref)
;; OPT_O-NEXT: (global.set $any
;; OPT_O-NEXT: (br_on_cast $block0 anyref eqref
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i64
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $block
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i64.const 1)
;; OPT_O-NEXT: (global.get $eqref)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $with-block-param (export "with-block-param") (param i64 anyref) (result i64 eqref)
local.get 0
block (param i64) (result i64 eqref)
local.get 1
br_on_cast 0 anyref eqref
global.set $any
global.set $i64
i64.const 1
global.get $eqref
end
)
;; CHECK: (func $loop (type $26) (param $0 i32) (param $1 anyref)
;; CHECK-NEXT: (local $scratch (tuple i32 anyref))
;; CHECK-NEXT: (local $scratch_3 (tuple i32 anyref))
;; CHECK-NEXT: (local $scratch_4 anyref)
;; CHECK-NEXT: (local $scratch_5 i32)
;; CHECK-NEXT: (local $scratch_6 i32)
;; CHECK-NEXT: (local $scratch_7 (ref any))
;; CHECK-NEXT: (local $scratch_8 i32)
;; CHECK-NEXT: (local $scratch_9 anyref)
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (loop $label2
;; CHECK-NEXT: (block $label3
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (block $label (type $1) (result i32 anyref)
;; CHECK-NEXT: (block $label1
;; CHECK-NEXT: (local.set $scratch_9
;; CHECK-NEXT: (block $label0 (result anyref)
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (tuple.extract 2 0
;; CHECK-NEXT: (local.tee $scratch_3
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (tuple.extract 2 1
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (br_on_cast $label0 anyref eqref
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_8
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $any
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_8)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $label1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: (local.get $scratch_9)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $label3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $label2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $loop (type $26) (param $0 i32) (param $1 anyref)
;; OPT_O-NEXT: (loop $label2
;; OPT_O-NEXT: (block $label3
;; OPT_O-NEXT: (local.set $1
;; OPT_O-NEXT: (block $label0 (result eqref)
;; OPT_O-NEXT: (global.set $any
;; OPT_O-NEXT: (br_on_cast $label0 anyref eqref
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $label3)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $label2)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $loop (export "loop") (param i32 anyref)
local.get 0
local.get 1
loop (param i32 anyref)
br_on_cast 0 anyref eqref
global.set $any
global.set $i32
end
)
;; CHECK: (func $loop-results (type $11) (param $0 i32) (param $1 anyref) (result i32 anyref)
;; CHECK-NEXT: (local $scratch (tuple i32 anyref))
;; CHECK-NEXT: (local $scratch_3 (tuple i32 anyref))
;; CHECK-NEXT: (local $scratch_4 anyref)
;; CHECK-NEXT: (local $scratch_5 i32)
;; CHECK-NEXT: (local $scratch_6 i32)
;; CHECK-NEXT: (local $scratch_7 (ref any))
;; CHECK-NEXT: (local $scratch_8 anyref)
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (loop $label2 (type $1) (result i32 anyref)
;; CHECK-NEXT: (block $label3 (type $1) (result i32 anyref)
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (block $label (type $1) (result i32 anyref)
;; CHECK-NEXT: (br $label3
;; CHECK-NEXT: (block $label1 (type $1) (result i32 anyref)
;; CHECK-NEXT: (local.set $scratch_8
;; CHECK-NEXT: (block $label0 (result anyref)
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (tuple.extract 2 0
;; CHECK-NEXT: (local.tee $scratch_3
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (tuple.extract 2 1
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (br_on_cast $label0 anyref eqref
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $label1
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: (local.get $scratch_8)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $label2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $loop-results (type $9) (param $0 i32) (param $1 anyref) (result i32 anyref)
;; OPT_O-NEXT: (local $2 (tuple i32 anyref))
;; OPT_O-NEXT: (local $3 eqref)
;; OPT_O-NEXT: (local.set $2
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (loop $label2 (type $1) (result i32 (ref any))
;; OPT_O-NEXT: (block $label3 (type $1) (result i32 (ref any))
;; OPT_O-NEXT: (local.set $2
;; OPT_O-NEXT: (block $label (type $0) (result i32 eqref)
;; OPT_O-NEXT: (br $label3
;; OPT_O-NEXT: (block $label1 (type $1) (result i32 (ref any))
;; OPT_O-NEXT: (local.set $3
;; OPT_O-NEXT: (block $label0 (result eqref)
;; OPT_O-NEXT: (br $label1
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.tee $0
;; OPT_O-NEXT: (tuple.extract 2 0
;; OPT_O-NEXT: (local.get $2)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br_on_cast $label0 anyref eqref
;; OPT_O-NEXT: (tuple.extract 2 1
;; OPT_O-NEXT: (local.get $2)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $label
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (local.get $3)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $label2)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $loop-results (export "loop-results") (param i32 anyref) (result i32 anyref)
local.get 0
local.get 1
loop (param i32 anyref) (result i32 anyref)
br_on_cast 0 anyref eqref
end
)
;; CHECK: (func $if (type $12) (param $0 i32) (param $1 i32) (param $2 anyref) (result i32 eqref)
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 i32)
;; CHECK-NEXT: (local $scratch_6 (ref any))
;; CHECK-NEXT: (local $scratch_7 i32)
;; CHECK-NEXT: (local $scratch_8 eqref)
;; CHECK-NEXT: (block $label (type $0) (result i32 eqref)
;; CHECK-NEXT: (local.set $scratch_8
;; CHECK-NEXT: (block $label0 (result eqref)
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (if (type $0) (result i32 eqref)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (br_on_cast $label0 anyref eqref
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $any
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (global.get $eqref)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (global.get $eq)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: (local.get $scratch_8)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $if (type $10) (param $0 i32) (param $1 i32) (param $2 anyref) (result i32 eqref)
;; OPT_O-NEXT: (block $label (type $0) (result i32 eqref)
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: (block $label0 (result eqref)
;; OPT_O-NEXT: (br $label
;; OPT_O-NEXT: (if (type $0) (result i32 eqref)
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (then
;; OPT_O-NEXT: (global.set $any
;; OPT_O-NEXT: (br_on_cast $label0 anyref eqref
;; OPT_O-NEXT: (local.get $2)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (global.get $eqref)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (else
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 1)
;; OPT_O-NEXT: (global.get $eq)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $if (export "if") (param i32 i32 anyref) (result i32 eqref)
local.get 0
if (result i32 eqref)
local.get 1
local.get 2
br_on_cast 0 anyref eqref
global.set $any
global.set $i32
i32.const 0
global.get $eqref
else
i32.const 1
global.get $eq
end
)
;; CHECK: (func $else (type $12) (param $0 i32) (param $1 i32) (param $2 anyref) (result i32 eqref)
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 i32)
;; CHECK-NEXT: (local $scratch_6 (ref any))
;; CHECK-NEXT: (local $scratch_7 i32)
;; CHECK-NEXT: (local $scratch_8 eqref)
;; CHECK-NEXT: (block $label (type $0) (result i32 eqref)
;; CHECK-NEXT: (local.set $scratch_8
;; CHECK-NEXT: (block $label0 (result eqref)
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (if (type $0) (result i32 eqref)
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (global.get $eqref)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (br_on_cast $label0 anyref eqref
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $any
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (global.get $eq)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: (local.get $scratch_8)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $else (type $10) (param $0 i32) (param $1 i32) (param $2 anyref) (result i32 eqref)
;; OPT_O-NEXT: (block $label (type $0) (result i32 eqref)
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: (block $label0 (result eqref)
;; OPT_O-NEXT: (br $label
;; OPT_O-NEXT: (if (type $0) (result i32 eqref)
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (then
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (global.get $eqref)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (else
;; OPT_O-NEXT: (global.set $any
;; OPT_O-NEXT: (br_on_cast $label0 anyref eqref
;; OPT_O-NEXT: (local.get $2)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 1)
;; OPT_O-NEXT: (global.get $eq)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $else (export "else") (param i32 i32 anyref) (result i32 eqref)
local.get 0
if (result i32 eqref)
i32.const 0
global.get $eqref
else
local.get 1
local.get 2
br_on_cast 0 anyref eqref
global.set $any
global.set $i32
i32.const 1
global.get $eq
end
)
;; CHECK: (func $if-else-params (type $27) (param $0 i32) (param $1 i32) (param $2 anyref) (param $3 anyref) (result i32 eqref)
;; CHECK-NEXT: (local $scratch i32)
;; CHECK-NEXT: (local $scratch_5 anyref)
;; CHECK-NEXT: (local $scratch_6 i32)
;; CHECK-NEXT: (local $scratch_7 i32)
;; CHECK-NEXT: (local $scratch_8 (ref any))
;; CHECK-NEXT: (local $scratch_9 i32)
;; CHECK-NEXT: (local $scratch_10 anyref)
;; CHECK-NEXT: (local $scratch_11 i32)
;; CHECK-NEXT: (local $scratch_12 (ref any))
;; CHECK-NEXT: (local $scratch_13 i32)
;; CHECK-NEXT: (local $scratch_14 eqref)
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $label (type $0) (result i32 eqref)
;; CHECK-NEXT: (local.set $scratch_14
;; CHECK-NEXT: (block $label0 (result eqref)
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (if (type $0) (result i32 eqref)
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (then
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_8
;; CHECK-NEXT: (br_on_cast $label0 anyref eqref
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_9
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $any
;; CHECK-NEXT: (local.get $scratch_8)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_9)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.get $eq)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (else
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_11
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_10
;; CHECK-NEXT: (local.get $3)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_11)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_12
;; CHECK-NEXT: (br_on_cast $label0 anyref eqref
;; CHECK-NEXT: (local.get $scratch_10)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_13
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $any
;; CHECK-NEXT: (local.get $scratch_12)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_13)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.get $eqref)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: (local.get $scratch_14)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $if-else-params (type $27) (param $0 i32) (param $1 i32) (param $2 anyref) (param $3 anyref) (result i32 eqref)
;; OPT_O-NEXT: (block $label (type $0) (result i32 eqref)
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (block $label0 (result eqref)
;; OPT_O-NEXT: (br $label
;; OPT_O-NEXT: (if (type $0) (result i32 eqref)
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: (then
;; OPT_O-NEXT: (global.set $any
;; OPT_O-NEXT: (br_on_cast $label0 anyref eqref
;; OPT_O-NEXT: (local.get $2)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (global.get $eq)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (else
;; OPT_O-NEXT: (global.set $any
;; OPT_O-NEXT: (br_on_cast $label0 anyref eqref
;; OPT_O-NEXT: (local.get $3)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (global.get $eqref)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $if-else-params (export "if-else-params") (param i32 i32 anyref anyref) (result i32 eqref)
local.get 0
local.get 1
if (param i32) (result i32 eqref)
local.get 2
br_on_cast 0 anyref eqref
global.set $any
global.get $eq
else
local.get 3
br_on_cast 0 anyref eqref
global.set $any
global.get $eqref
end
)
;; CHECK: (func $try-catch (type $2) (param $0 i32) (param $1 anyref) (result i32 eqref)
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_3 i32)
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 (ref any))
;; CHECK-NEXT: (local $scratch_6 eqref)
;; CHECK-NEXT: (block $label (type $0) (result i32 eqref)
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (block $label0 (result eqref)
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (try (type $0) (result i32 eqref)
;; CHECK-NEXT: (do
;; CHECK-NEXT: (local.set $scratch_3
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (br_on_cast $label0 anyref eqref
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (call $use-i32-any
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (global.get $eqref)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $e
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (pop i32)
;; CHECK-NEXT: (global.get $eq)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $try-catch (type $3) (param $0 i32) (param $1 anyref) (result i32 eqref)
;; OPT_O-NEXT: (block $label (type $0) (result i32 eqref)
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (block $label0 (result eqref)
;; OPT_O-NEXT: (br $label
;; OPT_O-NEXT: (try (type $0) (result i32 eqref)
;; OPT_O-NEXT: (do
;; OPT_O-NEXT: (call $use-i32-any
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (br_on_cast $label0 anyref eqref
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (global.get $eqref)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (catch $e
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (pop i32)
;; OPT_O-NEXT: (global.get $eq)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $try-catch (export "try-catch") (param i32 anyref) (result i32 eqref)
try (result i32 eqref)
local.get 0
local.get 1
br_on_cast 0 anyref eqref
call $use-i32-any
i32.const 0
global.get $eqref
catch $e
global.get $eq
end
)
;; CHECK: (func $try-catch_all (type $2) (param $0 i32) (param $1 anyref) (result i32 eqref)
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_3 i32)
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 (ref any))
;; CHECK-NEXT: (local $scratch_6 eqref)
;; CHECK-NEXT: (block $label (type $0) (result i32 eqref)
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (block $label0 (result eqref)
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (try (type $0) (result i32 eqref)
;; CHECK-NEXT: (do
;; CHECK-NEXT: (local.set $scratch_3
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (br_on_cast $label0 anyref eqref
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (call $use-i32-any
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (global.get $eqref)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch_all
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (global.get $eq)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $try-catch_all (type $3) (param $0 i32) (param $1 anyref) (result i32 eqref)
;; OPT_O-NEXT: (block $label (type $0) (result i32 eqref)
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (block $label0 (result eqref)
;; OPT_O-NEXT: (br $label
;; OPT_O-NEXT: (try (type $0) (result i32 eqref)
;; OPT_O-NEXT: (do
;; OPT_O-NEXT: (call $use-i32-any
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (br_on_cast $label0 anyref eqref
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (global.get $eqref)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (catch_all
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 1)
;; OPT_O-NEXT: (global.get $eq)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $try-catch_all (export "try-catch_all") (param i32 anyref) (result i32 eqref)
try (result i32 eqref)
local.get 0
local.get 1
br_on_cast 0 anyref eqref
call $use-i32-any
i32.const 0
global.get $eqref
catch_all
i32.const 1
global.get $eq
end
)
;; CHECK: (func $try-delegate (type $2) (param $0 i32) (param $1 anyref) (result i32 eqref)
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_3 i32)
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 (ref any))
;; CHECK-NEXT: (local $scratch_6 eqref)
;; CHECK-NEXT: (block $label (type $0) (result i32 eqref)
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (block $label0 (result eqref)
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (try (type $0) (result i32 eqref)
;; CHECK-NEXT: (do
;; CHECK-NEXT: (local.set $scratch_3
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (br_on_cast $label0 anyref eqref
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (call $use-i32-any
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (global.get $eqref)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (delegate 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $try-delegate (type $3) (param $0 i32) (param $1 anyref) (result i32 eqref)
;; OPT_O-NEXT: (block $label (type $0) (result i32 eqref)
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (block $label0 (result eqref)
;; OPT_O-NEXT: (br $label
;; OPT_O-NEXT: (try (type $0) (result i32 eqref)
;; OPT_O-NEXT: (do
;; OPT_O-NEXT: (call $use-i32-any
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (br_on_cast $label0 anyref eqref
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (global.get $eqref)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (delegate 2)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $try-delegate (export "try-delegate") (param i32 anyref) (result i32 eqref)
try (result i32 eqref)
local.get 0
local.get 1
br_on_cast 0 anyref eqref
call $use-i32-any
i32.const 0
global.get $eqref
delegate 0
)
;; CHECK: (func $try-everything-params (type $2) (param $0 i32) (param $1 anyref) (result i32 eqref)
;; CHECK-NEXT: (local $scratch i32)
;; CHECK-NEXT: (local $scratch_3 anyref)
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 i32)
;; CHECK-NEXT: (local $scratch_6 (ref any))
;; CHECK-NEXT: (local $scratch_7 eqref)
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $label (type $0) (result i32 eqref)
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (block $label0 (result eqref)
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (try (type $0) (result i32 eqref)
;; CHECK-NEXT: (do
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_3
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (br_on_cast $label0 anyref eqref
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (call $use-i32-any
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (global.get $eqref)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $e
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (pop i32)
;; CHECK-NEXT: (global.get $eqref)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $e2
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (pop i32)
;; CHECK-NEXT: (global.get $eqref)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch_all
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (global.get $eqref)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $try-everything-params (type $3) (param $0 i32) (param $1 anyref) (result i32 eqref)
;; OPT_O-NEXT: (block $label (type $0) (result i32 eqref)
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (block $label0 (result eqref)
;; OPT_O-NEXT: (br $label
;; OPT_O-NEXT: (try (type $0) (result i32 eqref)
;; OPT_O-NEXT: (do
;; OPT_O-NEXT: (call $use-i32-any
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (br_on_cast $label0 anyref eqref
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (global.get $eqref)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (catch $e
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (pop i32)
;; OPT_O-NEXT: (global.get $eqref)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (catch $e2
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (pop i32)
;; OPT_O-NEXT: (global.get $eqref)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (catch_all
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 1)
;; OPT_O-NEXT: (global.get $eqref)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $try-everything-params (export "try-everything-params") (param i32 anyref) (result i32 eqref)
local.get 0
try (param i32) (result i32 eqref)
local.get 1
br_on_cast 0 anyref eqref
call $use-i32-any
i32.const 0
global.get $eqref
catch $e
global.get $eqref
catch $e2
global.get $eqref
catch_all
i32.const 1
global.get $eqref
end
)
;; CHECK: (func $try_table (type $2) (param $0 i32) (param $1 anyref) (result i32 eqref)
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_3 i32)
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 (ref any))
;; CHECK-NEXT: (local $scratch_6 eqref)
;; CHECK-NEXT: (block $label (type $0) (result i32 eqref)
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (block $label0 (result eqref)
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (try_table (type $0) (result i32 eqref)
;; CHECK-NEXT: (local.set $scratch_3
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (br_on_cast $label0 anyref eqref
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (call $use-i32-any
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (global.get $eqref)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $try_table (type $3) (param $0 i32) (param $1 anyref) (result i32 eqref)
;; OPT_O-NEXT: (block $label (type $0) (result i32 eqref)
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (block $label0 (result eqref)
;; OPT_O-NEXT: (br $label
;; OPT_O-NEXT: (try_table (type $0) (result i32 eqref)
;; OPT_O-NEXT: (call $use-i32-any
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (br_on_cast $label0 anyref eqref
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (global.get $eqref)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $try_table (export "try_table") (param i32 anyref) (result i32 eqref)
try_table (result i32 eqref)
local.get 0
local.get 1
br_on_cast 0 anyref eqref
call $use-i32-any
i32.const 0
global.get $eqref
end
)
;; CHECK: (func $try_table-params (type $2) (param $0 i32) (param $1 anyref) (result i32 eqref)
;; CHECK-NEXT: (local $scratch i32)
;; CHECK-NEXT: (local $scratch_3 anyref)
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 i32)
;; CHECK-NEXT: (local $scratch_6 (ref any))
;; CHECK-NEXT: (local $scratch_7 eqref)
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $label (type $0) (result i32 eqref)
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (block $label0 (result eqref)
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (try_table (type $0) (result i32 eqref)
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_3
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (br_on_cast $label0 anyref eqref
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (call $use-i32-any
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (global.get $eq)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $try_table-params (type $3) (param $0 i32) (param $1 anyref) (result i32 eqref)
;; OPT_O-NEXT: (block $label (type $0) (result i32 eqref)
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (block $label0 (result eqref)
;; OPT_O-NEXT: (br $label
;; OPT_O-NEXT: (try_table (type $2) (result i32 (ref eq))
;; OPT_O-NEXT: (call $use-i32-any
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (br_on_cast $label0 anyref eqref
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (global.get $eq)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $try_table-params (export "try_table-params") (param i32 anyref) (result i32 eqref)
local.get 0
try_table (param i32) (result i32 eqref)
local.get 1
br_on_cast 0 anyref eqref
call $use-i32-any
i32.const 0
global.get $eq
end
)
;; CHECK: (func $branch-to-func (type $2) (param $0 i32) (param $1 anyref) (result i32 eqref)
;; CHECK-NEXT: (local $scratch anyref)
;; CHECK-NEXT: (local $scratch_3 i32)
;; CHECK-NEXT: (local $scratch_4 i32)
;; CHECK-NEXT: (local $scratch_5 (ref any))
;; CHECK-NEXT: (local $scratch_6 i32)
;; CHECK-NEXT: (local $scratch_7 eqref)
;; CHECK-NEXT: (block $label (type $0) (result i32 eqref)
;; CHECK-NEXT: (local.set $scratch_7
;; CHECK-NEXT: (block $label0 (result eqref)
;; CHECK-NEXT: (local.set $scratch_3
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_4
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $scratch_5
;; CHECK-NEXT: (br_on_cast $label0 anyref eqref
;; CHECK-NEXT: (local.get $scratch)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $i32
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (local.set $scratch_6
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: )
;; CHECK-NEXT: (global.set $any
;; CHECK-NEXT: (local.get $scratch_5)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $scratch_6)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $label
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (global.get $eqref)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (tuple.make 2
;; CHECK-NEXT: (local.get $scratch_3)
;; CHECK-NEXT: (local.get $scratch_7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; OPT_O: (func $branch-to-func (type $3) (param $0 i32) (param $1 anyref) (result i32 eqref)
;; OPT_O-NEXT: (block $label (type $0) (result i32 eqref)
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: (block $label0 (result eqref)
;; OPT_O-NEXT: (global.set $any
;; OPT_O-NEXT: (br_on_cast $label0 anyref eqref
;; OPT_O-NEXT: (local.get $1)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (global.set $i32
;; OPT_O-NEXT: (local.get $0)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: (br $label
;; OPT_O-NEXT: (tuple.make 2
;; OPT_O-NEXT: (i32.const 0)
;; OPT_O-NEXT: (global.get $eqref)
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
;; OPT_O-NEXT: )
(func $branch-to-func (export "branch-to-func") (param i32 anyref) (result i32 eqref)
local.get 0
local.get 1
br_on_cast 0 anyref eqref
global.set $any
global.set $i32
i32.const 0
global.get $eqref
)
)