eliminate a bunch of dynamic_cast's.
authorChris Lattner <sabre@nondot.org>
Fri, 22 Jan 2010 05:24:46 +0000 (05:24 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 22 Jan 2010 05:24:46 +0000 (05:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94155 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/LoopPass.h
include/llvm/Pass.h
include/llvm/PassManagers.h
lib/Analysis/IPA/CallGraphSCCPass.cpp
lib/VMCore/PassManager.cpp

index 2dceccbd307cdc3394486d9ac7e15e0da1819c12..25488da4579a90d306e101689101080bc24979d7 100644 (file)
@@ -94,6 +94,9 @@ public:
     return "Loop Pass Manager";
   }
 
+  virtual PMDataManager *getAsPMDataManager() { return this; }
+  virtual Pass *getAsPass() { return this; }
+
   /// Print passes managed by this manager
   void dumpPassStructure(unsigned Offset);
 
index 0a53cbf8d08d5f945d0d3615385f0b10f27782ea..7bc6295432a750230c04c8226a98709ead89d451 100644 (file)
@@ -153,6 +153,7 @@ public:
     return this;
   }
   virtual ImmutablePass *getAsImmutablePass() { return 0; }
+  virtual PMDataManager *getAsPMDataManager() { return 0; }
   
   /// verifyAnalysis() - This member can be implemented by a analysis pass to
   /// check state of analysis information. 
index dffc24a41ca734deb8e4b8e9fb77c9cd6d3c199b..443a9e02d2ad07da8ad720c0d56867e541fb1da0 100644 (file)
@@ -273,6 +273,8 @@ public:
   }
 
   virtual ~PMDataManager();
+  
+  virtual Pass *getAsPass() = 0;
 
   /// Augment AvailableAnalysis by adding analysis made available by pass P.
   void recordAvailableAnalysis(Pass *P);
@@ -413,7 +415,6 @@ private:
 /// function.
 
 class FPPassManager : public ModulePass, public PMDataManager {
 public:
   static char ID;
   explicit FPPassManager(int Depth) 
@@ -435,6 +436,9 @@ public:
   ///
   bool doFinalization(Module &M);
 
+  virtual PMDataManager *getAsPMDataManager() { return this; }
+  virtual Pass *getAsPass() { return this; }
+
   /// Pass Manager itself does not invalidate any analysis info.
   void getAnalysisUsage(AnalysisUsage &Info) const {
     Info.setPreservesAll();
index 5504b9be33ae13c08f7310bed0da272a35c6980d..bb2a2cc8c3ce9b761b430c75d177ec6132392ef1 100644 (file)
@@ -57,6 +57,9 @@ public:
     return "CallGraph Pass Manager";
   }
 
+  virtual PMDataManager *getAsPMDataManager() { return this; }
+  virtual Pass *getAsPass() { return this; }
+
   // Print passes managed by this manager
   void dumpPassStructure(unsigned Offset) {
     errs().indent(Offset*2) << "Call Graph SCC Pass Manager\n";
index 7aa8cb3b01012035da76e6d9c4bbf9df163a39a4..7b02c9335918aaa330c916243b8856665620a08b 100644 (file)
@@ -127,6 +127,9 @@ public:
   bool doFinalization(Module &M);
   bool doFinalization(Function &F);
 
+  virtual PMDataManager *getAsPMDataManager() { return this; }
+  virtual Pass *getAsPass() { return this; }
+
   virtual const char *getPassName() const {
     return "BasicBlock Pass Manager";
   }
@@ -196,6 +199,10 @@ public:
   ///
   bool doFinalization(Module &M);
 
+                                  
+  virtual PMDataManager *getAsPMDataManager() { return this; }
+  virtual Pass *getAsPass() { return this; }
+
   /// Pass Manager itself does not invalidate any analysis info.
   void getAnalysisUsage(AnalysisUsage &Info) const {
     Info.setPreservesAll();
@@ -269,6 +276,9 @@ public:
     return "Module Pass Manager";
   }
 
+  virtual PMDataManager *getAsPMDataManager() { return this; }
+  virtual Pass *getAsPass() { return this; }
+
   // Print passes managed by this manager
   void dumpPassStructure(unsigned Offset) {
     llvm::dbgs() << std::string(Offset*2, ' ') << "ModulePass Manager\n";
@@ -344,6 +354,9 @@ public:
     }
   }
 
+  virtual PMDataManager *getAsPMDataManager() { return this; }
+  virtual Pass *getAsPass() { return this; }
+
   MPPassManager *getContainedManager(unsigned N) {
     assert(N < PassManagers.size() && "Pass number out of range!");
     MPPassManager *MP = static_cast<MPPassManager *>(PassManagers[N]);
@@ -387,7 +400,7 @@ public:
   /// 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)) 
+    if (P->getAsPMDataManager()) 
       return 0;
 
     sys::SmartScopedLock<true> Lock(*TimingInfoMutex);
@@ -581,11 +594,11 @@ void PMTopLevelManager::dumpPasses() const {
   
   // Every class that derives from PMDataManager also derives from Pass
   // (sometimes indirectly), but there's no inheritance relationship
-  // between PMDataManager and Pass, so we have to dynamic_cast to get
+  // between PMDataManager and Pass, so we have to getAsPass to get
   // from a PMDataManager* to a Pass*.
   for (SmallVector<PMDataManager *, 8>::const_iterator I = PassManagers.begin(),
          E = PassManagers.end(); I != E; ++I)
-    dynamic_cast<Pass *>(*I)->dumpPassStructure(1);
+    (*I)->getAsPass()->dumpPassStructure(1);
 }
 
 void PMTopLevelManager::dumpArguments() const {
@@ -851,12 +864,12 @@ void PMDataManager::add(Pass *P, bool ProcessAnalysis) {
   // Set P as P's last user until someone starts using P.
   // However, if P is a Pass Manager then it does not need
   // to record its last user.
-  if (!dynamic_cast<PMDataManager *>(P))
+  if (P->getAsPMDataManager() == 0)
     LastUses.push_back(P);
   TPM->setLastUser(LastUses, P);
 
   if (!TransferLastUses.empty()) {
-    Pass *My_PM = dynamic_cast<Pass *>(this);
+    Pass *My_PM = getAsPass();
     TPM->setLastUser(TransferLastUses, My_PM);
     TransferLastUses.clear();
   }
@@ -965,7 +978,7 @@ void PMDataManager::dumpLastUses(Pass *P, unsigned Offset) const{
 void PMDataManager::dumpPassArguments() const {
   for (SmallVector<Pass *, 8>::const_iterator I = PassVector.begin(),
         E = PassVector.end(); I != E; ++I) {
-    if (PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I))
+    if (PMDataManager *PMD = (*I)->getAsPMDataManager())
       PMD->dumpPassArguments();
     else
       if (const PassInfo *PI = (*I)->getPassInfo())
@@ -1583,7 +1596,7 @@ void PMStack::push(PMDataManager *PM) {
 void PMStack::dump() {
   for (std::deque<PMDataManager *>::iterator I = S.begin(),
          E = S.end(); I != E; ++I)
-    printf("%s ", dynamic_cast<Pass *>(*I)->getPassName());
+    printf("%s ", (*I)->getAsPass()->getPassName());
 
   if (!S.empty())
     printf("\n");