summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp2
-rw-r--r--llvm/test/CodeGen/X86/code-model-elf-memset.ll91
2 files changed, 92 insertions, 1 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index f77a716434f..660255612ee 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -15793,7 +15793,7 @@ X86TargetLowering::LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const {
Result = DAG.getNode(getGlobalWrapperKind(), DL, PtrVT, Result);
// With PIC, the address is actually $g + Offset.
- if (isPositionIndependent() && !Subtarget.is64Bit()) {
+ if (OpFlag) {
Result =
DAG.getNode(ISD::ADD, DL, PtrVT,
DAG.getNode(X86ISD::GlobalBaseReg, SDLoc(), PtrVT), Result);
diff --git a/llvm/test/CodeGen/X86/code-model-elf-memset.ll b/llvm/test/CodeGen/X86/code-model-elf-memset.ll
new file mode 100644
index 00000000000..ba34aaeddcb
--- /dev/null
+++ b/llvm/test/CodeGen/X86/code-model-elf-memset.ll
@@ -0,0 +1,91 @@
+; 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: xorl %esi, %esi
+; SMALL-PIC-NEXT: movl $400, %edx # imm = 0x190
+; 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: xorl %esi, %esi
+; MEDIUM-PIC-NEXT: movl $400, %edx # imm = 0x190
+; 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: .Ltmp0:
+; LARGE-PIC-NEXT: leaq {{.*}}(%rip), %rax
+; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.Ltmp0, %rcx
+; LARGE-PIC-NEXT: addq %rcx, %rax
+; LARGE-PIC-NEXT: movl $0, {{[0-9]+}}(%rsp)
+; LARGE-PIC-NEXT: leaq {{[0-9]+}}(%rsp), %rdi
+; LARGE-PIC-NEXT: movabsq $memset@GOT, %rcx
+; LARGE-PIC-NEXT: xorl %esi, %esi
+; LARGE-PIC-NEXT: movl $400, %edx # imm = 0x190
+; LARGE-PIC-NEXT: callq *(%rax,%rcx)
+; 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 "}
OpenPOWER on IntegriCloud