From: Dan Gohman Date: Mon, 28 Sep 2009 00:07:05 +0000 (+0000) Subject: Extend the StartPassTimer and StopPassTimer functions so that the X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=5c12adaa8b92800d835ddd5c97723c6eb5628b5b;p=oota-llvm.git 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 --- diff --git a/include/llvm/PassManagers.h b/include/llvm/PassManagers.h index 94d56e4757c..a067294e9fa 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 801ae1952cb..a96a5c591f8 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 c9515f600fe..f3686fe67a2 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 79c30aa480c..a3496ed9b4f 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(); } //===----------------------------------------------------------------------===//