diff options
author | Chris Lattner <sabre@nondot.org> | 2009-08-31 06:01:21 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-08-31 06:01:21 +0000 |
commit | 223479b6087a6d9a1470c857c459e408ba51df84 (patch) | |
tree | a315d5b7f8742c9713d2b8a95d96faf519c3d434 /lib/Analysis | |
parent | f5313424550268526a14fd910cfb59efb95e0f30 (diff) | |
download | external_llvm-223479b6087a6d9a1470c857c459e408ba51df84.zip external_llvm-223479b6087a6d9a1470c857c459e408ba51df84.tar.gz external_llvm-223479b6087a6d9a1470c857c459e408ba51df84.tar.bz2 |
cleanups, factor some code out to a helper function
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@80542 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis')
-rw-r--r-- | lib/Analysis/IPA/CallGraphSCCPass.cpp | 61 |
1 files changed, 39 insertions, 22 deletions
diff --git a/lib/Analysis/IPA/CallGraphSCCPass.cpp b/lib/Analysis/IPA/CallGraphSCCPass.cpp index 4a9bf9f..d91a74d 100644 --- a/lib/Analysis/IPA/CallGraphSCCPass.cpp +++ b/lib/Analysis/IPA/CallGraphSCCPass.cpp @@ -31,7 +31,6 @@ using namespace llvm; namespace { class CGPassManager : public ModulePass, public PMDataManager { - public: static char ID; explicit CGPassManager(int Depth) @@ -73,11 +72,41 @@ public: virtual PassManagerType getPassManagerType() const { return PMT_CallGraphPassManager; } + +private: + bool RunPassOnSCC(Pass *P, std::vector<CallGraphNode*> &CurSCC); }; -} +} // end anonymous namespace. char CGPassManager::ID = 0; + +bool CGPassManager::RunPassOnSCC(Pass *P, std::vector<CallGraphNode*> &CurSCC) { + bool Changed = false; + if (CallGraphSCCPass *CGSP = dynamic_cast<CallGraphSCCPass*>(P)) { + StartPassTimer(P); + Changed = CGSP->runOnSCC(CurSCC); + StopPassTimer(P); + return Changed; + } + + StartPassTimer(P); + FPPassManager *FPP = dynamic_cast<FPPassManager *>(P); + assert(FPP && "Invalid CGPassManager member"); + + // Run pass P on all functions in the current SCC. + for (unsigned i = 0, e = CurSCC.size(); i != e; ++i) { + if (Function *F = CurSCC[i]->getFunction()) { + dumpPassInfo(P, EXECUTION_MSG, ON_FUNCTION_MSG, F->getName()); + Changed |= FPP->runOnFunction(*F); + } + } + StopPassTimer(P); + + return Changed; +} + + /// run - Execute all of the passes scheduled for execution. Keep track of /// whether any of the passes modifies the module, and if so, return true. bool CGPassManager::runOnModule(Module &M) { @@ -86,7 +115,7 @@ bool CGPassManager::runOnModule(Module &M) { std::vector<CallGraphNode*> CurSCC; - // Walk SCC + // Walk the callgraph in bottom-up SCC order. for (scc_iterator<CallGraph*> CGI = scc_begin(&CG), E = scc_end(&CG); CGI != E;) { // Copy the current SCC and increment past it so that the pass can hack @@ -94,31 +123,19 @@ bool CGPassManager::runOnModule(Module &M) { CurSCC = *CGI; ++CGI; - // Run all passes on current SCC - for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { - Pass *P = getContainedPass(Index); + + // Run all passes on current SCC. + for (unsigned PassNo = 0, e = getNumContainedPasses(); + PassNo != e; ++PassNo) { + Pass *P = getContainedPass(PassNo); dumpPassInfo(P, EXECUTION_MSG, ON_CG_MSG, ""); dumpRequiredSet(P); initializeAnalysisImpl(P); - StartPassTimer(P); - if (CallGraphSCCPass *CGSP = dynamic_cast<CallGraphSCCPass *>(P)) - Changed |= CGSP->runOnSCC(CurSCC); - else { - FPPassManager *FPP = dynamic_cast<FPPassManager *>(P); - assert (FPP && "Invalid CGPassManager member"); - - // Run pass P on all functions current SCC - for (unsigned i = 0, e = CurSCC.size(); i != e; ++i) { - if (Function *F = CurSCC[i]->getFunction()) { - dumpPassInfo(P, EXECUTION_MSG, ON_FUNCTION_MSG, F->getName()); - Changed |= FPP->runOnFunction(*F); - } - } - } - StopPassTimer(P); + // Actually run this pass on the current SCC. + Changed |= RunPassOnSCC(P, CurSCC); if (Changed) dumpPassInfo(P, MODIFICATION_MSG, ON_CG_MSG, ""); |