Cache size of PassVector to speed up getNumContainedPasses().

getNumContainedPasses() used to compute the size of the vector on demand. It is
called repeated in loops (such as runOnFunction()) and it can be updated while
inside the loop.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167759 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng 2012-11-12 21:42:53 +00:00
parent 3c9e55867e
commit 0655668b11
2 changed files with 12 additions and 8 deletions

View File

@ -263,7 +263,7 @@ private:
class PMDataManager {
public:
explicit PMDataManager() : TPM(NULL), Depth(0) {
explicit PMDataManager() : TPM(NULL), PassVectorSize(0), Depth(0) {
initializeAnalysisInfo();
}
@ -344,7 +344,7 @@ public:
void dumpPreservedSet(const Pass *P) const;
virtual unsigned getNumContainedPasses() const {
return (unsigned)PassVector.size();
return PassVectorSize;
}
virtual PassManagerType getPassManagerType() const {
@ -369,14 +369,16 @@ protected:
// Top level manager.
PMTopLevelManager *TPM;
// Collection of pass that are managed by this manager
SmallVector<Pass *, 16> PassVector;
// Collection of Analysis provided by Parent pass manager and
// used by current pass manager. At at time there can not be more
// then PMT_Last active pass mangers.
std::map<AnalysisID, Pass *> *InheritedAnalysis[PMT_Last];
// Collection of pass that are managed by this manager
SmallVector<Pass *, 16> PassVector;
// Cache the size of PassVector
unsigned PassVectorSize;
/// isPassDebuggingExecutionsOrMore - Return true if -debug-pass=Executions
/// or higher is specified.
@ -444,7 +446,7 @@ public:
}
FunctionPass *getContainedPass(unsigned N) {
assert ( N < PassVector.size() && "Pass number out of range!");
assert ( N < PassVectorSize && "Pass number out of range!");
FunctionPass *FP = static_cast<FunctionPass *>(PassVector[N]);
return FP;
}

View File

@ -195,7 +195,7 @@ public:
}
BasicBlockPass *getContainedPass(unsigned N) {
assert(N < PassVector.size() && "Pass number out of range!");
assert(N < PassVectorSize && "Pass number out of range!");
BasicBlockPass *BP = static_cast<BasicBlockPass *>(PassVector[N]);
return BP;
}
@ -346,7 +346,7 @@ public:
}
ModulePass *getContainedPass(unsigned N) {
assert(N < PassVector.size() && "Pass number out of range!");
assert(N < PassVectorSize && "Pass number out of range!");
return static_cast<ModulePass *>(PassVector[N]);
}
@ -963,6 +963,7 @@ void PMDataManager::add(Pass *P, bool ProcessAnalysis) {
if (!ProcessAnalysis) {
// Add pass
PassVector.push_back(P);
++PassVectorSize;
return;
}
@ -1024,6 +1025,7 @@ void PMDataManager::add(Pass *P, bool ProcessAnalysis) {
// Add pass
PassVector.push_back(P);
++PassVectorSize;
}