This removes some assumptions that the small code model will only reference "near" globals. There are still some missing optimizations and wrong code sequences, but I'd like to address those separately. This will require auditing any checks of the code model in the X86 backend.
803 lines
28 KiB
LLVM
803 lines
28 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_sp
|
|
; Run with --no_x86_scrub_rip because we care a lot about how globals are
|
|
; accessed in the code model.
|
|
|
|
; RUN: llc -verify-machineinstrs < %s -relocation-model=static -code-model=small | FileCheck %s --check-prefix=CHECK --check-prefix=SMALL-STATIC
|
|
; RUN: llc -verify-machineinstrs < %s -relocation-model=static -code-model=medium | FileCheck %s --check-prefix=CHECK --check-prefix=MEDIUM-STATIC
|
|
; RUN: llc -verify-machineinstrs < %s -relocation-model=static -code-model=large | FileCheck %s --check-prefix=CHECK --check-prefix=LARGE-STATIC
|
|
; RUN: llc -verify-machineinstrs < %s -relocation-model=pic -code-model=small | FileCheck %s --check-prefix=CHECK --check-prefix=SMALL-PIC
|
|
; 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
|
|
; RUN: llc -verify-machineinstrs < %s -relocation-model=pic -code-model=medium | FileCheck %s --check-prefix=CHECK --check-prefix=MEDIUM-PIC
|
|
; RUN: llc -verify-machineinstrs < %s -relocation-model=pic -code-model=large | FileCheck %s --check-prefix=CHECK --check-prefix=LARGE-PIC
|
|
; RUN: llc -verify-machineinstrs < %s -relocation-model=pic -code-model=large -large-data-threshold=1000 | FileCheck %s --check-prefix=CHECK --check-prefix=LARGE-PIC
|
|
|
|
; Generated from this C source:
|
|
;
|
|
; static int static_data[10];
|
|
; int global_data[10] = {1, 2};
|
|
; extern int extern_data[10];
|
|
;
|
|
; int *lea_static_data() { return &static_data[0]; }
|
|
; int *lea_global_data() { return &global_data[0]; }
|
|
; int *lea_extern_data() { return &extern_data[0]; }
|
|
;
|
|
; static void static_fn(void) {}
|
|
; void global_fn(void) {}
|
|
; void extern_fn(void);
|
|
;
|
|
; typedef void (*void_fn)(void);
|
|
; void_fn lea_static_fn() { return &static_fn; }
|
|
; void_fn lea_global_fn() { return &global_fn; }
|
|
; void_fn lea_extern_fn() { return &extern_fn; }
|
|
|
|
|
|
; ModuleID = 'model.c'
|
|
source_filename = "model.c"
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64--linux"
|
|
|
|
@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
|
|
@static_data = internal global [10 x i32] zeroinitializer, align 16
|
|
@extern_data = external global [10 x i32], align 16
|
|
@thread_data = external thread_local global i32, align 4
|
|
@unknown_size_data = dso_local global [0 x i32] zeroinitializer, align 16
|
|
@forced_small_data = dso_local global [10 x i32] zeroinitializer, code_model "small", align 16
|
|
@forced_large_data = dso_local global [10 x i32] zeroinitializer, code_model "large", align 16
|
|
|
|
define dso_local ptr @lea_static_data() #0 {
|
|
; SMALL-STATIC-LABEL: lea_static_data:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movl $static_data, %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: lea_static_data:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movabsq $static_data, %rax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: lea_static_data:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $static_data, %rax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: lea_static_data:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: leaq static_data(%rip), %rax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_static_data:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq static_data(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: lea_static_data:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
|
|
; MEDIUM-PIC-NEXT: movabsq $static_data@GOTOFF, %rax
|
|
; MEDIUM-PIC-NEXT: addq %rcx, %rax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: lea_static_data:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L0$pb:
|
|
; LARGE-PIC-NEXT: leaq .L0$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L0$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $static_data@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: addq %rcx, %rax
|
|
; LARGE-PIC-NEXT: retq
|
|
ret ptr @static_data
|
|
}
|
|
|
|
define dso_local ptr @lea_global_data() #0 {
|
|
; SMALL-STATIC-LABEL: lea_global_data:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movl $global_data, %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: lea_global_data:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movabsq $global_data, %rax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: lea_global_data:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $global_data, %rax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: lea_global_data:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: leaq global_data(%rip), %rax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_global_data:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq global_data(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: lea_global_data:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
|
|
; MEDIUM-PIC-NEXT: movabsq $global_data@GOTOFF, %rax
|
|
; MEDIUM-PIC-NEXT: addq %rcx, %rax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: lea_global_data:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L1$pb:
|
|
; LARGE-PIC-NEXT: leaq .L1$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L1$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $global_data@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: addq %rcx, %rax
|
|
; LARGE-PIC-NEXT: retq
|
|
ret ptr @global_data
|
|
}
|
|
|
|
define dso_local ptr @lea_extern_data() #0 {
|
|
; SMALL-STATIC-LABEL: lea_extern_data:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: lea_extern_data:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: lea_extern_data:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $extern_data, %rax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: lea_extern_data:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_extern_data:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: lea_extern_data:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: lea_extern_data:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L2$pb:
|
|
; LARGE-PIC-NEXT: leaq .L2$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L2$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $extern_data@GOT, %rax
|
|
; LARGE-PIC-NEXT: movq (%rcx,%rax), %rax
|
|
; LARGE-PIC-NEXT: retq
|
|
ret ptr @extern_data
|
|
}
|
|
|
|
define dso_local ptr @lea_unknown_size_data() #0 {
|
|
; SMALL-STATIC-LABEL: lea_unknown_size_data:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movl $unknown_size_data, %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: lea_unknown_size_data:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movabsq $unknown_size_data, %rax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: lea_unknown_size_data:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $unknown_size_data, %rax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: lea_unknown_size_data:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: leaq unknown_size_data(%rip), %rax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_unknown_size_data:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movabsq $unknown_size_data@GOTOFF, %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: addq %rcx, %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: lea_unknown_size_data:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
|
|
; MEDIUM-PIC-NEXT: movabsq $unknown_size_data@GOTOFF, %rax
|
|
; MEDIUM-PIC-NEXT: addq %rcx, %rax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: lea_unknown_size_data:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L3$pb:
|
|
; LARGE-PIC-NEXT: leaq .L3$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L3$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $unknown_size_data@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: addq %rcx, %rax
|
|
; LARGE-PIC-NEXT: retq
|
|
ret ptr @unknown_size_data
|
|
}
|
|
|
|
; TODO: make nopic small and medium instruction sequence the same
|
|
define dso_local ptr @lea_forced_small_data() #0 {
|
|
; SMALL-STATIC-LABEL: lea_forced_small_data:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movl $forced_small_data, %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: lea_forced_small_data:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movabsq $forced_small_data, %rax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: lea_forced_small_data:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $forced_small_data, %rax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: lea_forced_small_data:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: leaq forced_small_data(%rip), %rax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_forced_small_data:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq forced_small_data(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: lea_forced_small_data:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: leaq forced_small_data(%rip), %rax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: lea_forced_small_data:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L4$pb:
|
|
; LARGE-PIC-NEXT: leaq .L4$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L4$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $forced_small_data@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: addq %rcx, %rax
|
|
; LARGE-PIC-NEXT: retq
|
|
ret ptr @forced_small_data
|
|
}
|
|
|
|
; TODO: make small and medium instruction sequence the same
|
|
define dso_local i32 @load_forced_small_data() #0 {
|
|
; SMALL-STATIC-LABEL: load_forced_small_data:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movl forced_small_data+8(%rip), %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: load_forced_small_data:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movabsq $forced_small_data, %rax
|
|
; MEDIUM-STATIC-NEXT: movl 8(%rax), %eax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: load_forced_small_data:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $forced_small_data, %rax
|
|
; LARGE-STATIC-NEXT: movl 8(%rax), %eax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: load_forced_small_data:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: movl forced_small_data+8(%rip), %eax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: load_forced_small_data:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq forced_small_data(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movl 8(%rax), %eax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: load_forced_small_data:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: leaq forced_small_data(%rip), %rax
|
|
; MEDIUM-PIC-NEXT: movl 8(%rax), %eax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: load_forced_small_data:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L5$pb:
|
|
; LARGE-PIC-NEXT: leaq .L5$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L5$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $forced_small_data@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: movl 8(%rcx,%rax), %eax
|
|
; LARGE-PIC-NEXT: retq
|
|
%rv = load i32, ptr getelementptr inbounds (i32, ptr @forced_small_data, i64 2)
|
|
ret i32 %rv
|
|
}
|
|
|
|
; TODO: fix small code model instruction sequences to use 64-bit constants
|
|
define dso_local ptr @lea_forced_large_data() #0 {
|
|
; SMALL-STATIC-LABEL: lea_forced_large_data:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movl $forced_large_data, %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: lea_forced_large_data:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movabsq $forced_large_data, %rax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: lea_forced_large_data:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $forced_large_data, %rax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: lea_forced_large_data:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
|
|
; SMALL-PIC-NEXT: leaq forced_large_data@GOTOFF(%rax), %rax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_forced_large_data:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movabsq $forced_large_data@GOTOFF, %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: addq %rcx, %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: lea_forced_large_data:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
|
|
; MEDIUM-PIC-NEXT: movabsq $forced_large_data@GOTOFF, %rax
|
|
; MEDIUM-PIC-NEXT: addq %rcx, %rax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: lea_forced_large_data:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L6$pb:
|
|
; LARGE-PIC-NEXT: leaq .L6$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L6$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $forced_large_data@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: addq %rcx, %rax
|
|
; LARGE-PIC-NEXT: retq
|
|
ret ptr @forced_large_data
|
|
}
|
|
|
|
define dso_local i32 @load_forced_large_data() #0 {
|
|
; SMALL-STATIC-LABEL: load_forced_large_data:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movl forced_large_data+8(%rip), %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: load_forced_large_data:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movabsq $forced_large_data, %rax
|
|
; MEDIUM-STATIC-NEXT: movl 8(%rax), %eax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: load_forced_large_data:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $forced_large_data, %rax
|
|
; LARGE-STATIC-NEXT: movl 8(%rax), %eax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: load_forced_large_data:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
|
|
; SMALL-PIC-NEXT: movl forced_large_data@GOTOFF+8(%rax), %eax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: load_forced_large_data:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movabsq $forced_large_data@GOTOFF, %rcx
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movl 8(%rax,%rcx), %eax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: load_forced_large_data:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
|
|
; MEDIUM-PIC-NEXT: movabsq $forced_large_data@GOTOFF, %rcx
|
|
; MEDIUM-PIC-NEXT: movl 8(%rax,%rcx), %eax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: load_forced_large_data:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L7$pb:
|
|
; LARGE-PIC-NEXT: leaq .L7$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L7$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $forced_large_data@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: movl 8(%rcx,%rax), %eax
|
|
; LARGE-PIC-NEXT: retq
|
|
%rv = load i32, ptr getelementptr inbounds (i32, ptr @forced_large_data, i64 2)
|
|
ret i32 %rv
|
|
}
|
|
|
|
define dso_local i32 @load_global_data() #0 {
|
|
; SMALL-STATIC-LABEL: load_global_data:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movl global_data+8(%rip), %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: load_global_data:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movabsq $global_data, %rax
|
|
; MEDIUM-STATIC-NEXT: movl 8(%rax), %eax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: load_global_data:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $global_data, %rax
|
|
; LARGE-STATIC-NEXT: movl 8(%rax), %eax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: load_global_data:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: movl global_data+8(%rip), %eax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: load_global_data:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq global_data(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movl 8(%rax), %eax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: load_global_data:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
|
|
; MEDIUM-PIC-NEXT: movabsq $global_data@GOTOFF, %rcx
|
|
; MEDIUM-PIC-NEXT: movl 8(%rax,%rcx), %eax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: load_global_data:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L8$pb:
|
|
; LARGE-PIC-NEXT: leaq .L8$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L8$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $global_data@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: movl 8(%rcx,%rax), %eax
|
|
; LARGE-PIC-NEXT: retq
|
|
%rv = load i32, ptr getelementptr inbounds ([10 x i32], ptr @global_data, i64 0, i64 2)
|
|
ret i32 %rv
|
|
}
|
|
|
|
define dso_local i32 @load_extern_data() #0 {
|
|
; SMALL-STATIC-LABEL: load_extern_data:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; SMALL-STATIC-NEXT: movl 8(%rax), %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: load_extern_data:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; MEDIUM-STATIC-NEXT: movl 8(%rax), %eax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: load_extern_data:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $extern_data, %rax
|
|
; LARGE-STATIC-NEXT: movl 8(%rax), %eax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: load_extern_data:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; SMALL-PIC-NEXT: movl 8(%rax), %eax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: load_extern_data:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movl 8(%rax), %eax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: load_extern_data:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; MEDIUM-PIC-NEXT: movl 8(%rax), %eax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: load_extern_data:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L9$pb:
|
|
; LARGE-PIC-NEXT: leaq .L9$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L9$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $extern_data@GOT, %rax
|
|
; LARGE-PIC-NEXT: movq (%rcx,%rax), %rax
|
|
; LARGE-PIC-NEXT: movl 8(%rax), %eax
|
|
; LARGE-PIC-NEXT: retq
|
|
%rv = load i32, ptr getelementptr inbounds ([10 x i32], ptr @extern_data, i64 0, i64 2)
|
|
ret i32 %rv
|
|
}
|
|
|
|
define dso_local i32 @load_unknown_size_data() #0 {
|
|
; SMALL-STATIC-LABEL: load_unknown_size_data:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movl unknown_size_data+8(%rip), %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: load_unknown_size_data:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movabsq $unknown_size_data, %rax
|
|
; MEDIUM-STATIC-NEXT: movl 8(%rax), %eax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: load_unknown_size_data:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $unknown_size_data, %rax
|
|
; LARGE-STATIC-NEXT: movl 8(%rax), %eax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: load_unknown_size_data:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: movl unknown_size_data+8(%rip), %eax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: load_unknown_size_data:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movabsq $unknown_size_data@GOTOFF, %rcx
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movl 8(%rax,%rcx), %eax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: load_unknown_size_data:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
|
|
; MEDIUM-PIC-NEXT: movabsq $unknown_size_data@GOTOFF, %rcx
|
|
; MEDIUM-PIC-NEXT: movl 8(%rax,%rcx), %eax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: load_unknown_size_data:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L10$pb:
|
|
; LARGE-PIC-NEXT: leaq .L10$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L10$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $unknown_size_data@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: movl 8(%rcx,%rax), %eax
|
|
; LARGE-PIC-NEXT: retq
|
|
%rv = load i32, ptr getelementptr inbounds (i32, ptr @unknown_size_data, i64 2)
|
|
ret i32 %rv
|
|
}
|
|
|
|
define dso_local void @global_fn() #0 {
|
|
; CHECK-LABEL: global_fn:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: retq
|
|
ret void
|
|
}
|
|
|
|
define internal void @static_fn() #0 {
|
|
; CHECK-LABEL: static_fn:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: retq
|
|
ret void
|
|
}
|
|
|
|
declare void @extern_fn()
|
|
|
|
define dso_local ptr @lea_static_fn() #0 {
|
|
; SMALL-STATIC-LABEL: lea_static_fn:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movl $static_fn, %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: lea_static_fn:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: leaq static_fn(%rip), %rax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: lea_static_fn:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $static_fn, %rax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: lea_static_fn:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: leaq static_fn(%rip), %rax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_static_fn:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq static_fn(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: lea_static_fn:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: leaq static_fn(%rip), %rax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: lea_static_fn:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L13$pb:
|
|
; LARGE-PIC-NEXT: leaq .L13$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L13$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $static_fn@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: addq %rcx, %rax
|
|
; LARGE-PIC-NEXT: retq
|
|
ret ptr @static_fn
|
|
}
|
|
|
|
define dso_local ptr @lea_global_fn() #0 {
|
|
; SMALL-STATIC-LABEL: lea_global_fn:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movl $global_fn, %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: lea_global_fn:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: leaq global_fn(%rip), %rax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: lea_global_fn:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $global_fn, %rax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: lea_global_fn:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: leaq global_fn(%rip), %rax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_global_fn:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq global_fn(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: lea_global_fn:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: leaq global_fn(%rip), %rax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: lea_global_fn:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L14$pb:
|
|
; LARGE-PIC-NEXT: leaq .L14$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L14$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $global_fn@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: addq %rcx, %rax
|
|
; LARGE-PIC-NEXT: retq
|
|
ret ptr @global_fn
|
|
}
|
|
|
|
define dso_local ptr @lea_extern_fn() #0 {
|
|
; SMALL-STATIC-LABEL: lea_extern_fn:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movq extern_fn@GOTPCREL(%rip), %rax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: lea_extern_fn:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movq extern_fn@GOTPCREL(%rip), %rax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: lea_extern_fn:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $extern_fn, %rax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: lea_extern_fn:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: movq extern_fn@GOTPCREL(%rip), %rax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_extern_fn:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movq extern_fn@GOTPCREL(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: lea_extern_fn:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: movq extern_fn@GOTPCREL(%rip), %rax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: lea_extern_fn:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L15$pb:
|
|
; LARGE-PIC-NEXT: leaq .L15$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L15$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $extern_fn@GOT, %rax
|
|
; LARGE-PIC-NEXT: movq (%rcx,%rax), %rax
|
|
; LARGE-PIC-NEXT: retq
|
|
ret ptr @extern_fn
|
|
}
|
|
|
|
; FIXME: The result is same for small, medium and large model, because we
|
|
; specify pie option in the test case. And the type of tls is initial exec tls.
|
|
; For pic code. The large model code for pic tls should be emitted as below.
|
|
|
|
; .L3:
|
|
; leaq .L3(%rip), %rbx
|
|
; movabsq $_GLOBAL_OFFSET_TABLE_-.L3, %r11
|
|
; addq %r11, %rbx
|
|
; leaq thread_data@TLSGD(%rip), %rdi
|
|
; movabsq $__tls_get_addr@PLTOFF, %rax
|
|
; addq %rbx, %rax
|
|
; call *%rax
|
|
; movl (%rax), %eax
|
|
|
|
; The medium and small model code for pic tls should be emitted as below.
|
|
; data16
|
|
; leaq thread_data@TLSGD(%rip), %rdi
|
|
; data16
|
|
; data16
|
|
; rex64
|
|
; callq __tls_get_addr@PLT
|
|
; movl (%rax), %eax
|
|
|
|
define dso_local i32 @load_thread_data() #0 {
|
|
; CHECK-LABEL: load_thread_data:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: movq thread_data@GOTTPOFF(%rip), %rax
|
|
; CHECK-NEXT: movl %fs:(%rax), %eax
|
|
; CHECK-NEXT: retq
|
|
%1 = load i32, ptr @thread_data, align 4
|
|
ret i32 %1
|
|
}
|
|
|
|
define dso_local float @load_constant_pool(float %x) #0 {
|
|
; SMALL-STATIC-LABEL: load_constant_pool:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: load_constant_pool:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax
|
|
; MEDIUM-STATIC-NEXT: addss (%rax), %xmm0
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: load_constant_pool:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax
|
|
; LARGE-STATIC-NEXT: addss (%rax), %xmm0
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: load_constant_pool:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: load_constant_pool:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: load_constant_pool:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: load_constant_pool:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L17$pb:
|
|
; LARGE-PIC-NEXT: leaq .L17$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L17$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: addss (%rcx,%rax), %xmm0
|
|
; LARGE-PIC-NEXT: retq
|
|
%a = fadd float %x, 1.0
|
|
ret float %a
|
|
}
|
|
|
|
attributes #0 = { noinline nounwind uwtable }
|
|
|
|
!llvm.module.flags = !{!0, !1, !2}
|
|
!llvm.ident = !{!3}
|
|
|
|
!0 = !{i32 1, !"wchar_size", i32 4}
|
|
!1 = !{i32 7, !"PIC Level", i32 2}
|
|
!2 = !{i32 7, !"PIE Level", i32 2}
|
|
!3 = !{!"clang version 7.0.0 "}
|