[PM] Add support to the analysis managers to query explicitly for cached
[oota-llvm.git] / include / llvm / IR / PassManager.h
index 4d0c09234b766f846a4bcfac0454bee46b761992..d6e97419def19785c25fbfb05244c7326c4a10ff 100644 (file)
@@ -460,6 +460,26 @@ public:
     return static_cast<const ResultModelT &>(ResultConcept).Result;
   }
 
+  /// \brief Get the cached result of an analysis pass for this module.
+  ///
+  /// This method never runs the analysis.
+  ///
+  /// \returns null if there is no cached result.
+  template <typename PassT>
+  const typename PassT::Result *getCachedResult(Module *M) const {
+    assert(ModuleAnalysisPasses.count(PassT::ID()) &&
+           "This analysis pass was not registered prior to being queried");
+
+    const detail::AnalysisResultConcept<Module *> *ResultConcept =
+        getCachedResultImpl(PassT::ID(), M);
+    if (!ResultConcept)
+      return 0;
+
+    typedef detail::AnalysisResultModel<Module *, PassT, typename PassT::Result>
+        ResultModelT;
+    return &static_cast<const ResultModelT *>(ResultConcept)->Result;
+  }
+
   /// \brief Register an analysis pass with the manager.
   ///
   /// This provides an initialized and set-up analysis pass to the
@@ -495,6 +515,10 @@ private:
   const detail::AnalysisResultConcept<Module *> &getResultImpl(void *PassID,
                                                                Module *M);
 
+  /// \brief Get a cached module pass result or return null.
+  const detail::AnalysisResultConcept<Module *> *
+  getCachedResultImpl(void *PassID, Module *M) const;
+
   /// \brief Invalidate a module pass result.
   void invalidateImpl(void *PassID, Module *M);
 
@@ -537,6 +561,26 @@ public:
     return static_cast<const ResultModelT &>(ResultConcept).Result;
   }
 
+  /// \brief Get the cached result of an analysis pass for a function if
+  /// available.
+  ///
+  /// Does not run the analysis ever.
+  /// \returns null if a cached result is not available.
+  template <typename PassT>
+  const typename PassT::Result *getCachedResult(Function *F) {
+    assert(FunctionAnalysisPasses.count(PassT::ID()) &&
+           "This analysis pass was not registered prior to being queried");
+
+    const detail::AnalysisResultConcept<Function *> *ResultConcept =
+        getCachedResultImpl(PassT::ID(), F);
+    if (!ResultConcept)
+      return 0;
+
+    typedef detail::AnalysisResultModel<Function *, PassT,
+                                        typename PassT::Result> ResultModelT;
+    return &static_cast<const ResultModelT *>(ResultConcept)->Result;
+  }
+
   /// \brief Register an analysis pass with the manager.
   ///
   /// This provides an initialized and set-up analysis pass to the
@@ -583,6 +627,10 @@ private:
   const detail::AnalysisResultConcept<Function *> &getResultImpl(void *PassID,
                                                                  Function *F);
 
+  /// \brief Get a cached function pass result or return null.
+  const detail::AnalysisResultConcept<Function *> *
+  getCachedResultImpl(void *PassID, Function *F) const;
+
   /// \brief Invalidate a function pass result.
   void invalidateImpl(void *PassID, Function *F);