[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / CodeGen / X86 / code-model-elf.ll
blobf60f75bc26911e4bf73a4e8587e3e434238115f0
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
12 ; RUN: llc -verify-machineinstrs < %s -relocation-model=pic    -code-model=large  -large-data-threshold=1000 | FileCheck %s --check-prefix=CHECK --check-prefix=LARGE-SMALL-DATA-PIC
14 ; Check that the relocations we emit are valid.
15 ; RUN: llc -verify-machineinstrs < %s -relocation-model=static -code-model=small  -filetype=obj -o /dev/null
16 ; RUN: llc -verify-machineinstrs < %s -relocation-model=static -code-model=medium -filetype=obj -o /dev/null
17 ; RUN: llc -verify-machineinstrs < %s -relocation-model=static -code-model=large  -filetype=obj -o /dev/null
18 ; RUN: llc -verify-machineinstrs < %s -relocation-model=pic    -code-model=small  -filetype=obj -o /dev/null
19 ; RUN: llc -verify-machineinstrs < %s -relocation-model=pic    -code-model=medium -large-data-threshold=1000 -filetype=obj -o /dev/null
20 ; RUN: llc -verify-machineinstrs < %s -relocation-model=pic    -code-model=medium -filetype=obj -o /dev/null
21 ; RUN: llc -verify-machineinstrs < %s -relocation-model=pic    -code-model=large  -filetype=obj -o /dev/null
22 ; RUN: llc -verify-machineinstrs < %s -relocation-model=pic    -code-model=large  -large-data-threshold=1000 -filetype=obj -o /dev/null
24 ; Generated from this C source:
26 ; static int static_data[10];
27 ; int global_data[10] = {1, 2};
28 ; extern int extern_data[10];
30 ; int *lea_static_data() { return &static_data[0]; }
31 ; int *lea_global_data() { return &global_data[0]; }
32 ; int *lea_extern_data() { return &extern_data[0]; }
34 ; static void static_fn(void) {}
35 ; void global_fn(void) {}
36 ; void extern_fn(void);
38 ; typedef void (*void_fn)(void);
39 ; void_fn lea_static_fn() { return &static_fn; }
40 ; void_fn lea_global_fn() { return &global_fn; }
41 ; void_fn lea_extern_fn() { return &extern_fn; }
44 ; ModuleID = 'model.c'
45 source_filename = "model.c"
46 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
47 target triple = "x86_64--linux"
49 %t = type opaque
51 @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
52 @static_data = internal global [10 x i32] zeroinitializer, align 16
53 @static_data_alias = internal constant ptr getelementptr inbounds ([10 x i32], ptr @static_data, i64 0, i64 2), align 8
54 @extern_data = external global [10 x i32], align 16
55 @thread_data = external thread_local global i32, align 4
56 @unknown_size_data = dso_local global [0 x i32] zeroinitializer, align 16
57 @bool = dso_local global i1 false
58 @opaque = external dso_local global %t
59 @forced_small_data = dso_local global [10 x i32] zeroinitializer, code_model "small", align 16
60 @forced_large_data = dso_local global [10 x i32] zeroinitializer, code_model "large", align 16
61 @__ehdr_start = external dso_local global i8
62 @__start_foo = external dso_local global i8
63 @__stop_foo = external dso_local global i8
65 define dso_local ptr @lea_static_data() #0 {
66 ; SMALL-STATIC-LABEL: lea_static_data:
67 ; SMALL-STATIC:       # %bb.0:
68 ; SMALL-STATIC-NEXT:    movl $static_data, %eax
69 ; SMALL-STATIC-NEXT:    retq
71 ; MEDIUM-STATIC-LABEL: lea_static_data:
72 ; MEDIUM-STATIC:       # %bb.0:
73 ; MEDIUM-STATIC-NEXT:    movabsq $static_data, %rax
74 ; MEDIUM-STATIC-NEXT:    retq
76 ; LARGE-STATIC-LABEL: lea_static_data:
77 ; LARGE-STATIC:       # %bb.0:
78 ; LARGE-STATIC-NEXT:    movabsq $static_data, %rax
79 ; LARGE-STATIC-NEXT:    retq
81 ; SMALL-PIC-LABEL: lea_static_data:
82 ; SMALL-PIC:       # %bb.0:
83 ; SMALL-PIC-NEXT:    leaq static_data(%rip), %rax
84 ; SMALL-PIC-NEXT:    retq
86 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_static_data:
87 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
88 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq static_data(%rip), %rax
89 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
91 ; MEDIUM-PIC-LABEL: lea_static_data:
92 ; MEDIUM-PIC:       # %bb.0:
93 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
94 ; MEDIUM-PIC-NEXT:    movabsq $static_data@GOTOFF, %rax
95 ; MEDIUM-PIC-NEXT:    addq %rcx, %rax
96 ; MEDIUM-PIC-NEXT:    retq
98 ; LARGE-PIC-LABEL: lea_static_data:
99 ; LARGE-PIC:       # %bb.0:
100 ; LARGE-PIC-NEXT:  .L0$pb:
101 ; LARGE-PIC-NEXT:    leaq .L0$pb(%rip), %rax
102 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L0$pb, %rcx
103 ; LARGE-PIC-NEXT:    addq %rax, %rcx
104 ; LARGE-PIC-NEXT:    movabsq $static_data@GOTOFF, %rax
105 ; LARGE-PIC-NEXT:    addq %rcx, %rax
106 ; LARGE-PIC-NEXT:    retq
108 ; LARGE-SMALL-DATA-PIC-LABEL: lea_static_data:
109 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
110 ; LARGE-SMALL-DATA-PIC-NEXT:  .L0$pb:
111 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L0$pb(%rip), %rax
112 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L0$pb, %rcx
113 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
114 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $static_data@GOTOFF, %rax
115 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
116 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
117   ret ptr @static_data
120 define dso_local ptr @lea_static_data_alias() #0 {
121 ; SMALL-STATIC-LABEL: lea_static_data_alias:
122 ; SMALL-STATIC:       # %bb.0:
123 ; SMALL-STATIC-NEXT:    movl $static_data_alias, %eax
124 ; SMALL-STATIC-NEXT:    retq
126 ; MEDIUM-STATIC-LABEL: lea_static_data_alias:
127 ; MEDIUM-STATIC:       # %bb.0:
128 ; MEDIUM-STATIC-NEXT:    movabsq $static_data_alias, %rax
129 ; MEDIUM-STATIC-NEXT:    retq
131 ; LARGE-STATIC-LABEL: lea_static_data_alias:
132 ; LARGE-STATIC:       # %bb.0:
133 ; LARGE-STATIC-NEXT:    movabsq $static_data_alias, %rax
134 ; LARGE-STATIC-NEXT:    retq
136 ; SMALL-PIC-LABEL: lea_static_data_alias:
137 ; SMALL-PIC:       # %bb.0:
138 ; SMALL-PIC-NEXT:    leaq static_data_alias(%rip), %rax
139 ; SMALL-PIC-NEXT:    retq
141 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_static_data_alias:
142 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
143 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq static_data_alias(%rip), %rax
144 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
146 ; MEDIUM-PIC-LABEL: lea_static_data_alias:
147 ; MEDIUM-PIC:       # %bb.0:
148 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
149 ; MEDIUM-PIC-NEXT:    movabsq $static_data_alias@GOTOFF, %rax
150 ; MEDIUM-PIC-NEXT:    addq %rcx, %rax
151 ; MEDIUM-PIC-NEXT:    retq
153 ; LARGE-PIC-LABEL: lea_static_data_alias:
154 ; LARGE-PIC:       # %bb.0:
155 ; LARGE-PIC-NEXT:  .L1$pb:
156 ; LARGE-PIC-NEXT:    leaq .L1$pb(%rip), %rax
157 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L1$pb, %rcx
158 ; LARGE-PIC-NEXT:    addq %rax, %rcx
159 ; LARGE-PIC-NEXT:    movabsq $static_data_alias@GOTOFF, %rax
160 ; LARGE-PIC-NEXT:    addq %rcx, %rax
161 ; LARGE-PIC-NEXT:    retq
163 ; LARGE-SMALL-DATA-PIC-LABEL: lea_static_data_alias:
164 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
165 ; LARGE-SMALL-DATA-PIC-NEXT:  .L1$pb:
166 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L1$pb(%rip), %rax
167 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L1$pb, %rcx
168 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
169 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $static_data_alias@GOTOFF, %rax
170 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
171 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
172   ret ptr @static_data_alias
175 define dso_local ptr @lea_global_data() #0 {
176 ; SMALL-STATIC-LABEL: lea_global_data:
177 ; SMALL-STATIC:       # %bb.0:
178 ; SMALL-STATIC-NEXT:    movl $global_data, %eax
179 ; SMALL-STATIC-NEXT:    retq
181 ; MEDIUM-STATIC-LABEL: lea_global_data:
182 ; MEDIUM-STATIC:       # %bb.0:
183 ; MEDIUM-STATIC-NEXT:    movabsq $global_data, %rax
184 ; MEDIUM-STATIC-NEXT:    retq
186 ; LARGE-STATIC-LABEL: lea_global_data:
187 ; LARGE-STATIC:       # %bb.0:
188 ; LARGE-STATIC-NEXT:    movabsq $global_data, %rax
189 ; LARGE-STATIC-NEXT:    retq
191 ; SMALL-PIC-LABEL: lea_global_data:
192 ; SMALL-PIC:       # %bb.0:
193 ; SMALL-PIC-NEXT:    leaq global_data(%rip), %rax
194 ; SMALL-PIC-NEXT:    retq
196 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_global_data:
197 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
198 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq global_data(%rip), %rax
199 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
201 ; MEDIUM-PIC-LABEL: lea_global_data:
202 ; MEDIUM-PIC:       # %bb.0:
203 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
204 ; MEDIUM-PIC-NEXT:    movabsq $global_data@GOTOFF, %rax
205 ; MEDIUM-PIC-NEXT:    addq %rcx, %rax
206 ; MEDIUM-PIC-NEXT:    retq
208 ; LARGE-PIC-LABEL: lea_global_data:
209 ; LARGE-PIC:       # %bb.0:
210 ; LARGE-PIC-NEXT:  .L2$pb:
211 ; LARGE-PIC-NEXT:    leaq .L2$pb(%rip), %rax
212 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L2$pb, %rcx
213 ; LARGE-PIC-NEXT:    addq %rax, %rcx
214 ; LARGE-PIC-NEXT:    movabsq $global_data@GOTOFF, %rax
215 ; LARGE-PIC-NEXT:    addq %rcx, %rax
216 ; LARGE-PIC-NEXT:    retq
218 ; LARGE-SMALL-DATA-PIC-LABEL: lea_global_data:
219 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
220 ; LARGE-SMALL-DATA-PIC-NEXT:  .L2$pb:
221 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L2$pb(%rip), %rax
222 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L2$pb, %rcx
223 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
224 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $global_data@GOTOFF, %rax
225 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
226 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
227   ret ptr @global_data
230 define dso_local ptr @lea_extern_data() #0 {
231 ; SMALL-STATIC-LABEL: lea_extern_data:
232 ; SMALL-STATIC:       # %bb.0:
233 ; SMALL-STATIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
234 ; SMALL-STATIC-NEXT:    retq
236 ; MEDIUM-STATIC-LABEL: lea_extern_data:
237 ; MEDIUM-STATIC:       # %bb.0:
238 ; MEDIUM-STATIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
239 ; MEDIUM-STATIC-NEXT:    retq
241 ; LARGE-STATIC-LABEL: lea_extern_data:
242 ; LARGE-STATIC:       # %bb.0:
243 ; LARGE-STATIC-NEXT:    movabsq $extern_data, %rax
244 ; LARGE-STATIC-NEXT:    retq
246 ; SMALL-PIC-LABEL: lea_extern_data:
247 ; SMALL-PIC:       # %bb.0:
248 ; SMALL-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
249 ; SMALL-PIC-NEXT:    retq
251 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_extern_data:
252 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
253 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
254 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
256 ; MEDIUM-PIC-LABEL: lea_extern_data:
257 ; MEDIUM-PIC:       # %bb.0:
258 ; MEDIUM-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
259 ; MEDIUM-PIC-NEXT:    retq
261 ; LARGE-PIC-LABEL: lea_extern_data:
262 ; LARGE-PIC:       # %bb.0:
263 ; LARGE-PIC-NEXT:  .L3$pb:
264 ; LARGE-PIC-NEXT:    leaq .L3$pb(%rip), %rax
265 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L3$pb, %rcx
266 ; LARGE-PIC-NEXT:    addq %rax, %rcx
267 ; LARGE-PIC-NEXT:    movabsq $extern_data@GOT, %rax
268 ; LARGE-PIC-NEXT:    movq (%rcx,%rax), %rax
269 ; LARGE-PIC-NEXT:    retq
271 ; LARGE-SMALL-DATA-PIC-LABEL: lea_extern_data:
272 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
273 ; LARGE-SMALL-DATA-PIC-NEXT:  .L3$pb:
274 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L3$pb(%rip), %rax
275 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L3$pb, %rcx
276 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
277 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $extern_data@GOT, %rax
278 ; LARGE-SMALL-DATA-PIC-NEXT:    movq (%rcx,%rax), %rax
279 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
280   ret ptr @extern_data
283 define dso_local ptr @lea_unknown_size_data() #0 {
284 ; SMALL-STATIC-LABEL: lea_unknown_size_data:
285 ; SMALL-STATIC:       # %bb.0:
286 ; SMALL-STATIC-NEXT:    movl $unknown_size_data, %eax
287 ; SMALL-STATIC-NEXT:    retq
289 ; MEDIUM-STATIC-LABEL: lea_unknown_size_data:
290 ; MEDIUM-STATIC:       # %bb.0:
291 ; MEDIUM-STATIC-NEXT:    movabsq $unknown_size_data, %rax
292 ; MEDIUM-STATIC-NEXT:    retq
294 ; LARGE-STATIC-LABEL: lea_unknown_size_data:
295 ; LARGE-STATIC:       # %bb.0:
296 ; LARGE-STATIC-NEXT:    movabsq $unknown_size_data, %rax
297 ; LARGE-STATIC-NEXT:    retq
299 ; SMALL-PIC-LABEL: lea_unknown_size_data:
300 ; SMALL-PIC:       # %bb.0:
301 ; SMALL-PIC-NEXT:    leaq unknown_size_data(%rip), %rax
302 ; SMALL-PIC-NEXT:    retq
304 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_unknown_size_data:
305 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
306 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
307 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movabsq $unknown_size_data@GOTOFF, %rax
308 ; MEDIUM-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
309 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
311 ; MEDIUM-PIC-LABEL: lea_unknown_size_data:
312 ; MEDIUM-PIC:       # %bb.0:
313 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
314 ; MEDIUM-PIC-NEXT:    movabsq $unknown_size_data@GOTOFF, %rax
315 ; MEDIUM-PIC-NEXT:    addq %rcx, %rax
316 ; MEDIUM-PIC-NEXT:    retq
318 ; LARGE-PIC-LABEL: lea_unknown_size_data:
319 ; LARGE-PIC:       # %bb.0:
320 ; LARGE-PIC-NEXT:  .L4$pb:
321 ; LARGE-PIC-NEXT:    leaq .L4$pb(%rip), %rax
322 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L4$pb, %rcx
323 ; LARGE-PIC-NEXT:    addq %rax, %rcx
324 ; LARGE-PIC-NEXT:    movabsq $unknown_size_data@GOTOFF, %rax
325 ; LARGE-PIC-NEXT:    addq %rcx, %rax
326 ; LARGE-PIC-NEXT:    retq
328 ; LARGE-SMALL-DATA-PIC-LABEL: lea_unknown_size_data:
329 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
330 ; LARGE-SMALL-DATA-PIC-NEXT:  .L4$pb:
331 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L4$pb(%rip), %rax
332 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L4$pb, %rcx
333 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
334 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $unknown_size_data@GOTOFF, %rax
335 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
336 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
337   ret ptr @unknown_size_data
340 define dso_local ptr @lea_forced_small_data() #0 {
341 ; SMALL-STATIC-LABEL: lea_forced_small_data:
342 ; SMALL-STATIC:       # %bb.0:
343 ; SMALL-STATIC-NEXT:    movl $forced_small_data, %eax
344 ; SMALL-STATIC-NEXT:    retq
346 ; MEDIUM-STATIC-LABEL: lea_forced_small_data:
347 ; MEDIUM-STATIC:       # %bb.0:
348 ; MEDIUM-STATIC-NEXT:    movl $forced_small_data, %eax
349 ; MEDIUM-STATIC-NEXT:    retq
351 ; LARGE-STATIC-LABEL: lea_forced_small_data:
352 ; LARGE-STATIC:       # %bb.0:
353 ; LARGE-STATIC-NEXT:    movabsq $forced_small_data, %rax
354 ; LARGE-STATIC-NEXT:    retq
356 ; SMALL-PIC-LABEL: lea_forced_small_data:
357 ; SMALL-PIC:       # %bb.0:
358 ; SMALL-PIC-NEXT:    leaq forced_small_data(%rip), %rax
359 ; SMALL-PIC-NEXT:    retq
361 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_forced_small_data:
362 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
363 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq forced_small_data(%rip), %rax
364 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
366 ; MEDIUM-PIC-LABEL: lea_forced_small_data:
367 ; MEDIUM-PIC:       # %bb.0:
368 ; MEDIUM-PIC-NEXT:    leaq forced_small_data(%rip), %rax
369 ; MEDIUM-PIC-NEXT:    retq
371 ; LARGE-PIC-LABEL: lea_forced_small_data:
372 ; LARGE-PIC:       # %bb.0:
373 ; LARGE-PIC-NEXT:  .L5$pb:
374 ; LARGE-PIC-NEXT:    leaq .L5$pb(%rip), %rax
375 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L5$pb, %rcx
376 ; LARGE-PIC-NEXT:    addq %rax, %rcx
377 ; LARGE-PIC-NEXT:    movabsq $forced_small_data@GOTOFF, %rax
378 ; LARGE-PIC-NEXT:    addq %rcx, %rax
379 ; LARGE-PIC-NEXT:    retq
381 ; LARGE-SMALL-DATA-PIC-LABEL: lea_forced_small_data:
382 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
383 ; LARGE-SMALL-DATA-PIC-NEXT:  .L5$pb:
384 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L5$pb(%rip), %rax
385 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L5$pb, %rcx
386 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
387 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $forced_small_data@GOTOFF, %rax
388 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
389 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
390   ret ptr @forced_small_data
393 define dso_local i32 @load_forced_small_data() #0 {
394 ; SMALL-STATIC-LABEL: load_forced_small_data:
395 ; SMALL-STATIC:       # %bb.0:
396 ; SMALL-STATIC-NEXT:    movl forced_small_data+8(%rip), %eax
397 ; SMALL-STATIC-NEXT:    retq
399 ; MEDIUM-STATIC-LABEL: load_forced_small_data:
400 ; MEDIUM-STATIC:       # %bb.0:
401 ; MEDIUM-STATIC-NEXT:    movl forced_small_data+8(%rip), %eax
402 ; MEDIUM-STATIC-NEXT:    retq
404 ; LARGE-STATIC-LABEL: load_forced_small_data:
405 ; LARGE-STATIC:       # %bb.0:
406 ; LARGE-STATIC-NEXT:    movabsq $forced_small_data+8, %rax
407 ; LARGE-STATIC-NEXT:    movl (%rax), %eax
408 ; LARGE-STATIC-NEXT:    retq
410 ; SMALL-PIC-LABEL: load_forced_small_data:
411 ; SMALL-PIC:       # %bb.0:
412 ; SMALL-PIC-NEXT:    movl forced_small_data+8(%rip), %eax
413 ; SMALL-PIC-NEXT:    retq
415 ; MEDIUM-SMALL-DATA-PIC-LABEL: load_forced_small_data:
416 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
417 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movl forced_small_data+8(%rip), %eax
418 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
420 ; MEDIUM-PIC-LABEL: load_forced_small_data:
421 ; MEDIUM-PIC:       # %bb.0:
422 ; MEDIUM-PIC-NEXT:    movl forced_small_data+8(%rip), %eax
423 ; MEDIUM-PIC-NEXT:    retq
425 ; LARGE-PIC-LABEL: load_forced_small_data:
426 ; LARGE-PIC:       # %bb.0:
427 ; LARGE-PIC-NEXT:  .L6$pb:
428 ; LARGE-PIC-NEXT:    leaq .L6$pb(%rip), %rax
429 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L6$pb, %rcx
430 ; LARGE-PIC-NEXT:    addq %rax, %rcx
431 ; LARGE-PIC-NEXT:    movabsq $forced_small_data@GOTOFF, %rax
432 ; LARGE-PIC-NEXT:    movl 8(%rcx,%rax), %eax
433 ; LARGE-PIC-NEXT:    retq
435 ; LARGE-SMALL-DATA-PIC-LABEL: load_forced_small_data:
436 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
437 ; LARGE-SMALL-DATA-PIC-NEXT:  .L6$pb:
438 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L6$pb(%rip), %rax
439 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L6$pb, %rcx
440 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
441 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $forced_small_data@GOTOFF, %rax
442 ; LARGE-SMALL-DATA-PIC-NEXT:    movl 8(%rcx,%rax), %eax
443 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
444   %rv = load i32, ptr getelementptr inbounds (i32, ptr @forced_small_data, i64 2)
445   ret i32 %rv
448 define dso_local ptr @lea_forced_large_data() #0 {
449 ; SMALL-STATIC-LABEL: lea_forced_large_data:
450 ; SMALL-STATIC:       # %bb.0:
451 ; SMALL-STATIC-NEXT:    movabsq $forced_large_data, %rax
452 ; SMALL-STATIC-NEXT:    retq
454 ; MEDIUM-STATIC-LABEL: lea_forced_large_data:
455 ; MEDIUM-STATIC:       # %bb.0:
456 ; MEDIUM-STATIC-NEXT:    movabsq $forced_large_data, %rax
457 ; MEDIUM-STATIC-NEXT:    retq
459 ; LARGE-STATIC-LABEL: lea_forced_large_data:
460 ; LARGE-STATIC:       # %bb.0:
461 ; LARGE-STATIC-NEXT:    movabsq $forced_large_data, %rax
462 ; LARGE-STATIC-NEXT:    retq
464 ; SMALL-PIC-LABEL: lea_forced_large_data:
465 ; SMALL-PIC:       # %bb.0:
466 ; SMALL-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
467 ; SMALL-PIC-NEXT:    movabsq $forced_large_data@GOTOFF, %rax
468 ; SMALL-PIC-NEXT:    addq %rcx, %rax
469 ; SMALL-PIC-NEXT:    retq
471 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_forced_large_data:
472 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
473 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
474 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movabsq $forced_large_data@GOTOFF, %rax
475 ; MEDIUM-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
476 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
478 ; MEDIUM-PIC-LABEL: lea_forced_large_data:
479 ; MEDIUM-PIC:       # %bb.0:
480 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
481 ; MEDIUM-PIC-NEXT:    movabsq $forced_large_data@GOTOFF, %rax
482 ; MEDIUM-PIC-NEXT:    addq %rcx, %rax
483 ; MEDIUM-PIC-NEXT:    retq
485 ; LARGE-PIC-LABEL: lea_forced_large_data:
486 ; LARGE-PIC:       # %bb.0:
487 ; LARGE-PIC-NEXT:  .L7$pb:
488 ; LARGE-PIC-NEXT:    leaq .L7$pb(%rip), %rax
489 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L7$pb, %rcx
490 ; LARGE-PIC-NEXT:    addq %rax, %rcx
491 ; LARGE-PIC-NEXT:    movabsq $forced_large_data@GOTOFF, %rax
492 ; LARGE-PIC-NEXT:    addq %rcx, %rax
493 ; LARGE-PIC-NEXT:    retq
495 ; LARGE-SMALL-DATA-PIC-LABEL: lea_forced_large_data:
496 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
497 ; LARGE-SMALL-DATA-PIC-NEXT:  .L7$pb:
498 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L7$pb(%rip), %rax
499 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L7$pb, %rcx
500 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
501 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $forced_large_data@GOTOFF, %rax
502 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
503 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
504   ret ptr @forced_large_data
507 define dso_local i32 @load_forced_large_data() #0 {
508 ; SMALL-STATIC-LABEL: load_forced_large_data:
509 ; SMALL-STATIC:       # %bb.0:
510 ; SMALL-STATIC-NEXT:    movabsq $forced_large_data+8, %rax
511 ; SMALL-STATIC-NEXT:    movl (%rax), %eax
512 ; SMALL-STATIC-NEXT:    retq
514 ; MEDIUM-STATIC-LABEL: load_forced_large_data:
515 ; MEDIUM-STATIC:       # %bb.0:
516 ; MEDIUM-STATIC-NEXT:    movabsq $forced_large_data+8, %rax
517 ; MEDIUM-STATIC-NEXT:    movl (%rax), %eax
518 ; MEDIUM-STATIC-NEXT:    retq
520 ; LARGE-STATIC-LABEL: load_forced_large_data:
521 ; LARGE-STATIC:       # %bb.0:
522 ; LARGE-STATIC-NEXT:    movabsq $forced_large_data+8, %rax
523 ; LARGE-STATIC-NEXT:    movl (%rax), %eax
524 ; LARGE-STATIC-NEXT:    retq
526 ; SMALL-PIC-LABEL: load_forced_large_data:
527 ; SMALL-PIC:       # %bb.0:
528 ; SMALL-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
529 ; SMALL-PIC-NEXT:    movabsq $forced_large_data@GOTOFF, %rcx
530 ; SMALL-PIC-NEXT:    movl 8(%rax,%rcx), %eax
531 ; SMALL-PIC-NEXT:    retq
533 ; MEDIUM-SMALL-DATA-PIC-LABEL: load_forced_large_data:
534 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
535 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
536 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movabsq $forced_large_data@GOTOFF, %rcx
537 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movl 8(%rax,%rcx), %eax
538 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
540 ; MEDIUM-PIC-LABEL: load_forced_large_data:
541 ; MEDIUM-PIC:       # %bb.0:
542 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
543 ; MEDIUM-PIC-NEXT:    movabsq $forced_large_data@GOTOFF, %rcx
544 ; MEDIUM-PIC-NEXT:    movl 8(%rax,%rcx), %eax
545 ; MEDIUM-PIC-NEXT:    retq
547 ; LARGE-PIC-LABEL: load_forced_large_data:
548 ; LARGE-PIC:       # %bb.0:
549 ; LARGE-PIC-NEXT:  .L8$pb:
550 ; LARGE-PIC-NEXT:    leaq .L8$pb(%rip), %rax
551 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L8$pb, %rcx
552 ; LARGE-PIC-NEXT:    addq %rax, %rcx
553 ; LARGE-PIC-NEXT:    movabsq $forced_large_data@GOTOFF, %rax
554 ; LARGE-PIC-NEXT:    movl 8(%rcx,%rax), %eax
555 ; LARGE-PIC-NEXT:    retq
557 ; LARGE-SMALL-DATA-PIC-LABEL: load_forced_large_data:
558 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
559 ; LARGE-SMALL-DATA-PIC-NEXT:  .L8$pb:
560 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L8$pb(%rip), %rax
561 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L8$pb, %rcx
562 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
563 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $forced_large_data@GOTOFF, %rax
564 ; LARGE-SMALL-DATA-PIC-NEXT:    movl 8(%rcx,%rax), %eax
565 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
566   %rv = load i32, ptr getelementptr inbounds (i32, ptr @forced_large_data, i64 2)
567   ret i32 %rv
570 define dso_local i32 @load_global_data() #0 {
571 ; SMALL-STATIC-LABEL: load_global_data:
572 ; SMALL-STATIC:       # %bb.0:
573 ; SMALL-STATIC-NEXT:    movl global_data+8(%rip), %eax
574 ; SMALL-STATIC-NEXT:    retq
576 ; MEDIUM-STATIC-LABEL: load_global_data:
577 ; MEDIUM-STATIC:       # %bb.0:
578 ; MEDIUM-STATIC-NEXT:    movabsq $global_data+8, %rax
579 ; MEDIUM-STATIC-NEXT:    movl (%rax), %eax
580 ; MEDIUM-STATIC-NEXT:    retq
582 ; LARGE-STATIC-LABEL: load_global_data:
583 ; LARGE-STATIC:       # %bb.0:
584 ; LARGE-STATIC-NEXT:    movabsq $global_data+8, %rax
585 ; LARGE-STATIC-NEXT:    movl (%rax), %eax
586 ; LARGE-STATIC-NEXT:    retq
588 ; SMALL-PIC-LABEL: load_global_data:
589 ; SMALL-PIC:       # %bb.0:
590 ; SMALL-PIC-NEXT:    movl global_data+8(%rip), %eax
591 ; SMALL-PIC-NEXT:    retq
593 ; MEDIUM-SMALL-DATA-PIC-LABEL: load_global_data:
594 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
595 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movl global_data+8(%rip), %eax
596 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
598 ; MEDIUM-PIC-LABEL: load_global_data:
599 ; MEDIUM-PIC:       # %bb.0:
600 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
601 ; MEDIUM-PIC-NEXT:    movabsq $global_data@GOTOFF, %rcx
602 ; MEDIUM-PIC-NEXT:    movl 8(%rax,%rcx), %eax
603 ; MEDIUM-PIC-NEXT:    retq
605 ; LARGE-PIC-LABEL: load_global_data:
606 ; LARGE-PIC:       # %bb.0:
607 ; LARGE-PIC-NEXT:  .L9$pb:
608 ; LARGE-PIC-NEXT:    leaq .L9$pb(%rip), %rax
609 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L9$pb, %rcx
610 ; LARGE-PIC-NEXT:    addq %rax, %rcx
611 ; LARGE-PIC-NEXT:    movabsq $global_data@GOTOFF, %rax
612 ; LARGE-PIC-NEXT:    movl 8(%rcx,%rax), %eax
613 ; LARGE-PIC-NEXT:    retq
615 ; LARGE-SMALL-DATA-PIC-LABEL: load_global_data:
616 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
617 ; LARGE-SMALL-DATA-PIC-NEXT:  .L9$pb:
618 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L9$pb(%rip), %rax
619 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L9$pb, %rcx
620 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
621 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $global_data@GOTOFF, %rax
622 ; LARGE-SMALL-DATA-PIC-NEXT:    movl 8(%rcx,%rax), %eax
623 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
624   %rv = load i32, ptr getelementptr inbounds ([10 x i32], ptr @global_data, i64 0, i64 2)
625   ret i32 %rv
628 define dso_local i32 @load_extern_data() #0 {
629 ; SMALL-STATIC-LABEL: load_extern_data:
630 ; SMALL-STATIC:       # %bb.0:
631 ; SMALL-STATIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
632 ; SMALL-STATIC-NEXT:    movl 8(%rax), %eax
633 ; SMALL-STATIC-NEXT:    retq
635 ; MEDIUM-STATIC-LABEL: load_extern_data:
636 ; MEDIUM-STATIC:       # %bb.0:
637 ; MEDIUM-STATIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
638 ; MEDIUM-STATIC-NEXT:    movl 8(%rax), %eax
639 ; MEDIUM-STATIC-NEXT:    retq
641 ; LARGE-STATIC-LABEL: load_extern_data:
642 ; LARGE-STATIC:       # %bb.0:
643 ; LARGE-STATIC-NEXT:    movabsq $extern_data, %rax
644 ; LARGE-STATIC-NEXT:    movl 8(%rax), %eax
645 ; LARGE-STATIC-NEXT:    retq
647 ; SMALL-PIC-LABEL: load_extern_data:
648 ; SMALL-PIC:       # %bb.0:
649 ; SMALL-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
650 ; SMALL-PIC-NEXT:    movl 8(%rax), %eax
651 ; SMALL-PIC-NEXT:    retq
653 ; MEDIUM-SMALL-DATA-PIC-LABEL: load_extern_data:
654 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
655 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
656 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movl 8(%rax), %eax
657 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
659 ; MEDIUM-PIC-LABEL: load_extern_data:
660 ; MEDIUM-PIC:       # %bb.0:
661 ; MEDIUM-PIC-NEXT:    movq extern_data@GOTPCREL(%rip), %rax
662 ; MEDIUM-PIC-NEXT:    movl 8(%rax), %eax
663 ; MEDIUM-PIC-NEXT:    retq
665 ; LARGE-PIC-LABEL: load_extern_data:
666 ; LARGE-PIC:       # %bb.0:
667 ; LARGE-PIC-NEXT:  .L10$pb:
668 ; LARGE-PIC-NEXT:    leaq .L10$pb(%rip), %rax
669 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L10$pb, %rcx
670 ; LARGE-PIC-NEXT:    addq %rax, %rcx
671 ; LARGE-PIC-NEXT:    movabsq $extern_data@GOT, %rax
672 ; LARGE-PIC-NEXT:    movq (%rcx,%rax), %rax
673 ; LARGE-PIC-NEXT:    movl 8(%rax), %eax
674 ; LARGE-PIC-NEXT:    retq
676 ; LARGE-SMALL-DATA-PIC-LABEL: load_extern_data:
677 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
678 ; LARGE-SMALL-DATA-PIC-NEXT:  .L10$pb:
679 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L10$pb(%rip), %rax
680 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L10$pb, %rcx
681 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
682 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $extern_data@GOT, %rax
683 ; LARGE-SMALL-DATA-PIC-NEXT:    movq (%rcx,%rax), %rax
684 ; LARGE-SMALL-DATA-PIC-NEXT:    movl 8(%rax), %eax
685 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
686   %rv = load i32, ptr getelementptr inbounds ([10 x i32], ptr @extern_data, i64 0, i64 2)
687   ret i32 %rv
690 define dso_local i32 @load_unknown_size_data() #0 {
691 ; SMALL-STATIC-LABEL: load_unknown_size_data:
692 ; SMALL-STATIC:       # %bb.0:
693 ; SMALL-STATIC-NEXT:    movl unknown_size_data+8(%rip), %eax
694 ; SMALL-STATIC-NEXT:    retq
696 ; MEDIUM-STATIC-LABEL: load_unknown_size_data:
697 ; MEDIUM-STATIC:       # %bb.0:
698 ; MEDIUM-STATIC-NEXT:    movabsq $unknown_size_data+8, %rax
699 ; MEDIUM-STATIC-NEXT:    movl (%rax), %eax
700 ; MEDIUM-STATIC-NEXT:    retq
702 ; LARGE-STATIC-LABEL: load_unknown_size_data:
703 ; LARGE-STATIC:       # %bb.0:
704 ; LARGE-STATIC-NEXT:    movabsq $unknown_size_data+8, %rax
705 ; LARGE-STATIC-NEXT:    movl (%rax), %eax
706 ; LARGE-STATIC-NEXT:    retq
708 ; SMALL-PIC-LABEL: load_unknown_size_data:
709 ; SMALL-PIC:       # %bb.0:
710 ; SMALL-PIC-NEXT:    movl unknown_size_data+8(%rip), %eax
711 ; SMALL-PIC-NEXT:    retq
713 ; MEDIUM-SMALL-DATA-PIC-LABEL: load_unknown_size_data:
714 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
715 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
716 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movabsq $unknown_size_data@GOTOFF, %rcx
717 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movl 8(%rax,%rcx), %eax
718 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
720 ; MEDIUM-PIC-LABEL: load_unknown_size_data:
721 ; MEDIUM-PIC:       # %bb.0:
722 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
723 ; MEDIUM-PIC-NEXT:    movabsq $unknown_size_data@GOTOFF, %rcx
724 ; MEDIUM-PIC-NEXT:    movl 8(%rax,%rcx), %eax
725 ; MEDIUM-PIC-NEXT:    retq
727 ; LARGE-PIC-LABEL: load_unknown_size_data:
728 ; LARGE-PIC:       # %bb.0:
729 ; LARGE-PIC-NEXT:  .L11$pb:
730 ; LARGE-PIC-NEXT:    leaq .L11$pb(%rip), %rax
731 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L11$pb, %rcx
732 ; LARGE-PIC-NEXT:    addq %rax, %rcx
733 ; LARGE-PIC-NEXT:    movabsq $unknown_size_data@GOTOFF, %rax
734 ; LARGE-PIC-NEXT:    movl 8(%rcx,%rax), %eax
735 ; LARGE-PIC-NEXT:    retq
737 ; LARGE-SMALL-DATA-PIC-LABEL: load_unknown_size_data:
738 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
739 ; LARGE-SMALL-DATA-PIC-NEXT:  .L11$pb:
740 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L11$pb(%rip), %rax
741 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L11$pb, %rcx
742 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
743 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $unknown_size_data@GOTOFF, %rax
744 ; LARGE-SMALL-DATA-PIC-NEXT:    movl 8(%rcx,%rax), %eax
745 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
746   %rv = load i32, ptr getelementptr inbounds (i32, ptr @unknown_size_data, i64 2)
747   ret i32 %rv
750 define dso_local i1 @load_bool() #0 {
751 ; SMALL-STATIC-LABEL: load_bool:
752 ; SMALL-STATIC:       # %bb.0:
753 ; SMALL-STATIC-NEXT:    movzbl bool(%rip), %eax
754 ; SMALL-STATIC-NEXT:    retq
756 ; MEDIUM-STATIC-LABEL: load_bool:
757 ; MEDIUM-STATIC:       # %bb.0:
758 ; MEDIUM-STATIC-NEXT:    movabsq $bool, %rax
759 ; MEDIUM-STATIC-NEXT:    movzbl (%rax), %eax
760 ; MEDIUM-STATIC-NEXT:    retq
762 ; LARGE-STATIC-LABEL: load_bool:
763 ; LARGE-STATIC:       # %bb.0:
764 ; LARGE-STATIC-NEXT:    movabsq $bool, %rax
765 ; LARGE-STATIC-NEXT:    movzbl (%rax), %eax
766 ; LARGE-STATIC-NEXT:    retq
768 ; SMALL-PIC-LABEL: load_bool:
769 ; SMALL-PIC:       # %bb.0:
770 ; SMALL-PIC-NEXT:    movzbl bool(%rip), %eax
771 ; SMALL-PIC-NEXT:    retq
773 ; MEDIUM-SMALL-DATA-PIC-LABEL: load_bool:
774 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
775 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movzbl bool(%rip), %eax
776 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
778 ; MEDIUM-PIC-LABEL: load_bool:
779 ; MEDIUM-PIC:       # %bb.0:
780 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
781 ; MEDIUM-PIC-NEXT:    movabsq $bool@GOTOFF, %rcx
782 ; MEDIUM-PIC-NEXT:    movzbl (%rax,%rcx), %eax
783 ; MEDIUM-PIC-NEXT:    retq
785 ; LARGE-PIC-LABEL: load_bool:
786 ; LARGE-PIC:       # %bb.0:
787 ; LARGE-PIC-NEXT:  .L12$pb:
788 ; LARGE-PIC-NEXT:    leaq .L12$pb(%rip), %rax
789 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L12$pb, %rcx
790 ; LARGE-PIC-NEXT:    addq %rax, %rcx
791 ; LARGE-PIC-NEXT:    movabsq $bool@GOTOFF, %rax
792 ; LARGE-PIC-NEXT:    movzbl (%rcx,%rax), %eax
793 ; LARGE-PIC-NEXT:    retq
795 ; LARGE-SMALL-DATA-PIC-LABEL: load_bool:
796 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
797 ; LARGE-SMALL-DATA-PIC-NEXT:  .L12$pb:
798 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L12$pb(%rip), %rax
799 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L12$pb, %rcx
800 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
801 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $bool@GOTOFF, %rax
802 ; LARGE-SMALL-DATA-PIC-NEXT:    movzbl (%rcx,%rax), %eax
803 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
804   %rv = load i1, ptr @bool
805   ret i1 %rv
808 define dso_local ptr @lea_opaque() #0 {
809 ; SMALL-STATIC-LABEL: lea_opaque:
810 ; SMALL-STATIC:       # %bb.0:
811 ; SMALL-STATIC-NEXT:    movl $opaque, %eax
812 ; SMALL-STATIC-NEXT:    retq
814 ; MEDIUM-STATIC-LABEL: lea_opaque:
815 ; MEDIUM-STATIC:       # %bb.0:
816 ; MEDIUM-STATIC-NEXT:    movabsq $opaque, %rax
817 ; MEDIUM-STATIC-NEXT:    retq
819 ; LARGE-STATIC-LABEL: lea_opaque:
820 ; LARGE-STATIC:       # %bb.0:
821 ; LARGE-STATIC-NEXT:    movabsq $opaque, %rax
822 ; LARGE-STATIC-NEXT:    retq
824 ; SMALL-PIC-LABEL: lea_opaque:
825 ; SMALL-PIC:       # %bb.0:
826 ; SMALL-PIC-NEXT:    leaq opaque(%rip), %rax
827 ; SMALL-PIC-NEXT:    retq
829 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_opaque:
830 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
831 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
832 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movabsq $opaque@GOTOFF, %rax
833 ; MEDIUM-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
834 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
836 ; MEDIUM-PIC-LABEL: lea_opaque:
837 ; MEDIUM-PIC:       # %bb.0:
838 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
839 ; MEDIUM-PIC-NEXT:    movabsq $opaque@GOTOFF, %rax
840 ; MEDIUM-PIC-NEXT:    addq %rcx, %rax
841 ; MEDIUM-PIC-NEXT:    retq
843 ; LARGE-PIC-LABEL: lea_opaque:
844 ; LARGE-PIC:       # %bb.0:
845 ; LARGE-PIC-NEXT:  .L13$pb:
846 ; LARGE-PIC-NEXT:    leaq .L13$pb(%rip), %rax
847 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L13$pb, %rcx
848 ; LARGE-PIC-NEXT:    addq %rax, %rcx
849 ; LARGE-PIC-NEXT:    movabsq $opaque@GOTOFF, %rax
850 ; LARGE-PIC-NEXT:    addq %rcx, %rax
851 ; LARGE-PIC-NEXT:    retq
853 ; LARGE-SMALL-DATA-PIC-LABEL: lea_opaque:
854 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
855 ; LARGE-SMALL-DATA-PIC-NEXT:  .L13$pb:
856 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L13$pb(%rip), %rax
857 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L13$pb, %rcx
858 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
859 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $opaque@GOTOFF, %rax
860 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
861 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
862   ret ptr @opaque
865 define dso_local ptr @lea_ehdr_start() #0 {
866 ; SMALL-STATIC-LABEL: lea_ehdr_start:
867 ; SMALL-STATIC:       # %bb.0:
868 ; SMALL-STATIC-NEXT:    movl $__ehdr_start, %eax
869 ; SMALL-STATIC-NEXT:    retq
871 ; MEDIUM-STATIC-LABEL: lea_ehdr_start:
872 ; MEDIUM-STATIC:       # %bb.0:
873 ; MEDIUM-STATIC-NEXT:    movabsq $__ehdr_start, %rax
874 ; MEDIUM-STATIC-NEXT:    retq
876 ; LARGE-STATIC-LABEL: lea_ehdr_start:
877 ; LARGE-STATIC:       # %bb.0:
878 ; LARGE-STATIC-NEXT:    movabsq $__ehdr_start, %rax
879 ; LARGE-STATIC-NEXT:    retq
881 ; SMALL-PIC-LABEL: lea_ehdr_start:
882 ; SMALL-PIC:       # %bb.0:
883 ; SMALL-PIC-NEXT:    leaq __ehdr_start(%rip), %rax
884 ; SMALL-PIC-NEXT:    retq
886 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_ehdr_start:
887 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
888 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
889 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movabsq $__ehdr_start@GOTOFF, %rax
890 ; MEDIUM-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
891 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
893 ; MEDIUM-PIC-LABEL: lea_ehdr_start:
894 ; MEDIUM-PIC:       # %bb.0:
895 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
896 ; MEDIUM-PIC-NEXT:    movabsq $__ehdr_start@GOTOFF, %rax
897 ; MEDIUM-PIC-NEXT:    addq %rcx, %rax
898 ; MEDIUM-PIC-NEXT:    retq
900 ; LARGE-PIC-LABEL: lea_ehdr_start:
901 ; LARGE-PIC:       # %bb.0:
902 ; LARGE-PIC-NEXT:  .L14$pb:
903 ; LARGE-PIC-NEXT:    leaq .L14$pb(%rip), %rax
904 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L14$pb, %rcx
905 ; LARGE-PIC-NEXT:    addq %rax, %rcx
906 ; LARGE-PIC-NEXT:    movabsq $__ehdr_start@GOTOFF, %rax
907 ; LARGE-PIC-NEXT:    addq %rcx, %rax
908 ; LARGE-PIC-NEXT:    retq
910 ; LARGE-SMALL-DATA-PIC-LABEL: lea_ehdr_start:
911 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
912 ; LARGE-SMALL-DATA-PIC-NEXT:  .L14$pb:
913 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L14$pb(%rip), %rax
914 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L14$pb, %rcx
915 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
916 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $__ehdr_start@GOTOFF, %rax
917 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
918 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
919   ret ptr @__ehdr_start
922 define dso_local ptr @lea_start_foo() #0 {
923 ; SMALL-STATIC-LABEL: lea_start_foo:
924 ; SMALL-STATIC:       # %bb.0:
925 ; SMALL-STATIC-NEXT:    movl $__start_foo, %eax
926 ; SMALL-STATIC-NEXT:    retq
928 ; MEDIUM-STATIC-LABEL: lea_start_foo:
929 ; MEDIUM-STATIC:       # %bb.0:
930 ; MEDIUM-STATIC-NEXT:    movabsq $__start_foo, %rax
931 ; MEDIUM-STATIC-NEXT:    retq
933 ; LARGE-STATIC-LABEL: lea_start_foo:
934 ; LARGE-STATIC:       # %bb.0:
935 ; LARGE-STATIC-NEXT:    movabsq $__start_foo, %rax
936 ; LARGE-STATIC-NEXT:    retq
938 ; SMALL-PIC-LABEL: lea_start_foo:
939 ; SMALL-PIC:       # %bb.0:
940 ; SMALL-PIC-NEXT:    leaq __start_foo(%rip), %rax
941 ; SMALL-PIC-NEXT:    retq
943 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_start_foo:
944 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
945 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
946 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movabsq $__start_foo@GOTOFF, %rax
947 ; MEDIUM-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
948 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
950 ; MEDIUM-PIC-LABEL: lea_start_foo:
951 ; MEDIUM-PIC:       # %bb.0:
952 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
953 ; MEDIUM-PIC-NEXT:    movabsq $__start_foo@GOTOFF, %rax
954 ; MEDIUM-PIC-NEXT:    addq %rcx, %rax
955 ; MEDIUM-PIC-NEXT:    retq
957 ; LARGE-PIC-LABEL: lea_start_foo:
958 ; LARGE-PIC:       # %bb.0:
959 ; LARGE-PIC-NEXT:  .L15$pb:
960 ; LARGE-PIC-NEXT:    leaq .L15$pb(%rip), %rax
961 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L15$pb, %rcx
962 ; LARGE-PIC-NEXT:    addq %rax, %rcx
963 ; LARGE-PIC-NEXT:    movabsq $__start_foo@GOTOFF, %rax
964 ; LARGE-PIC-NEXT:    addq %rcx, %rax
965 ; LARGE-PIC-NEXT:    retq
967 ; LARGE-SMALL-DATA-PIC-LABEL: lea_start_foo:
968 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
969 ; LARGE-SMALL-DATA-PIC-NEXT:  .L15$pb:
970 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L15$pb(%rip), %rax
971 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L15$pb, %rcx
972 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
973 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $__start_foo@GOTOFF, %rax
974 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
975 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
976   ret ptr @__start_foo
979 define dso_local ptr @lea_stop_foo() #0 {
980 ; SMALL-STATIC-LABEL: lea_stop_foo:
981 ; SMALL-STATIC:       # %bb.0:
982 ; SMALL-STATIC-NEXT:    movl $__stop_foo, %eax
983 ; SMALL-STATIC-NEXT:    retq
985 ; MEDIUM-STATIC-LABEL: lea_stop_foo:
986 ; MEDIUM-STATIC:       # %bb.0:
987 ; MEDIUM-STATIC-NEXT:    movabsq $__stop_foo, %rax
988 ; MEDIUM-STATIC-NEXT:    retq
990 ; LARGE-STATIC-LABEL: lea_stop_foo:
991 ; LARGE-STATIC:       # %bb.0:
992 ; LARGE-STATIC-NEXT:    movabsq $__stop_foo, %rax
993 ; LARGE-STATIC-NEXT:    retq
995 ; SMALL-PIC-LABEL: lea_stop_foo:
996 ; SMALL-PIC:       # %bb.0:
997 ; SMALL-PIC-NEXT:    leaq __stop_foo(%rip), %rax
998 ; SMALL-PIC-NEXT:    retq
1000 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_stop_foo:
1001 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
1002 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
1003 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movabsq $__stop_foo@GOTOFF, %rax
1004 ; MEDIUM-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
1005 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
1007 ; MEDIUM-PIC-LABEL: lea_stop_foo:
1008 ; MEDIUM-PIC:       # %bb.0:
1009 ; MEDIUM-PIC-NEXT:    leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
1010 ; MEDIUM-PIC-NEXT:    movabsq $__stop_foo@GOTOFF, %rax
1011 ; MEDIUM-PIC-NEXT:    addq %rcx, %rax
1012 ; MEDIUM-PIC-NEXT:    retq
1014 ; LARGE-PIC-LABEL: lea_stop_foo:
1015 ; LARGE-PIC:       # %bb.0:
1016 ; LARGE-PIC-NEXT:  .L16$pb:
1017 ; LARGE-PIC-NEXT:    leaq .L16$pb(%rip), %rax
1018 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L16$pb, %rcx
1019 ; LARGE-PIC-NEXT:    addq %rax, %rcx
1020 ; LARGE-PIC-NEXT:    movabsq $__stop_foo@GOTOFF, %rax
1021 ; LARGE-PIC-NEXT:    addq %rcx, %rax
1022 ; LARGE-PIC-NEXT:    retq
1024 ; LARGE-SMALL-DATA-PIC-LABEL: lea_stop_foo:
1025 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
1026 ; LARGE-SMALL-DATA-PIC-NEXT:  .L16$pb:
1027 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L16$pb(%rip), %rax
1028 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L16$pb, %rcx
1029 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
1030 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $__stop_foo@GOTOFF, %rax
1031 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
1032 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
1033   ret ptr @__stop_foo
1036 define dso_local void @global_fn() #0 {
1037 ; CHECK-LABEL: global_fn:
1038 ; CHECK:       # %bb.0:
1039 ; CHECK-NEXT:    retq
1040   ret void
1043 define internal void @static_fn() #0 {
1044 ; CHECK-LABEL: static_fn:
1045 ; CHECK:       # %bb.0:
1046 ; CHECK-NEXT:    retq
1047   ret void
1050 declare void @extern_fn()
1052 @ifunc_func = ifunc void (), ptr @resolver
1053 @dso_local_ifunc_func = dso_local ifunc void (), ptr @resolver
1055 define internal ptr @resolver() {
1056 ; CHECK-LABEL: resolver:
1057 ; CHECK:       # %bb.0: # %entry
1058 ; CHECK-NEXT:    xorl %eax, %eax
1059 ; CHECK-NEXT:    retq
1060 entry:
1061   ret ptr null
1064 define dso_local ptr @lea_static_fn() #0 {
1065 ; SMALL-STATIC-LABEL: lea_static_fn:
1066 ; SMALL-STATIC:       # %bb.0:
1067 ; SMALL-STATIC-NEXT:    movl $static_fn, %eax
1068 ; SMALL-STATIC-NEXT:    retq
1070 ; MEDIUM-STATIC-LABEL: lea_static_fn:
1071 ; MEDIUM-STATIC:       # %bb.0:
1072 ; MEDIUM-STATIC-NEXT:    movl $static_fn, %eax
1073 ; MEDIUM-STATIC-NEXT:    retq
1075 ; LARGE-STATIC-LABEL: lea_static_fn:
1076 ; LARGE-STATIC:       # %bb.0:
1077 ; LARGE-STATIC-NEXT:    movabsq $static_fn, %rax
1078 ; LARGE-STATIC-NEXT:    retq
1080 ; SMALL-PIC-LABEL: lea_static_fn:
1081 ; SMALL-PIC:       # %bb.0:
1082 ; SMALL-PIC-NEXT:    leaq static_fn(%rip), %rax
1083 ; SMALL-PIC-NEXT:    retq
1085 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_static_fn:
1086 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
1087 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq static_fn(%rip), %rax
1088 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
1090 ; MEDIUM-PIC-LABEL: lea_static_fn:
1091 ; MEDIUM-PIC:       # %bb.0:
1092 ; MEDIUM-PIC-NEXT:    leaq static_fn(%rip), %rax
1093 ; MEDIUM-PIC-NEXT:    retq
1095 ; LARGE-PIC-LABEL: lea_static_fn:
1096 ; LARGE-PIC:       # %bb.0:
1097 ; LARGE-PIC-NEXT:  .L20$pb:
1098 ; LARGE-PIC-NEXT:    leaq .L20$pb(%rip), %rax
1099 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L20$pb, %rcx
1100 ; LARGE-PIC-NEXT:    addq %rax, %rcx
1101 ; LARGE-PIC-NEXT:    movabsq $static_fn@GOTOFF, %rax
1102 ; LARGE-PIC-NEXT:    addq %rcx, %rax
1103 ; LARGE-PIC-NEXT:    retq
1105 ; LARGE-SMALL-DATA-PIC-LABEL: lea_static_fn:
1106 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
1107 ; LARGE-SMALL-DATA-PIC-NEXT:  .L20$pb:
1108 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L20$pb(%rip), %rax
1109 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L20$pb, %rcx
1110 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
1111 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $static_fn@GOTOFF, %rax
1112 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
1113 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
1114   ret ptr @static_fn
1117 define dso_local ptr @lea_global_fn() #0 {
1118 ; SMALL-STATIC-LABEL: lea_global_fn:
1119 ; SMALL-STATIC:       # %bb.0:
1120 ; SMALL-STATIC-NEXT:    movl $global_fn, %eax
1121 ; SMALL-STATIC-NEXT:    retq
1123 ; MEDIUM-STATIC-LABEL: lea_global_fn:
1124 ; MEDIUM-STATIC:       # %bb.0:
1125 ; MEDIUM-STATIC-NEXT:    movl $global_fn, %eax
1126 ; MEDIUM-STATIC-NEXT:    retq
1128 ; LARGE-STATIC-LABEL: lea_global_fn:
1129 ; LARGE-STATIC:       # %bb.0:
1130 ; LARGE-STATIC-NEXT:    movabsq $global_fn, %rax
1131 ; LARGE-STATIC-NEXT:    retq
1133 ; SMALL-PIC-LABEL: lea_global_fn:
1134 ; SMALL-PIC:       # %bb.0:
1135 ; SMALL-PIC-NEXT:    leaq global_fn(%rip), %rax
1136 ; SMALL-PIC-NEXT:    retq
1138 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_global_fn:
1139 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
1140 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq global_fn(%rip), %rax
1141 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
1143 ; MEDIUM-PIC-LABEL: lea_global_fn:
1144 ; MEDIUM-PIC:       # %bb.0:
1145 ; MEDIUM-PIC-NEXT:    leaq global_fn(%rip), %rax
1146 ; MEDIUM-PIC-NEXT:    retq
1148 ; LARGE-PIC-LABEL: lea_global_fn:
1149 ; LARGE-PIC:       # %bb.0:
1150 ; LARGE-PIC-NEXT:  .L21$pb:
1151 ; LARGE-PIC-NEXT:    leaq .L21$pb(%rip), %rax
1152 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L21$pb, %rcx
1153 ; LARGE-PIC-NEXT:    addq %rax, %rcx
1154 ; LARGE-PIC-NEXT:    movabsq $global_fn@GOTOFF, %rax
1155 ; LARGE-PIC-NEXT:    addq %rcx, %rax
1156 ; LARGE-PIC-NEXT:    retq
1158 ; LARGE-SMALL-DATA-PIC-LABEL: lea_global_fn:
1159 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
1160 ; LARGE-SMALL-DATA-PIC-NEXT:  .L21$pb:
1161 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L21$pb(%rip), %rax
1162 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L21$pb, %rcx
1163 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
1164 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $global_fn@GOTOFF, %rax
1165 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
1166 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
1167   ret ptr @global_fn
1170 define dso_local ptr @lea_extern_fn() #0 {
1171 ; SMALL-STATIC-LABEL: lea_extern_fn:
1172 ; SMALL-STATIC:       # %bb.0:
1173 ; SMALL-STATIC-NEXT:    movq extern_fn@GOTPCREL(%rip), %rax
1174 ; SMALL-STATIC-NEXT:    retq
1176 ; MEDIUM-STATIC-LABEL: lea_extern_fn:
1177 ; MEDIUM-STATIC:       # %bb.0:
1178 ; MEDIUM-STATIC-NEXT:    movq extern_fn@GOTPCREL(%rip), %rax
1179 ; MEDIUM-STATIC-NEXT:    retq
1181 ; LARGE-STATIC-LABEL: lea_extern_fn:
1182 ; LARGE-STATIC:       # %bb.0:
1183 ; LARGE-STATIC-NEXT:    movabsq $extern_fn, %rax
1184 ; LARGE-STATIC-NEXT:    retq
1186 ; SMALL-PIC-LABEL: lea_extern_fn:
1187 ; SMALL-PIC:       # %bb.0:
1188 ; SMALL-PIC-NEXT:    movq extern_fn@GOTPCREL(%rip), %rax
1189 ; SMALL-PIC-NEXT:    retq
1191 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_extern_fn:
1192 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
1193 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movq extern_fn@GOTPCREL(%rip), %rax
1194 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
1196 ; MEDIUM-PIC-LABEL: lea_extern_fn:
1197 ; MEDIUM-PIC:       # %bb.0:
1198 ; MEDIUM-PIC-NEXT:    movq extern_fn@GOTPCREL(%rip), %rax
1199 ; MEDIUM-PIC-NEXT:    retq
1201 ; LARGE-PIC-LABEL: lea_extern_fn:
1202 ; LARGE-PIC:       # %bb.0:
1203 ; LARGE-PIC-NEXT:  .L22$pb:
1204 ; LARGE-PIC-NEXT:    leaq .L22$pb(%rip), %rax
1205 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L22$pb, %rcx
1206 ; LARGE-PIC-NEXT:    addq %rax, %rcx
1207 ; LARGE-PIC-NEXT:    movabsq $extern_fn@GOT, %rax
1208 ; LARGE-PIC-NEXT:    movq (%rcx,%rax), %rax
1209 ; LARGE-PIC-NEXT:    retq
1211 ; LARGE-SMALL-DATA-PIC-LABEL: lea_extern_fn:
1212 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
1213 ; LARGE-SMALL-DATA-PIC-NEXT:  .L22$pb:
1214 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L22$pb(%rip), %rax
1215 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L22$pb, %rcx
1216 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
1217 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $extern_fn@GOT, %rax
1218 ; LARGE-SMALL-DATA-PIC-NEXT:    movq (%rcx,%rax), %rax
1219 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
1220   ret ptr @extern_fn
1223 define dso_local ptr @lea_ifunc() #0 {
1224 ; SMALL-STATIC-LABEL: lea_ifunc:
1225 ; SMALL-STATIC:       # %bb.0:
1226 ; SMALL-STATIC-NEXT:    movq ifunc_func@GOTPCREL(%rip), %rax
1227 ; SMALL-STATIC-NEXT:    retq
1229 ; MEDIUM-STATIC-LABEL: lea_ifunc:
1230 ; MEDIUM-STATIC:       # %bb.0:
1231 ; MEDIUM-STATIC-NEXT:    movq ifunc_func@GOTPCREL(%rip), %rax
1232 ; MEDIUM-STATIC-NEXT:    retq
1234 ; LARGE-STATIC-LABEL: lea_ifunc:
1235 ; LARGE-STATIC:       # %bb.0:
1236 ; LARGE-STATIC-NEXT:    movabsq $ifunc_func, %rax
1237 ; LARGE-STATIC-NEXT:    retq
1239 ; SMALL-PIC-LABEL: lea_ifunc:
1240 ; SMALL-PIC:       # %bb.0:
1241 ; SMALL-PIC-NEXT:    movq ifunc_func@GOTPCREL(%rip), %rax
1242 ; SMALL-PIC-NEXT:    retq
1244 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_ifunc:
1245 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
1246 ; MEDIUM-SMALL-DATA-PIC-NEXT:    movq ifunc_func@GOTPCREL(%rip), %rax
1247 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
1249 ; MEDIUM-PIC-LABEL: lea_ifunc:
1250 ; MEDIUM-PIC:       # %bb.0:
1251 ; MEDIUM-PIC-NEXT:    movq ifunc_func@GOTPCREL(%rip), %rax
1252 ; MEDIUM-PIC-NEXT:    retq
1254 ; LARGE-PIC-LABEL: lea_ifunc:
1255 ; LARGE-PIC:       # %bb.0:
1256 ; LARGE-PIC-NEXT:  .L23$pb:
1257 ; LARGE-PIC-NEXT:    leaq .L23$pb(%rip), %rax
1258 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L23$pb, %rcx
1259 ; LARGE-PIC-NEXT:    addq %rax, %rcx
1260 ; LARGE-PIC-NEXT:    movabsq $ifunc_func@GOT, %rax
1261 ; LARGE-PIC-NEXT:    movq (%rcx,%rax), %rax
1262 ; LARGE-PIC-NEXT:    retq
1264 ; LARGE-SMALL-DATA-PIC-LABEL: lea_ifunc:
1265 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
1266 ; LARGE-SMALL-DATA-PIC-NEXT:  .L23$pb:
1267 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L23$pb(%rip), %rax
1268 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L23$pb, %rcx
1269 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
1270 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $ifunc_func@GOT, %rax
1271 ; LARGE-SMALL-DATA-PIC-NEXT:    movq (%rcx,%rax), %rax
1272 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
1273   ret ptr @ifunc_func
1276 define dso_local ptr @lea_dso_local_ifunc() #0 {
1277 ; SMALL-STATIC-LABEL: lea_dso_local_ifunc:
1278 ; SMALL-STATIC:       # %bb.0:
1279 ; SMALL-STATIC-NEXT:    movl $dso_local_ifunc_func, %eax
1280 ; SMALL-STATIC-NEXT:    retq
1282 ; MEDIUM-STATIC-LABEL: lea_dso_local_ifunc:
1283 ; MEDIUM-STATIC:       # %bb.0:
1284 ; MEDIUM-STATIC-NEXT:    movl $dso_local_ifunc_func, %eax
1285 ; MEDIUM-STATIC-NEXT:    retq
1287 ; LARGE-STATIC-LABEL: lea_dso_local_ifunc:
1288 ; LARGE-STATIC:       # %bb.0:
1289 ; LARGE-STATIC-NEXT:    movabsq $dso_local_ifunc_func, %rax
1290 ; LARGE-STATIC-NEXT:    retq
1292 ; SMALL-PIC-LABEL: lea_dso_local_ifunc:
1293 ; SMALL-PIC:       # %bb.0:
1294 ; SMALL-PIC-NEXT:    leaq dso_local_ifunc_func(%rip), %rax
1295 ; SMALL-PIC-NEXT:    retq
1297 ; MEDIUM-SMALL-DATA-PIC-LABEL: lea_dso_local_ifunc:
1298 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
1299 ; MEDIUM-SMALL-DATA-PIC-NEXT:    leaq dso_local_ifunc_func(%rip), %rax
1300 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
1302 ; MEDIUM-PIC-LABEL: lea_dso_local_ifunc:
1303 ; MEDIUM-PIC:       # %bb.0:
1304 ; MEDIUM-PIC-NEXT:    leaq dso_local_ifunc_func(%rip), %rax
1305 ; MEDIUM-PIC-NEXT:    retq
1307 ; LARGE-PIC-LABEL: lea_dso_local_ifunc:
1308 ; LARGE-PIC:       # %bb.0:
1309 ; LARGE-PIC-NEXT:  .L24$pb:
1310 ; LARGE-PIC-NEXT:    leaq .L24$pb(%rip), %rax
1311 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L24$pb, %rcx
1312 ; LARGE-PIC-NEXT:    addq %rax, %rcx
1313 ; LARGE-PIC-NEXT:    movabsq $dso_local_ifunc_func@GOTOFF, %rax
1314 ; LARGE-PIC-NEXT:    addq %rcx, %rax
1315 ; LARGE-PIC-NEXT:    retq
1317 ; LARGE-SMALL-DATA-PIC-LABEL: lea_dso_local_ifunc:
1318 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
1319 ; LARGE-SMALL-DATA-PIC-NEXT:  .L24$pb:
1320 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L24$pb(%rip), %rax
1321 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L24$pb, %rcx
1322 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
1323 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $dso_local_ifunc_func@GOTOFF, %rax
1324 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rcx, %rax
1325 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
1326   ret ptr @dso_local_ifunc_func
1329 ; FIXME: The result is same for small, medium and large model, because we
1330 ; specify pie option in the test case. And the type of tls is initial exec tls.
1331 ; For pic code. The large model code for pic tls should be emitted as below.
1333 ; .L3:
1334 ; leaq  .L3(%rip), %rbx
1335 ; movabsq       $_GLOBAL_OFFSET_TABLE_-.L3, %r11
1336 ; addq  %r11, %rbx
1337 ; leaq  thread_data@TLSGD(%rip), %rdi
1338 ; movabsq       $__tls_get_addr@PLTOFF, %rax
1339 ; addq  %rbx, %rax
1340 ; call  *%rax
1341 ; movl  (%rax), %eax
1343 ; The medium and small model code for pic tls should be emitted as below.
1344 ; data16
1345 ; leaq  thread_data@TLSGD(%rip), %rdi
1346 ; data16
1347 ; data16
1348 ; rex64
1349 ; callq __tls_get_addr@PLT
1350 ; movl  (%rax), %eax
1352 define dso_local i32 @load_thread_data() #0 {
1353 ; CHECK-LABEL: load_thread_data:
1354 ; CHECK:       # %bb.0:
1355 ; CHECK-NEXT:    movq thread_data@GOTTPOFF(%rip), %rax
1356 ; CHECK-NEXT:    movl %fs:(%rax), %eax
1357 ; CHECK-NEXT:    retq
1358   %1 = load i32, ptr @thread_data, align 4
1359   ret i32 %1
1362 define dso_local float @load_constant_pool(float %x) #0 {
1363 ; SMALL-STATIC-LABEL: load_constant_pool:
1364 ; SMALL-STATIC:       # %bb.0:
1365 ; SMALL-STATIC-NEXT:    addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1366 ; SMALL-STATIC-NEXT:    retq
1368 ; MEDIUM-STATIC-LABEL: load_constant_pool:
1369 ; MEDIUM-STATIC:       # %bb.0:
1370 ; MEDIUM-STATIC-NEXT:    addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1371 ; MEDIUM-STATIC-NEXT:    retq
1373 ; LARGE-STATIC-LABEL: load_constant_pool:
1374 ; LARGE-STATIC:       # %bb.0:
1375 ; LARGE-STATIC-NEXT:    movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax
1376 ; LARGE-STATIC-NEXT:    addss (%rax), %xmm0
1377 ; LARGE-STATIC-NEXT:    retq
1379 ; SMALL-PIC-LABEL: load_constant_pool:
1380 ; SMALL-PIC:       # %bb.0:
1381 ; SMALL-PIC-NEXT:    addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1382 ; SMALL-PIC-NEXT:    retq
1384 ; MEDIUM-SMALL-DATA-PIC-LABEL: load_constant_pool:
1385 ; MEDIUM-SMALL-DATA-PIC:       # %bb.0:
1386 ; MEDIUM-SMALL-DATA-PIC-NEXT:    addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1387 ; MEDIUM-SMALL-DATA-PIC-NEXT:    retq
1389 ; MEDIUM-PIC-LABEL: load_constant_pool:
1390 ; MEDIUM-PIC:       # %bb.0:
1391 ; MEDIUM-PIC-NEXT:    addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1392 ; MEDIUM-PIC-NEXT:    retq
1394 ; LARGE-PIC-LABEL: load_constant_pool:
1395 ; LARGE-PIC:       # %bb.0:
1396 ; LARGE-PIC-NEXT:  .L26$pb:
1397 ; LARGE-PIC-NEXT:    leaq .L26$pb(%rip), %rax
1398 ; LARGE-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L26$pb, %rcx
1399 ; LARGE-PIC-NEXT:    addq %rax, %rcx
1400 ; LARGE-PIC-NEXT:    movabsq ${{\.?LCPI[0-9]+_[0-9]+}}@GOTOFF, %rax
1401 ; LARGE-PIC-NEXT:    addss (%rcx,%rax), %xmm0
1402 ; LARGE-PIC-NEXT:    retq
1404 ; LARGE-SMALL-DATA-PIC-LABEL: load_constant_pool:
1405 ; LARGE-SMALL-DATA-PIC:       # %bb.0:
1406 ; LARGE-SMALL-DATA-PIC-NEXT:  .L26$pb:
1407 ; LARGE-SMALL-DATA-PIC-NEXT:    leaq .L26$pb(%rip), %rax
1408 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq $_GLOBAL_OFFSET_TABLE_-.L26$pb, %rcx
1409 ; LARGE-SMALL-DATA-PIC-NEXT:    addq %rax, %rcx
1410 ; LARGE-SMALL-DATA-PIC-NEXT:    movabsq ${{\.?LCPI[0-9]+_[0-9]+}}@GOTOFF, %rax
1411 ; LARGE-SMALL-DATA-PIC-NEXT:    addss (%rcx,%rax), %xmm0
1412 ; LARGE-SMALL-DATA-PIC-NEXT:    retq
1413   %a = fadd float %x, 1.0
1414   ret float %a
1417 attributes #0 = { noinline nounwind uwtable }
1419 !llvm.module.flags = !{!0, !1, !2}
1420 !llvm.ident = !{!3}
1422 !0 = !{i32 1, !"wchar_size", i32 4}
1423 !1 = !{i32 7, !"PIC Level", i32 2}
1424 !2 = !{i32 7, !"PIE Level", i32 2}
1425 !3 = !{!"clang version 7.0.0 "}