[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / X86 / code-model-elf.ll
blobaef1e0e117ee7c253f0d6a8c75155195052547a3
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
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 | FileCheck %s --check-prefix=CHECK --check-prefix=MEDIUM-PIC
10 ; RUN: llc -verify-machineinstrs < %s -relocation-model=pic    -code-model=large  | FileCheck %s --check-prefix=CHECK --check-prefix=LARGE-PIC
12 ; Generated from this C source:
14 ; static int static_data[10];
15 ; int global_data[10] = {1, 2};
16 ; extern int extern_data[10];
18 ; int *lea_static_data() { return &static_data[0]; }
19 ; int *lea_global_data() { return &global_data[0]; }
20 ; int *lea_extern_data() { return &extern_data[0]; }
22 ; static void static_fn(void) {}
23 ; void global_fn(void) {}
24 ; void extern_fn(void);
26 ; typedef void (*void_fn)(void);
27 ; void_fn lea_static_fn() { return &static_fn; }
28 ; void_fn lea_global_fn() { return &global_fn; }
29 ; void_fn lea_extern_fn() { return &extern_fn; }
32 ; ModuleID = 'model.c'
33 source_filename = "model.c"
34 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
35 target triple = "x86_64--linux"
37 @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
38 @static_data = internal global [10 x i32] zeroinitializer, align 16
39 @extern_data = external global [10 x i32], align 16
40 @thread_data = external thread_local global i32, align 4
41 @unknown_size_data = dso_local global [0 x i32] zeroinitializer, align 16
44 define dso_local ptr @lea_static_data() #0 {
45 ; SMALL-STATIC-LABEL: lea_static_data:
46 ; SMALL-STATIC:       # %bb.0:
47 ; SMALL-STATIC-NEXT:    movl $static_data, %eax
48 ; SMALL-STATIC-NEXT:    retq
50 ; MEDIUM-STATIC-LABEL: lea_static_data:
51 ; MEDIUM-STATIC:       # %bb.0:
52 ; MEDIUM-STATIC-NEXT:    movabsq $static_data, %rax
53 ; MEDIUM-STATIC-NEXT:    retq
55 ; LARGE-STATIC-LABEL: lea_static_data:
56 ; LARGE-STATIC:       # %bb.0:
57 ; LARGE-STATIC-NEXT:    movabsq $static_data, %rax
58 ; LARGE-STATIC-NEXT:    retq
60 ; SMALL-PIC-LABEL: lea_static_data:
61 ; SMALL-PIC:       # %bb.0:
62 ; SMALL-PIC-NEXT:    leaq static_data(%rip), %rax
63 ; SMALL-PIC-NEXT:    retq
65 ; MEDIUM-PIC-LABEL: lea_static_data:
66 ; MEDIUM-PIC:       # %bb.0:
67 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
68 ; MEDIUM-PIC-NEXT:    movabsq $static_data@GOTOFF, %rax
69 ; MEDIUM-PIC-NEXT:    addq %rcx, %rax
70 ; MEDIUM-PIC-NEXT:    retq
72 ; LARGE-PIC-LABEL: lea_static_data:
73 ; LARGE-PIC:       # %bb.0:
74 ; LARGE-PIC-NEXT:  .L0$pb:
75 ; LARGE-PIC-NEXT:    leaq .L0$pb(%rip), %rax
76 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L0$pb, %rcx
77 ; LARGE-PIC-NEXT:    addq %rax, %rcx
78 ; LARGE-PIC-NEXT:    movabsq $static_data@GOTOFF, %rax
79 ; LARGE-PIC-NEXT:    addq %rcx, %rax
80 ; LARGE-PIC-NEXT:    retq
81   ret ptr @static_data
84 define dso_local ptr @lea_global_data() #0 {
85 ; SMALL-STATIC-LABEL: lea_global_data:
86 ; SMALL-STATIC:       # %bb.0:
87 ; SMALL-STATIC-NEXT:    movl $global_data, %eax
88 ; SMALL-STATIC-NEXT:    retq
90 ; MEDIUM-STATIC-LABEL: lea_global_data:
91 ; MEDIUM-STATIC:       # %bb.0:
92 ; MEDIUM-STATIC-NEXT:    movabsq $global_data, %rax
93 ; MEDIUM-STATIC-NEXT:    retq
95 ; LARGE-STATIC-LABEL: lea_global_data:
96 ; LARGE-STATIC:       # %bb.0:
97 ; LARGE-STATIC-NEXT:    movabsq $global_data, %rax
98 ; LARGE-STATIC-NEXT:    retq
100 ; SMALL-PIC-LABEL: lea_global_data:
101 ; SMALL-PIC:       # %bb.0:
102 ; SMALL-PIC-NEXT:    leaq global_data(%rip), %rax
103 ; SMALL-PIC-NEXT:    retq
105 ; MEDIUM-PIC-LABEL: lea_global_data:
106 ; MEDIUM-PIC:       # %bb.0:
107 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
108 ; MEDIUM-PIC-NEXT:    movabsq $global_data@GOTOFF, %rax
109 ; MEDIUM-PIC-NEXT:    addq %rcx, %rax
110 ; MEDIUM-PIC-NEXT:    retq
112 ; LARGE-PIC-LABEL: lea_global_data:
113 ; LARGE-PIC:       # %bb.0:
114 ; LARGE-PIC-NEXT:  .L1$pb:
115 ; LARGE-PIC-NEXT:    leaq .L1$pb(%rip), %rax
116 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L1$pb, %rcx
117 ; LARGE-PIC-NEXT:    addq %rax, %rcx
118 ; LARGE-PIC-NEXT:    movabsq $global_data@GOTOFF, %rax
119 ; LARGE-PIC-NEXT:    addq %rcx, %rax
120 ; LARGE-PIC-NEXT:    retq
121   ret ptr @global_data
124 define dso_local ptr @lea_extern_data() #0 {
125 ; SMALL-STATIC-LABEL: lea_extern_data:
126 ; SMALL-STATIC:       # %bb.0:
127 ; SMALL-STATIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
128 ; SMALL-STATIC-NEXT:    retq
130 ; MEDIUM-STATIC-LABEL: lea_extern_data:
131 ; MEDIUM-STATIC:       # %bb.0:
132 ; MEDIUM-STATIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
133 ; MEDIUM-STATIC-NEXT:    retq
135 ; LARGE-STATIC-LABEL: lea_extern_data:
136 ; LARGE-STATIC:       # %bb.0:
137 ; LARGE-STATIC-NEXT:    movabsq $extern_data, %rax
138 ; LARGE-STATIC-NEXT:    retq
140 ; SMALL-PIC-LABEL: lea_extern_data:
141 ; SMALL-PIC:       # %bb.0:
142 ; SMALL-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
143 ; SMALL-PIC-NEXT:    retq
145 ; MEDIUM-PIC-LABEL: lea_extern_data:
146 ; MEDIUM-PIC:       # %bb.0:
147 ; MEDIUM-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
148 ; MEDIUM-PIC-NEXT:    retq
150 ; LARGE-PIC-LABEL: lea_extern_data:
151 ; LARGE-PIC:       # %bb.0:
152 ; LARGE-PIC-NEXT:  .L2$pb:
153 ; LARGE-PIC-NEXT:    leaq .L2$pb(%rip), %rax
154 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L2$pb, %rcx
155 ; LARGE-PIC-NEXT:    addq %rax, %rcx
156 ; LARGE-PIC-NEXT:    movabsq $extern_data@GOT, %rax
157 ; LARGE-PIC-NEXT:    movq (%rcx,%rax), %rax
158 ; LARGE-PIC-NEXT:    retq
159   ret ptr @extern_data
162 define dso_local ptr @lea_unknown_size_data() #0 {
163 ; SMALL-STATIC-LABEL: lea_unknown_size_data:
164 ; SMALL-STATIC:       # %bb.0:
165 ; SMALL-STATIC-NEXT:    movl $unknown_size_data, %eax
166 ; SMALL-STATIC-NEXT:    retq
168 ; MEDIUM-STATIC-LABEL: lea_unknown_size_data:
169 ; MEDIUM-STATIC:       # %bb.0:
170 ; MEDIUM-STATIC-NEXT:    movabsq $unknown_size_data, %rax
171 ; MEDIUM-STATIC-NEXT:    retq
173 ; LARGE-STATIC-LABEL: lea_unknown_size_data:
174 ; LARGE-STATIC:       # %bb.0:
175 ; LARGE-STATIC-NEXT:    movabsq $unknown_size_data, %rax
176 ; LARGE-STATIC-NEXT:    retq
178 ; SMALL-PIC-LABEL: lea_unknown_size_data:
179 ; SMALL-PIC:       # %bb.0:
180 ; SMALL-PIC-NEXT:    leaq unknown_size_data(%rip), %rax
181 ; SMALL-PIC-NEXT:    retq
183 ; MEDIUM-PIC-LABEL: lea_unknown_size_data:
184 ; MEDIUM-PIC:       # %bb.0:
185 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
186 ; MEDIUM-PIC-NEXT:    movabsq $unknown_size_data@GOTOFF, %rax
187 ; MEDIUM-PIC-NEXT:    addq %rcx, %rax
188 ; MEDIUM-PIC-NEXT:    retq
190 ; LARGE-PIC-LABEL: lea_unknown_size_data:
191 ; LARGE-PIC:       # %bb.0:
192 ; LARGE-PIC-NEXT:  .L3$pb:
193 ; LARGE-PIC-NEXT:    leaq .L3$pb(%rip), %rax
194 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L3$pb, %rcx
195 ; LARGE-PIC-NEXT:    addq %rax, %rcx
196 ; LARGE-PIC-NEXT:    movabsq $unknown_size_data@GOTOFF, %rax
197 ; LARGE-PIC-NEXT:    addq %rcx, %rax
198 ; LARGE-PIC-NEXT:    retq
199   ret ptr @unknown_size_data
202 define dso_local i32 @load_global_data() #0 {
203 ; SMALL-STATIC-LABEL: load_global_data:
204 ; SMALL-STATIC:       # %bb.0:
205 ; SMALL-STATIC-NEXT:    movl global_data+8(%rip), %eax
206 ; SMALL-STATIC-NEXT:    retq
208 ; MEDIUM-STATIC-LABEL: load_global_data:
209 ; MEDIUM-STATIC:       # %bb.0:
210 ; MEDIUM-STATIC-NEXT:    movabsq $global_data, %rax
211 ; MEDIUM-STATIC-NEXT:    movl 8(%rax), %eax
212 ; MEDIUM-STATIC-NEXT:    retq
214 ; LARGE-STATIC-LABEL: load_global_data:
215 ; LARGE-STATIC:       # %bb.0:
216 ; LARGE-STATIC-NEXT:    movabsq $global_data, %rax
217 ; LARGE-STATIC-NEXT:    movl 8(%rax), %eax
218 ; LARGE-STATIC-NEXT:    retq
220 ; SMALL-PIC-LABEL: load_global_data:
221 ; SMALL-PIC:       # %bb.0:
222 ; SMALL-PIC-NEXT:    movl global_data+8(%rip), %eax
223 ; SMALL-PIC-NEXT:    retq
225 ; MEDIUM-PIC-LABEL: load_global_data:
226 ; MEDIUM-PIC:       # %bb.0:
227 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
228 ; MEDIUM-PIC-NEXT:    movabsq $global_data@GOTOFF, %rcx
229 ; MEDIUM-PIC-NEXT:    movl 8(%rax,%rcx), %eax
230 ; MEDIUM-PIC-NEXT:    retq
232 ; LARGE-PIC-LABEL: load_global_data:
233 ; LARGE-PIC:       # %bb.0:
234 ; LARGE-PIC-NEXT:  .L4$pb:
235 ; LARGE-PIC-NEXT:    leaq .L4$pb(%rip), %rax
236 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L4$pb, %rcx
237 ; LARGE-PIC-NEXT:    addq %rax, %rcx
238 ; LARGE-PIC-NEXT:    movabsq $global_data@GOTOFF, %rax
239 ; LARGE-PIC-NEXT:    movl 8(%rcx,%rax), %eax
240 ; LARGE-PIC-NEXT:    retq
241   %rv = load i32, ptr getelementptr inbounds ([10 x i32], ptr @global_data, i64 0, i64 2)
242   ret i32 %rv
245 define dso_local i32 @load_extern_data() #0 {
246 ; SMALL-STATIC-LABEL: load_extern_data:
247 ; SMALL-STATIC:       # %bb.0:
248 ; SMALL-STATIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
249 ; SMALL-STATIC-NEXT:    movl 8(%rax), %eax
250 ; SMALL-STATIC-NEXT:    retq
252 ; MEDIUM-STATIC-LABEL: load_extern_data:
253 ; MEDIUM-STATIC:       # %bb.0:
254 ; MEDIUM-STATIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
255 ; MEDIUM-STATIC-NEXT:    movl 8(%rax), %eax
256 ; MEDIUM-STATIC-NEXT:    retq
258 ; LARGE-STATIC-LABEL: load_extern_data:
259 ; LARGE-STATIC:       # %bb.0:
260 ; LARGE-STATIC-NEXT:    movabsq $extern_data, %rax
261 ; LARGE-STATIC-NEXT:    movl 8(%rax), %eax
262 ; LARGE-STATIC-NEXT:    retq
264 ; SMALL-PIC-LABEL: load_extern_data:
265 ; SMALL-PIC:       # %bb.0:
266 ; SMALL-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
267 ; SMALL-PIC-NEXT:    movl 8(%rax), %eax
268 ; SMALL-PIC-NEXT:    retq
270 ; MEDIUM-PIC-LABEL: load_extern_data:
271 ; MEDIUM-PIC:       # %bb.0:
272 ; MEDIUM-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
273 ; MEDIUM-PIC-NEXT:    movl 8(%rax), %eax
274 ; MEDIUM-PIC-NEXT:    retq
276 ; LARGE-PIC-LABEL: load_extern_data:
277 ; LARGE-PIC:       # %bb.0:
278 ; LARGE-PIC-NEXT:  .L5$pb:
279 ; LARGE-PIC-NEXT:    leaq .L5$pb(%rip), %rax
280 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L5$pb, %rcx
281 ; LARGE-PIC-NEXT:    addq %rax, %rcx
282 ; LARGE-PIC-NEXT:    movabsq $extern_data@GOT, %rax
283 ; LARGE-PIC-NEXT:    movq (%rcx,%rax), %rax
284 ; LARGE-PIC-NEXT:    movl 8(%rax), %eax
285 ; LARGE-PIC-NEXT:    retq
286   %rv = load i32, ptr getelementptr inbounds ([10 x i32], ptr @extern_data, i64 0, i64 2)
287   ret i32 %rv
290 define dso_local i32 @load_unknown_size_data() #0 {
291 ; SMALL-STATIC-LABEL: load_unknown_size_data:
292 ; SMALL-STATIC:       # %bb.0:
293 ; SMALL-STATIC-NEXT:    movl unknown_size_data+8(%rip), %eax
294 ; SMALL-STATIC-NEXT:    retq
296 ; MEDIUM-STATIC-LABEL: load_unknown_size_data:
297 ; MEDIUM-STATIC:       # %bb.0:
298 ; MEDIUM-STATIC-NEXT:    movabsq $unknown_size_data, %rax
299 ; MEDIUM-STATIC-NEXT:    movl 8(%rax), %eax
300 ; MEDIUM-STATIC-NEXT:    retq
302 ; LARGE-STATIC-LABEL: load_unknown_size_data:
303 ; LARGE-STATIC:       # %bb.0:
304 ; LARGE-STATIC-NEXT:    movabsq $unknown_size_data, %rax
305 ; LARGE-STATIC-NEXT:    movl 8(%rax), %eax
306 ; LARGE-STATIC-NEXT:    retq
308 ; SMALL-PIC-LABEL: load_unknown_size_data:
309 ; SMALL-PIC:       # %bb.0:
310 ; SMALL-PIC-NEXT:    movl unknown_size_data+8(%rip), %eax
311 ; SMALL-PIC-NEXT:    retq
313 ; MEDIUM-PIC-LABEL: load_unknown_size_data:
314 ; MEDIUM-PIC:       # %bb.0:
315 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
316 ; MEDIUM-PIC-NEXT:    movabsq $unknown_size_data@GOTOFF, %rcx
317 ; MEDIUM-PIC-NEXT:    movl 8(%rax,%rcx), %eax
318 ; MEDIUM-PIC-NEXT:    retq
320 ; LARGE-PIC-LABEL: load_unknown_size_data:
321 ; LARGE-PIC:       # %bb.0:
322 ; LARGE-PIC-NEXT:  .L6$pb:
323 ; LARGE-PIC-NEXT:    leaq .L6$pb(%rip), %rax
324 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L6$pb, %rcx
325 ; LARGE-PIC-NEXT:    addq %rax, %rcx
326 ; LARGE-PIC-NEXT:    movabsq $unknown_size_data@GOTOFF, %rax
327 ; LARGE-PIC-NEXT:    movl 8(%rcx,%rax), %eax
328 ; LARGE-PIC-NEXT:    retq
329   %rv = load i32, ptr getelementptr inbounds (i32, ptr @unknown_size_data, i64 2)
330   ret i32 %rv
333 define dso_local void @global_fn() #0 {
334 ; CHECK-LABEL: global_fn:
335 ; CHECK:       # %bb.0:
336 ; CHECK-NEXT:    retq
337   ret void
340 define internal void @static_fn() #0 {
341 ; CHECK-LABEL: static_fn:
342 ; CHECK:       # %bb.0:
343 ; CHECK-NEXT:    retq
344   ret void
347 declare void @extern_fn()
349 define dso_local ptr @lea_static_fn() #0 {
350 ; SMALL-STATIC-LABEL: lea_static_fn:
351 ; SMALL-STATIC:       # %bb.0:
352 ; SMALL-STATIC-NEXT:    movl $static_fn, %eax
353 ; SMALL-STATIC-NEXT:    retq
355 ; MEDIUM-STATIC-LABEL: lea_static_fn:
356 ; MEDIUM-STATIC:       # %bb.0:
357 ; MEDIUM-STATIC-NEXT:    leaq static_fn(%rip), %rax
358 ; MEDIUM-STATIC-NEXT:    retq
360 ; LARGE-STATIC-LABEL: lea_static_fn:
361 ; LARGE-STATIC:       # %bb.0:
362 ; LARGE-STATIC-NEXT:    movabsq $static_fn, %rax
363 ; LARGE-STATIC-NEXT:    retq
365 ; SMALL-PIC-LABEL: lea_static_fn:
366 ; SMALL-PIC:       # %bb.0:
367 ; SMALL-PIC-NEXT:    leaq static_fn(%rip), %rax
368 ; SMALL-PIC-NEXT:    retq
370 ; MEDIUM-PIC-LABEL: lea_static_fn:
371 ; MEDIUM-PIC:       # %bb.0:
372 ; MEDIUM-PIC-NEXT:    leaq static_fn(%rip), %rax
373 ; MEDIUM-PIC-NEXT:    retq
375 ; LARGE-PIC-LABEL: lea_static_fn:
376 ; LARGE-PIC:       # %bb.0:
377 ; LARGE-PIC-NEXT:  .L9$pb:
378 ; LARGE-PIC-NEXT:    leaq .L9$pb(%rip), %rax
379 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L9$pb, %rcx
380 ; LARGE-PIC-NEXT:    addq %rax, %rcx
381 ; LARGE-PIC-NEXT:    movabsq $static_fn@GOTOFF, %rax
382 ; LARGE-PIC-NEXT:    addq %rcx, %rax
383 ; LARGE-PIC-NEXT:    retq
384   ret ptr @static_fn
387 define dso_local ptr @lea_global_fn() #0 {
388 ; SMALL-STATIC-LABEL: lea_global_fn:
389 ; SMALL-STATIC:       # %bb.0:
390 ; SMALL-STATIC-NEXT:    movl $global_fn, %eax
391 ; SMALL-STATIC-NEXT:    retq
393 ; MEDIUM-STATIC-LABEL: lea_global_fn:
394 ; MEDIUM-STATIC:       # %bb.0:
395 ; MEDIUM-STATIC-NEXT:    leaq global_fn(%rip), %rax
396 ; MEDIUM-STATIC-NEXT:    retq
398 ; LARGE-STATIC-LABEL: lea_global_fn:
399 ; LARGE-STATIC:       # %bb.0:
400 ; LARGE-STATIC-NEXT:    movabsq $global_fn, %rax
401 ; LARGE-STATIC-NEXT:    retq
403 ; SMALL-PIC-LABEL: lea_global_fn:
404 ; SMALL-PIC:       # %bb.0:
405 ; SMALL-PIC-NEXT:    leaq global_fn(%rip), %rax
406 ; SMALL-PIC-NEXT:    retq
408 ; MEDIUM-PIC-LABEL: lea_global_fn:
409 ; MEDIUM-PIC:       # %bb.0:
410 ; MEDIUM-PIC-NEXT:    leaq global_fn(%rip), %rax
411 ; MEDIUM-PIC-NEXT:    retq
413 ; LARGE-PIC-LABEL: lea_global_fn:
414 ; LARGE-PIC:       # %bb.0:
415 ; LARGE-PIC-NEXT:  .L10$pb:
416 ; LARGE-PIC-NEXT:    leaq .L10$pb(%rip), %rax
417 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L10$pb, %rcx
418 ; LARGE-PIC-NEXT:    addq %rax, %rcx
419 ; LARGE-PIC-NEXT:    movabsq $global_fn@GOTOFF, %rax
420 ; LARGE-PIC-NEXT:    addq %rcx, %rax
421 ; LARGE-PIC-NEXT:    retq
422   ret ptr @global_fn
425 define dso_local ptr @lea_extern_fn() #0 {
426 ; SMALL-STATIC-LABEL: lea_extern_fn:
427 ; SMALL-STATIC:       # %bb.0:
428 ; SMALL-STATIC-NEXT:    movq extern_fn@GOTPCREL(%rip), %rax
429 ; SMALL-STATIC-NEXT:    retq
431 ; MEDIUM-STATIC-LABEL: lea_extern_fn:
432 ; MEDIUM-STATIC:       # %bb.0:
433 ; MEDIUM-STATIC-NEXT:    movq extern_fn@GOTPCREL(%rip), %rax
434 ; MEDIUM-STATIC-NEXT:    retq
436 ; LARGE-STATIC-LABEL: lea_extern_fn:
437 ; LARGE-STATIC:       # %bb.0:
438 ; LARGE-STATIC-NEXT:    movabsq $extern_fn, %rax
439 ; LARGE-STATIC-NEXT:    retq
441 ; SMALL-PIC-LABEL: lea_extern_fn:
442 ; SMALL-PIC:       # %bb.0:
443 ; SMALL-PIC-NEXT:    movq extern_fn@GOTPCREL(%rip), %rax
444 ; SMALL-PIC-NEXT:    retq
446 ; MEDIUM-PIC-LABEL: lea_extern_fn:
447 ; MEDIUM-PIC:       # %bb.0:
448 ; MEDIUM-PIC-NEXT:    movq extern_fn@GOTPCREL(%rip), %rax
449 ; MEDIUM-PIC-NEXT:    retq
451 ; LARGE-PIC-LABEL: lea_extern_fn:
452 ; LARGE-PIC:       # %bb.0:
453 ; LARGE-PIC-NEXT:  .L11$pb:
454 ; LARGE-PIC-NEXT:    leaq .L11$pb(%rip), %rax
455 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L11$pb, %rcx
456 ; LARGE-PIC-NEXT:    addq %rax, %rcx
457 ; LARGE-PIC-NEXT:    movabsq $extern_fn@GOT, %rax
458 ; LARGE-PIC-NEXT:    movq (%rcx,%rax), %rax
459 ; LARGE-PIC-NEXT:    retq
460   ret ptr @extern_fn
463 ; FIXME: The result is same for small, medium and large model, because we
464 ; specify pie option in the test case. And the type of tls is initial exec tls.
465 ; For pic code. The large model code for pic tls should be emitted as below.
467 ; .L3:
468 ; leaq  .L3(%rip), %rbx
469 ; movabsq       $_GLOBAL_OFFSET_TABLE_-.L3, %r11
470 ; addq  %r11, %rbx
471 ; leaq  thread_data@TLSGD(%rip), %rdi
472 ; movabsq       $__tls_get_addr@PLTOFF, %rax
473 ; addq  %rbx, %rax
474 ; call  *%rax
475 ; movl  (%rax), %eax
477 ; The medium and small model code for pic tls should be emitted as below.
478 ; data16
479 ; leaq  thread_data@TLSGD(%rip), %rdi
480 ; data16
481 ; data16
482 ; rex64
483 ; callq __tls_get_addr@PLT
484 ; movl  (%rax), %eax
486 define dso_local i32 @load_thread_data() #0 {
487 ; CHECK-LABEL: load_thread_data:
488 ; CHECK:       # %bb.0:
489 ; CHECK-NEXT:    movq thread_data@GOTTPOFF(%rip), %rax
490 ; CHECK-NEXT:    movl %fs:(%rax), %eax
491 ; CHECK-NEXT:    retq
492   %1 = load i32, ptr @thread_data, align 4
493   ret i32 %1
496 define dso_local float @load_constant_pool(float %x) #0 {
497 ; SMALL-STATIC-LABEL: load_constant_pool:
498 ; SMALL-STATIC:       # %bb.0:
499 ; SMALL-STATIC-NEXT:    addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
500 ; SMALL-STATIC-NEXT:    retq
502 ; MEDIUM-STATIC-LABEL: load_constant_pool:
503 ; MEDIUM-STATIC:       # %bb.0:
504 ; MEDIUM-STATIC-NEXT:    movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax
505 ; MEDIUM-STATIC-NEXT:    addss (%rax), %xmm0
506 ; MEDIUM-STATIC-NEXT:    retq
508 ; LARGE-STATIC-LABEL: load_constant_pool:
509 ; LARGE-STATIC:       # %bb.0:
510 ; LARGE-STATIC-NEXT:    movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax
511 ; LARGE-STATIC-NEXT:    addss (%rax), %xmm0
512 ; LARGE-STATIC-NEXT:    retq
514 ; SMALL-PIC-LABEL: load_constant_pool:
515 ; SMALL-PIC:       # %bb.0:
516 ; SMALL-PIC-NEXT:    addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
517 ; SMALL-PIC-NEXT:    retq
519 ; MEDIUM-PIC-LABEL: load_constant_pool:
520 ; MEDIUM-PIC:       # %bb.0:
521 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
522 ; MEDIUM-PIC-NEXT:    movabsq ${{\.?LCPI[0-9]+_[0-9]+}}@GOTOFF, %rcx
523 ; MEDIUM-PIC-NEXT:    addss (%rax,%rcx), %xmm0
524 ; MEDIUM-PIC-NEXT:    retq
526 ; LARGE-PIC-LABEL: load_constant_pool:
527 ; LARGE-PIC:       # %bb.0:
528 ; LARGE-PIC-NEXT:  .L13$pb:
529 ; LARGE-PIC-NEXT:    leaq .L13$pb(%rip), %rax
530 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L13$pb, %rcx
531 ; LARGE-PIC-NEXT:    addq %rax, %rcx
532 ; LARGE-PIC-NEXT:    movabsq ${{\.?LCPI[0-9]+_[0-9]+}}@GOTOFF, %rax
533 ; LARGE-PIC-NEXT:    addss (%rcx,%rax), %xmm0
534 ; LARGE-PIC-NEXT:    retq
535   %a = fadd float %x, 1.0
536   ret float %a
539 attributes #0 = { noinline nounwind uwtable }
541 !llvm.module.flags = !{!0, !1, !2}
542 !llvm.ident = !{!3}
544 !0 = !{i32 1, !"wchar_size", i32 4}
545 !1 = !{i32 7, !"PIC Level", i32 2}
546 !2 = !{i32 7, !"PIE Level", i32 2}
547 !3 = !{!"clang version 7.0.0 "}