Index: lib/CodeGen/GlobalMerge.cpp =================================================================== --- lib/CodeGen/GlobalMerge.cpp +++ lib/CodeGen/GlobalMerge.cpp @@ -73,10 +73,10 @@ #define DEBUG_TYPE "global-merge" -static cl::opt +static cl::opt EnableGlobalMerge("enable-global-merge", cl::Hidden, cl::desc("Enable global merge pass"), - cl::init(true)); + cl::init(cl::BOU_UNSET)); static cl::opt EnableGlobalMergeOnConst("global-merge-on-const", cl::Hidden, @@ -278,8 +278,25 @@ } } +static bool shouldEnableGlobalMergeForModule(const Module &M) { + Metadata *FlagMD = M.getModuleFlag("Global Merge"); + + // If not explicitly specified otherwise, enable the pass. + if (!FlagMD) + return true; + + ConstantAsMetadata *Flag = dyn_cast(FlagMD); + if (!Flag || !isa(Flag->getValue())) + report_fatal_error("Unexpected type for \"Global Merge\" module flag " + "value, should be an integer constant!"); + + return !cast(Flag->getValue())->isZero(); +} + bool GlobalMerge::doInitialization(Module &M) { - if (!EnableGlobalMerge) + if (EnableGlobalMerge == cl::BOU_FALSE || + (EnableGlobalMerge == cl::BOU_UNSET && + !shouldEnableGlobalMergeForModule(M))) return false; DenseMap > Globals, ConstGlobals, Index: test/CodeGen/AArch64/global-merge-moduleflag-disabled.ll =================================================================== --- /dev/null +++ test/CodeGen/AArch64/global-merge-moduleflag-disabled.ll @@ -0,0 +1,21 @@ +; RUN: llc %s -mtriple=aarch64-none-linux-gnu -o - | FileCheck %s --check-prefix=CHECK-NGM +; RUN: llc %s -mtriple=aarch64-none-linux-gnu -enable-global-merge -o - | FileCheck %s --check-prefix=CHECK-GM +; RUN: llc %s -mtriple=aarch64-none-linux-gnu -enable-global-merge=false -o - | FileCheck %s --check-prefix=CHECK-NGM + +@m = internal global i32 0, align 4 +@n = internal global i32 0, align 4 + +define void @f1(i32 %a1, i32 %a2) { + store i32 %a1, i32* @m, align 4 + store i32 %a2, i32* @n, align 4 + ret void +} + +!0 = !{ i32 4, !"Global Merge", i32 0 } +!llvm.module.flags = !{ !0 } + +;CHECK-GM: .type _MergedGlobals,@object // @_MergedGlobals +;CHECK-GM: .local _MergedGlobals +;CHECK-GM: .comm _MergedGlobals,8,8 + +;CHECK-NGM-NOT: MergedGlobals Index: test/CodeGen/AArch64/global-merge-moduleflag-enabled.ll =================================================================== --- /dev/null +++ test/CodeGen/AArch64/global-merge-moduleflag-enabled.ll @@ -0,0 +1,21 @@ +; RUN: llc %s -mtriple=aarch64-none-linux-gnu -o - | FileCheck %s --check-prefix=CHECK-GM +; RUN: llc %s -mtriple=aarch64-none-linux-gnu -enable-global-merge -o - | FileCheck %s --check-prefix=CHECK-GM +; RUN: llc %s -mtriple=aarch64-none-linux-gnu -enable-global-merge=false -o - | FileCheck %s --check-prefix=CHECK-NGM + +@m = internal global i32 0, align 4 +@n = internal global i32 0, align 4 + +define void @f1(i32 %a1, i32 %a2) { + store i32 %a1, i32* @m, align 4 + store i32 %a2, i32* @n, align 4 + ret void +} + +!0 = !{ i32 1, !"Global Merge", i32 1 } +!llvm.module.flags = !{ !0 } + +;CHECK-GM: .type _MergedGlobals,@object // @_MergedGlobals +;CHECK-GM: .local _MergedGlobals +;CHECK-GM: .comm _MergedGlobals,8,8 + +;CHECK-NGM-NOT: MergedGlobals