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
This commit is contained in:
Dan Gohman 2009-09-28 00:07:05 +00:00
parent 6a2fa325c1
commit 5c12adaa8b
4 changed files with 29 additions and 34 deletions

View File

@ -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 *);
}

View File

@ -96,9 +96,9 @@ bool CGPassManager::RunPassOnSCC(Pass *P, std::vector<CallGraphNode*> &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<CallGraphNode*> &CurSCC,
return Changed;
}
StartPassTimer(P);
FPPassManager *FPP = dynamic_cast<FPPassManager *>(P);
assert(FPP && "Invalid CGPassManager member");
@ -118,10 +117,11 @@ bool CGPassManager::RunPassOnSCC(Pass *P, std::vector<CallGraphNode*> &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.

View File

@ -232,10 +232,10 @@ bool LPPassManager::runOnFunction(Function &F) {
LoopPass *LP = dynamic_cast<LoopPass *>(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)

View File

@ -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<PMDataManager *>(P))
return;
return 0;
sys::SmartScopedLock<true> Lock(*TimingInfoMutex);
std::map<Pass*, Timer>::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<PMDataManager *>(P))
return;
sys::SmartScopedLock<true> Lock(*TimingInfoMutex);
std::map<Pass*, Timer>::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();
}
//===----------------------------------------------------------------------===//