xref: /llvm-project/llvm/test/CodeGen/X86/code-model-elf.ll (revision 6cea7c491f4c4c68aa0494a9b18f36ff40c22c81)
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.
4
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
13
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
23
24; Generated from this C source:
25;
26; static int static_data[10];
27; int global_data[10] = {1, 2};
28; extern int extern_data[10];
29;
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]; }
33;
34; static void static_fn(void) {}
35; void global_fn(void) {}
36; void extern_fn(void);
37;
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; }
42
43
44; ModuleID = 'model.c'
45source_filename = "model.c"
46target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
47target triple = "x86_64--linux"
48
49%t = type opaque
50
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
64
65define 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
70;
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
75;
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
80;
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
85;
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
90;
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
97;
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
107;
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
118}
119
120define 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
125;
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
130;
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
135;
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
140;
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
145;
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
152;
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
162;
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
173}
174
175define 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
180;
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
185;
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
190;
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
195;
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
200;
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
207;
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
217;
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
228}
229
230define 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
235;
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
240;
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
245;
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
250;
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
255;
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
260;
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
270;
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
281}
282
283define 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
288;
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
293;
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
298;
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
303;
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
310;
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
317;
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
327;
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
338}
339
340define 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
345;
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
350;
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
355;
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
360;
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
365;
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
370;
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
380;
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
391}
392
393define 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
398;
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
403;
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
409;
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
414;
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
419;
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
424;
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
434;
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
446}
447
448define 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
453;
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
458;
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
463;
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
470;
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
477;
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
484;
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
494;
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
505}
506
507define 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
513;
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
519;
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
525;
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
532;
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
539;
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
546;
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
556;
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
568}
569
570define 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
575;
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
581;
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
587;
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
592;
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
597;
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
604;
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
614;
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
626}
627
628define 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
634;
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
640;
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
646;
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
652;
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
658;
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
664;
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
675;
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
688}
689
690define 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
695;
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
701;
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
707;
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
712;
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
719;
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
726;
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
736;
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
748}
749
750define 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
755;
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
761;
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
767;
768; SMALL-PIC-LABEL: load_bool:
769; SMALL-PIC:       # %bb.0:
770; SMALL-PIC-NEXT:    movzbl bool(%rip), %eax
771; SMALL-PIC-NEXT:    retq
772;
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
777;
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
784;
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
794;
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
806}
807
808define 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
813;
814; MEDIUM-STATIC-LABEL: lea_opaque:
815; MEDIUM-STATIC:       # %bb.0:
816; MEDIUM-STATIC-NEXT:    movabsq $opaque, %rax
817; MEDIUM-STATIC-NEXT:    retq
818;
819; LARGE-STATIC-LABEL: lea_opaque:
820; LARGE-STATIC:       # %bb.0:
821; LARGE-STATIC-NEXT:    movabsq $opaque, %rax
822; LARGE-STATIC-NEXT:    retq
823;
824; SMALL-PIC-LABEL: lea_opaque:
825; SMALL-PIC:       # %bb.0:
826; SMALL-PIC-NEXT:    leaq opaque(%rip), %rax
827; SMALL-PIC-NEXT:    retq
828;
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
835;
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
842;
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
852;
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
863}
864
865define 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
870;
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
875;
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
880;
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
885;
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
892;
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
899;
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
909;
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
920}
921
922define 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
927;
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
932;
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
937;
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
942;
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
949;
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
956;
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
966;
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
977}
978
979define 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
984;
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
989;
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
994;
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
999;
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
1006;
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
1013;
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
1023;
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
1034}
1035
1036define dso_local void @global_fn() #0 {
1037; CHECK-LABEL: global_fn:
1038; CHECK:       # %bb.0:
1039; CHECK-NEXT:    retq
1040  ret void
1041}
1042
1043define internal void @static_fn() #0 {
1044; CHECK-LABEL: static_fn:
1045; CHECK:       # %bb.0:
1046; CHECK-NEXT:    retq
1047  ret void
1048}
1049
1050declare void @extern_fn()
1051
1052@ifunc_func = ifunc void (), ptr @resolver
1053@dso_local_ifunc_func = dso_local ifunc void (), ptr @resolver
1054
1055define internal ptr @resolver() {
1056; CHECK-LABEL: resolver:
1057; CHECK:       # %bb.0: # %entry
1058; CHECK-NEXT:    xorl %eax, %eax
1059; CHECK-NEXT:    retq
1060entry:
1061  ret ptr null
1062}
1063
1064define 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
1069;
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
1074;
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
1079;
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
1084;
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
1089;
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
1094;
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
1104;
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
1115}
1116
1117define 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
1122;
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
1127;
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
1132;
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
1137;
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
1142;
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
1147;
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
1157;
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
1168}
1169
1170define 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
1175;
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
1180;
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
1185;
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
1190;
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
1195;
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
1200;
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
1210;
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
1221}
1222
1223define 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
1228;
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
1233;
1234; LARGE-STATIC-LABEL: lea_ifunc:
1235; LARGE-STATIC:       # %bb.0:
1236; LARGE-STATIC-NEXT:    movabsq $ifunc_func, %rax
1237; LARGE-STATIC-NEXT:    retq
1238;
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
1243;
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
1248;
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
1253;
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
1263;
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
1274}
1275
1276define 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
1281;
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
1286;
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
1291;
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
1296;
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
1301;
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
1306;
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
1316;
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
1327}
1328
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.
1332
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
1342
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
1351
1352define 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
1360}
1361
1362define 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
1367;
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
1372;
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
1378;
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
1383;
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
1388;
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
1393;
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
1403;
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
1415}
1416
1417attributes #0 = { noinline nounwind uwtable }
1418
1419!llvm.module.flags = !{!0, !1, !2}
1420!llvm.ident = !{!3}
1421
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 "}
1426