| ;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited. | |
| ;; RUN: wasm-opt %s -all --inlining-optimizing -S -o - | filecheck %s | |
| (module | |
| ;; CHECK: (type $none_=>_none (func)) | |
| (type $none_=>_none (func)) | |
| (type $none_=>_i32 (func (result i32))) | |
| ;; CHECK: (func $0 (type $none_=>_none) | |
| ;; CHECK-NEXT: (nop) | |
| ;; CHECK-NEXT: ) | |
| (func $0 | |
| (nop) | |
| ) | |
| ;; CHECK: (func $1 (type $none_=>_none) | |
| ;; CHECK-NEXT: (drop | |
| ;; CHECK-NEXT: (block ;; (replaces unreachable CallRef we can't emit) | |
| ;; CHECK-NEXT: (drop | |
| ;; CHECK-NEXT: (unreachable) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: (unreachable) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| (func $1 | |
| ;; $0 will be inlined into here. We will then optimize this function - but | |
| ;; we do so *without* optimizing $0 (as inlining-optimizing only optimizes | |
| ;; where it inlines, for efficiency). As part of the optimizations, we will | |
| ;; try to precompute the cast here, which will try to look up $0. We should | |
| ;; not hit an assertion, rather we should skip precomputing it, the same as if | |
| ;; we were optimizing $1 before $0 were added to the module. (In fact, we will | |
| ;; be able to see that the cast cannot succeed, and will optimize it into an | |
| ;; unreachable.) | |
| (call $0) | |
| (drop | |
| (call_ref $none_=>_i32 | |
| (ref.cast (ref $none_=>_i32) | |
| (ref.func $0) | |
| ) | |
| ) | |
| ) | |
| ) | |
| ) |