[llvm] r219191 - GlobalDCE: Don't drop any COMDAT members

Rafael EspĂ­ndola rafael.espindola at gmail.com
Tue Oct 7 05:07:06 PDT 2014


Thanks!

On 7 October 2014 03:07, David Majnemer <david.majnemer at gmail.com> wrote:
> Author: majnemer
> Date: Tue Oct  7 02:07:19 2014
> New Revision: 219191
>
> URL: http://llvm.org/viewvc/llvm-project?rev=219191&view=rev
> Log:
> GlobalDCE: Don't drop any COMDAT members
>
> If we require a single member of a comdat, require all of the other
> members as well.
>
> This fixes PR20981.
>
> Added:
>     llvm/trunk/test/Transforms/GlobalDCE/pr20981.ll
> Modified:
>     llvm/trunk/lib/Transforms/IPO/GlobalDCE.cpp
>
> Modified: llvm/trunk/lib/Transforms/IPO/GlobalDCE.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/GlobalDCE.cpp?rev=219191&r1=219190&r2=219191&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/GlobalDCE.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/GlobalDCE.cpp Tue Oct  7 02:07:19 2014
> @@ -78,9 +78,6 @@ bool GlobalDCE::runOnModule(Module &M) {
>    // Remove empty functions from the global ctors list.
>    Changed |= optimizeGlobalCtorsList(M, isEmptyFunction);
>
> -  typedef std::multimap<const Comdat *, GlobalValue *> ComdatGVPairsTy;
> -  ComdatGVPairsTy ComdatGVPairs;
> -
>    // Loop over the module, adding globals which are obviously necessary.
>    for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
>      Changed |= RemoveUnusedGlobalValue(*I);
> @@ -88,8 +85,6 @@ bool GlobalDCE::runOnModule(Module &M) {
>      if (!I->isDeclaration() && !I->hasAvailableExternallyLinkage()) {
>        if (!I->isDiscardableIfUnused())
>          GlobalIsNeeded(I);
> -      else if (const Comdat *C = I->getComdat())
> -        ComdatGVPairs.insert(std::make_pair(C, I));
>      }
>    }
>
> @@ -101,8 +96,6 @@ bool GlobalDCE::runOnModule(Module &M) {
>      if (!I->isDeclaration() && !I->hasAvailableExternallyLinkage()) {
>        if (!I->isDiscardableIfUnused())
>          GlobalIsNeeded(I);
> -      else if (const Comdat *C = I->getComdat())
> -        ComdatGVPairs.insert(std::make_pair(C, I));
>      }
>    }
>
> @@ -112,24 +105,7 @@ bool GlobalDCE::runOnModule(Module &M) {
>      // Externally visible aliases are needed.
>      if (!I->isDiscardableIfUnused()) {
>        GlobalIsNeeded(I);
> -    } else if (const Comdat *C = I->getComdat()) {
> -      ComdatGVPairs.insert(std::make_pair(C, I));
> -    }
> -  }
> -
> -  for (ComdatGVPairsTy::iterator I = ComdatGVPairs.begin(),
> -                                 E = ComdatGVPairs.end();
> -       I != E;) {
> -    ComdatGVPairsTy::iterator UB = ComdatGVPairs.upper_bound(I->first);
> -    bool CanDiscard = std::all_of(I, UB, [](ComdatGVPairsTy::value_type Pair) {
> -      return Pair.second->isDiscardableIfUnused();
> -    });
> -    if (!CanDiscard) {
> -      std::for_each(I, UB, [this](ComdatGVPairsTy::value_type Pair) {
> -        GlobalIsNeeded(Pair.second);
> -      });
>      }
> -    I = UB;
>    }
>
>    // Now that all globals which are needed are in the AliveGlobals set, we loop
> @@ -211,7 +187,20 @@ void GlobalDCE::GlobalIsNeeded(GlobalVal
>    // If the global is already in the set, no need to reprocess it.
>    if (!AliveGlobals.insert(G))
>      return;
> -
> +
> +  Module *M = G->getParent();
> +  if (Comdat *C = G->getComdat()) {
> +    for (Function &F : *M)
> +      if (F.getComdat() == C)
> +        GlobalIsNeeded(&F);
> +    for (GlobalVariable &GV : M->globals())
> +      if (GV.getComdat() == C)
> +        GlobalIsNeeded(&GV);
> +    for (GlobalAlias &GA : M->aliases())
> +      if (GA.getComdat() == C)
> +        GlobalIsNeeded(&GA);
> +  }
> +
>    if (GlobalVariable *GV = dyn_cast<GlobalVariable>(G)) {
>      // If this is a global variable, we must make sure to add any global values
>      // referenced by the initializer to the alive set.
>
> Added: llvm/trunk/test/Transforms/GlobalDCE/pr20981.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalDCE/pr20981.ll?rev=219191&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/GlobalDCE/pr20981.ll (added)
> +++ llvm/trunk/test/Transforms/GlobalDCE/pr20981.ll Tue Oct  7 02:07:19 2014
> @@ -0,0 +1,17 @@
> +; RUN: opt < %s -globaldce -S | FileCheck %s
> +
> +$c1 = comdat any
> +; CHECK: $c1 = comdat any
> +
> + at a1 = linkonce_odr alias void ()* @f1
> +; CHECK: @a1 = linkonce_odr alias void ()* @f1
> +
> +define linkonce_odr void @f1() comdat $c1 {
> +  ret void
> +}
> +; CHECK: define linkonce_odr void @f1() comdat $c1
> +
> +define void @g() {
> +  call void @f1()
> +  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