120
|
1 ; Test for generation of jump table for ropi/rwpi
|
|
2
|
|
3 ; RUN: llc -relocation-model=static -mtriple=armv7a--none-eabi -disable-block-placement < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ARM --check-prefix=ARM_ABS
|
|
4 ; RUN: llc -relocation-model=ropi -mtriple=armv7a--none-eabi -disable-block-placement < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ARM --check-prefix=ARM_PC
|
|
5 ; RUN: llc -relocation-model=ropi-rwpi -mtriple=armv7a--none-eabi -disable-block-placement < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ARM --check-prefix=ARM_PC
|
|
6
|
|
7 ; RUN: llc -relocation-model=static -mtriple=thumbv7m--none-eabi -disable-block-placement < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB2
|
|
8 ; RUN: llc -relocation-model=ropi -mtriple=thumbv7m--none-eabi -disable-block-placement < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB2
|
|
9 ; RUN: llc -relocation-model=ropi-rwpi -mtriple=thumbv7m--none-eabi -disable-block-placement < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB2
|
|
10
|
|
11 ; RUN: llc -relocation-model=static -mtriple=thumbv6m--none-eabi -disable-block-placement < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB1
|
|
12 ; RUN: llc -relocation-model=ropi -mtriple=thumbv6m--none-eabi -disable-block-placement < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB1
|
|
13 ; RUN: llc -relocation-model=ropi-rwpi -mtriple=thumbv6m--none-eabi -disable-block-placement < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB1
|
|
14
|
|
15
|
|
16 declare void @exit0()
|
|
17 declare void @exit1()
|
|
18 declare void @exit2()
|
|
19 declare void @exit3()
|
|
20 declare void @exit4()
|
|
21 define void @jump_table(i32 %val) {
|
|
22 entry:
|
|
23 switch i32 %val, label %default [ i32 1, label %lab1
|
|
24 i32 2, label %lab2
|
|
25 i32 3, label %lab3
|
|
26 i32 4, label %lab4 ]
|
|
27
|
|
28 default:
|
|
29 tail call void @exit0()
|
|
30 ret void
|
|
31
|
|
32 lab1:
|
|
33 tail call void @exit1()
|
|
34 ret void
|
|
35
|
|
36 lab2:
|
|
37 tail call void @exit2()
|
|
38 ret void
|
|
39
|
|
40 lab3:
|
|
41 tail call void @exit3()
|
|
42 ret void
|
|
43
|
|
44 lab4:
|
|
45 tail call void @exit4()
|
|
46 ret void
|
|
47
|
|
48 ; CHECK-LABEL: jump_table:
|
|
49
|
121
|
50 ; ARM: adr r[[R_TAB_BASE:[0-9]+]], [[LJTI:\.LJTI[0-9]+_[0-9]+]]
|
120
|
51 ; ARM: lsl r[[R_TAB_IDX:[0-9]+]], r{{[0-9]+}}, #2
|
|
52 ; ARM_ABS: ldr pc, [r[[R_TAB_IDX]], r[[R_TAB_BASE]]]
|
|
53 ; ARM_PC: ldr r[[R_OFFSET:[0-9]+]], [r[[R_TAB_IDX]], r[[R_TAB_BASE]]]
|
|
54 ; ARM_PC: add pc, r[[R_OFFSET]], r[[R_TAB_BASE]]
|
|
55 ; ARM: [[LJTI]]
|
|
56 ; ARM_ABS: .long [[LBB1:\.LBB[0-9]+_[0-9]+]]
|
|
57 ; ARM_ABS: .long [[LBB2:\.LBB[0-9]+_[0-9]+]]
|
|
58 ; ARM_ABS: .long [[LBB3:\.LBB[0-9]+_[0-9]+]]
|
|
59 ; ARM_ABS: .long [[LBB4:\.LBB[0-9]+_[0-9]+]]
|
|
60 ; ARM_PC: .long [[LBB1:\.LBB[0-9]+_[0-9]+]]-[[LJTI]]
|
|
61 ; ARM_PC: .long [[LBB2:\.LBB[0-9]+_[0-9]+]]-[[LJTI]]
|
|
62 ; ARM_PC: .long [[LBB3:\.LBB[0-9]+_[0-9]+]]-[[LJTI]]
|
|
63 ; ARM_PC: .long [[LBB4:\.LBB[0-9]+_[0-9]+]]-[[LJTI]]
|
|
64 ; ARM: [[LBB1]]
|
|
65 ; ARM-NEXT: b exit1
|
|
66 ; ARM: [[LBB2]]
|
|
67 ; ARM-NEXT: b exit2
|
|
68 ; ARM: [[LBB3]]
|
|
69 ; ARM-NEXT: b exit3
|
|
70 ; ARM: [[LBB4]]
|
|
71 ; ARM-NEXT: b exit4
|
|
72
|
|
73 ; THUMB2: [[LCPI:\.LCPI[0-9]+_[0-9]+]]:
|
|
74 ; THUMB2: tbb [pc, r{{[0-9]+}}]
|
|
75 ; THUMB2: .byte ([[LBB1:\.LBB[0-9]+_[0-9]+]]-([[LCPI]]+4))/2
|
|
76 ; THUMB2: .byte ([[LBB2:\.LBB[0-9]+_[0-9]+]]-([[LCPI]]+4))/2
|
|
77 ; THUMB2: .byte ([[LBB3:\.LBB[0-9]+_[0-9]+]]-([[LCPI]]+4))/2
|
|
78 ; THUMB2: .byte ([[LBB4:\.LBB[0-9]+_[0-9]+]]-([[LCPI]]+4))/2
|
|
79 ; THUMB2: [[LBB1]]
|
|
80 ; THUMB2-NEXT: b exit1
|
|
81 ; THUMB2: [[LBB2]]
|
|
82 ; THUMB2-NEXT: b exit2
|
|
83 ; THUMB2: [[LBB3]]
|
|
84 ; THUMB2-NEXT: b exit3
|
|
85 ; THUMB2: [[LBB4]]
|
|
86 ; THUMB2-NEXT: b exit4
|
|
87
|
|
88 ; THUMB1: .p2align 2
|
|
89 ; THUMB1: add r[[x:[0-9]+]], pc
|
|
90 ; THUMB1: ldrb r[[x]], [r[[x]], #4]
|
|
91 ; THUMB1: lsls r[[x]], r[[x]], #1
|
|
92 ; THUMB1: [[LCPI:\.LCPI[0-9]+_[0-9]+]]:
|
|
93 ; THUMB1: add pc, r[[x]]
|
|
94 ; THUMB1: .p2align 2
|
|
95 ; THUMB1: .byte ([[LBB1:\.LBB[0-9]+_[0-9]+]]-([[LCPI]]+4))/2
|
|
96 ; THUMB1: .byte ([[LBB2:\.LBB[0-9]+_[0-9]+]]-([[LCPI]]+4))/2
|
|
97 ; THUMB1: .byte ([[LBB3:\.LBB[0-9]+_[0-9]+]]-([[LCPI]]+4))/2
|
|
98 ; THUMB1: .byte ([[LBB4:\.LBB[0-9]+_[0-9]+]]-([[LCPI]]+4))/2
|
|
99 ; THUMB1: [[LBB1]]
|
|
100 ; THUMB1-NEXT: bl exit1
|
|
101 ; THUMB1: [[LBB2]]
|
|
102 ; THUMB1-NEXT: bl exit2
|
|
103 ; THUMB1: [[LBB3]]
|
|
104 ; THUMB1-NEXT: bl exit3
|
|
105 ; THUMB1: [[LBB4]]
|
|
106 ; THUMB1-NEXT: bl exit4
|
|
107 }
|