1 ; RUN: llc <%s -jump-table-type=single | FileCheck --check-prefix=SINGLE %s
2 ; RUN: llc <%s -jump-table-type=arity | FileCheck --check-prefix=ARITY %s
3 ; RUN: llc <%s -jump-table-type=simplified | FileCheck --check-prefix=SIMPL %s
4 ; RUN: llc <%s -jump-table-type=full | FileCheck --check-prefix=FULL %s
6 target triple = "x86_64-unknown-linux-gnu"
8 %struct.fun_struct = type { i32 (...)* }
10 @a = global [12 x i32 () *] [ i32 ()* bitcast (void ()* @indirect_fun to i32 ()*),
11 i32 ()* bitcast (void ()* @indirect_fun_match to i32 ()*),
12 i32 ()* bitcast (i32 ()* @indirect_fun_i32 to i32 ()*),
13 i32 ()* bitcast (i32 (i32)* @indirect_fun_i32_1 to i32 ()*),
14 i32 ()* bitcast (i32 (i32, i32)* @indirect_fun_i32_2 to i32 ()*),
15 i32 ()* bitcast (i32* (i32*, i32)* @indirect_fun_i32S_2 to i32 ()*),
16 i32 ()* bitcast (void (%struct.fun_struct)* @indirect_fun_struct to i32 ()*),
17 i32 ()* bitcast (void (i32 (...)*, i32)* @indirect_fun_fun to i32 ()*),
18 i32 ()* bitcast (i32 (i32 (...)*, i32)* @indirect_fun_fun_ret to i32 ()*),
19 i32 ()* bitcast (void ([19 x i8])* @indirect_fun_array to i32 ()*),
20 i32 ()* bitcast (void (<3 x i32>)* @indirect_fun_vec to i32 ()*),
21 i32 ()* bitcast (void (<4 x float>)* @indirect_fun_vec_2 to i32 ()*)
24 define void @indirect_fun() unnamed_addr jumptable {
28 define void @indirect_fun_match() unnamed_addr jumptable {
32 define i32 @indirect_fun_i32() unnamed_addr jumptable {
36 define i32 @indirect_fun_i32_1(i32 %a) unnamed_addr jumptable {
40 define i32 @indirect_fun_i32_2(i32 %a, i32 %b) unnamed_addr jumptable {
44 define i32* @indirect_fun_i32S_2(i32* %a, i32 %b) unnamed_addr jumptable {
48 define void @indirect_fun_struct(%struct.fun_struct %fs) unnamed_addr jumptable {
52 define void @indirect_fun_fun(i32 (...)* %fun, i32 %a) unnamed_addr jumptable {
56 define i32 @indirect_fun_fun_ret(i32 (...)* %fun, i32 %a) unnamed_addr jumptable {
60 define void @indirect_fun_array([19 x i8] %a) unnamed_addr jumptable {
64 define void @indirect_fun_vec(<3 x i32> %a) unnamed_addr jumptable {
68 define void @indirect_fun_vec_2(<4 x float> %a) unnamed_addr jumptable {
72 define i32 @m(void ()* %fun) {
77 define void ()* @get_fun() {
78 ret void ()* @indirect_fun
79 ; SINGLE: movl $__llvm_jump_instr_table_0_
80 ; ARITY: movl $__llvm_jump_instr_table_
81 ; SIMPL: movl $__llvm_jump_instr_table_
82 ; FULL: movl $__llvm_jump_instr_table_
85 define i32 @main(i32 %argc, i8** %argv) {
86 %f = call void ()* ()* @get_fun()
87 %a = call i32 @m(void ()* %f)
91 ; SINGLE-DAG: .align 8, 0x90
92 ; SINGLE-DAG: .type __llvm_jump_instr_table_0_1,@function
93 ; SINGLE-DAG: __llvm_jump_instr_table_0_1:
94 ; SINGLE-DAG: jmp indirect_fun_array@PLT
95 ; SINGLE-DAG: .align 8, 0x90
96 ; SINGLE-DAG: .type __llvm_jump_instr_table_0_2,@function
97 ; SINGLE-DAG: __llvm_jump_instr_table_0_2:
98 ; SINGLE-DAG: jmp indirect_fun_i32_2@PLT
99 ; SINGLE-DAG: .align 8, 0x90
100 ; SINGLE-DAG: .type __llvm_jump_instr_table_0_3,@function
101 ; SINGLE-DAG: __llvm_jump_instr_table_0_3:
102 ; SINGLE-DAG: jmp indirect_fun_vec_2@PLT
103 ; SINGLE-DAG: .align 8, 0x90
104 ; SINGLE-DAG: .type __llvm_jump_instr_table_0_4,@function
105 ; SINGLE-DAG: __llvm_jump_instr_table_0_4:
106 ; SINGLE-DAG: jmp indirect_fun_i32S_2@PLT
107 ; SINGLE-DAG: .align 8, 0x90
108 ; SINGLE-DAG: .type __llvm_jump_instr_table_0_5,@function
109 ; SINGLE-DAG: __llvm_jump_instr_table_0_5:
110 ; SINGLE-DAG: jmp indirect_fun_struct@PLT
111 ; SINGLE-DAG: .align 8, 0x90
112 ; SINGLE-DAG: .type __llvm_jump_instr_table_0_6,@function
113 ; SINGLE-DAG: __llvm_jump_instr_table_0_6:
114 ; SINGLE-DAG: jmp indirect_fun_i32_1@PLT
115 ; SINGLE-DAG: .align 8, 0x90
116 ; SINGLE-DAG: .type __llvm_jump_instr_table_0_7,@function
117 ; SINGLE-DAG: __llvm_jump_instr_table_0_7:
118 ; SINGLE-DAG: jmp indirect_fun_i32@PLT
119 ; SINGLE-DAG: .align 8, 0x90
120 ; SINGLE-DAG: .type __llvm_jump_instr_table_0_8,@function
121 ; SINGLE-DAG: __llvm_jump_instr_table_0_8:
122 ; SINGLE-DAG: jmp indirect_fun_fun@PLT
123 ; SINGLE-DAG: .align 8, 0x90
124 ; SINGLE-DAG: .type __llvm_jump_instr_table_0_9,@function
125 ; SINGLE-DAG: __llvm_jump_instr_table_0_9:
126 ; SINGLE-DAG: jmp indirect_fun_fun_ret@PLT
127 ; SINGLE-DAG: .align 8, 0x90
128 ; SINGLE-DAG: .type __llvm_jump_instr_table_0_10,@function
129 ; SINGLE-DAG: __llvm_jump_instr_table_0_10:
130 ; SINGLE-DAG: jmp indirect_fun@PLT
131 ; SINGLE-DAG: .align 8, 0x90
132 ; SINGLE-DAG: .type __llvm_jump_instr_table_0_11,@function
133 ; SINGLE-DAG: __llvm_jump_instr_table_0_11:
134 ; SINGLE-DAG: jmp indirect_fun_match@PLT
135 ; SINGLE-DAG: .align 8, 0x90
136 ; SINGLE-DAG: .type __llvm_jump_instr_table_0_12,@function
137 ; SINGLE-DAG: __llvm_jump_instr_table_0_12:
138 ; SINGLE-DAG: jmp indirect_fun_vec@PLT
139 ; SINGLE-DAG: .align 8, 0x90
141 ; SINGLE-DAG: .align 8, 0x90
143 ; SINGLE-DAG: .align 8, 0x90
145 ; SINGLE-DAG: .align 8, 0x90
149 ; ARITY-DAG: .align 8, 0x90
150 ; ARITY-DAG: .type __llvm_jump_instr_table_2_1,@function
151 ; ARITY-DAG: __llvm_jump_instr_table_2_1:
152 ; ARITY-DAG: jmp indirect_fun{{.*}}@PLT
153 ; ARITY-DAG: .align 8, 0x90
155 ; ARITY-DAG: .align 8, 0x90
156 ; ARITY-DAG: .type __llvm_jump_instr_table_0_1,@function
157 ; ARITY-DAG: __llvm_jump_instr_table_0_1:
158 ; ARITY-DAG: jmp indirect_fun{{.*}}@PLT
159 ; ARITY-DAG: .align 8, 0x90
160 ; ARITY-DAG: .type __llvm_jump_instr_table_1_1,@function
161 ; ARITY-DAG: __llvm_jump_instr_table_1_1:
162 ; ARITY-DAG: jmp indirect_fun{{.*}}@PLT
164 ; SIMPL-DAG: .align 8, 0x90
165 ; SIMPL-DAG: .type __llvm_jump_instr_table_2_1,@function
166 ; SIMPL-DAG: __llvm_jump_instr_table_2_1:
167 ; SIMPL-DAG: jmp indirect_fun{{.*}}@PLT
168 ; SIMPL-DAG: .align 8, 0x90
170 ; SIMPL-DAG: .align 8, 0x90
171 ; SIMPL-DAG: .type __llvm_jump_instr_table_0_1,@function
172 ; SIMPL-DAG: __llvm_jump_instr_table_0_1:
173 ; SIMPL-DAG: jmp indirect_fun{{.*}}@PLT
174 ; SIMPL-DAG: .align 8, 0x90
175 ; SIMPL-DAG: .type __llvm_jump_instr_table_1_1,@function
176 ; SIMPL-DAG: __llvm_jump_instr_table_1_1:
177 ; SIMPL-DAG: jmp indirect_fun{{.*}}@PLT
178 ; SIMPL-DAG: .align 8, 0x90
179 ; SIMPL-DAG: .type __llvm_jump_instr_table_3_1,@function
180 ; SIMPL-DAG: __llvm_jump_instr_table_3_1:
181 ; SIMPL-DAG: jmp indirect_fun{{.*}}@PLT
182 ; SIMPL-DAG: .align 8, 0x90
183 ; SIMPL-DAG: .type __llvm_jump_instr_table_4_1,@function
184 ; SIMPL-DAG: __llvm_jump_instr_table_4_1:
185 ; SIMPL-DAG: jmp indirect_fun{{.*}}@PLT
188 ; FULL-DAG: .align 8, 0x90
189 ; FULL-DAG: .type __llvm_jump_instr_table_10_1,@function
190 ; FULL-DAG:__llvm_jump_instr_table_10_1:
191 ; FULL-DAG: jmp indirect_fun_i32_1@PLT
192 ; FULL-DAG: .align 8, 0x90
194 ; FULL-DAG: .align 8, 0x90
195 ; FULL-DAG: .type __llvm_jump_instr_table_9_1,@function
196 ; FULL-DAG:__llvm_jump_instr_table_9_1:
197 ; FULL-DAG: jmp indirect_fun_i32_2@PLT
198 ; FULL-DAG: .align 8, 0x90
200 ; FULL-DAG: .align 8, 0x90
201 ; FULL-DAG: .type __llvm_jump_instr_table_7_1,@function
202 ; FULL-DAG:__llvm_jump_instr_table_7_1:
203 ; FULL-DAG: jmp indirect_fun_i32S_2@PLT
204 ; FULL-DAG: .align 8, 0x90
206 ; FULL-DAG: .align 8, 0x90
207 ; FULL-DAG: .type __llvm_jump_instr_table_3_1,@function
208 ; FULL-DAG:__llvm_jump_instr_table_3_1:
209 ; FULL-DAG: jmp indirect_fun_vec_2@PLT
210 ; FULL-DAG: .align 8, 0x90
212 ; FULL-DAG: .align 8, 0x90
213 ; FULL-DAG: .type __llvm_jump_instr_table_2_1,@function
214 ; FULL-DAG:__llvm_jump_instr_table_2_1:
215 ; FULL-DAG: jmp indirect_fun@PLT
216 ; FULL-DAG: .align 8, 0x90
218 ; FULL-DAG: .align 8, 0x90
220 ; FULL-DAG: .align 8, 0x90
221 ; FULL-DAG: .type __llvm_jump_instr_table_8_1,@function
222 ; FULL-DAG:__llvm_jump_instr_table_8_1:
223 ; FULL-DAG: jmp indirect_fun_i32@PLT
224 ; FULL-DAG: .align 8, 0x90
226 ; FULL-DAG: .align 8, 0x90
227 ; FULL-DAG: .type __llvm_jump_instr_table_1_1,@function
228 ; FULL-DAG:__llvm_jump_instr_table_1_1:
229 ; FULL-DAG: jmp indirect_fun_array@PLT
230 ; FULL-DAG: .align 8, 0x90
232 ; FULL-DAG: .align 8, 0x90
233 ; FULL-DAG: .type __llvm_jump_instr_table_0_1,@function
234 ; FULL-DAG:__llvm_jump_instr_table_0_1:
235 ; FULL-DAG: jmp indirect_fun_vec@PLT
236 ; FULL-DAG: .align 8, 0x90
238 ; FULL-DAG: .align 8, 0x90
239 ; FULL-DAG: .type __llvm_jump_instr_table_6_1,@function
240 ; FULL-DAG:__llvm_jump_instr_table_6_1:
241 ; FULL-DAG: jmp indirect_fun_struct@PLT
242 ; FULL-DAG: .align 8, 0x90
244 ; FULL-DAG: .align 8, 0x90
245 ; FULL-DAG: .type __llvm_jump_instr_table_5_1,@function
246 ; FULL-DAG:__llvm_jump_instr_table_5_1:
247 ; FULL-DAG: jmp indirect_fun_fun@PLT
248 ; FULL-DAG: .align 8, 0x90
250 ; FULL-DAG: .align 8, 0x90
251 ; FULL-DAG: .type __llvm_jump_instr_table_4_1,@function
252 ; FULL-DAG:__llvm_jump_instr_table_4_1:
253 ; FULL-DAG: jmp indirect_fun_fun_ret@PLT
254 ; FULL-DAG: .align 8, 0x90