mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
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. llvm-svn: 82949
This commit is contained in:
parent
189ce11684
commit
09f5f7f190
@ -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 *);
|
||||
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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)
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
Loading…
Reference in New Issue
Block a user