xref: /llvm-project/llvm/test/CodeGen/RISCV/jumptable-swguarded.ll (revision 9fb196b469c9cdc5f44c0621b44289137cdd654a)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple riscv32 -mattr=+experimental-zicfilp < %s | FileCheck %s
3; RUN: llc -mtriple riscv64 -mattr=+experimental-zicfilp < %s | FileCheck %s
4; RUN: llc -mtriple riscv32 < %s | FileCheck %s --check-prefix=NO-ZICFILP
5; RUN: llc -mtriple riscv64 < %s | FileCheck %s --check-prefix=NO-ZICFILP
6
7; Test using t2 to jump table branch.
8define void @above_threshold(i32 signext %in, ptr %out) nounwind {
9; CHECK-LABEL: above_threshold:
10; CHECK:       # %bb.0: # %entry
11; CHECK-NEXT:    lpad 0
12; CHECK-NEXT:    addi a0, a0, -1
13; CHECK-NEXT:    li a2, 5
14; CHECK-NEXT:    bltu a2, a0, .LBB0_9
15; CHECK-NEXT:  # %bb.1: # %entry
16; CHECK-NEXT:    slli a0, a0, 2
17; CHECK-NEXT:    lui a2, %hi(.LJTI0_0)
18; CHECK-NEXT:    addi a2, a2, %lo(.LJTI0_0)
19; CHECK-NEXT:    add a0, a0, a2
20; CHECK-NEXT:    lw t2, 0(a0)
21; CHECK-NEXT:    jr t2
22; CHECK-NEXT:  .LBB0_2: # %bb1
23; CHECK-NEXT:    li a0, 4
24; CHECK-NEXT:    j .LBB0_8
25; CHECK-NEXT:  .LBB0_3: # %bb5
26; CHECK-NEXT:    li a0, 100
27; CHECK-NEXT:    j .LBB0_8
28; CHECK-NEXT:  .LBB0_4: # %bb3
29; CHECK-NEXT:    li a0, 2
30; CHECK-NEXT:    j .LBB0_8
31; CHECK-NEXT:  .LBB0_5: # %bb4
32; CHECK-NEXT:    li a0, 1
33; CHECK-NEXT:    j .LBB0_8
34; CHECK-NEXT:  .LBB0_6: # %bb2
35; CHECK-NEXT:    li a0, 3
36; CHECK-NEXT:    j .LBB0_8
37; CHECK-NEXT:  .LBB0_7: # %bb6
38; CHECK-NEXT:    li a0, 200
39; CHECK-NEXT:  .LBB0_8: # %exit
40; CHECK-NEXT:    sw a0, 0(a1)
41; CHECK-NEXT:  .LBB0_9: # %exit
42; CHECK-NEXT:    ret
43;
44; NO-ZICFILP-LABEL: above_threshold:
45; NO-ZICFILP:       # %bb.0: # %entry
46; NO-ZICFILP-NEXT:    addi a0, a0, -1
47; NO-ZICFILP-NEXT:    li a2, 5
48; NO-ZICFILP-NEXT:    bltu a2, a0, .LBB0_9
49; NO-ZICFILP-NEXT:  # %bb.1: # %entry
50; NO-ZICFILP-NEXT:    slli a0, a0, 2
51; NO-ZICFILP-NEXT:    lui a2, %hi(.LJTI0_0)
52; NO-ZICFILP-NEXT:    addi a2, a2, %lo(.LJTI0_0)
53; NO-ZICFILP-NEXT:    add a0, a0, a2
54; NO-ZICFILP-NEXT:    lw a0, 0(a0)
55; NO-ZICFILP-NEXT:    jr a0
56; NO-ZICFILP-NEXT:  .LBB0_2: # %bb1
57; NO-ZICFILP-NEXT:    li a0, 4
58; NO-ZICFILP-NEXT:    j .LBB0_8
59; NO-ZICFILP-NEXT:  .LBB0_3: # %bb5
60; NO-ZICFILP-NEXT:    li a0, 100
61; NO-ZICFILP-NEXT:    j .LBB0_8
62; NO-ZICFILP-NEXT:  .LBB0_4: # %bb3
63; NO-ZICFILP-NEXT:    li a0, 2
64; NO-ZICFILP-NEXT:    j .LBB0_8
65; NO-ZICFILP-NEXT:  .LBB0_5: # %bb4
66; NO-ZICFILP-NEXT:    li a0, 1
67; NO-ZICFILP-NEXT:    j .LBB0_8
68; NO-ZICFILP-NEXT:  .LBB0_6: # %bb2
69; NO-ZICFILP-NEXT:    li a0, 3
70; NO-ZICFILP-NEXT:    j .LBB0_8
71; NO-ZICFILP-NEXT:  .LBB0_7: # %bb6
72; NO-ZICFILP-NEXT:    li a0, 200
73; NO-ZICFILP-NEXT:  .LBB0_8: # %exit
74; NO-ZICFILP-NEXT:    sw a0, 0(a1)
75; NO-ZICFILP-NEXT:  .LBB0_9: # %exit
76; NO-ZICFILP-NEXT:    ret
77entry:
78  switch i32 %in, label %exit [
79    i32 1, label %bb1
80    i32 2, label %bb2
81    i32 3, label %bb3
82    i32 4, label %bb4
83    i32 5, label %bb5
84    i32 6, label %bb6
85  ]
86bb1:
87  store i32 4, ptr %out
88  br label %exit
89bb2:
90  store i32 3, ptr %out
91  br label %exit
92bb3:
93  store i32 2, ptr %out
94  br label %exit
95bb4:
96  store i32 1, ptr %out
97  br label %exit
98bb5:
99  store i32 100, ptr %out
100  br label %exit
101bb6:
102  store i32 200, ptr %out
103  br label %exit
104exit:
105  ret void
106}
107