| ; RUN: llc < %s -asm-verbose=false -verify-machineinstrs | FileCheck %s |
| |
| target triple = "wasm32-unknown-unknown" |
| |
| ; Test that switches are lowered correctly in the presence of an |
| ; unreachable default branch target. |
| |
| ; CHECK-LABEL: foo: |
| ; CHECK-NEXT: .functype foo (i32) -> (i32) |
| ; CHECK-NEXT: block |
| ; CHECK-NEXT: block |
| ; CHECK-NEXT: local.get 0 |
| ; CHECK-NEXT: br_table {0, 1, 0} |
| ; CHECK-NEXT: .LBB0_1: |
| ; CHECK-NEXT: end_block |
| ; CHECK-NEXT: i32.const 0 |
| ; CHECK-NEXT: return |
| ; CHECK-NEXT: .LBB0_2: |
| ; CHECK-NEXT: end_block |
| ; CHECK-NEXT: i32.const 1 |
| ; CHECK-NEXT: end_function |
| define i32 @foo(i32 %x) { |
| entry: |
| switch i32 %x, label %unreachable [ |
| i32 0, label %bb0 |
| i32 1, label %bb1 |
| ] |
| |
| bb0: |
| ret i32 0 |
| |
| bb1: |
| ret i32 1 |
| |
| unreachable: |
| unreachable |
| } |
| |
| ; CHECK-LABEL: split: |
| ; CHECK: .functype split (i32) -> () |
| ; CHECK: block |
| ; CHECK: br_if 0 |
| ; CHECK: block |
| ; CHECK: block |
| ; CHECK: br_table {1, 1, 0} |
| ; CHECK: .LBB1_2 |
| ; CHECK: end_block |
| ; CHECK: br_table {0, 0, 0, 0, 0, 0, 0, 0} |
| ; CHECK: .LBB1_3 |
| ; CHECK: end_block |
| ; CHECK: unreachable |
| ; CHECK: .LBB1_4 |
| ; CHECK: end_block |
| ; CHECK: end_function |
| define void @split(i8 %c) { |
| entry: |
| switch i8 %c, label %sw.default [ |
| i8 114, label %return |
| i8 103, label %sw.bb1 |
| i8 98, label %sw.bb2 |
| i8 97, label %sw.bb3 |
| i8 48, label %sw.bb4 |
| i8 49, label %sw.bb5 |
| ] |
| |
| sw.bb1: |
| unreachable |
| |
| sw.bb2: |
| unreachable |
| |
| sw.bb3: |
| unreachable |
| |
| sw.bb4: |
| unreachable |
| |
| sw.bb5: |
| unreachable |
| |
| sw.default: |
| unreachable |
| |
| return: |
| ret void |
| } |