From 29c52f7449a3997329603ced247453221cbfb217 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Tue, 6 Jan 2015 07:12:52 +0000 Subject: [PATCH] X86: Don't make illegal GOTTPOFF relocations "ELF Handling for Thread-Local Storage" specifies that R_X86_64_GOTTPOFF relocation target a movq or addq instruction. Prohibit the truncation of such loads to movl or addl. This fixes PR22083. Differential Revision: http://reviews.llvm.org/D6839 llvm-svn: 225250 --- llvm/lib/Target/X86/X86ISelLowering.cpp | 12 ++++++++++++ llvm/lib/Target/X86/X86ISelLowering.h | 5 +++++ llvm/test/CodeGen/X86/tls-models.ll | 8 ++++++++ 3 files changed, 25 insertions(+) diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 9e06861..9893589 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -3862,6 +3862,18 @@ bool X86TargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT) const { return false; } +bool X86TargetLowering::shouldReduceLoadWidth(SDNode *Load, + ISD::LoadExtType ExtTy, + EVT NewVT) const { + // "ELF Handling for Thread-Local Storage" specifies that R_X86_64_GOTTPOFF + // relocation target a movq or addq instruction: don't let the load shrink. + SDValue BasePtr = cast(Load)->getBasePtr(); + if (BasePtr.getOpcode() == X86ISD::WrapperRIP) + if (const auto *GA = dyn_cast(BasePtr.getOperand(0))) + return GA->getTargetFlags() != X86II::MO_GOTTPOFF; + return true; +} + /// \brief Returns true if it is beneficial to convert a load of a constant /// to just the constant itself. bool X86TargetLowering::shouldConvertConstantLoadToIntImm(const APInt &Imm, diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h index 0b01bae..ba077a8a 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.h +++ b/llvm/lib/Target/X86/X86ISelLowering.h @@ -770,6 +770,11 @@ namespace llvm { return !X86ScalarSSEf64 || VT == MVT::f80; } + /// Return true if we believe it is correct and profitable to reduce the + /// load node to a smaller type. + bool shouldReduceLoadWidth(SDNode *Load, ISD::LoadExtType ExtTy, + EVT NewVT) const override; + const X86Subtarget* getSubtarget() const { return Subtarget; } diff --git a/llvm/test/CodeGen/X86/tls-models.ll b/llvm/test/CodeGen/X86/tls-models.ll index 8e3e958..0fd7853 100644 --- a/llvm/test/CodeGen/X86/tls-models.ll +++ b/llvm/test/CodeGen/X86/tls-models.ll @@ -128,6 +128,14 @@ entry: ; DARWIN: _internal_ie@TLVP } +define i32 @PR22083() { +entry: + ret i32 ptrtoint (i32* @external_ie to i32) + ; X64-LABEL: PR22083: + ; X64: movq external_ie@GOTTPOFF(%rip), %rax + ; X64_PIC-LABEL: PR22083: + ; X64_PIC: movq external_ie@GOTTPOFF(%rip), %rax +} ; ----- localexec specified ----- -- 2.7.4