Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / code-model-elf.ll
blob901a62d26f77e8a619107ce13c7a457b550c0fbc
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_sp
2 ; Run with --no_x86_scrub_rip because we care a lot about how globals are
3 ; accessed in the code model.
5 ; RUN: llc -verify-machineinstrs < %s -relocation-model=static -code-model=small  | FileCheck %s --check-prefix=CHECK --check-prefix=SMALL-STATIC
6 ; RUN: llc -verify-machineinstrs < %s -relocation-model=static -code-model=medium | FileCheck %s --check-prefix=CHECK --check-prefix=MEDIUM-STATIC
7 ; RUN: llc -verify-machineinstrs < %s -relocation-model=static -code-model=large  | FileCheck %s --check-prefix=CHECK --check-prefix=LARGE-STATIC
8 ; RUN: llc -verify-machineinstrs < %s -relocation-model=pic    -code-model=small  | FileCheck %s --check-prefix=CHECK --check-prefix=SMALL-PIC
9 ; RUN: llc -verify-machineinstrs < %s -relocation-model=pic    -code-model=medium -large-data-threshold=1000 | FileCheck %s --check-prefix=CHECK --check-prefix=MEDIUM-SMALL-DATA-PIC
10 ; RUN: llc -verify-machineinstrs < %s -relocation-model=pic    -code-model=medium | FileCheck %s --check-prefix=CHECK --check-prefix=MEDIUM-PIC
11 ; RUN: llc -verify-machineinstrs < %s -relocation-model=pic    -code-model=large  | FileCheck %s --check-prefix=CHECK --check-prefix=LARGE-PIC
13 ; Generated from this C source:
15 ; static int static_data[10];
16 ; int global_data[10] = {1, 2};
17 ; extern int extern_data[10];
19 ; int *lea_static_data() { return &static_data[0]; }
20 ; int *lea_global_data() { return &global_data[0]; }
21 ; int *lea_extern_data() { return &extern_data[0]; }
23 ; static void static_fn(void) {}
24 ; void global_fn(void) {}
25 ; void extern_fn(void);
27 ; typedef void (*void_fn)(void);
28 ; void_fn lea_static_fn() { return &static_fn; }
29 ; void_fn lea_global_fn() { return &global_fn; }
30 ; void_fn lea_extern_fn() { return &extern_fn; }
33 ; ModuleID = 'model.c'
34 source_filename = "model.c"
35 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
36 target triple = "x86_64--linux"
38 @global_data = dso_local global [10 x i32] [i32 1, i32 2, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0], align 16
39 @static_data = internal global [10 x i32] zeroinitializer, align 16
40 @extern_data = external global [10 x i32], align 16
41 @thread_data = external thread_local global i32, align 4
42 @unknown_size_data = dso_local global [0 x i32] zeroinitializer, align 16
45 define dso_local ptr @lea_static_data() #0 {
46 ; SMALL-STATIC-LABEL: lea_static_data:
47 ; SMALL-STATIC:       # %bb.0:
48 ; SMALL-STATIC-NEXT:    movl $static_data, %eax
49 ; SMALL-STATIC-NEXT:    retq
51 ; MEDIUM-STATIC-LABEL: lea_static_data:
52 ; MEDIUM-STATIC:       # %bb.0:
53 ; MEDIUM-STATIC-NEXT:    movabsq $static_data, %rax
54 ; MEDIUM-STATIC-NEXT:    retq
56 ; LARGE-STATIC-LABEL: lea_static_data:
57 ; LARGE-STATIC:       # %bb.0:
58 ; LARGE-STATIC-NEXT:    movabsq $static_data, %rax
59 ; LARGE-STATIC-NEXT:    retq
61 ; SMALL-PIC-LABEL: lea_static_data:
62 ; SMALL-PIC:       # %bb.0:
63 ; SMALL-PIC-NEXT:    leaq static_data(%rip), %rax
64 ; SMALL-PIC-NEXT:    retq
66 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_static_data:
67 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
68 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq static_data(%rip), %rax
69 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
71 ; MEDIUM-PIC-LABEL: lea_static_data:
72 ; MEDIUM-PIC:       # %bb.0:
73 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
74 ; MEDIUM-PIC-NEXT:    movabsq $static_data@GOTOFF, %rax
75 ; MEDIUM-PIC-NEXT:    addq %rcx, %rax
76 ; MEDIUM-PIC-NEXT:    retq
78 ; LARGE-PIC-LABEL: lea_static_data:
79 ; LARGE-PIC:       # %bb.0:
80 ; LARGE-PIC-NEXT:  .L0$pb:
81 ; LARGE-PIC-NEXT:    leaq .L0$pb(%rip), %rax
82 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L0$pb, %rcx
83 ; LARGE-PIC-NEXT:    addq %rax, %rcx
84 ; LARGE-PIC-NEXT:    movabsq $static_data@GOTOFF, %rax
85 ; LARGE-PIC-NEXT:    addq %rcx, %rax
86 ; LARGE-PIC-NEXT:    retq
87   ret ptr @static_data
90 define dso_local ptr @lea_global_data() #0 {
91 ; SMALL-STATIC-LABEL: lea_global_data:
92 ; SMALL-STATIC:       # %bb.0:
93 ; SMALL-STATIC-NEXT:    movl $global_data, %eax
94 ; SMALL-STATIC-NEXT:    retq
96 ; MEDIUM-STATIC-LABEL: lea_global_data:
97 ; MEDIUM-STATIC:       # %bb.0:
98 ; MEDIUM-STATIC-NEXT:    movabsq $global_data, %rax
99 ; MEDIUM-STATIC-NEXT:    retq
101 ; LARGE-STATIC-LABEL: lea_global_data:
102 ; LARGE-STATIC:       # %bb.0:
103 ; LARGE-STATIC-NEXT:    movabsq $global_data, %rax
104 ; LARGE-STATIC-NEXT:    retq
106 ; SMALL-PIC-LABEL: lea_global_data:
107 ; SMALL-PIC:       # %bb.0:
108 ; SMALL-PIC-NEXT:    leaq global_data(%rip), %rax
109 ; SMALL-PIC-NEXT:    retq
111 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_global_data:
112 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
113 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq global_data(%rip), %rax
114 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
116 ; MEDIUM-PIC-LABEL: lea_global_data:
117 ; MEDIUM-PIC:       # %bb.0:
118 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
119 ; MEDIUM-PIC-NEXT:    movabsq $global_data@GOTOFF, %rax
120 ; MEDIUM-PIC-NEXT:    addq %rcx, %rax
121 ; MEDIUM-PIC-NEXT:    retq
123 ; LARGE-PIC-LABEL: lea_global_data:
124 ; LARGE-PIC:       # %bb.0:
125 ; LARGE-PIC-NEXT:  .L1$pb:
126 ; LARGE-PIC-NEXT:    leaq .L1$pb(%rip), %rax
127 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L1$pb, %rcx
128 ; LARGE-PIC-NEXT:    addq %rax, %rcx
129 ; LARGE-PIC-NEXT:    movabsq $global_data@GOTOFF, %rax
130 ; LARGE-PIC-NEXT:    addq %rcx, %rax
131 ; LARGE-PIC-NEXT:    retq
132   ret ptr @global_data
135 define dso_local ptr @lea_extern_data() #0 {
136 ; SMALL-STATIC-LABEL: lea_extern_data:
137 ; SMALL-STATIC:       # %bb.0:
138 ; SMALL-STATIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
139 ; SMALL-STATIC-NEXT:    retq
141 ; MEDIUM-STATIC-LABEL: lea_extern_data:
142 ; MEDIUM-STATIC:       # %bb.0:
143 ; MEDIUM-STATIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
144 ; MEDIUM-STATIC-NEXT:    retq
146 ; LARGE-STATIC-LABEL: lea_extern_data:
147 ; LARGE-STATIC:       # %bb.0:
148 ; LARGE-STATIC-NEXT:    movabsq $extern_data, %rax
149 ; LARGE-STATIC-NEXT:    retq
151 ; SMALL-PIC-LABEL: lea_extern_data:
152 ; SMALL-PIC:       # %bb.0:
153 ; SMALL-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
154 ; SMALL-PIC-NEXT:    retq
156 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_extern_data:
157 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
158 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
159 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
161 ; MEDIUM-PIC-LABEL: lea_extern_data:
162 ; MEDIUM-PIC:       # %bb.0:
163 ; MEDIUM-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
164 ; MEDIUM-PIC-NEXT:    retq
166 ; LARGE-PIC-LABEL: lea_extern_data:
167 ; LARGE-PIC:       # %bb.0:
168 ; LARGE-PIC-NEXT:  .L2$pb:
169 ; LARGE-PIC-NEXT:    leaq .L2$pb(%rip), %rax
170 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L2$pb, %rcx
171 ; LARGE-PIC-NEXT:    addq %rax, %rcx
172 ; LARGE-PIC-NEXT:    movabsq $extern_data@GOT, %rax
173 ; LARGE-PIC-NEXT:    movq (%rcx,%rax), %rax
174 ; LARGE-PIC-NEXT:    retq
175   ret ptr @extern_data
178 define dso_local ptr @lea_unknown_size_data() #0 {
179 ; SMALL-STATIC-LABEL: lea_unknown_size_data:
180 ; SMALL-STATIC:       # %bb.0:
181 ; SMALL-STATIC-NEXT:    movl $unknown_size_data, %eax
182 ; SMALL-STATIC-NEXT:    retq
184 ; MEDIUM-STATIC-LABEL: lea_unknown_size_data:
185 ; MEDIUM-STATIC:       # %bb.0:
186 ; MEDIUM-STATIC-NEXT:    movabsq $unknown_size_data, %rax
187 ; MEDIUM-STATIC-NEXT:    retq
189 ; LARGE-STATIC-LABEL: lea_unknown_size_data:
190 ; LARGE-STATIC:       # %bb.0:
191 ; LARGE-STATIC-NEXT:    movabsq $unknown_size_data, %rax
192 ; LARGE-STATIC-NEXT:    retq
194 ; SMALL-PIC-LABEL: lea_unknown_size_data:
195 ; SMALL-PIC:       # %bb.0:
196 ; SMALL-PIC-NEXT:    leaq unknown_size_data(%rip), %rax
197 ; SMALL-PIC-NEXT:    retq
199 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_unknown_size_data:
200 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
201 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
202 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movabsq $unknown_size_data@GOTOFF, %rax
203 ; MEDIUM-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
204 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
206 ; MEDIUM-PIC-LABEL: lea_unknown_size_data:
207 ; MEDIUM-PIC:       # %bb.0:
208 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
209 ; MEDIUM-PIC-NEXT:    movabsq $unknown_size_data@GOTOFF, %rax
210 ; MEDIUM-PIC-NEXT:    addq %rcx, %rax
211 ; MEDIUM-PIC-NEXT:    retq
213 ; LARGE-PIC-LABEL: lea_unknown_size_data:
214 ; LARGE-PIC:       # %bb.0:
215 ; LARGE-PIC-NEXT:  .L3$pb:
216 ; LARGE-PIC-NEXT:    leaq .L3$pb(%rip), %rax
217 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L3$pb, %rcx
218 ; LARGE-PIC-NEXT:    addq %rax, %rcx
219 ; LARGE-PIC-NEXT:    movabsq $unknown_size_data@GOTOFF, %rax
220 ; LARGE-PIC-NEXT:    addq %rcx, %rax
221 ; LARGE-PIC-NEXT:    retq
222   ret ptr @unknown_size_data
225 define dso_local i32 @load_global_data() #0 {
226 ; SMALL-STATIC-LABEL: load_global_data:
227 ; SMALL-STATIC:       # %bb.0:
228 ; SMALL-STATIC-NEXT:    movl global_data+8(%rip), %eax
229 ; SMALL-STATIC-NEXT:    retq
231 ; MEDIUM-STATIC-LABEL: load_global_data:
232 ; MEDIUM-STATIC:       # %bb.0:
233 ; MEDIUM-STATIC-NEXT:    movabsq $global_data, %rax
234 ; MEDIUM-STATIC-NEXT:    movl 8(%rax), %eax
235 ; MEDIUM-STATIC-NEXT:    retq
237 ; LARGE-STATIC-LABEL: load_global_data:
238 ; LARGE-STATIC:       # %bb.0:
239 ; LARGE-STATIC-NEXT:    movabsq $global_data, %rax
240 ; LARGE-STATIC-NEXT:    movl 8(%rax), %eax
241 ; LARGE-STATIC-NEXT:    retq
243 ; SMALL-PIC-LABEL: load_global_data:
244 ; SMALL-PIC:       # %bb.0:
245 ; SMALL-PIC-NEXT:    movl global_data+8(%rip), %eax
246 ; SMALL-PIC-NEXT:    retq
248 ; MEDIUM-SMALL-DATA-PIC-LABEL: load_global_data:
249 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
250 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq global_data(%rip), %rax
251 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movl 8(%rax), %eax
252 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
254 ; MEDIUM-PIC-LABEL: load_global_data:
255 ; MEDIUM-PIC:       # %bb.0:
256 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
257 ; MEDIUM-PIC-NEXT:    movabsq $global_data@GOTOFF, %rcx
258 ; MEDIUM-PIC-NEXT:    movl 8(%rax,%rcx), %eax
259 ; MEDIUM-PIC-NEXT:    retq
261 ; LARGE-PIC-LABEL: load_global_data:
262 ; LARGE-PIC:       # %bb.0:
263 ; LARGE-PIC-NEXT:  .L4$pb:
264 ; LARGE-PIC-NEXT:    leaq .L4$pb(%rip), %rax
265 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L4$pb, %rcx
266 ; LARGE-PIC-NEXT:    addq %rax, %rcx
267 ; LARGE-PIC-NEXT:    movabsq $global_data@GOTOFF, %rax
268 ; LARGE-PIC-NEXT:    movl 8(%rcx,%rax), %eax
269 ; LARGE-PIC-NEXT:    retq
270   %rv = load i32, ptr getelementptr inbounds ([10 x i32], ptr @global_data, i64 0, i64 2)
271   ret i32 %rv
274 define dso_local i32 @load_extern_data() #0 {
275 ; SMALL-STATIC-LABEL: load_extern_data:
276 ; SMALL-STATIC:       # %bb.0:
277 ; SMALL-STATIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
278 ; SMALL-STATIC-NEXT:    movl 8(%rax), %eax
279 ; SMALL-STATIC-NEXT:    retq
281 ; MEDIUM-STATIC-LABEL: load_extern_data:
282 ; MEDIUM-STATIC:       # %bb.0:
283 ; MEDIUM-STATIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
284 ; MEDIUM-STATIC-NEXT:    movl 8(%rax), %eax
285 ; MEDIUM-STATIC-NEXT:    retq
287 ; LARGE-STATIC-LABEL: load_extern_data:
288 ; LARGE-STATIC:       # %bb.0:
289 ; LARGE-STATIC-NEXT:    movabsq $extern_data, %rax
290 ; LARGE-STATIC-NEXT:    movl 8(%rax), %eax
291 ; LARGE-STATIC-NEXT:    retq
293 ; SMALL-PIC-LABEL: load_extern_data:
294 ; SMALL-PIC:       # %bb.0:
295 ; SMALL-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
296 ; SMALL-PIC-NEXT:    movl 8(%rax), %eax
297 ; SMALL-PIC-NEXT:    retq
299 ; MEDIUM-SMALL-DATA-PIC-LABEL: load_extern_data:
300 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
301 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
302 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movl 8(%rax), %eax
303 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
305 ; MEDIUM-PIC-LABEL: load_extern_data:
306 ; MEDIUM-PIC:       # %bb.0:
307 ; MEDIUM-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
308 ; MEDIUM-PIC-NEXT:    movl 8(%rax), %eax
309 ; MEDIUM-PIC-NEXT:    retq
311 ; LARGE-PIC-LABEL: load_extern_data:
312 ; LARGE-PIC:       # %bb.0:
313 ; LARGE-PIC-NEXT:  .L5$pb:
314 ; LARGE-PIC-NEXT:    leaq .L5$pb(%rip), %rax
315 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L5$pb, %rcx
316 ; LARGE-PIC-NEXT:    addq %rax, %rcx
317 ; LARGE-PIC-NEXT:    movabsq $extern_data@GOT, %rax
318 ; LARGE-PIC-NEXT:    movq (%rcx,%rax), %rax
319 ; LARGE-PIC-NEXT:    movl 8(%rax), %eax
320 ; LARGE-PIC-NEXT:    retq
321   %rv = load i32, ptr getelementptr inbounds ([10 x i32], ptr @extern_data, i64 0, i64 2)
322   ret i32 %rv
325 define dso_local i32 @load_unknown_size_data() #0 {
326 ; SMALL-STATIC-LABEL: load_unknown_size_data:
327 ; SMALL-STATIC:       # %bb.0:
328 ; SMALL-STATIC-NEXT:    movl unknown_size_data+8(%rip), %eax
329 ; SMALL-STATIC-NEXT:    retq
331 ; MEDIUM-STATIC-LABEL: load_unknown_size_data:
332 ; MEDIUM-STATIC:       # %bb.0:
333 ; MEDIUM-STATIC-NEXT:    movabsq $unknown_size_data, %rax
334 ; MEDIUM-STATIC-NEXT:    movl 8(%rax), %eax
335 ; MEDIUM-STATIC-NEXT:    retq
337 ; LARGE-STATIC-LABEL: load_unknown_size_data:
338 ; LARGE-STATIC:       # %bb.0:
339 ; LARGE-STATIC-NEXT:    movabsq $unknown_size_data, %rax
340 ; LARGE-STATIC-NEXT:    movl 8(%rax), %eax
341 ; LARGE-STATIC-NEXT:    retq
343 ; SMALL-PIC-LABEL: load_unknown_size_data:
344 ; SMALL-PIC:       # %bb.0:
345 ; SMALL-PIC-NEXT:    movl unknown_size_data+8(%rip), %eax
346 ; SMALL-PIC-NEXT:    retq
348 ; MEDIUM-SMALL-DATA-PIC-LABEL: load_unknown_size_data:
349 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
350 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
351 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movabsq $unknown_size_data@GOTOFF, %rcx
352 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movl 8(%rax,%rcx), %eax
353 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
355 ; MEDIUM-PIC-LABEL: load_unknown_size_data:
356 ; MEDIUM-PIC:       # %bb.0:
357 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
358 ; MEDIUM-PIC-NEXT:    movabsq $unknown_size_data@GOTOFF, %rcx
359 ; MEDIUM-PIC-NEXT:    movl 8(%rax,%rcx), %eax
360 ; MEDIUM-PIC-NEXT:    retq
362 ; LARGE-PIC-LABEL: load_unknown_size_data:
363 ; LARGE-PIC:       # %bb.0:
364 ; LARGE-PIC-NEXT:  .L6$pb:
365 ; LARGE-PIC-NEXT:    leaq .L6$pb(%rip), %rax
366 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L6$pb, %rcx
367 ; LARGE-PIC-NEXT:    addq %rax, %rcx
368 ; LARGE-PIC-NEXT:    movabsq $unknown_size_data@GOTOFF, %rax
369 ; LARGE-PIC-NEXT:    movl 8(%rcx,%rax), %eax
370 ; LARGE-PIC-NEXT:    retq
371   %rv = load i32, ptr getelementptr inbounds (i32, ptr @unknown_size_data, i64 2)
372   ret i32 %rv
375 define dso_local void @global_fn() #0 {
376 ; CHECK-LABEL: global_fn:
377 ; CHECK:       # %bb.0:
378 ; CHECK-NEXT:    retq
379   ret void
382 define internal void @static_fn() #0 {
383 ; CHECK-LABEL: static_fn:
384 ; CHECK:       # %bb.0:
385 ; CHECK-NEXT:    retq
386   ret void
389 declare void @extern_fn()
391 define dso_local ptr @lea_static_fn() #0 {
392 ; SMALL-STATIC-LABEL: lea_static_fn:
393 ; SMALL-STATIC:       # %bb.0:
394 ; SMALL-STATIC-NEXT:    movl $static_fn, %eax
395 ; SMALL-STATIC-NEXT:    retq
397 ; MEDIUM-STATIC-LABEL: lea_static_fn:
398 ; MEDIUM-STATIC:       # %bb.0:
399 ; MEDIUM-STATIC-NEXT:    leaq static_fn(%rip), %rax
400 ; MEDIUM-STATIC-NEXT:    retq
402 ; LARGE-STATIC-LABEL: lea_static_fn:
403 ; LARGE-STATIC:       # %bb.0:
404 ; LARGE-STATIC-NEXT:    movabsq $static_fn, %rax
405 ; LARGE-STATIC-NEXT:    retq
407 ; SMALL-PIC-LABEL: lea_static_fn:
408 ; SMALL-PIC:       # %bb.0:
409 ; SMALL-PIC-NEXT:    leaq static_fn(%rip), %rax
410 ; SMALL-PIC-NEXT:    retq
412 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_static_fn:
413 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
414 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq static_fn(%rip), %rax
415 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
417 ; MEDIUM-PIC-LABEL: lea_static_fn:
418 ; MEDIUM-PIC:       # %bb.0:
419 ; MEDIUM-PIC-NEXT:    leaq static_fn(%rip), %rax
420 ; MEDIUM-PIC-NEXT:    retq
422 ; LARGE-PIC-LABEL: lea_static_fn:
423 ; LARGE-PIC:       # %bb.0:
424 ; LARGE-PIC-NEXT:  .L9$pb:
425 ; LARGE-PIC-NEXT:    leaq .L9$pb(%rip), %rax
426 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L9$pb, %rcx
427 ; LARGE-PIC-NEXT:    addq %rax, %rcx
428 ; LARGE-PIC-NEXT:    movabsq $static_fn@GOTOFF, %rax
429 ; LARGE-PIC-NEXT:    addq %rcx, %rax
430 ; LARGE-PIC-NEXT:    retq
431   ret ptr @static_fn
434 define dso_local ptr @lea_global_fn() #0 {
435 ; SMALL-STATIC-LABEL: lea_global_fn:
436 ; SMALL-STATIC:       # %bb.0:
437 ; SMALL-STATIC-NEXT:    movl $global_fn, %eax
438 ; SMALL-STATIC-NEXT:    retq
440 ; MEDIUM-STATIC-LABEL: lea_global_fn:
441 ; MEDIUM-STATIC:       # %bb.0:
442 ; MEDIUM-STATIC-NEXT:    leaq global_fn(%rip), %rax
443 ; MEDIUM-STATIC-NEXT:    retq
445 ; LARGE-STATIC-LABEL: lea_global_fn:
446 ; LARGE-STATIC:       # %bb.0:
447 ; LARGE-STATIC-NEXT:    movabsq $global_fn, %rax
448 ; LARGE-STATIC-NEXT:    retq
450 ; SMALL-PIC-LABEL: lea_global_fn:
451 ; SMALL-PIC:       # %bb.0:
452 ; SMALL-PIC-NEXT:    leaq global_fn(%rip), %rax
453 ; SMALL-PIC-NEXT:    retq
455 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_global_fn:
456 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
457 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq global_fn(%rip), %rax
458 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
460 ; MEDIUM-PIC-LABEL: lea_global_fn:
461 ; MEDIUM-PIC:       # %bb.0:
462 ; MEDIUM-PIC-NEXT:    leaq global_fn(%rip), %rax
463 ; MEDIUM-PIC-NEXT:    retq
465 ; LARGE-PIC-LABEL: lea_global_fn:
466 ; LARGE-PIC:       # %bb.0:
467 ; LARGE-PIC-NEXT:  .L10$pb:
468 ; LARGE-PIC-NEXT:    leaq .L10$pb(%rip), %rax
469 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L10$pb, %rcx
470 ; LARGE-PIC-NEXT:    addq %rax, %rcx
471 ; LARGE-PIC-NEXT:    movabsq $global_fn@GOTOFF, %rax
472 ; LARGE-PIC-NEXT:    addq %rcx, %rax
473 ; LARGE-PIC-NEXT:    retq
474   ret ptr @global_fn
477 define dso_local ptr @lea_extern_fn() #0 {
478 ; SMALL-STATIC-LABEL: lea_extern_fn:
479 ; SMALL-STATIC:       # %bb.0:
480 ; SMALL-STATIC-NEXT:    movq extern_fn@GOTPCREL(%rip), %rax
481 ; SMALL-STATIC-NEXT:    retq
483 ; MEDIUM-STATIC-LABEL: lea_extern_fn:
484 ; MEDIUM-STATIC:       # %bb.0:
485 ; MEDIUM-STATIC-NEXT:    movq extern_fn@GOTPCREL(%rip), %rax
486 ; MEDIUM-STATIC-NEXT:    retq
488 ; LARGE-STATIC-LABEL: lea_extern_fn:
489 ; LARGE-STATIC:       # %bb.0:
490 ; LARGE-STATIC-NEXT:    movabsq $extern_fn, %rax
491 ; LARGE-STATIC-NEXT:    retq
493 ; SMALL-PIC-LABEL: lea_extern_fn:
494 ; SMALL-PIC:       # %bb.0:
495 ; SMALL-PIC-NEXT:    movq extern_fn@GOTPCREL(%rip), %rax
496 ; SMALL-PIC-NEXT:    retq
498 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_extern_fn:
499 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
500 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movq extern_fn@GOTPCREL(%rip), %rax
501 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
503 ; MEDIUM-PIC-LABEL: lea_extern_fn:
504 ; MEDIUM-PIC:       # %bb.0:
505 ; MEDIUM-PIC-NEXT:    movq extern_fn@GOTPCREL(%rip), %rax
506 ; MEDIUM-PIC-NEXT:    retq
508 ; LARGE-PIC-LABEL: lea_extern_fn:
509 ; LARGE-PIC:       # %bb.0:
510 ; LARGE-PIC-NEXT:  .L11$pb:
511 ; LARGE-PIC-NEXT:    leaq .L11$pb(%rip), %rax
512 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L11$pb, %rcx
513 ; LARGE-PIC-NEXT:    addq %rax, %rcx
514 ; LARGE-PIC-NEXT:    movabsq $extern_fn@GOT, %rax
515 ; LARGE-PIC-NEXT:    movq (%rcx,%rax), %rax
516 ; LARGE-PIC-NEXT:    retq
517   ret ptr @extern_fn
520 ; FIXME: The result is same for small, medium and large model, because we
521 ; specify pie option in the test case. And the type of tls is initial exec tls.
522 ; For pic code. The large model code for pic tls should be emitted as below.
524 ; .L3:
525 ; leaq  .L3(%rip), %rbx
526 ; movabsq       $_GLOBAL_OFFSET_TABLE_-.L3, %r11
527 ; addq  %r11, %rbx
528 ; leaq  thread_data@TLSGD(%rip), %rdi
529 ; movabsq       $__tls_get_addr@PLTOFF, %rax
530 ; addq  %rbx, %rax
531 ; call  *%rax
532 ; movl  (%rax), %eax
534 ; The medium and small model code for pic tls should be emitted as below.
535 ; data16
536 ; leaq  thread_data@TLSGD(%rip), %rdi
537 ; data16
538 ; data16
539 ; rex64
540 ; callq __tls_get_addr@PLT
541 ; movl  (%rax), %eax
543 define dso_local i32 @load_thread_data() #0 {
544 ; CHECK-LABEL: load_thread_data:
545 ; CHECK:       # %bb.0:
546 ; CHECK-NEXT:    movq thread_data@GOTTPOFF(%rip), %rax
547 ; CHECK-NEXT:    movl %fs:(%rax), %eax
548 ; CHECK-NEXT:    retq
549   %1 = load i32, ptr @thread_data, align 4
550   ret i32 %1
553 define dso_local float @load_constant_pool(float %x) #0 {
554 ; SMALL-STATIC-LABEL: load_constant_pool:
555 ; SMALL-STATIC:       # %bb.0:
556 ; SMALL-STATIC-NEXT:    addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
557 ; SMALL-STATIC-NEXT:    retq
559 ; MEDIUM-STATIC-LABEL: load_constant_pool:
560 ; MEDIUM-STATIC:       # %bb.0:
561 ; MEDIUM-STATIC-NEXT:    movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax
562 ; MEDIUM-STATIC-NEXT:    addss (%rax), %xmm0
563 ; MEDIUM-STATIC-NEXT:    retq
565 ; LARGE-STATIC-LABEL: load_constant_pool:
566 ; LARGE-STATIC:       # %bb.0:
567 ; LARGE-STATIC-NEXT:    movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax
568 ; LARGE-STATIC-NEXT:    addss (%rax), %xmm0
569 ; LARGE-STATIC-NEXT:    retq
571 ; SMALL-PIC-LABEL: load_constant_pool:
572 ; SMALL-PIC:       # %bb.0:
573 ; SMALL-PIC-NEXT:    addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
574 ; SMALL-PIC-NEXT:    retq
576 ; MEDIUM-SMALL-DATA-PIC-LABEL: load_constant_pool:
577 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
578 ; MEDIUM-SMALL-DATA-PIC-NEXT:    addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
579 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
581 ; MEDIUM-PIC-LABEL: load_constant_pool:
582 ; MEDIUM-PIC:       # %bb.0:
583 ; MEDIUM-PIC-NEXT:    addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
584 ; MEDIUM-PIC-NEXT:    retq
586 ; LARGE-PIC-LABEL: load_constant_pool:
587 ; LARGE-PIC:       # %bb.0:
588 ; LARGE-PIC-NEXT:  .L13$pb:
589 ; LARGE-PIC-NEXT:    leaq .L13$pb(%rip), %rax
590 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L13$pb, %rcx
591 ; LARGE-PIC-NEXT:    addq %rax, %rcx
592 ; LARGE-PIC-NEXT:    movabsq ${{\.?LCPI[0-9]+_[0-9]+}}@GOTOFF, %rax
593 ; LARGE-PIC-NEXT:    addss (%rcx,%rax), %xmm0
594 ; LARGE-PIC-NEXT:    retq
595   %a = fadd float %x, 1.0
596   ret float %a
599 attributes #0 = { noinline nounwind uwtable }
601 !llvm.module.flags = !{!0, !1, !2}
602 !llvm.ident = !{!3}
604 !0 = !{i32 1, !"wchar_size", i32 4}
605 !1 = !{i32 7, !"PIC Level", i32 2}
606 !2 = !{i32 7, !"PIE Level", i32 2}
607 !3 = !{!"clang version 7.0.0 "}