| ;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. | |
| ;; RUN: wasm-opt -all %s.wasm -q -S -o - | filecheck %s | |
| ;; Test that we read label names from the name section. The wasm file was | |
| ;; produced by wasm-tools from | |
| ;; | |
| ;; (module | |
| ;; (tag $e) | |
| ;; (func $f (param $p i32) (result i32) | |
| ;; (block $named-block (result i32) | |
| ;; (loop $named-loop | |
| ;; (br_if $named-loop (local.get $p)) | |
| ;; ) | |
| ;; (block ;; unnamed: still takes a label index | |
| ;; (br_if 0 (local.get $p)) | |
| ;; ) | |
| ;; (block $unused-block) | |
| ;; (if $used-if (local.get $p) (then (br $used-if))) | |
| ;; (if $unused-if (local.get $p) (then (nop))) | |
| ;; (block $handler | |
| ;; (try_table $used-try-table (catch_all $handler) | |
| ;; (br $used-try-table) | |
| ;; ) | |
| ;; ) | |
| ;; (i32.const 42) | |
| ;; ) | |
| ;; ) | |
| ;; ) | |
| ;; | |
| ;; The unnamed block takes label index 2, so reading the names of the labels | |
| ;; after it depends on counting it. `if` and `try_table` cannot hold names in | |
| ;; Binaryen IR, so their names are only used when they are branched to, which | |
| ;; requires a wrapper block anyhow: $used-if and $used-try-table are preserved, | |
| ;; while $unused-if is dropped rather than introducing a block for it. | |
| ;; CHECK: (type $0 (func)) | |
| ;; CHECK: (type $1 (func (param i32) (result i32))) | |
| ;; CHECK: (tag $e (type $0)) | |
| ;; CHECK: (func $f (type $1) (param $p i32) (result i32) | |
| ;; CHECK-NEXT: (block $named-block (result i32) | |
| ;; CHECK-NEXT: (loop $named-loop | |
| ;; CHECK-NEXT: (br_if $named-loop | |
| ;; CHECK-NEXT: (local.get $p) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: (block $block | |
| ;; CHECK-NEXT: (br_if $block | |
| ;; CHECK-NEXT: (local.get $p) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: (block $unused-block | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: (block $used-if | |
| ;; CHECK-NEXT: (if | |
| ;; CHECK-NEXT: (local.get $p) | |
| ;; CHECK-NEXT: (then | |
| ;; CHECK-NEXT: (br $used-if) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: (if | |
| ;; CHECK-NEXT: (local.get $p) | |
| ;; CHECK-NEXT: (then | |
| ;; CHECK-NEXT: (nop) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: (block $handler | |
| ;; CHECK-NEXT: (block $used-try-table | |
| ;; CHECK-NEXT: (try_table (catch_all $handler) | |
| ;; CHECK-NEXT: (br $used-try-table) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: (i32.const 42) | |
| ;; CHECK-NEXT: ) | |
| ;; CHECK-NEXT: ) |