| ;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. | |
| ;; RUN: foreach %s %t wasm-opt --inlining -S -o - | filecheck %s | |
| ;; RUN: foreach %s %t wasm-opt --inlining -tnh -S -o - | filecheck %s | |
| ;; Check that with or without TrapsNeverHappen, we inline calls to trapping | |
| ;; functions. That propagates the unreachability for other passes. | |
| (module | |
| ;; CHECK: (type $0 (func)) | |
| ;; CHECK: (func $call-trap | |
| ;; CHECK-NEXT: (if | |
| ;; CHECK-NEXT: (i32.const 42) | |
| ;; CHECK-NEXT: (then | |
| ;; CHECK-NEXT: (block $__inlined_func$trap | |
| ;; CHECK-NEXT: (unreachable) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: (else | |
| ;; CHECK-NEXT: (block $__inlined_func$trap$1 | |
| ;; CHECK-NEXT: (unreachable) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| (func $call-trap | |
| ;; Call twice to avoid the single-caller rules, which always inline. | |
| (if | |
| (i32.const 42) | |
| (then | |
| (call $trap) | |
| ) | |
| (else | |
| (call $trap) | |
| ) | |
| ) | |
| ) | |
| (func $trap | |
| (unreachable) | |
| ) | |
| ;; CHECK: (func $call-trap-value | |
| ;; CHECK-NEXT: (drop | |
| ;; CHECK-NEXT: (if | |
| ;; CHECK-NEXT: (i32.const 42) | |
| ;; CHECK-NEXT: (then | |
| ;; CHECK-NEXT: (block $__inlined_func$trap-value$2 | |
| ;; CHECK-NEXT: (unreachable) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: (else | |
| ;; CHECK-NEXT: (block $__inlined_func$trap-value$3 | |
| ;; CHECK-NEXT: (unreachable) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| (func $call-trap-value | |
| (drop | |
| (if (result i32) | |
| (i32.const 42) | |
| (then | |
| (call $trap-value) | |
| ) | |
| (else | |
| (call $trap-value) | |
| ) | |
| ) | |
| ) | |
| ) | |
| (func $trap-value (result i32) | |
| (unreachable) | |
| ) | |
| ) |