[llvm-commits] [llvm] r61742 - in /llvm/trunk: lib/Transforms/IPO/GlobalDCE.cpp test/Transforms/GlobalDCE/2009-01-05-DeadAliases.ll

Duncan Sands baldrick at free.fr
Mon Jan 5 12:37:33 PST 2009


Author: baldrick
Date: Mon Jan  5 14:37:33 2009
New Revision: 61742

URL: http://llvm.org/viewvc/llvm-project?rev=61742&view=rev
Log:
Delete unused global aliases with internal linkage.
In fact this also deletes those with linkonce linkage,
however this is currently dead because for the moment
aliases aren't allowed to have this linkage type.

Added:
    llvm/trunk/test/Transforms/GlobalDCE/2009-01-05-DeadAliases.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=61742&r1=61741&r2=61742&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/IPO/GlobalDCE.cpp (original)
+++ llvm/trunk/lib/Transforms/IPO/GlobalDCE.cpp Mon Jan  5 14:37:33 2009
@@ -25,6 +25,7 @@
 #include <set>
 using namespace llvm;
 
+STATISTIC(NumAliases, "Number of global aliases removed");
 STATISTIC(NumFunctions, "Number of functions removed");
 STATISTIC(NumVariables, "Number of global variables removed");
 
@@ -32,7 +33,7 @@
   struct VISIBILITY_HIDDEN GlobalDCE : public ModulePass {
     static char ID; // Pass identification, replacement for typeid
     GlobalDCE() : ModulePass(&ID) {}
- 
+
     // run - Do the GlobalDCE pass on the specified module, optionally updating
     // the specified callgraph to reflect the changes.
     //
@@ -41,7 +42,7 @@
   private:
     std::set<GlobalValue*> AliveGlobals;
 
-    /// GlobalIsNeeded - the specific global value as needed, and
+    /// GlobalIsNeeded - mark the specific global value as needed, and
     /// recursively mark anything that it uses as also needed.
     void GlobalIsNeeded(GlobalValue *GV);
     void MarkUsedGlobalsAsNeeded(Constant *C);
@@ -77,11 +78,12 @@
       GlobalIsNeeded(I);
   }
 
-
   for (Module::alias_iterator I = M.alias_begin(), E = M.alias_end();
        I != E; ++I) {
-    // Aliases are always needed even if they are not used.
-    MarkUsedGlobalsAsNeeded(I->getAliasee());
+    Changed |= RemoveUnusedGlobalValue(*I);
+    // Externally visible aliases are needed.
+    if (!I->hasInternalLinkage() && !I->hasLinkOnceLinkage())
+      GlobalIsNeeded(I);
   }
 
   // Now that all globals which are needed are in the AliveGlobals set, we loop
@@ -96,7 +98,6 @@
       I->setInitializer(0);
     }
 
-
   // The second pass drops the bodies of functions which are dead...
   std::vector<Function*> DeadFunctions;
   for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
@@ -107,7 +108,7 @@
     }
 
   if (!DeadFunctions.empty()) {
-    // Now that all interreferences have been dropped, delete the actual objects
+    // Now that all interferences have been dropped, delete the actual objects
     // themselves.
     for (unsigned i = 0, e = DeadFunctions.size(); i != e; ++i) {
       RemoveUnusedGlobalValue(*DeadFunctions[i]);
@@ -126,6 +127,17 @@
     Changed = true;
   }
 
+  // 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;
+    }
+  }
+
   // Make sure that all memory is released
   AliveGlobals.clear();
   return Changed;
@@ -147,7 +159,10 @@
     // referenced by the initializer to the alive set.
     if (GV->hasInitializer())
       MarkUsedGlobalsAsNeeded(GV->getInitializer());
-  } else if (!isa<GlobalAlias>(G)) {
+  } else if (GlobalAlias *GA = dyn_cast<GlobalAlias>(G)) {
+    // The target of a global alias is needed.
+    MarkUsedGlobalsAsNeeded(GA->getAliasee());
+  } else {
     // Otherwise this must be a function object.  We have to scan the body of
     // the function looking for constants and global values which are used as
     // operands.  Any operands of these types must be processed to ensure that

Added: llvm/trunk/test/Transforms/GlobalDCE/2009-01-05-DeadAliases.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalDCE/2009-01-05-DeadAliases.ll?rev=61742&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/GlobalDCE/2009-01-05-DeadAliases.ll (added)
+++ llvm/trunk/test/Transforms/GlobalDCE/2009-01-05-DeadAliases.ll Mon Jan  5 14:37:33 2009
@@ -0,0 +1,8 @@
+; RUN: llvm-as < %s | opt -globaldce | llvm-dis | not grep @D
+; RUN: llvm-as < %s | opt -globaldce | llvm-dis | grep @L | count 3
+
+ at A = global i32 0
+ at D = alias internal i32* @A
+ at L1 = alias i32* @A
+ at L2 = alias internal i32* @L1
+ at L3 = alias i32* @L2





More information about the llvm-commits mailing list