Eliminate dead global variables

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2400 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2002-04-29 18:13:11 +00:00
parent f3e3247429
commit f772f8ef38

View File

@ -6,9 +6,10 @@
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
#include "llvm/Transforms/IPO/GlobalDCE.h" #include "llvm/Transforms/IPO/GlobalDCE.h"
#include "llvm/Analysis/CallGraph.h"
#include "llvm/Module.h" #include "llvm/Module.h"
#include "llvm/Function.h" #include "llvm/Function.h"
#include "llvm/GlobalVariable.h"
#include "llvm/Analysis/CallGraph.h"
#include "Support/DepthFirstIterator.h" #include "Support/DepthFirstIterator.h"
static bool RemoveUnreachableFunctions(Module *M, CallGraph &CallGraph) { static bool RemoveUnreachableFunctions(Module *M, CallGraph &CallGraph) {
@ -45,6 +46,22 @@ static bool RemoveUnreachableFunctions(Module *M, CallGraph &CallGraph) {
return true; return true;
} }
static bool RemoveUnreachableGlobalVariables(Module *M) {
bool Changed = false;
// Eliminate all global variables that are unused, and that are internal, or
// do not have an initializer.
//
for (Module::giterator I = M->gbegin(); I != M->gend(); )
if (!(*I)->use_empty() ||
((*I)->hasExternalLinkage() && (*I)->hasInitializer()))
++I; // Cannot eliminate global variable
else {
delete M->getGlobalList().remove(I);
Changed = true;
}
return Changed;
}
namespace { namespace {
struct GlobalDCE : public Pass { struct GlobalDCE : public Pass {
const char *getPassName() const { return "Dead Global Elimination"; } const char *getPassName() const { return "Dead Global Elimination"; }
@ -53,7 +70,8 @@ namespace {
// the specified callgraph to reflect the changes. // the specified callgraph to reflect the changes.
// //
bool run(Module *M) { bool run(Module *M) {
return RemoveUnreachableFunctions(M, getAnalysis<CallGraph>()); return RemoveUnreachableFunctions(M, getAnalysis<CallGraph>()) |
RemoveUnreachableGlobalVariables(M);
} }
// getAnalysisUsage - This function works on the call graph of a module. // getAnalysisUsage - This function works on the call graph of a module.