blob: 0b0fb00a24907b9a37ab783558418d0813ed4390 [file]
;; 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
(module
;; CHECK: (func $param1 (param $ignore nullfuncref) (param $no (ref nofunc))
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $ignore)
;; CHECK-NEXT: )
;; CHECK-NEXT: (block
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $no)
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $param1 (param $ignore (ref null nofunc)) (param $no (ref nofunc))
;; The first param may be a null, and we ignore it. The second can be
;; optimized by putting an unreachable after it.
(drop
(local.get $ignore)
)
(drop
(local.get $no)
)
)
;; CHECK: (func $param2 (param $no (ref noextern))
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $no)
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
(func $param2 (param $no (ref noextern))
(drop
(local.get $no)
)
)
;; CHECK: (func $param3 (param $no (ref none))
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $no)
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
(func $param3 (param $no (ref none))
(drop
(local.get $no)
)
)
;; CHECK: (func $return (result (ref nofunc))
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
(func $return (result (ref nofunc))
(unreachable)
)
;; CHECK: (func $call
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (call $return)
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
(func $call
(drop
(call $return)
)
)
;; CHECK: (func $type-updating
;; CHECK-NEXT: (block $block
;; CHECK-NEXT: (block
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (br_on_null $block
;; CHECK-NEXT: (ref.null none)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $type-updating
(block $block
(drop
;; The value flowing out of this br is a non-nullable null, so it is
;; unreachable. While optimizing it we must properly update the types
;; above us to propagate the new unreachability, but while doing so we
;; must not make the mistake of changing the block's type, as it remains
;; reachable (due to the branch to it).
(br_on_null $block
(ref.null none)
)
)
;; Do a return to avoid the block's type being reachable just due to the
;; fallthrough. (This return will be removed since it is after the
;; unreachable we'll emit after the drop.)
(return)
)
)
)