diff options
author | Nuno Lopes <nunoplopes@sapo.pt> | 2008-10-10 16:25:50 +0000 |
---|---|---|
committer | Nuno Lopes <nunoplopes@sapo.pt> | 2008-10-10 16:25:50 +0000 |
commit | e3127f3f80525f7087c5ed51ae67bd87e57943f2 (patch) | |
tree | e46d570e54139d8d94849962f31a95dcd40338b0 /llvm/lib/Transforms | |
parent | 8022c30aaa193b1bc61daf7bf3b0357abaa4dd5e (diff) | |
download | bcm5719-llvm-e3127f3f80525f7087c5ed51ae67bd87e57943f2.tar.gz bcm5719-llvm-e3127f3f80525f7087c5ed51ae67bd87e57943f2.zip |
fix memleak by cleaning the global sets on pass exit
llvm-svn: 57353
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Scalar/GVN.cpp | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/llvm/lib/Transforms/Scalar/GVN.cpp b/llvm/lib/Transforms/Scalar/GVN.cpp index 0e1900cbe08..2d0a99b4829 100644 --- a/llvm/lib/Transforms/Scalar/GVN.cpp +++ b/llvm/lib/Transforms/Scalar/GVN.cpp @@ -739,6 +739,7 @@ namespace { bool performPRE(Function& F); Value* lookupNumber(BasicBlock* BB, uint32_t num); bool mergeBlockIntoPredecessor(BasicBlock* BB); + void cleanupGlobalSets(); }; char GVN::ID = 0; @@ -1129,7 +1130,9 @@ bool GVN::runOnFunction(Function& F) { changed |= PREChanged; } } - + + cleanupGlobalSets(); + return changed; } @@ -1332,16 +1335,9 @@ bool GVN::performPRE(Function& F) { // iterateOnFunction - Executes one iteration of GVN bool GVN::iterateOnFunction(Function &F) { - // Clean out global sets from any previous functions - VN.clear(); - phiMap.clear(); - - for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator - I = localAvail.begin(), E = localAvail.end(); I != E; ++I) - delete I->second; - localAvail.clear(); - - DominatorTree &DT = getAnalysis<DominatorTree>(); + DominatorTree &DT = getAnalysis<DominatorTree>(); + + cleanupGlobalSets(); // Top-down walk of the dominator tree bool changed = false; @@ -1351,3 +1347,13 @@ bool GVN::iterateOnFunction(Function &F) { return changed; } + +void GVN::cleanupGlobalSets() { + VN.clear(); + phiMap.clear(); + + for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator + I = localAvail.begin(), E = localAvail.end(); I != E; ++I) + delete I->second; + localAvail.clear(); +} |