mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-04 01:11:44 +00:00
CodeGen: Make the global-merge pass independently testable, and add a test.
llvm-svn: 270023
This commit is contained in:
parent
d34b10ac08
commit
1d69c09bab
@ -91,6 +91,11 @@ EnableGlobalMerge("enable-global-merge", cl::Hidden,
|
||||
cl::desc("Enable the global merge pass"),
|
||||
cl::init(true));
|
||||
|
||||
static cl::opt<unsigned>
|
||||
GlobalMergeMaxOffset("global-merge-max-offset", cl::Hidden,
|
||||
cl::desc("Set maximum offset for global merge pass"),
|
||||
cl::init(0));
|
||||
|
||||
static cl::opt<bool> GlobalMergeGroupByUse(
|
||||
"global-merge-group-by-use", cl::Hidden,
|
||||
cl::desc("Improve global merge pass to look at uses"), cl::init(true));
|
||||
@ -130,6 +135,8 @@ namespace {
|
||||
/// Whether we should merge global variables that have external linkage.
|
||||
bool MergeExternalGlobals;
|
||||
|
||||
bool IsMachO;
|
||||
|
||||
bool doMerge(SmallVectorImpl<GlobalVariable*> &Globals,
|
||||
Module &M, bool isConst, unsigned AddrSpace) const;
|
||||
/// \brief Merge everything in \p Globals for which the corresponding bit
|
||||
@ -157,10 +164,14 @@ namespace {
|
||||
|
||||
public:
|
||||
static char ID; // Pass identification, replacement for typeid.
|
||||
explicit GlobalMerge(const TargetMachine *TM = nullptr,
|
||||
unsigned MaximalOffset = 0,
|
||||
bool OnlyOptimizeForSize = false,
|
||||
bool MergeExternalGlobals = false)
|
||||
explicit GlobalMerge()
|
||||
: FunctionPass(ID), TM(nullptr), MaxOffset(GlobalMergeMaxOffset),
|
||||
OnlyOptimizeForSize(false), MergeExternalGlobals(false) {
|
||||
initializeGlobalMergePass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
explicit GlobalMerge(const TargetMachine *TM, unsigned MaximalOffset,
|
||||
bool OnlyOptimizeForSize, bool MergeExternalGlobals)
|
||||
: FunctionPass(ID), TM(TM), MaxOffset(MaximalOffset),
|
||||
OnlyOptimizeForSize(OnlyOptimizeForSize),
|
||||
MergeExternalGlobals(MergeExternalGlobals) {
|
||||
@ -458,8 +469,7 @@ bool GlobalMerge::doMerge(const SmallVectorImpl<GlobalVariable *> &Globals,
|
||||
// we can also emit an alias for internal linkage as it's safe to do so.
|
||||
// It's not safe on Mach-O as the alias (and thus the portion of the
|
||||
// MergedGlobals variable) may be dead stripped at link time.
|
||||
if (Linkage != GlobalValue::InternalLinkage ||
|
||||
!TM->getTargetTriple().isOSBinFormatMachO()) {
|
||||
if (Linkage != GlobalValue::InternalLinkage || !IsMachO) {
|
||||
GlobalAlias::create(Tys[idx], AddrSpace, Linkage, Name, GEP, &M);
|
||||
}
|
||||
|
||||
@ -512,6 +522,8 @@ bool GlobalMerge::doInitialization(Module &M) {
|
||||
if (!EnableGlobalMerge)
|
||||
return false;
|
||||
|
||||
IsMachO = Triple(M.getTargetTriple()).isOSBinFormatMachO();
|
||||
|
||||
auto &DL = M.getDataLayout();
|
||||
DenseMap<unsigned, SmallVector<GlobalVariable*, 16> > Globals, ConstGlobals,
|
||||
BSSGlobals;
|
||||
@ -549,7 +561,8 @@ bool GlobalMerge::doInitialization(Module &M) {
|
||||
continue;
|
||||
|
||||
if (DL.getTypeAllocSize(Ty) < MaxOffset) {
|
||||
if (TargetLoweringObjectFile::getKindForGlobal(&GV, *TM).isBSSLocal())
|
||||
if (TM &&
|
||||
TargetLoweringObjectFile::getKindForGlobal(&GV, *TM).isBSSLocal())
|
||||
BSSGlobals[AddressSpace].push_back(&GV);
|
||||
else if (GV.isConstant())
|
||||
ConstGlobals[AddressSpace].push_back(&GV);
|
||||
|
20
test/Transforms/GlobalMerge/basic.ll
Normal file
20
test/Transforms/GlobalMerge/basic.ll
Normal file
@ -0,0 +1,20 @@
|
||||
; RUN: opt -global-merge -global-merge-max-offset=100 -S -o - %s | FileCheck %s
|
||||
|
||||
target datalayout = "e-p:64:64"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
; CHECK: @_MergedGlobals = private global { i32, i32 } { i32 1, i32 2 }
|
||||
|
||||
; CHECK: @a = internal alias i32, getelementptr inbounds ({ i32, i32 }, { i32, i32 }* @_MergedGlobals, i32 0, i32 0)
|
||||
@a = internal global i32 1
|
||||
|
||||
; CHECK: @b = internal alias i32, getelementptr inbounds ({ i32, i32 }, { i32, i32 }* @_MergedGlobals, i32 0, i32 1)
|
||||
@b = internal global i32 2
|
||||
|
||||
define void @use() {
|
||||
; CHECK: load i32, i32* getelementptr inbounds ({ i32, i32 }, { i32, i32 }* @_MergedGlobals, i32 0, i32 0)
|
||||
%x = load i32, i32* @a
|
||||
; CHECK: load i32, i32* getelementptr inbounds ({ i32, i32 }, { i32, i32 }* @_MergedGlobals, i32 0, i32 1)
|
||||
%y = load i32, i32* @b
|
||||
ret void
|
||||
}
|
@ -362,6 +362,7 @@ int main(int argc, char **argv) {
|
||||
initializeSafeStackPass(Registry);
|
||||
initializeSjLjEHPreparePass(Registry);
|
||||
initializePreISelIntrinsicLoweringPass(Registry);
|
||||
initializeGlobalMergePass(Registry);
|
||||
|
||||
#ifdef LINK_POLLY_INTO_TOOLS
|
||||
polly::initializePollyPasses(Registry);
|
||||
|
Loading…
Reference in New Issue
Block a user