Keep track if analysis made available by the pass.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31664 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/llvm/PassManager.h b/include/llvm/PassManager.h
index 075a572..667fa70 100644
--- a/include/llvm/PassManager.h
+++ b/include/llvm/PassManager.h
@@ -19,6 +19,7 @@
 
 #include "llvm/Pass.h"
 #include <vector>
+#include <set>
 
 namespace llvm {
 
@@ -106,9 +107,12 @@
   /// Return true IFF AnalysisID AID is currently available.
   bool analysisCurrentlyAvailable(AnalysisID AID);
 
-  /// Augment RequiredSet by adding analysis required by pass P.
+  /// Augment RequiredAnalysis by adding analysis required by pass P.
   void noteDownRequiredAnalysis(Pass *P);
 
+  /// Augment AvailableAnalysis by adding analysis made available by pass P.
+  void noteDownAvailableAnalysis(Pass *P);
+
   /// Remove AnalysisID from the RequiredSet
   void removeAnalysis(AnalysisID AID);
 
@@ -121,6 +125,9 @@
 private:
    // Analysis required by the passes managed by this manager
   std::vector<AnalysisID> RequiredAnalysis;
+
+  // set of available Analysis
+  std::set<AnalysisID> AvailableAnalysis;
 };
 
 /// PassManager_New manages ModulePassManagers
diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp
index 27a86b6..157a9aa 100644
--- a/lib/VMCore/PassManager.cpp
+++ b/lib/VMCore/PassManager.cpp
@@ -164,7 +164,7 @@
   return false;
 }
 
-/// Augment RequiredSet by adding analysis required by pass P.
+/// Augment RequiredAnalysis by adding analysis required by pass P.
 void CommonPassManagerImpl::noteDownRequiredAnalysis(Pass *P) {
   AnalysisUsage AnUsage;
   P->getAnalysisUsage(AnUsage);
@@ -174,6 +174,21 @@
   RequiredAnalysis.insert(RequiredAnalysis.end(), RequiredSet.begin(), RequiredSet.end());
 }
 
+/// Augement AvailableAnalysis by adding analysis made available by pass P.
+void CommonPassManagerImpl::noteDownAvailableAnalysis(Pass *P) {
+  
+  if (const PassInfo *PI = P->getPassInfo()) {
+    AvailableAnalysis.insert(PI);
+
+    //TODO This pass is the current implementation of all of the interfaces it
+    //TODO implements as well.
+    //TODO
+    //TODO const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented();
+    //TODO for (unsigned i = 0, e = II.size(); i != e; ++i)
+    //TODO CurrentAnalyses[II[i]] = P;
+  }
+}
+
 /// Remove AnalysisID from the RequiredSet
 void CommonPassManagerImpl::removeAnalysis(AnalysisID AID) {
 
@@ -202,8 +217,9 @@
   if (!manageablePass(P))
     return false;
 
-  // Take a note of analysis required by this pass.
+  // Take a note of analysis required and made available by this pass
   noteDownRequiredAnalysis(P);
+  noteDownAvailableAnalysis(P);
 
   // Add pass
   PassVector.push_back(BP);
@@ -285,8 +301,9 @@
   if (!manageablePass(P))
     return false;
 
-  // Take a note of analysis required by this pass.
+  // Take a note of analysis required and made available by this pass
   noteDownRequiredAnalysis(P);
+  noteDownAvailableAnalysis(P);
 
   PassVector.push_back(FP);
   activeBBPassManager = NULL;
@@ -345,8 +362,9 @@
   if (!manageablePass(P))
     return false;
 
-  // Take a note of analysis required by this pass.
+  // Take a note of analysis required and made available by this pass
   noteDownRequiredAnalysis(P);
+  noteDownAvailableAnalysis(P);
 
   PassVector.push_back(MP);
   activeFunctionPassManager = NULL;