Skip to content

Commit

Permalink
[lanai] Simplify small section check in LowerGlobalAddress and treat …
Browse files Browse the repository at this point in the history
…ldata sections specially.

Move the check for the code model into isGlobalInSmallSectionImpl and return false (not in small section) for variables placed in sections prefixed with .ldata (workaround for a tool limitation).



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289832 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
jpienaar committed Dec 15, 2016
1 parent fb4f51e commit de36587
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 3 deletions.
3 changes: 1 addition & 2 deletions lib/Target/Lanai/LanaiISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1170,8 +1170,7 @@ SDValue LanaiTargetLowering::LowerGlobalAddress(SDValue Op,
// If the code model is small or global variable will be placed in the small
// section, then assume address will fit in 21-bits.
const GlobalObject *GO = GV->getBaseObject();
if (getTargetMachine().getCodeModel() == CodeModel::Small ||
(GO && TLOF->isGlobalInSmallSection(GO, getTargetMachine()))) {
if (TLOF->isGlobalInSmallSection(GO, getTargetMachine())) {
SDValue Small = DAG.getTargetGlobalAddress(
GV, DL, getPointerTy(DAG.getDataLayout()), Offset, LanaiII::MO_NO_FLAG);
return DAG.getNode(ISD::OR, DL, MVT::i32,
Expand Down
14 changes: 13 additions & 1 deletion lib/Target/Lanai/LanaiTargetObjectFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ static bool isInSmallSection(uint64_t Size) {
// section.
bool LanaiTargetObjectFile::isGlobalInSmallSection(
const GlobalObject *GO, const TargetMachine &TM) const {
if (GO == nullptr)
return false;

// We first check the case where global is a declaration, because finding
// section kind using getKindForGlobal() is only allowed for global
// definitions.
Expand All @@ -72,12 +75,21 @@ bool LanaiTargetObjectFile::isGlobalInSmallSection(const GlobalObject *GO,
// section. This method does all the work, except for checking the section
// kind.
bool LanaiTargetObjectFile::isGlobalInSmallSectionImpl(
const GlobalObject *GO, const TargetMachine & /*TM*/) const {
const GlobalObject *GO, const TargetMachine &TM) const {
// Only global variables, not functions.
const auto *GVA = dyn_cast<GlobalVariable>(GO);
if (!GVA)
return false;

// Global values placed in sections starting with .ldata do not fit in
// 21-bits, so always use large memory access for them. FIXME: This is a
// workaround for a tool limitation.
if (GVA->getSection().startswith(".ldata"))
return false;

if (TM.getCodeModel() == CodeModel::Small)
return true;

if (GVA->hasLocalLinkage())
return false;

Expand Down
14 changes: 14 additions & 0 deletions test/CodeGen/Lanai/codemodel.ll
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,17 @@ entry:
ret i32 %0
}

@y = local_unnamed_addr global i32* null, section ".ldata,block", align 8

define i32 @foo2() nounwind readonly {
entry:
; CHECK-SMALL-LABEL: foo2:
; CHECK-SMALL: mov hi(y), %r[[REGISTER:[0-9]+]]
; CHECK-SMALL: or %r[[REGISTER]], lo(y), %r[[REGISTER]]
; CHECK-LABEL: foo2:
; CHECK: mov hi(y), %r[[REGISTER:[0-9]+]]
; CHECK: or %r[[REGISTER]], lo(y), %r[[REGISTER]]
%0 = load i32*, i32** @y, align 8
%1 = load i32, i32* %0, align 4
ret i32 %1
}

0 comments on commit de36587

Please sign in to comment.