[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