blob: 28a4bc649d941d535bb9db56aa1e09776aa70f61 [file] [log] [blame] [edit]
;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited.
;; RUN: wasm-opt %s --dce -all -S -o - | filecheck %s
;; If either try body or catch body is reachable, the whole try construct is
;; reachable
(module
;; CHECK: (tag $e (param))
;; CHECK: (func $foo (type $none_=>_none)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
(func $foo)
(tag $e)
;; CHECK: (func $try_unreachable (type $none_=>_none)
;; CHECK-NEXT: (try $try
;; CHECK-NEXT: (do
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch_all
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (call $foo)
;; CHECK-NEXT: )
(func $try_unreachable
(try
(do
(unreachable)
)
(catch_all)
)
(call $foo) ;; shouldn't be dce'd
)
;; CHECK: (func $catch_unreachable (type $none_=>_none)
;; CHECK-NEXT: (try $try
;; CHECK-NEXT: (do
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch_all
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (call $foo)
;; CHECK-NEXT: )
(func $catch_unreachable
(try
(do)
(catch_all
(unreachable)
)
)
(call $foo) ;; shouldn't be dce'd
)
;; CHECK: (func $both_unreachable (type $none_=>_none)
;; CHECK-NEXT: (try $try
;; CHECK-NEXT: (do
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch_all
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $both_unreachable
(try
(do
(unreachable)
)
(catch_all
(unreachable)
)
)
(call $foo) ;; should be dce'd
)
;; CHECK: (func $throw (type $none_=>_none)
;; CHECK-NEXT: (block $label$0
;; CHECK-NEXT: (block $label$1
;; CHECK-NEXT: (throw $e)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $throw
;; All these wrapping expressions before 'throw' will be dce'd
(drop
(block $label$0 (result externref)
(if
(i32.clz
(block $label$1 (result i32)
(throw $e)
)
)
(nop)
)
(ref.null extern)
)
)
)
;; CHECK: (func $rethrow (type $none_=>_none)
;; CHECK-NEXT: (try $l0
;; CHECK-NEXT: (do
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $e
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (rethrow $l0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $rethrow
(try $l0
(do)
(catch $e
(drop
;; This i32.add will be dce'd
(i32.add
(i32.const 0)
(rethrow $l0)
)
)
)
)
)
)