[x86] Mechanically update a bunch of tests' check lines using the latest
[oota-llvm.git] / test / CodeGen / X86 / jump_tables.ll
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
5
6 target triple = "x86_64-unknown-linux-gnu"
7
8 %struct.fun_struct = type { i32 (...)* }
9
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 ()*)
22                             ]
23
24 define void @indirect_fun() unnamed_addr jumptable {
25   ret void
26 }
27
28 define void @indirect_fun_match() unnamed_addr jumptable {
29   ret void
30 }
31
32 define i32 @indirect_fun_i32() unnamed_addr jumptable {
33   ret i32 0
34 }
35
36 define i32 @indirect_fun_i32_1(i32 %a) unnamed_addr jumptable {
37   ret i32 %a
38 }
39
40 define i32 @indirect_fun_i32_2(i32 %a, i32 %b) unnamed_addr jumptable {
41   ret i32 %a
42 }
43
44 define i32* @indirect_fun_i32S_2(i32* %a, i32 %b) unnamed_addr jumptable {
45   ret i32* %a
46 }
47
48 define void @indirect_fun_struct(%struct.fun_struct %fs) unnamed_addr jumptable {
49   ret void
50 }
51
52 define void @indirect_fun_fun(i32 (...)* %fun, i32 %a) unnamed_addr jumptable {
53   ret void
54 }
55
56 define i32 @indirect_fun_fun_ret(i32 (...)* %fun, i32 %a) unnamed_addr jumptable {
57   ret i32 %a
58 }
59
60 define void @indirect_fun_array([19 x i8] %a) unnamed_addr jumptable {
61   ret void
62 }
63
64 define void @indirect_fun_vec(<3 x i32> %a) unnamed_addr jumptable {
65   ret void
66 }
67
68 define void @indirect_fun_vec_2(<4 x float> %a) unnamed_addr jumptable {
69   ret void
70 }
71
72 define i32 @m(void ()* %fun) {
73   call void ()* %fun()
74   ret i32 0
75 }
76
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_
83 }
84
85 define i32 @main(i32 %argc, i8** %argv) {
86   %f = call void ()* ()* @get_fun()
87   %a = call i32 @m(void ()* %f)
88   ret i32 %a
89 }
90
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
140 ; SINGLE-DAG:         ud2
141 ; SINGLE-DAG:         .align  8, 0x90
142 ; SINGLE-DAG:         ud2
143 ; SINGLE-DAG:         .align  8, 0x90
144 ; SINGLE-DAG:         ud2
145 ; SINGLE-DAG:         .align  8, 0x90
146 ; SINGLE-DAG:         ud2
147
148
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
154 ; ARITY-DAG:         ud2
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
163
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
169 ; SIMPL-DAG:         ud2
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
186
187
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
193 ; FULL-DAG:        ud2
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
199 ; FULL-DAG:        ud2
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
205 ; FULL-DAG:        ud2
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
211 ; FULL-DAG:        ud2
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
217 ; FULL-DAG:        ud2
218 ; FULL-DAG:        .align  8, 0x90
219 ; FULL-DAG:        ud2
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
225 ; FULL-DAG:        ud2
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
231 ; FULL-DAG:        ud2
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
237 ; FULL-DAG:        ud2
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
243 ; FULL-DAG:        ud2
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
249 ; FULL-DAG:        ud2
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
255 ; FULL-DAG:        ud2