Drop references to globals who do exist in the globals graph, but are never
authorChris Lattner <sabre@nondot.org>
Sat, 28 Jun 2003 22:10:58 +0000 (22:10 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 28 Jun 2003 22:10:58 +0000 (22:10 +0000)
read or written to.  Keep track of how many times this happens.  This should
be good for deleting things like references to type information in C++ classes

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6946 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/DataStructure/DataStructureOpt.cpp

index ad5b8947edc788d57b98567fb186ea612ec3877a..297979a72a0315facfc02d1c03f4b2628eca00b1 100644 (file)
@@ -14,6 +14,8 @@
 namespace {
   Statistic<>
   NumGlobalsConstanted("ds-opt", "Number of globals marked constant");
+  Statistic<>
+  NumGlobalsIsolated("ds-opt", "Number of globals with references dropped");
 
   class DSOpt : public Pass {
     TDDataStructures *TD;
@@ -60,8 +62,21 @@ bool DSOpt::OptimizeGlobals(Module &M) {
         // can delete it.  We don't ACTUALLY want to delete the global, just
         // remove anything that references the global: later passes will take
         // care of nuking it.
-        I->replaceAllUsesWith(Constant::getNullValue((Type*)I->getType()));
+        if (!I->use_empty()) {
+          I->replaceAllUsesWith(Constant::getNullValue((Type*)I->getType()));
+          ++NumGlobalsIsolated;
+        }
       } else if (GNode && GNode->isComplete()) {
+
+        // If the node has not been read or written, and it is not externally
+        // visible, kill any references to it so it can be DCE'd.
+        if (!GNode->isModified() && !GNode->isRead() &&I->hasInternalLinkage()){
+          if (!I->use_empty()) {
+            I->replaceAllUsesWith(Constant::getNullValue((Type*)I->getType()));
+            ++NumGlobalsIsolated;
+          }
+        }
+
         // We expect that there will almost always be a node for this global.
         // If there is, and the node doesn't have the M bit set, we can set the
         // 'constant' bit on the global.