From: Rafael Espindola Date: Tue, 3 Sep 2013 23:34:36 +0000 (+0000) Subject: Add r159136 back now that pr13124 has been fixed. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=79869ee59abc3aeebda6e15540273a7e5936adb4;p=oota-llvm.git Add r159136 back now that pr13124 has been fixed. Original message: If a constant or a function has linkonce_odr linkage and unnamed_addr, mark hidden. Being linkonce_odr guarantees that it is available in every dso that needs it. Being a constant/function with unnamed_addr guarantees that the copies don't have to be merged. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@189886 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/IR/GlobalValue.h b/include/llvm/IR/GlobalValue.h index 1dc99cfaa41..a5049e4324c 100644 --- a/include/llvm/IR/GlobalValue.h +++ b/include/llvm/IR/GlobalValue.h @@ -122,6 +122,9 @@ public: static bool isAvailableExternallyLinkage(LinkageTypes Linkage) { return Linkage == AvailableExternallyLinkage; } + static bool isLinkOnceODRLinkage(LinkageTypes Linkage) { + return Linkage == LinkOnceODRLinkage; + } static bool isLinkOnceLinkage(LinkageTypes Linkage) { return Linkage == LinkOnceAnyLinkage || Linkage == LinkOnceODRLinkage || @@ -202,6 +205,9 @@ public: bool hasAvailableExternallyLinkage() const { return isAvailableExternallyLinkage(Linkage); } + bool hasLinkOnceODRLinkage() const { + return isLinkOnceODRLinkage(Linkage); + } bool hasLinkOnceLinkage() const { return isLinkOnceLinkage(Linkage); } diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp index 64cd515f673..ab9d30da473 100644 --- a/lib/Transforms/IPO/GlobalOpt.cpp +++ b/lib/Transforms/IPO/GlobalOpt.cpp @@ -1914,6 +1914,12 @@ bool GlobalOpt::ProcessGlobal(GlobalVariable *GV, return true; } + if (GV->hasLinkOnceODRLinkage() && GV->hasUnnamedAddr() && GV->isConstant() && + GV->getVisibility() != GlobalValue::HiddenVisibility) { + GV->setVisibility(GlobalValue::HiddenVisibility); + return true; + } + if (!GV->hasLocalLinkage()) return false; @@ -1926,6 +1932,7 @@ bool GlobalOpt::ProcessGlobal(GlobalVariable *GV, if (!GS.isCompared && !GV->hasUnnamedAddr()) { GV->setUnnamedAddr(true); NumUnnamed++; + return true; } if (GV->isConstant() || !GV->hasInitializer()) @@ -2105,6 +2112,10 @@ bool GlobalOpt::OptimizeFunctions(Module &M) { F->eraseFromParent(); Changed = true; ++NumFnDeleted; + } else if (F->hasLinkOnceODRLinkage() && F->hasUnnamedAddr() && + F->getVisibility() != GlobalValue::HiddenVisibility) { + F->setVisibility(GlobalValue::HiddenVisibility); + Changed = true; } else if (F->hasLocalLinkage()) { if (F->getCallingConv() == CallingConv::C && !F->isVarArg() && !F->hasAddressTaken()) { diff --git a/test/Transforms/GlobalOpt/hidden.ll b/test/Transforms/GlobalOpt/hidden.ll new file mode 100644 index 00000000000..301e158d534 --- /dev/null +++ b/test/Transforms/GlobalOpt/hidden.ll @@ -0,0 +1,14 @@ +; RUN: opt %s -globalopt -S | FileCheck %s + +@foo = linkonce_odr unnamed_addr constant i32 42 +; CHECK: @foo = linkonce_odr hidden unnamed_addr constant i32 42 + +define linkonce_odr void @bar() unnamed_addr { +; CHECK: define linkonce_odr hidden void @bar() unnamed_addr { + ret void +} + +define i32* @zed() { + call void @bar() + ret i32* @foo +}