xref: /llvm-project/llvm/test/CodeGen/WebAssembly/switch-unreachable-default.ll (revision 122b0220fd45ee71acda912b0b712bb8edb6ba46)
1; RUN: llc < %s -asm-verbose=false -verify-machineinstrs | FileCheck %s
2
3target triple = "wasm32-unknown-unknown"
4
5; Test that switches are lowered correctly in the presence of an
6; unreachable default branch target.
7
8; CHECK-LABEL: foo:
9; CHECK-NEXT:    .functype foo (i32) -> (i32)
10; CHECK-NEXT:    block
11; CHECK-NEXT:    block
12; CHECK-NEXT:    local.get 0
13; CHECK-NEXT:    br_table {0, 1, 0}
14; CHECK-NEXT:  .LBB0_1:
15; CHECK-NEXT:    end_block
16; CHECK-NEXT:    i32.const 0
17; CHECK-NEXT:    return
18; CHECK-NEXT:  .LBB0_2:
19; CHECK-NEXT:    end_block
20; CHECK-NEXT:    i32.const 1
21; CHECK-NEXT:    end_function
22define i32 @foo(i32 %x) {
23entry:
24  switch i32 %x, label %unreachable [
25    i32 0, label %bb0
26    i32 1, label %bb1
27  ]
28
29bb0:
30  ret i32 0
31
32bb1:
33  ret i32 1
34
35unreachable:
36  unreachable
37}
38
39; CHECK-LABEL: split:
40; CHECK:    .functype split (i32) -> ()
41; CHECK:    block
42; CHECK:    br_if 0
43; CHECK:    block
44; CHECK:    block
45; CHECK:    br_table {1, 1, 0}
46; CHECK: .LBB1_2
47; CHECK:    end_block
48; CHECK:    br_table {0, 0, 0, 0, 0, 0, 0, 0}
49; CHECK: .LBB1_3
50; CHECK:    end_block
51; CHECK:    unreachable
52; CHECK: .LBB1_4
53; CHECK:    end_block
54; CHECK:    end_function
55define void @split(i8 %c) {
56entry:
57  switch i8 %c, label %sw.default [
58    i8 114, label %return
59    i8 103, label %sw.bb1
60    i8 98, label %sw.bb2
61    i8 97, label %sw.bb3
62    i8 48, label %sw.bb4
63    i8 49, label %sw.bb5
64  ]
65
66sw.bb1:
67  unreachable
68
69sw.bb2:
70  unreachable
71
72sw.bb3:
73  unreachable
74
75sw.bb4:
76  unreachable
77
78sw.bb5:
79  unreachable
80
81sw.default:
82  unreachable
83
84return:
85  ret void
86}
87