Enable the elimination of method prototypes that are not referenced
authorChris Lattner <sabre@nondot.org>
Sat, 28 Jul 2001 17:51:49 +0000 (17:51 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 28 Jul 2001 17:51:49 +0000 (17:51 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/DCE.cpp

index 515fd00f81a12078d8c101758077ac44bc50d65a..53b00e1649d884b9cca88838534b68d4eae56e99 100644 (file)
@@ -9,6 +9,7 @@
 //     predecessor only has one successor.
 //   * Eliminates PHI nodes for basic blocks with a single predecessor
 //   * Eliminates a basic block that only contains an unconditional branch
+//   * Eliminates method prototypes that are not referenced
 //
 // TODO: This should REALLY be worklist driven instead of iterative.  Right now,
 // we scan linearly through values, removing unused ones as we go.  The problem
@@ -323,9 +324,23 @@ bool opt::DoDeadCodeElimination(Method *M) {
   return Changed;
 }
 
-bool opt::DoDeadCodeElimination(Module *C) { 
-  bool Val = C->reduceApply(DoDeadCodeElimination);
+bool opt::DoDeadCodeElimination(Module *Mod) {
+  bool Changed = false;
+
+  for (Module::iterator MI = Mod->begin(); MI != Mod->end(); ) {
+    Method *Meth = *MI;
+    if (!Meth->isExternal()) {                 // DCE normal methods
+      Changed |= DoDeadCodeElimination(Meth);
+      ++MI;                                    // Next method please
+    } else if (Meth->use_size() == 0) {        // No references to prototype?
+      //cerr << "Removing method proto: " << Meth->getName() << endl;
+      delete Mod->getMethodList().remove(MI);  // Remove prototype
+      // Remove moves iterator to point to the next one automatically
+    } else {
+      ++MI;                                    // Skip prototype in use.
+    }
+  }
 
-  while (DoRemoveUnusedConstants(C)) Val = true;
-  return Val;
+  while (DoRemoveUnusedConstants(Mod)) Changed = true;
+  return Changed;
 }