diff options
| author | Duncan Sands <baldrick@free.fr> | 2009-02-17 23:05:26 +0000 | 
|---|---|---|
| committer | Duncan Sands <baldrick@free.fr> | 2009-02-17 23:05:26 +0000 | 
| commit | bf3ba5a1e9d4da9dabb1432398192fbfef29ad41 (patch) | |
| tree | 48007fa2f9587066c11b1ded03f295789f18a6d5 /llvm/lib/Transforms | |
| parent | f4dad7462103402a0f3a853e42a20065b40eab4f (diff) | |
| download | bcm5719-llvm-bf3ba5a1e9d4da9dabb1432398192fbfef29ad41.tar.gz bcm5719-llvm-bf3ba5a1e9d4da9dabb1432398192fbfef29ad41.zip | |
If an alias is dead and so is its aliasee, then globaldce would
crash because the alias would still be using the aliasee when the
aliasee was deleted.
llvm-svn: 64844
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/IPO/GlobalDCE.cpp | 24 | 
1 files changed, 16 insertions, 8 deletions
| diff --git a/llvm/lib/Transforms/IPO/GlobalDCE.cpp b/llvm/lib/Transforms/IPO/GlobalDCE.cpp index a0f8923242f..c28d5e3e57a 100644 --- a/llvm/lib/Transforms/IPO/GlobalDCE.cpp +++ b/llvm/lib/Transforms/IPO/GlobalDCE.cpp @@ -82,7 +82,7 @@ bool GlobalDCE::runOnModule(Module &M) {         I != E; ++I) {      Changed |= RemoveUnusedGlobalValue(*I);      // Externally visible aliases are needed. -    if (!I->hasInternalLinkage() && !I->hasLinkOnceLinkage()) +    if (!I->hasLocalLinkage() && !I->hasLinkOnceLinkage())        GlobalIsNeeded(I);    } @@ -107,6 +107,15 @@ bool GlobalDCE::runOnModule(Module &M) {          I->deleteBody();      } +  // The third pass drops targets of aliases which are dead... +  std::vector<GlobalAlias*> DeadAliases; +  for (Module::alias_iterator I = M.alias_begin(), E = M.alias_end(); I != E; +       ++I) +    if (!AliveGlobals.count(I)) { +      DeadAliases.push_back(I); +      I->setAliasee(0); +    } +    if (!DeadFunctions.empty()) {      // Now that all interferences have been dropped, delete the actual objects      // themselves. @@ -128,14 +137,13 @@ bool GlobalDCE::runOnModule(Module &M) {    }    // Now delete any dead aliases. -  for (Module::alias_iterator I = M.alias_begin(), E = M.alias_end(); I != E;) { -    Module::alias_iterator J = I++; -    if (!AliveGlobals.count(J)) { -      RemoveUnusedGlobalValue(*J); -      M.getAliasList().erase(J); -      ++NumAliases; -      Changed = true; +  if (!DeadAliases.empty()) { +    for (unsigned i = 0, e = DeadAliases.size(); i != e; ++i) { +      RemoveUnusedGlobalValue(*DeadAliases[i]); +      M.getAliasList().erase(DeadAliases[i]);      } +    NumAliases += DeadAliases.size(); +    Changed = true;    }    // Make sure that all memory is released | 

