From 881b45ccdf866e982b1dadc93b19dc11cf245bf7 Mon Sep 17 00:00:00 2001 From: Bob Wilson Date: Wed, 17 Nov 2010 21:25:39 +0000 Subject: [PATCH] Change ARMGlobalMerge to keep BSS globals in separate pools. This completes the fixes for Radar 8673120. llvm-svn: 119566 --- llvm/lib/Target/ARM/ARMGlobalMerge.cpp | 14 ++++++++++---- llvm/test/CodeGen/ARM/global-merge.ll | 8 +++++++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/llvm/lib/Target/ARM/ARMGlobalMerge.cpp b/llvm/lib/Target/ARM/ARMGlobalMerge.cpp index 72cab6462c45..3f0238387a2b 100644 --- a/llvm/lib/Target/ARM/ARMGlobalMerge.cpp +++ b/llvm/lib/Target/ARM/ARMGlobalMerge.cpp @@ -65,6 +65,7 @@ #include "llvm/Pass.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetLowering.h" +#include "llvm/Target/TargetLoweringObjectFile.h" using namespace llvm; namespace { @@ -74,7 +75,7 @@ namespace { const TargetLowering *TLI; bool doMerge(SmallVectorImpl &Globals, - Module &M, bool) const; + Module &M, bool isConst) const; public: static char ID; // Pass identification, replacement for typeid. @@ -161,7 +162,7 @@ bool ARMGlobalMerge::doMerge(SmallVectorImpl &Globals, bool ARMGlobalMerge::doInitialization(Module &M) { - SmallVector Globals, ConstGlobals; + SmallVector Globals, ConstGlobals, BSSGlobals; const TargetData *TD = TLI->getTargetData(); unsigned MaxOffset = TLI->getMaximalGlobalOffset(); bool Changed = false; @@ -183,7 +184,10 @@ bool ARMGlobalMerge::doInitialization(Module &M) { continue; if (TD->getTypeAllocSize(I->getType()->getElementType()) < MaxOffset) { - if (I->isConstant()) + const TargetLoweringObjectFile &TLOF = TLI->getObjFileLowering(); + if (TLOF.getKindForGlobal(I, TLI->getTargetMachine()).isBSSLocal()) + BSSGlobals.push_back(I); + else if (I->isConstant()) ConstGlobals.push_back(I); else Globals.push_back(I); @@ -192,10 +196,12 @@ bool ARMGlobalMerge::doInitialization(Module &M) { if (Globals.size() > 1) Changed |= doMerge(Globals, M, false); + if (BSSGlobals.size() > 1) + Changed |= doMerge(BSSGlobals, M, false); + // FIXME: This currently breaks the EH processing due to way how the // typeinfo detection works. We might want to detect the TIs and ignore // them in the future. - // if (ConstGlobals.size() > 1) // Changed |= doMerge(ConstGlobals, M, true); diff --git a/llvm/test/CodeGen/ARM/global-merge.ll b/llvm/test/CodeGen/ARM/global-merge.ll index e519dde33a0d..28bf2214740a 100644 --- a/llvm/test/CodeGen/ARM/global-merge.ll +++ b/llvm/test/CodeGen/ARM/global-merge.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -march=thumb | FileCheck %s +; RUN: llc < %s -mtriple=thumb-apple-darwin | FileCheck %s ; Test the ARMGlobalMerge pass. Use -march=thumb because it has a small ; value for the maximum offset (127). @@ -15,3 +15,9 @@ ; When this works properly, @g3 is placed in a separate chunk of merged globals. ; CHECK: _MergedGlobals1: @g3 = internal global [30 x i32] [ i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10 ] + +; Global variables that can be placed in BSS should be kept together in a +; separate pool of merged globals. +; CHECK: _MergedGlobals2 +@g4 = internal global i32 0 +@g5 = internal global i32 0 -- GitLab