mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-07 14:33:15 +00:00
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:
parent
f3e3247429
commit
f772f8ef38
@ -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.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user