blob: e02ce7c2cd9f088c8ab833bb0380687f8d949bb2 [file]
;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited.
;; RUN: foreach %s %t wasm-opt -all --dae2 --closed-world -S -o - | filecheck %s
(module
;; CHECK: (rec
;; CHECK-NEXT: (type $sig2 (func (result i32)))
;; CHECK: (type $cont2 (cont $sig2))
;; CHECK: (type $cont1 (cont $sig1))
;; CHECK: (type $sig1 (func (param i32) (result i32)))
(type $sig1 (func (param i32) (result i32)))
(type $sig2 (func (result i32)))
(type $cont1 (cont $sig1))
(type $cont2 (cont $sig2))
;; CHECK: (func $target (type $3)
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 42)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $target (type $sig1) (param i32) (result i32)
;; Even though $sig1 is used in a continuation, $target is unreferenced,
;; so DAE2 can optimize it by giving it a new type.
(i32.const 42)
)
;; CHECK: (func $caller (type $5) (param $k (ref $cont1))
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block (result (ref $cont2))
;; CHECK-NEXT: (block
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (call $target)
;; CHECK-NEXT: )
;; CHECK-NEXT: (cont.bind $cont1 $cont2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (local.get $k)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $caller (param $k (ref $cont1)) (result (ref $cont2))
(drop (call $target (i32.const 0)))
(cont.bind $cont1 $cont2 (i32.const 0) (local.get $k))
)
)
(module
;; CHECK: (rec
;; CHECK-NEXT: (type $sig2 (func (result i32)))
;; CHECK: (type $cont2 (cont $sig2))
;; CHECK: (type $cont1 (cont $sig1))
;; CHECK: (type $sig1 (func (param i32) (result i32)))
(type $sig1 (func (param i32) (result i32)))
(type $sig2 (func (result i32)))
(type $cont1 (cont $sig1))
(type $cont2 (cont $sig2))
;; CHECK: (elem declare func $target)
(elem declare func $target)
;; CHECK: (func $target (type $sig1) (param $0 i32) (result i32)
;; CHECK-NEXT: (i32.const 42)
;; CHECK-NEXT: )
(func $target (type $sig1) (param i32) (result i32)
;; Same, but $target is referenced, so we cannot change its type. Because
;; $sig1 is used in a continuation, we cannot yet optimize it.
(i32.const 42)
)
;; CHECK: (func $caller (type $5) (param $k (ref $cont1))
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (block (result (ref $cont2))
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (call $target
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (ref.func $target)
;; CHECK-NEXT: )
;; CHECK-NEXT: (cont.bind $cont1 $cont2
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (local.get $k)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $caller (param $k (ref $cont1)) (result (ref $cont2))
(drop (call $target (i32.const 0)))
(drop (ref.func $target))
(cont.bind $cont1 $cont2 (i32.const 0) (local.get $k))
)
)