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