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