From 5c12adaa8b92800d835ddd5c97723c6eb5628b5b Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Mon, 28 Sep 2009 00:07:05 +0000 Subject: Extend the StartPassTimer and StopPassTimer functions so that the code that stops the timer doesn't have to search to find the timer object before it stops the timer. This avoids a lock acquisition and a few other things done with the timer running. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82949 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/PassManagers.h | 5 ++-- lib/Analysis/IPA/CallGraphSCCPass.cpp | 8 +++--- lib/Analysis/LoopPass.cpp | 4 +-- lib/VMCore/PassManager.cpp | 46 +++++++++++++++-------------------- 4 files changed, 29 insertions(+), 34 deletions(-) diff --git a/include/llvm/PassManagers.h b/include/llvm/PassManagers.h index 94d56e4..a067294 100644 --- a/include/llvm/PassManagers.h +++ b/include/llvm/PassManagers.h @@ -95,6 +95,7 @@ namespace llvm { class Pass; class StringRef; class Value; + class Timer; /// FunctionPassManager and PassManager, two top level managers, serve /// as the public interface of pass manager infrastructure. @@ -460,8 +461,8 @@ public: } }; -extern void StartPassTimer(llvm::Pass *); -extern void StopPassTimer(llvm::Pass *); +extern Timer *StartPassTimer(Pass *); +extern void StopPassTimer(Pass *, Timer *); } diff --git a/lib/Analysis/IPA/CallGraphSCCPass.cpp b/lib/Analysis/IPA/CallGraphSCCPass.cpp index 801ae19..a96a5c5 100644 --- a/lib/Analysis/IPA/CallGraphSCCPass.cpp +++ b/lib/Analysis/IPA/CallGraphSCCPass.cpp @@ -96,9 +96,9 @@ bool CGPassManager::RunPassOnSCC(Pass *P, std::vector &CurSCC, CallGraphUpToDate = true; } - StartPassTimer(CGSP); + Timer *T = StartPassTimer(CGSP); Changed = CGSP->runOnSCC(CurSCC); - StopPassTimer(CGSP); + StopPassTimer(CGSP, T); // After the CGSCCPass is done, when assertions are enabled, use // RefreshCallGraph to verify that the callgraph was correctly updated. @@ -110,7 +110,6 @@ bool CGPassManager::RunPassOnSCC(Pass *P, std::vector &CurSCC, return Changed; } - StartPassTimer(P); FPPassManager *FPP = dynamic_cast(P); assert(FPP && "Invalid CGPassManager member"); @@ -118,10 +117,11 @@ bool CGPassManager::RunPassOnSCC(Pass *P, std::vector &CurSCC, 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()); + Timer *T = StartPassTimer(FPP); Changed |= FPP->runOnFunction(*F); + StopPassTimer(FPP, T); } } - StopPassTimer(P); // The function pass(es) modified the IR, they may have clobbered the // callgraph. diff --git a/lib/Analysis/LoopPass.cpp b/lib/Analysis/LoopPass.cpp index c9515f6..f3686fe 100644 --- a/lib/Analysis/LoopPass.cpp +++ b/lib/Analysis/LoopPass.cpp @@ -232,10 +232,10 @@ bool LPPassManager::runOnFunction(Function &F) { LoopPass *LP = dynamic_cast(P); { PassManagerPrettyStackEntry X(LP, *CurrentLoop->getHeader()); - StartPassTimer(P); assert(LP && "Invalid LPPassManager member"); + Timer *T = StartPassTimer(P); Changed |= LP->runOnLoop(CurrentLoop, *this); - StopPassTimer(P); + StopPassTimer(P, T); } if (Changed) diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp index 79c30aa..a3496ed 100644 --- a/lib/VMCore/PassManager.cpp +++ b/lib/VMCore/PassManager.cpp @@ -397,25 +397,19 @@ public: // null. It may be called multiple times. static void createTheTimeInfo(); - void passStarted(Pass *P) { + /// passStarted - This method creates a timer for the given pass if it doesn't + /// already have one, and starts the timer. + Timer *passStarted(Pass *P) { if (dynamic_cast(P)) - return; + return 0; sys::SmartScopedLock Lock(*TimingInfoMutex); std::map::iterator I = TimingData.find(P); if (I == TimingData.end()) I=TimingData.insert(std::make_pair(P, Timer(P->getPassName(), TG))).first; - I->second.startTimer(); - } - - void passEnded(Pass *P) { - if (dynamic_cast(P)) - return; - - sys::SmartScopedLock Lock(*TimingInfoMutex); - std::map::iterator I = TimingData.find(P); - assert(I != TimingData.end() && "passStarted/passEnded not nested right!"); - I->second.stopTimer(); + Timer *T = &I->second; + T->startTimer(); + return T; } }; @@ -827,9 +821,9 @@ void PMDataManager::freePass(Pass *P, const StringRef &Msg, // If the pass crashes releasing memory, remember this. PassManagerPrettyStackEntry X(P); - if (TheTimeInfo) TheTimeInfo->passStarted(P); + Timer *T = StartPassTimer(P); P->releaseMemory(); - if (TheTimeInfo) TheTimeInfo->passEnded(P); + StopPassTimer(P, T); } if (const PassInfo *PI = P->getPassInfo()) { @@ -1162,9 +1156,9 @@ bool BBPassManager::runOnFunction(Function &F) { // If the pass crashes, remember this. PassManagerPrettyStackEntry X(BP, *I); - if (TheTimeInfo) TheTimeInfo->passStarted(BP); + Timer *T = StartPassTimer(BP); Changed |= BP->runOnBasicBlock(*I); - if (TheTimeInfo) TheTimeInfo->passEnded(BP); + StopPassTimer(BP, T); } if (Changed) @@ -1377,9 +1371,9 @@ bool FPPassManager::runOnFunction(Function &F) { { PassManagerPrettyStackEntry X(FP, F); - if (TheTimeInfo) TheTimeInfo->passStarted(FP); + Timer *T = StartPassTimer(FP); Changed |= FP->runOnFunction(F); - if (TheTimeInfo) TheTimeInfo->passEnded(FP); + StopPassTimer(FP, T); } if (Changed) @@ -1453,9 +1447,9 @@ MPPassManager::runOnModule(Module &M) { { PassManagerPrettyStackEntry X(MP, M); - if (TheTimeInfo) TheTimeInfo->passStarted(MP); + Timer *T = StartPassTimer(MP); Changed |= MP->runOnModule(M); - if (TheTimeInfo) TheTimeInfo->passEnded(MP); + StopPassTimer(MP, T); } if (Changed) @@ -1591,15 +1585,15 @@ void TimingInfo::createTheTimeInfo() { } /// If TimingInfo is enabled then start pass timer. -void llvm::StartPassTimer(Pass *P) { +Timer *llvm::StartPassTimer(Pass *P) { if (TheTimeInfo) - TheTimeInfo->passStarted(P); + return TheTimeInfo->passStarted(P); + return 0; } /// If TimingInfo is enabled then stop pass timer. -void llvm::StopPassTimer(Pass *P) { - if (TheTimeInfo) - TheTimeInfo->passEnded(P); +void llvm::StopPassTimer(Pass *P, Timer *T) { + if (T) T->stopTimer(); } //===----------------------------------------------------------------------===// -- cgit v1.1