[llvm] r219283 - GlobalOpt: Don't drop unused memberes of a Comdat
Rafael EspĂndola
rafael.espindola at gmail.com
Wed Oct 8 06:20:03 PDT 2014
Thanks!
On 8 October 2014 03:23, David Majnemer <david.majnemer at gmail.com> wrote:
> Author: majnemer
> Date: Wed Oct 8 02:23:31 2014
> New Revision: 219283
>
> URL: http://llvm.org/viewvc/llvm-project?rev=219283&view=rev
> Log:
> GlobalOpt: Don't drop unused memberes of a Comdat
>
> A linkonce_odr member of a COMDAT shouldn't be dropped if we need to
> keep the entire COMDAT group.
>
> This fixes PR21191.
>
> Added:
> llvm/trunk/test/Transforms/GlobalOpt/pr21191.ll
> Modified:
> llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp
>
> Modified: llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp?rev=219283&r1=219282&r2=219283&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp Wed Oct 8 02:23:31 2014
> @@ -88,6 +88,7 @@ namespace {
>
> const DataLayout *DL;
> TargetLibraryInfo *TLI;
> + SmallSet<const Comdat *, 8> NotDiscardableComdats;
> };
> }
>
> @@ -1908,8 +1909,11 @@ bool GlobalOpt::OptimizeFunctions(Module
> // Functions without names cannot be referenced outside this module.
> if (!F->hasName() && !F->isDeclaration() && !F->hasLocalLinkage())
> F->setLinkage(GlobalValue::InternalLinkage);
> +
> + const Comdat *C = F->getComdat();
> + bool inComdat = C && NotDiscardableComdats.count(C);
> F->removeDeadConstantUsers();
> - if (F->isDefTriviallyDead()) {
> + if ((!inComdat || F->hasLocalLinkage()) && F->isDefTriviallyDead()) {
> F->eraseFromParent();
> Changed = true;
> ++NumFnDeleted;
> @@ -1941,12 +1945,6 @@ bool GlobalOpt::OptimizeFunctions(Module
> bool GlobalOpt::OptimizeGlobalVars(Module &M) {
> bool Changed = false;
>
> - SmallSet<const Comdat *, 8> NotDiscardableComdats;
> - for (const GlobalVariable &GV : M.globals())
> - if (const Comdat *C = GV.getComdat())
> - if (!GV.isDiscardableIfUnused())
> - NotDiscardableComdats.insert(C);
> -
> for (Module::global_iterator GVI = M.global_begin(), E = M.global_end();
> GVI != E; ) {
> GlobalVariable *GV = GVI++;
> @@ -1963,7 +1961,7 @@ bool GlobalOpt::OptimizeGlobalVars(Modul
>
> if (GV->isDiscardableIfUnused()) {
> if (const Comdat *C = GV->getComdat())
> - if (NotDiscardableComdats.count(C))
> + if (NotDiscardableComdats.count(C) && !GV->hasLocalLinkage())
> continue;
> Changed |= ProcessGlobal(GV, GVI);
> }
> @@ -3047,6 +3045,20 @@ bool GlobalOpt::runOnModule(Module &M) {
> while (LocalChange) {
> LocalChange = false;
>
> + NotDiscardableComdats.clear();
> + for (const GlobalVariable &GV : M.globals())
> + if (const Comdat *C = GV.getComdat())
> + if (!GV.isDiscardableIfUnused() || !GV.use_empty())
> + NotDiscardableComdats.insert(C);
> + for (Function &F : M)
> + if (const Comdat *C = F.getComdat())
> + if (!F.isDefTriviallyDead())
> + NotDiscardableComdats.insert(C);
> + for (GlobalAlias &GA : M.aliases())
> + if (const Comdat *C = GA.getComdat())
> + if (!GA.isDiscardableIfUnused() || !GA.use_empty())
> + NotDiscardableComdats.insert(C);
> +
> // Delete functions that are trivially dead, ccc -> fastcc
> LocalChange |= OptimizeFunctions(M);
>
>
> Added: llvm/trunk/test/Transforms/GlobalOpt/pr21191.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/pr21191.ll?rev=219283&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/GlobalOpt/pr21191.ll (added)
> +++ llvm/trunk/test/Transforms/GlobalOpt/pr21191.ll Wed Oct 8 02:23:31 2014
> @@ -0,0 +1,19 @@
> +; RUN: opt < %s -globalopt -S | FileCheck %s
> +
> +$c = comdat any
> +; CHECK: $c = comdat any
> +
> +define linkonce_odr void @foo() comdat $c {
> + ret void
> +}
> +; CHECK: define linkonce_odr void @foo() comdat $c
> +
> +define linkonce_odr void @bar() comdat $c {
> + ret void
> +}
> +; CHECK: define linkonce_odr void @bar() comdat $c
> +
> +define void @zed() {
> + call void @foo()
> + ret void
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list