Add a new MachineInstr-level DCE pass. It is very simple, and is intended to
[oota-llvm.git] / include / llvm / PassManagers.h
index 04bb48bc3e323057846dbe8602f0bc6e62705311..f8e1308c235b4b3a74f158f920ba4832ba592f95 100644 (file)
@@ -13,6 +13,8 @@
 
 #include "llvm/PassManager.h"
 #include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/SmallPtrSet.h"
+#include "llvm/ADT/DenseMap.h"
 #include <deque>
 #include <map>
 
@@ -28,8 +30,8 @@
 //
 // Pass Manager Infrastructure uses multiple pass managers.  They are
 // PassManager, FunctionPassManager, MPPassManager, FPPassManager, BBPassManager.
-// This class hierarcy uses multiple inheritance but pass managers do not derive
-// from another pass manager.
+// This class hierarchy uses multiple inheritance but pass managers do not
+// derive from another pass manager.
 //
 // PassManager and FunctionPassManager are two top-level pass manager that
 // represents the external interface of this entire pass manager infrastucture.
@@ -86,6 +88,9 @@
 #ifndef PASSMANAGERS_H
 #define PASSMANAGERS_H
 
+#include "llvm/Pass.h"
+#include <deque>
+
 namespace llvm {
 
 /// FunctionPassManager and PassManager, two top level managers, serve 
@@ -145,8 +150,8 @@ private:
 class PMTopLevelManager {
 public:
 
-  virtual unsigned getNumContainedManagers() {
-    return PassManagers.size();
+  virtual unsigned getNumContainedManagers() const {
+    return (unsigned)PassManagers.size();
   }
 
   /// Schedule pass P for execution. Make sure that passes required by
@@ -169,6 +174,9 @@ public:
   /// then return NULL.
   Pass *findAnalysisPass(AnalysisID AID);
 
+  /// Find analysis usage information for the pass P.
+  AnalysisUsage *findAnalysisUsage(Pass *P);
+
   explicit PMTopLevelManager(enum TopLevelManagerType t);
   virtual ~PMTopLevelManager(); 
 
@@ -178,7 +186,7 @@ public:
     ImmutablePasses.push_back(P);
   }
 
-  inline std::vector<ImmutablePass *>& getImmutablePasses() {
+  inline SmallVector<ImmutablePass *, 8>& getImmutablePasses() {
     return ImmutablePasses;
   }
 
@@ -204,20 +212,27 @@ public:
 protected:
   
   /// Collection of pass managers
-  std::vector<PMDataManager *> PassManagers;
+  SmallVector<PMDataManager *, 8> PassManagers;
 
 private:
 
   /// Collection of pass managers that are not directly maintained
   /// by this pass manager
-  std::vector<PMDataManager *> IndirectPassManagers;
+  SmallVector<PMDataManager *, 8> IndirectPassManagers;
 
   // Map to keep track of last user of the analysis pass.
   // LastUser->second is the last user of Lastuser->first.
-  std::map<Pass *, Pass *> LastUser;
+  DenseMap<Pass *, Pass *> LastUser;
+
+  // Map to keep track of passes that are last used by a pass.
+  // This inverse map is initialized at PM->run() based on
+  // LastUser map.
+  DenseMap<Pass *, SmallPtrSet<Pass *, 8> > InversedLastUser;
 
   /// Immutable passes are managed by top level manager.
-  std::vector<ImmutablePass *> ImmutablePasses;
+  SmallVector<ImmutablePass *, 8> ImmutablePasses;
+
+  DenseMap<Pass *, AnalysisUsage *> AnUsageMap;
 };
 
 
@@ -242,6 +257,9 @@ public:
   /// verifyPreservedAnalysis -- Verify analysis presreved by pass P.
   void verifyPreservedAnalysis(Pass *P);
 
+  /// verifyDomInfo -- Verify dominator information if it is available.
+  void verifyDomInfo(Pass &P, Function &F);
+
   /// Remove Analysis that is not preserved by the pass
   void removeNotPreservedAnalysis(Pass *P);
   
@@ -302,11 +320,11 @@ public:
   void dumpPassArguments() const;
   void dumpPassInfo(Pass *P, enum PassDebuggingString S1,
                     enum PassDebuggingString S2, const char *Msg);
-  void dumpAnalysisSetInfo(const char *Msg, Pass *P,
-                           const std::vector<AnalysisID> &Set) const;
+  void dumpRequiredSet(const Pass *P) const;
+  void dumpPreservedSet(const Pass *P) const;
 
-  virtual unsigned getNumContainedPasses() 
-    return PassVector.size();
+  virtual unsigned getNumContainedPasses() const {
+    return (unsigned)PassVector.size();
   }
 
   virtual PassManagerType getPassManagerType() const { 
@@ -332,7 +350,7 @@ protected:
   PMTopLevelManager *TPM;
 
   // Collection of pass that are managed by this manager
-  std::vector<Pass *> PassVector;
+  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
@@ -340,6 +358,9 @@ protected:
   std::map<AnalysisID, Pass *> *InheritedAnalysis[PMT_Last];
 
 private:
+  void dumpAnalysisUsage(const char *Msg, const Pass *P,
+                           const AnalysisUsage::VectorType &Set) const;
+
   // Set of available Analysis. This information is used while scheduling 
   // pass. If a pass requires an analysis which is not not available then 
   // equired analysis pass is scheduled to run before the pass itself is 
@@ -348,7 +369,7 @@ private:
 
   // Collection of higher level analysis used by the pass managed by
   // this manager.
-  std::vector<Pass *> HigherLevelAnalysis;
+  SmallVector<Pass *, 8> HigherLevelAnalysis;
 
   unsigned Depth;
 };