From 1d69c09bab773c32002e32d96601c5fc74934cc4 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Thu, 19 May 2016 04:38:56 +0000 Subject: [PATCH] CodeGen: Make the global-merge pass independently testable, and add a test. llvm-svn: 270023 --- lib/CodeGen/GlobalMerge.cpp | 27 ++++++++++++++++++++------- test/Transforms/GlobalMerge/basic.ll | 20 ++++++++++++++++++++ tools/opt/opt.cpp | 1 + 3 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 test/Transforms/GlobalMerge/basic.ll diff --git a/lib/CodeGen/GlobalMerge.cpp b/lib/CodeGen/GlobalMerge.cpp index 30e12cc2ec4..8c760b724d1 100644 --- a/lib/CodeGen/GlobalMerge.cpp +++ b/lib/CodeGen/GlobalMerge.cpp @@ -91,6 +91,11 @@ EnableGlobalMerge("enable-global-merge", cl::Hidden, cl::desc("Enable the global merge pass"), cl::init(true)); +static cl::opt +GlobalMergeMaxOffset("global-merge-max-offset", cl::Hidden, + cl::desc("Set maximum offset for global merge pass"), + cl::init(0)); + static cl::opt 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 &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 &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 > 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); diff --git a/test/Transforms/GlobalMerge/basic.ll b/test/Transforms/GlobalMerge/basic.ll new file mode 100644 index 00000000000..598d917f74a --- /dev/null +++ b/test/Transforms/GlobalMerge/basic.ll @@ -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 +} diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp index afa66819f11..a790ccfe356 100644 --- a/tools/opt/opt.cpp +++ b/tools/opt/opt.cpp @@ -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);