; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; Run with --no_x86_scrub_rip because we care a lot about how globals are ; accessed in the code model. ; Memset is interesting because it is an ExternalSymbol reference instead of a ; GlobalValue. Make sure we do the right GOT load for 64-bit large. ; RUN: llc < %s -relocation-model=pic -code-model=small | FileCheck %s --check-prefix=CHECK --check-prefix=SMALL-PIC ; RUN: llc < %s -relocation-model=pic -code-model=medium | FileCheck %s --check-prefix=CHECK --check-prefix=MEDIUM-PIC ; RUN: llc < %s -relocation-model=pic -code-model=large | FileCheck %s --check-prefix=CHECK --check-prefix=LARGE-PIC ; Generated from this C source: ; ; int main() { ; unsigned int a[100] = {0}; ; return 0; ; } ; 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" declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1) #1 define i32 @main() #0 { ; SMALL-PIC-LABEL: main: ; SMALL-PIC: # %bb.0: # %entry ; SMALL-PIC-NEXT: subq $424, %rsp # imm = 0x1A8 ; SMALL-PIC-NEXT: .cfi_def_cfa_offset 432 ; SMALL-PIC-NEXT: movl $0, {{[0-9]+}}(%rsp) ; SMALL-PIC-NEXT: leaq {{[0-9]+}}(%rsp), %rdi ; SMALL-PIC-NEXT: movl $400, %edx # imm = 0x190 ; SMALL-PIC-NEXT: xorl %esi, %esi ; SMALL-PIC-NEXT: callq memset@PLT ; SMALL-PIC-NEXT: xorl %eax, %eax ; SMALL-PIC-NEXT: addq $424, %rsp # imm = 0x1A8 ; SMALL-PIC-NEXT: .cfi_def_cfa_offset 8 ; SMALL-PIC-NEXT: retq ; ; MEDIUM-PIC-LABEL: main: ; MEDIUM-PIC: # %bb.0: # %entry ; MEDIUM-PIC-NEXT: subq $424, %rsp # imm = 0x1A8 ; MEDIUM-PIC-NEXT: .cfi_def_cfa_offset 432 ; MEDIUM-PIC-NEXT: movl $0, {{[0-9]+}}(%rsp) ; MEDIUM-PIC-NEXT: leaq {{[0-9]+}}(%rsp), %rdi ; MEDIUM-PIC-NEXT: movl $400, %edx # imm = 0x190 ; MEDIUM-PIC-NEXT: xorl %esi, %esi ; MEDIUM-PIC-NEXT: callq memset@PLT ; MEDIUM-PIC-NEXT: xorl %eax, %eax ; MEDIUM-PIC-NEXT: addq $424, %rsp # imm = 0x1A8 ; MEDIUM-PIC-NEXT: .cfi_def_cfa_offset 8 ; MEDIUM-PIC-NEXT: retq ; ; LARGE-PIC-LABEL: main: ; LARGE-PIC: # %bb.0: # %entry ; LARGE-PIC-NEXT: subq $424, %rsp # imm = 0x1A8 ; LARGE-PIC-NEXT: .cfi_def_cfa_offset 432 ; LARGE-PIC-NEXT: .L0$pb: ; LARGE-PIC-NEXT: leaq .L0${{.*}}(%rip), %rax ; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L0$pb, %rcx ; LARGE-PIC-NEXT: addq %rax, %rcx ; LARGE-PIC-NEXT: movl $0, {{[0-9]+}}(%rsp) ; LARGE-PIC-NEXT: leaq {{[0-9]+}}(%rsp), %rdi ; LARGE-PIC-NEXT: movabsq $memset@GOT, %rax ; LARGE-PIC-NEXT: movl $400, %edx # imm = 0x190 ; LARGE-PIC-NEXT: xorl %esi, %esi ; LARGE-PIC-NEXT: callq *(%rcx,%rax) ; LARGE-PIC-NEXT: xorl %eax, %eax ; LARGE-PIC-NEXT: addq $424, %rsp # imm = 0x1A8 ; LARGE-PIC-NEXT: .cfi_def_cfa_offset 8 ; LARGE-PIC-NEXT: retq entry: %retval = alloca i32, align 4 %a = alloca [100 x i32], align 16 store i32 0, i32* %retval, align 4 %0 = bitcast [100 x i32]* %a to i8* call void @llvm.memset.p0i8.i64(i8* align 16 %0, i8 0, i64 400, i1 false) ret i32 0 } attributes #0 = { noinline nounwind uwtable } attributes #0 = { argmemonly 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 "}