diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp index 0e1900cbe08..2d0a99b4829 100644 --- a/lib/Transforms/Scalar/GVN.cpp +++ b/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::iterator - I = localAvail.begin(), E = localAvail.end(); I != E; ++I) - delete I->second; - localAvail.clear(); - - DominatorTree &DT = getAnalysis(); + DominatorTree &DT = getAnalysis(); + + 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::iterator + I = localAvail.begin(), E = localAvail.end(); I != E; ++I) + delete I->second; + localAvail.clear(); +}