From ee7cb2986657411de6e2eab9ab896d5275d9e1b4 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 28 Jul 2001 17:51:49 +0000 Subject: [PATCH] Enable the elimination of method prototypes that are not referenced git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/DCE.cpp | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/Transforms/Scalar/DCE.cpp b/lib/Transforms/Scalar/DCE.cpp index 515fd00f81a..53b00e1649d 100644 --- a/lib/Transforms/Scalar/DCE.cpp +++ b/lib/Transforms/Scalar/DCE.cpp @@ -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; - while (DoRemoveUnusedConstants(C)) Val = true; - return Val; + 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(Mod)) Changed = true; + return Changed; }