Use shouldAssumeDSOLocal in isOffsetFoldingLegal.

This makes it slightly more powerful for dynamic-no-pic.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273704 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2016-06-24 18:48:36 +00:00
parent c0b6cd2c10
commit fddccef6cb
2 changed files with 24 additions and 9 deletions

View File

@ -311,17 +311,22 @@ TargetLowering::getPICJumpTableRelocBaseExpr(const MachineFunction *MF,
bool
TargetLowering::isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const {
// Assume that everything is safe in static mode.
if (getTargetMachine().getRelocationModel() == Reloc::Static)
return true;
const TargetMachine &TM = getTargetMachine();
Reloc::Model RM = TM.getRelocationModel();
const GlobalValue *GV = GA->getGlobal();
const Triple &TargetTriple = TM.getTargetTriple();
// In dynamic-no-pic mode, assume that known defined values are safe.
if (getTargetMachine().getRelocationModel() == Reloc::DynamicNoPIC &&
GA && GA->getGlobal()->isStrongDefinitionForLinker())
return true;
// If the address is not even local to this DSO we will have to load it from
// a got and then add the offset.
if (!shouldAssumeDSOLocal(RM, TargetTriple, *GV->getParent(), GV))
return false;
// Otherwise assume nothing is safe.
return false;
// If the code is position independent we will have to add a base register.
if (RM == Reloc::PIC_)
return false;
// Otherwise we can do it.
return true;
}
//===----------------------------------------------------------------------===//

View File

@ -0,0 +1,10 @@
; RUN: llc < %s -mtriple=i686-apple-darwin -relocation-model=dynamic-no-pic | FileCheck %s
@var = external hidden global i32
@p = external hidden global i32*
define void @f() {
; CHECK: movl $_var+40, _p
store i32* getelementptr (i32, i32* @var, i64 10), i32** @p
ret void
}