Cache size of PassVector to speed up getNumContainedPasses().
authorEvan Cheng <evan.cheng@apple.com>
Mon, 12 Nov 2012 21:42:53 +0000 (21:42 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Mon, 12 Nov 2012 21:42:53 +0000 (21:42 +0000)
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

include/llvm/PassManagers.h
lib/VMCore/PassManager.cpp

index 0af58533805ee278a5bfbc3cf93606dd65d183c1..3acbf0e2c07484ec7c0b25ae64cfa1b085204be7 100644 (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;
   }
index 53f11499e4b975ded1f1cd243083d8cf9e3bd429..5c209e24d81951655cf327d44a46730f36256de0 100644 (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;
 }