Home | History | Annotate | Download | only in IR
      1 //===- PassManager.h - Pass management infrastructure -----------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 /// \file
     10 ///
     11 /// This header defines various interfaces for pass management in LLVM. There
     12 /// is no "pass" interface in LLVM per se. Instead, an instance of any class
     13 /// which supports a method to 'run' it over a unit of IR can be used as
     14 /// a pass. A pass manager is generally a tool to collect a sequence of passes
     15 /// which run over a particular IR construct, and run each of them in sequence
     16 /// over each such construct in the containing IR construct. As there is no
     17 /// containing IR construct for a Module, a manager for passes over modules
     18 /// forms the base case which runs its managed passes in sequence over the
     19 /// single module provided.
     20 ///
     21 /// The core IR library provides managers for running passes over
     22 /// modules and functions.
     23 ///
     24 /// * FunctionPassManager can run over a Module, runs each pass over
     25 ///   a Function.
     26 /// * ModulePassManager must be directly run, runs each pass over the Module.
     27 ///
     28 /// Note that the implementations of the pass managers use concept-based
     29 /// polymorphism as outlined in the "Value Semantics and Concept-based
     30 /// Polymorphism" talk (or its abbreviated sibling "Inheritance Is The Base
     31 /// Class of Evil") by Sean Parent:
     32 /// * http://github.com/sean-parent/sean-parent.github.com/wiki/Papers-and-Presentations
     33 /// * http://www.youtube.com/watch?v=_BpMYeUFXv8
     34 /// * http://channel9.msdn.com/Events/GoingNative/2013/Inheritance-Is-The-Base-Class-of-Evil
     35 ///
     36 //===----------------------------------------------------------------------===//
     37 
     38 #ifndef LLVM_IR_PASSMANAGER_H
     39 #define LLVM_IR_PASSMANAGER_H
     40 
     41 #include "llvm/ADT/DenseMap.h"
     42 #include "llvm/ADT/STLExtras.h"
     43 #include "llvm/ADT/SmallPtrSet.h"
     44 #include "llvm/IR/Function.h"
     45 #include "llvm/IR/Module.h"
     46 #include "llvm/IR/PassManagerInternal.h"
     47 #include "llvm/Support/CommandLine.h"
     48 #include "llvm/Support/Debug.h"
     49 #include "llvm/Support/raw_ostream.h"
     50 #include "llvm/Support/type_traits.h"
     51 #include <list>
     52 #include <memory>
     53 #include <vector>
     54 
     55 namespace llvm {
     56 
     57 class Module;
     58 class Function;
     59 
     60 /// \brief An abstract set of preserved analyses following a transformation pass
     61 /// run.
     62 ///
     63 /// When a transformation pass is run, it can return a set of analyses whose
     64 /// results were preserved by that transformation. The default set is "none",
     65 /// and preserving analyses must be done explicitly.
     66 ///
     67 /// There is also an explicit all state which can be used (for example) when
     68 /// the IR is not mutated at all.
     69 class PreservedAnalyses {
     70 public:
     71   // We have to explicitly define all the special member functions because MSVC
     72   // refuses to generate them.
     73   PreservedAnalyses() {}
     74   PreservedAnalyses(const PreservedAnalyses &Arg)
     75       : PreservedPassIDs(Arg.PreservedPassIDs) {}
     76   PreservedAnalyses(PreservedAnalyses &&Arg)
     77       : PreservedPassIDs(std::move(Arg.PreservedPassIDs)) {}
     78   friend void swap(PreservedAnalyses &LHS, PreservedAnalyses &RHS) {
     79     using std::swap;
     80     swap(LHS.PreservedPassIDs, RHS.PreservedPassIDs);
     81   }
     82   PreservedAnalyses &operator=(PreservedAnalyses RHS) {
     83     swap(*this, RHS);
     84     return *this;
     85   }
     86 
     87   /// \brief Convenience factory function for the empty preserved set.
     88   static PreservedAnalyses none() { return PreservedAnalyses(); }
     89 
     90   /// \brief Construct a special preserved set that preserves all passes.
     91   static PreservedAnalyses all() {
     92     PreservedAnalyses PA;
     93     PA.PreservedPassIDs.insert((void *)AllPassesID);
     94     return PA;
     95   }
     96 
     97   /// \brief Mark a particular pass as preserved, adding it to the set.
     98   template <typename PassT> void preserve() { preserve(PassT::ID()); }
     99 
    100   /// \brief Mark an abstract PassID as preserved, adding it to the set.
    101   void preserve(void *PassID) {
    102     if (!areAllPreserved())
    103       PreservedPassIDs.insert(PassID);
    104   }
    105 
    106   /// \brief Intersect this set with another in place.
    107   ///
    108   /// This is a mutating operation on this preserved set, removing all
    109   /// preserved passes which are not also preserved in the argument.
    110   void intersect(const PreservedAnalyses &Arg) {
    111     if (Arg.areAllPreserved())
    112       return;
    113     if (areAllPreserved()) {
    114       PreservedPassIDs = Arg.PreservedPassIDs;
    115       return;
    116     }
    117     for (void *P : PreservedPassIDs)
    118       if (!Arg.PreservedPassIDs.count(P))
    119         PreservedPassIDs.erase(P);
    120   }
    121 
    122   /// \brief Intersect this set with a temporary other set in place.
    123   ///
    124   /// This is a mutating operation on this preserved set, removing all
    125   /// preserved passes which are not also preserved in the argument.
    126   void intersect(PreservedAnalyses &&Arg) {
    127     if (Arg.areAllPreserved())
    128       return;
    129     if (areAllPreserved()) {
    130       PreservedPassIDs = std::move(Arg.PreservedPassIDs);
    131       return;
    132     }
    133     for (void *P : PreservedPassIDs)
    134       if (!Arg.PreservedPassIDs.count(P))
    135         PreservedPassIDs.erase(P);
    136   }
    137 
    138   /// \brief Query whether a pass is marked as preserved by this set.
    139   template <typename PassT> bool preserved() const {
    140     return preserved(PassT::ID());
    141   }
    142 
    143   /// \brief Query whether an abstract pass ID is marked as preserved by this
    144   /// set.
    145   bool preserved(void *PassID) const {
    146     return PreservedPassIDs.count((void *)AllPassesID) ||
    147            PreservedPassIDs.count(PassID);
    148   }
    149 
    150   /// \brief Test whether all passes are preserved.
    151   ///
    152   /// This is used primarily to optimize for the case of no changes which will
    153   /// common in many scenarios.
    154   bool areAllPreserved() const {
    155     return PreservedPassIDs.count((void *)AllPassesID);
    156   }
    157 
    158 private:
    159   // Note that this must not be -1 or -2 as those are already used by the
    160   // SmallPtrSet.
    161   static const uintptr_t AllPassesID = (intptr_t)(-3);
    162 
    163   SmallPtrSet<void *, 2> PreservedPassIDs;
    164 };
    165 
    166 // Forward declare the analysis manager template.
    167 template <typename IRUnitT> class AnalysisManager;
    168 
    169 /// \brief Manages a sequence of passes over units of IR.
    170 ///
    171 /// A pass manager contains a sequence of passes to run over units of IR. It is
    172 /// itself a valid pass over that unit of IR, and when over some given IR will
    173 /// run each pass in sequence. This is the primary and most basic building
    174 /// block of a pass pipeline.
    175 ///
    176 /// If it is run with an \c AnalysisManager<IRUnitT> argument, it will propagate
    177 /// that analysis manager to each pass it runs, as well as calling the analysis
    178 /// manager's invalidation routine with the PreservedAnalyses of each pass it
    179 /// runs.
    180 template <typename IRUnitT> class PassManager {
    181 public:
    182   /// \brief Construct a pass manager.
    183   ///
    184   /// It can be passed a flag to get debug logging as the passes are run.
    185   PassManager(bool DebugLogging = false) : DebugLogging(DebugLogging) {}
    186   // We have to explicitly define all the special member functions because MSVC
    187   // refuses to generate them.
    188   PassManager(PassManager &&Arg)
    189       : Passes(std::move(Arg.Passes)),
    190         DebugLogging(std::move(Arg.DebugLogging)) {}
    191   PassManager &operator=(PassManager &&RHS) {
    192     Passes = std::move(RHS.Passes);
    193     DebugLogging = std::move(RHS.DebugLogging);
    194     return *this;
    195   }
    196 
    197   /// \brief Run all of the passes in this manager over the IR.
    198   PreservedAnalyses run(IRUnitT &IR, AnalysisManager<IRUnitT> *AM = nullptr) {
    199     PreservedAnalyses PA = PreservedAnalyses::all();
    200 
    201     if (DebugLogging)
    202       dbgs() << "Starting pass manager run.\n";
    203 
    204     for (unsigned Idx = 0, Size = Passes.size(); Idx != Size; ++Idx) {
    205       if (DebugLogging)
    206         dbgs() << "Running pass: " << Passes[Idx]->name() << " on "
    207                << IR.getName() << "\n";
    208 
    209       PreservedAnalyses PassPA = Passes[Idx]->run(IR, AM);
    210 
    211       // If we have an active analysis manager at this level we want to ensure
    212       // we update it as each pass runs and potentially invalidates analyses.
    213       // We also update the preserved set of analyses based on what analyses we
    214       // have already handled the invalidation for here and don't need to
    215       // invalidate when finished.
    216       if (AM)
    217         PassPA = AM->invalidate(IR, std::move(PassPA));
    218 
    219       // Finally, we intersect the final preserved analyses to compute the
    220       // aggregate preserved set for this pass manager.
    221       PA.intersect(std::move(PassPA));
    222 
    223       // FIXME: Historically, the pass managers all called the LLVM context's
    224       // yield function here. We don't have a generic way to acquire the
    225       // context and it isn't yet clear what the right pattern is for yielding
    226       // in the new pass manager so it is currently omitted.
    227       //IR.getContext().yield();
    228     }
    229 
    230     if (DebugLogging)
    231       dbgs() << "Finished pass manager run.\n";
    232 
    233     return PA;
    234   }
    235 
    236   template <typename PassT> void addPass(PassT Pass) {
    237     typedef detail::PassModel<IRUnitT, PassT> PassModelT;
    238     Passes.emplace_back(new PassModelT(std::move(Pass)));
    239   }
    240 
    241   static StringRef name() { return "PassManager"; }
    242 
    243 private:
    244   typedef detail::PassConcept<IRUnitT> PassConceptT;
    245 
    246   PassManager(const PassManager &) = delete;
    247   PassManager &operator=(const PassManager &) = delete;
    248 
    249   std::vector<std::unique_ptr<PassConceptT>> Passes;
    250 
    251   /// \brief Flag indicating whether we should do debug logging.
    252   bool DebugLogging;
    253 };
    254 
    255 /// \brief Convenience typedef for a pass manager over modules.
    256 typedef PassManager<Module> ModulePassManager;
    257 
    258 /// \brief Convenience typedef for a pass manager over functions.
    259 typedef PassManager<Function> FunctionPassManager;
    260 
    261 namespace detail {
    262 
    263 /// \brief A CRTP base used to implement analysis managers.
    264 ///
    265 /// This class template serves as the boiler plate of an analysis manager. Any
    266 /// analysis manager can be implemented on top of this base class. Any
    267 /// implementation will be required to provide specific hooks:
    268 ///
    269 /// - getResultImpl
    270 /// - getCachedResultImpl
    271 /// - invalidateImpl
    272 ///
    273 /// The details of the call pattern are within.
    274 ///
    275 /// Note that there is also a generic analysis manager template which implements
    276 /// the above required functions along with common datastructures used for
    277 /// managing analyses. This base class is factored so that if you need to
    278 /// customize the handling of a specific IR unit, you can do so without
    279 /// replicating *all* of the boilerplate.
    280 template <typename DerivedT, typename IRUnitT> class AnalysisManagerBase {
    281   DerivedT *derived_this() { return static_cast<DerivedT *>(this); }
    282   const DerivedT *derived_this() const {
    283     return static_cast<const DerivedT *>(this);
    284   }
    285 
    286   AnalysisManagerBase(const AnalysisManagerBase &) = delete;
    287   AnalysisManagerBase &
    288   operator=(const AnalysisManagerBase &) = delete;
    289 
    290 protected:
    291   typedef detail::AnalysisResultConcept<IRUnitT> ResultConceptT;
    292   typedef detail::AnalysisPassConcept<IRUnitT> PassConceptT;
    293 
    294   // FIXME: Provide template aliases for the models when we're using C++11 in
    295   // a mode supporting them.
    296 
    297   // We have to explicitly define all the special member functions because MSVC
    298   // refuses to generate them.
    299   AnalysisManagerBase() {}
    300   AnalysisManagerBase(AnalysisManagerBase &&Arg)
    301       : AnalysisPasses(std::move(Arg.AnalysisPasses)) {}
    302   AnalysisManagerBase &operator=(AnalysisManagerBase &&RHS) {
    303     AnalysisPasses = std::move(RHS.AnalysisPasses);
    304     return *this;
    305   }
    306 
    307 public:
    308   /// \brief Get the result of an analysis pass for this module.
    309   ///
    310   /// If there is not a valid cached result in the manager already, this will
    311   /// re-run the analysis to produce a valid result.
    312   template <typename PassT> typename PassT::Result &getResult(IRUnitT &IR) {
    313     assert(AnalysisPasses.count(PassT::ID()) &&
    314            "This analysis pass was not registered prior to being queried");
    315 
    316     ResultConceptT &ResultConcept =
    317         derived_this()->getResultImpl(PassT::ID(), IR);
    318     typedef detail::AnalysisResultModel<IRUnitT, PassT, typename PassT::Result>
    319         ResultModelT;
    320     return static_cast<ResultModelT &>(ResultConcept).Result;
    321   }
    322 
    323   /// \brief Get the cached result of an analysis pass for this module.
    324   ///
    325   /// This method never runs the analysis.
    326   ///
    327   /// \returns null if there is no cached result.
    328   template <typename PassT>
    329   typename PassT::Result *getCachedResult(IRUnitT &IR) const {
    330     assert(AnalysisPasses.count(PassT::ID()) &&
    331            "This analysis pass was not registered prior to being queried");
    332 
    333     ResultConceptT *ResultConcept =
    334         derived_this()->getCachedResultImpl(PassT::ID(), IR);
    335     if (!ResultConcept)
    336       return nullptr;
    337 
    338     typedef detail::AnalysisResultModel<IRUnitT, PassT, typename PassT::Result>
    339         ResultModelT;
    340     return &static_cast<ResultModelT *>(ResultConcept)->Result;
    341   }
    342 
    343   /// \brief Register an analysis pass with the manager.
    344   ///
    345   /// This provides an initialized and set-up analysis pass to the analysis
    346   /// manager. Whomever is setting up analysis passes must use this to populate
    347   /// the manager with all of the analysis passes available.
    348   template <typename PassT> void registerPass(PassT Pass) {
    349     assert(!AnalysisPasses.count(PassT::ID()) &&
    350            "Registered the same analysis pass twice!");
    351     typedef detail::AnalysisPassModel<IRUnitT, PassT> PassModelT;
    352     AnalysisPasses[PassT::ID()].reset(new PassModelT(std::move(Pass)));
    353   }
    354 
    355   /// \brief Invalidate a specific analysis pass for an IR module.
    356   ///
    357   /// Note that the analysis result can disregard invalidation.
    358   template <typename PassT> void invalidate(IRUnitT &IR) {
    359     assert(AnalysisPasses.count(PassT::ID()) &&
    360            "This analysis pass was not registered prior to being invalidated");
    361     derived_this()->invalidateImpl(PassT::ID(), IR);
    362   }
    363 
    364   /// \brief Invalidate analyses cached for an IR unit.
    365   ///
    366   /// Walk through all of the analyses pertaining to this unit of IR and
    367   /// invalidate them unless they are preserved by the PreservedAnalyses set.
    368   /// We accept the PreservedAnalyses set by value and update it with each
    369   /// analyis pass which has been successfully invalidated and thus can be
    370   /// preserved going forward. The updated set is returned.
    371   PreservedAnalyses invalidate(IRUnitT &IR, PreservedAnalyses PA) {
    372     return derived_this()->invalidateImpl(IR, std::move(PA));
    373   }
    374 
    375 protected:
    376   /// \brief Lookup a registered analysis pass.
    377   PassConceptT &lookupPass(void *PassID) {
    378     typename AnalysisPassMapT::iterator PI = AnalysisPasses.find(PassID);
    379     assert(PI != AnalysisPasses.end() &&
    380            "Analysis passes must be registered prior to being queried!");
    381     return *PI->second;
    382   }
    383 
    384   /// \brief Lookup a registered analysis pass.
    385   const PassConceptT &lookupPass(void *PassID) const {
    386     typename AnalysisPassMapT::const_iterator PI = AnalysisPasses.find(PassID);
    387     assert(PI != AnalysisPasses.end() &&
    388            "Analysis passes must be registered prior to being queried!");
    389     return *PI->second;
    390   }
    391 
    392 private:
    393   /// \brief Map type from module analysis pass ID to pass concept pointer.
    394   typedef DenseMap<void *, std::unique_ptr<PassConceptT>> AnalysisPassMapT;
    395 
    396   /// \brief Collection of module analysis passes, indexed by ID.
    397   AnalysisPassMapT AnalysisPasses;
    398 };
    399 
    400 } // End namespace detail
    401 
    402 /// \brief A generic analysis pass manager with lazy running and caching of
    403 /// results.
    404 ///
    405 /// This analysis manager can be used for any IR unit where the address of the
    406 /// IR unit sufficies as its identity. It manages the cache for a unit of IR via
    407 /// the address of each unit of IR cached.
    408 template <typename IRUnitT>
    409 class AnalysisManager
    410     : public detail::AnalysisManagerBase<AnalysisManager<IRUnitT>, IRUnitT> {
    411   friend class detail::AnalysisManagerBase<AnalysisManager<IRUnitT>, IRUnitT>;
    412   typedef detail::AnalysisManagerBase<AnalysisManager<IRUnitT>, IRUnitT> BaseT;
    413   typedef typename BaseT::ResultConceptT ResultConceptT;
    414   typedef typename BaseT::PassConceptT PassConceptT;
    415 
    416 public:
    417   // Most public APIs are inherited from the CRTP base class.
    418 
    419   /// \brief Construct an empty analysis manager.
    420   ///
    421   /// A flag can be passed to indicate that the manager should perform debug
    422   /// logging.
    423   AnalysisManager(bool DebugLogging = false) : DebugLogging(DebugLogging) {}
    424 
    425   // We have to explicitly define all the special member functions because MSVC
    426   // refuses to generate them.
    427   AnalysisManager(AnalysisManager &&Arg)
    428       : BaseT(std::move(static_cast<BaseT &>(Arg))),
    429         AnalysisResults(std::move(Arg.AnalysisResults)),
    430         DebugLogging(std::move(Arg.DebugLogging)) {}
    431   AnalysisManager &operator=(AnalysisManager &&RHS) {
    432     BaseT::operator=(std::move(static_cast<BaseT &>(RHS)));
    433     AnalysisResults = std::move(RHS.AnalysisResults);
    434     DebugLogging = std::move(RHS.DebugLogging);
    435     return *this;
    436   }
    437 
    438   /// \brief Returns true if the analysis manager has an empty results cache.
    439   bool empty() const {
    440     assert(AnalysisResults.empty() == AnalysisResultLists.empty() &&
    441            "The storage and index of analysis results disagree on how many "
    442            "there are!");
    443     return AnalysisResults.empty();
    444   }
    445 
    446   /// \brief Clear the analysis result cache.
    447   ///
    448   /// This routine allows cleaning up when the set of IR units itself has
    449   /// potentially changed, and thus we can't even look up a a result and
    450   /// invalidate it directly. Notably, this does *not* call invalidate functions
    451   /// as there is nothing to be done for them.
    452   void clear() {
    453     AnalysisResults.clear();
    454     AnalysisResultLists.clear();
    455   }
    456 
    457 private:
    458   AnalysisManager(const AnalysisManager &) = delete;
    459   AnalysisManager &operator=(const AnalysisManager &) = delete;
    460 
    461   /// \brief Get an analysis result, running the pass if necessary.
    462   ResultConceptT &getResultImpl(void *PassID, IRUnitT &IR) {
    463     typename AnalysisResultMapT::iterator RI;
    464     bool Inserted;
    465     std::tie(RI, Inserted) = AnalysisResults.insert(std::make_pair(
    466         std::make_pair(PassID, &IR), typename AnalysisResultListT::iterator()));
    467 
    468     // If we don't have a cached result for this function, look up the pass and
    469     // run it to produce a result, which we then add to the cache.
    470     if (Inserted) {
    471       auto &P = this->lookupPass(PassID);
    472       if (DebugLogging)
    473         dbgs() << "Running analysis: " << P.name() << "\n";
    474       AnalysisResultListT &ResultList = AnalysisResultLists[&IR];
    475       ResultList.emplace_back(PassID, P.run(IR, this));
    476 
    477       // P.run may have inserted elements into AnalysisResults and invalidated
    478       // RI.
    479       RI = AnalysisResults.find(std::make_pair(PassID, &IR));
    480       assert(RI != AnalysisResults.end() && "we just inserted it!");
    481 
    482       RI->second = std::prev(ResultList.end());
    483     }
    484 
    485     return *RI->second->second;
    486   }
    487 
    488   /// \brief Get a cached analysis result or return null.
    489   ResultConceptT *getCachedResultImpl(void *PassID, IRUnitT &IR) const {
    490     typename AnalysisResultMapT::const_iterator RI =
    491         AnalysisResults.find(std::make_pair(PassID, &IR));
    492     return RI == AnalysisResults.end() ? nullptr : &*RI->second->second;
    493   }
    494 
    495   /// \brief Invalidate a function pass result.
    496   void invalidateImpl(void *PassID, IRUnitT &IR) {
    497     typename AnalysisResultMapT::iterator RI =
    498         AnalysisResults.find(std::make_pair(PassID, &IR));
    499     if (RI == AnalysisResults.end())
    500       return;
    501 
    502     if (DebugLogging)
    503       dbgs() << "Invalidating analysis: " << this->lookupPass(PassID).name()
    504              << "\n";
    505     AnalysisResultLists[&IR].erase(RI->second);
    506     AnalysisResults.erase(RI);
    507   }
    508 
    509   /// \brief Invalidate the results for a function..
    510   PreservedAnalyses invalidateImpl(IRUnitT &IR, PreservedAnalyses PA) {
    511     // Short circuit for a common case of all analyses being preserved.
    512     if (PA.areAllPreserved())
    513       return PA;
    514 
    515     if (DebugLogging)
    516       dbgs() << "Invalidating all non-preserved analyses for: "
    517              << IR.getName() << "\n";
    518 
    519     // Clear all the invalidated results associated specifically with this
    520     // function.
    521     SmallVector<void *, 8> InvalidatedPassIDs;
    522     AnalysisResultListT &ResultsList = AnalysisResultLists[&IR];
    523     for (typename AnalysisResultListT::iterator I = ResultsList.begin(),
    524                                                 E = ResultsList.end();
    525          I != E;) {
    526       void *PassID = I->first;
    527 
    528       // Pass the invalidation down to the pass itself to see if it thinks it is
    529       // necessary. The analysis pass can return false if no action on the part
    530       // of the analysis manager is required for this invalidation event.
    531       if (I->second->invalidate(IR, PA)) {
    532         if (DebugLogging)
    533           dbgs() << "Invalidating analysis: " << this->lookupPass(PassID).name()
    534                  << "\n";
    535 
    536         InvalidatedPassIDs.push_back(I->first);
    537         I = ResultsList.erase(I);
    538       } else {
    539         ++I;
    540       }
    541 
    542       // After handling each pass, we mark it as preserved. Once we've
    543       // invalidated any stale results, the rest of the system is allowed to
    544       // start preserving this analysis again.
    545       PA.preserve(PassID);
    546     }
    547     while (!InvalidatedPassIDs.empty())
    548       AnalysisResults.erase(
    549           std::make_pair(InvalidatedPassIDs.pop_back_val(), &IR));
    550     if (ResultsList.empty())
    551       AnalysisResultLists.erase(&IR);
    552 
    553     return PA;
    554   }
    555 
    556   /// \brief List of function analysis pass IDs and associated concept pointers.
    557   ///
    558   /// Requires iterators to be valid across appending new entries and arbitrary
    559   /// erases. Provides both the pass ID and concept pointer such that it is
    560   /// half of a bijection and provides storage for the actual result concept.
    561   typedef std::list<std::pair<
    562       void *, std::unique_ptr<detail::AnalysisResultConcept<IRUnitT>>>>
    563       AnalysisResultListT;
    564 
    565   /// \brief Map type from function pointer to our custom list type.
    566   typedef DenseMap<IRUnitT *, AnalysisResultListT> AnalysisResultListMapT;
    567 
    568   /// \brief Map from function to a list of function analysis results.
    569   ///
    570   /// Provides linear time removal of all analysis results for a function and
    571   /// the ultimate storage for a particular cached analysis result.
    572   AnalysisResultListMapT AnalysisResultLists;
    573 
    574   /// \brief Map type from a pair of analysis ID and function pointer to an
    575   /// iterator into a particular result list.
    576   typedef DenseMap<std::pair<void *, IRUnitT *>,
    577                    typename AnalysisResultListT::iterator> AnalysisResultMapT;
    578 
    579   /// \brief Map from an analysis ID and function to a particular cached
    580   /// analysis result.
    581   AnalysisResultMapT AnalysisResults;
    582 
    583   /// \brief A flag indicating whether debug logging is enabled.
    584   bool DebugLogging;
    585 };
    586 
    587 /// \brief Convenience typedef for the Module analysis manager.
    588 typedef AnalysisManager<Module> ModuleAnalysisManager;
    589 
    590 /// \brief Convenience typedef for the Function analysis manager.
    591 typedef AnalysisManager<Function> FunctionAnalysisManager;
    592 
    593 /// \brief A module analysis which acts as a proxy for a function analysis
    594 /// manager.
    595 ///
    596 /// This primarily proxies invalidation information from the module analysis
    597 /// manager and module pass manager to a function analysis manager. You should
    598 /// never use a function analysis manager from within (transitively) a module
    599 /// pass manager unless your parent module pass has received a proxy result
    600 /// object for it.
    601 class FunctionAnalysisManagerModuleProxy {
    602 public:
    603   class Result;
    604 
    605   static void *ID() { return (void *)&PassID; }
    606 
    607   static StringRef name() { return "FunctionAnalysisManagerModuleProxy"; }
    608 
    609   explicit FunctionAnalysisManagerModuleProxy(FunctionAnalysisManager &FAM)
    610       : FAM(&FAM) {}
    611   // We have to explicitly define all the special member functions because MSVC
    612   // refuses to generate them.
    613   FunctionAnalysisManagerModuleProxy(
    614       const FunctionAnalysisManagerModuleProxy &Arg)
    615       : FAM(Arg.FAM) {}
    616   FunctionAnalysisManagerModuleProxy(FunctionAnalysisManagerModuleProxy &&Arg)
    617       : FAM(std::move(Arg.FAM)) {}
    618   FunctionAnalysisManagerModuleProxy &
    619   operator=(FunctionAnalysisManagerModuleProxy RHS) {
    620     std::swap(FAM, RHS.FAM);
    621     return *this;
    622   }
    623 
    624   /// \brief Run the analysis pass and create our proxy result object.
    625   ///
    626   /// This doesn't do any interesting work, it is primarily used to insert our
    627   /// proxy result object into the module analysis cache so that we can proxy
    628   /// invalidation to the function analysis manager.
    629   ///
    630   /// In debug builds, it will also assert that the analysis manager is empty
    631   /// as no queries should arrive at the function analysis manager prior to
    632   /// this analysis being requested.
    633   Result run(Module &M);
    634 
    635 private:
    636   static char PassID;
    637 
    638   FunctionAnalysisManager *FAM;
    639 };
    640 
    641 /// \brief The result proxy object for the
    642 /// \c FunctionAnalysisManagerModuleProxy.
    643 ///
    644 /// See its documentation for more information.
    645 class FunctionAnalysisManagerModuleProxy::Result {
    646 public:
    647   explicit Result(FunctionAnalysisManager &FAM) : FAM(&FAM) {}
    648   // We have to explicitly define all the special member functions because MSVC
    649   // refuses to generate them.
    650   Result(const Result &Arg) : FAM(Arg.FAM) {}
    651   Result(Result &&Arg) : FAM(std::move(Arg.FAM)) {}
    652   Result &operator=(Result RHS) {
    653     std::swap(FAM, RHS.FAM);
    654     return *this;
    655   }
    656   ~Result();
    657 
    658   /// \brief Accessor for the \c FunctionAnalysisManager.
    659   FunctionAnalysisManager &getManager() { return *FAM; }
    660 
    661   /// \brief Handler for invalidation of the module.
    662   ///
    663   /// If this analysis itself is preserved, then we assume that the set of \c
    664   /// Function objects in the \c Module hasn't changed and thus we don't need
    665   /// to invalidate *all* cached data associated with a \c Function* in the \c
    666   /// FunctionAnalysisManager.
    667   ///
    668   /// Regardless of whether this analysis is marked as preserved, all of the
    669   /// analyses in the \c FunctionAnalysisManager are potentially invalidated
    670   /// based on the set of preserved analyses.
    671   bool invalidate(Module &M, const PreservedAnalyses &PA);
    672 
    673 private:
    674   FunctionAnalysisManager *FAM;
    675 };
    676 
    677 /// \brief A function analysis which acts as a proxy for a module analysis
    678 /// manager.
    679 ///
    680 /// This primarily provides an accessor to a parent module analysis manager to
    681 /// function passes. Only the const interface of the module analysis manager is
    682 /// provided to indicate that once inside of a function analysis pass you
    683 /// cannot request a module analysis to actually run. Instead, the user must
    684 /// rely on the \c getCachedResult API.
    685 ///
    686 /// This proxy *doesn't* manage the invalidation in any way. That is handled by
    687 /// the recursive return path of each layer of the pass manager and the
    688 /// returned PreservedAnalysis set.
    689 class ModuleAnalysisManagerFunctionProxy {
    690 public:
    691   /// \brief Result proxy object for \c ModuleAnalysisManagerFunctionProxy.
    692   class Result {
    693   public:
    694     explicit Result(const ModuleAnalysisManager &MAM) : MAM(&MAM) {}
    695     // We have to explicitly define all the special member functions because
    696     // MSVC refuses to generate them.
    697     Result(const Result &Arg) : MAM(Arg.MAM) {}
    698     Result(Result &&Arg) : MAM(std::move(Arg.MAM)) {}
    699     Result &operator=(Result RHS) {
    700       std::swap(MAM, RHS.MAM);
    701       return *this;
    702     }
    703 
    704     const ModuleAnalysisManager &getManager() const { return *MAM; }
    705 
    706     /// \brief Handle invalidation by ignoring it, this pass is immutable.
    707     bool invalidate(Function &) { return false; }
    708 
    709   private:
    710     const ModuleAnalysisManager *MAM;
    711   };
    712 
    713   static void *ID() { return (void *)&PassID; }
    714 
    715   static StringRef name() { return "ModuleAnalysisManagerFunctionProxy"; }
    716 
    717   ModuleAnalysisManagerFunctionProxy(const ModuleAnalysisManager &MAM)
    718       : MAM(&MAM) {}
    719   // We have to explicitly define all the special member functions because MSVC
    720   // refuses to generate them.
    721   ModuleAnalysisManagerFunctionProxy(
    722       const ModuleAnalysisManagerFunctionProxy &Arg)
    723       : MAM(Arg.MAM) {}
    724   ModuleAnalysisManagerFunctionProxy(ModuleAnalysisManagerFunctionProxy &&Arg)
    725       : MAM(std::move(Arg.MAM)) {}
    726   ModuleAnalysisManagerFunctionProxy &
    727   operator=(ModuleAnalysisManagerFunctionProxy RHS) {
    728     std::swap(MAM, RHS.MAM);
    729     return *this;
    730   }
    731 
    732   /// \brief Run the analysis pass and create our proxy result object.
    733   /// Nothing to see here, it just forwards the \c MAM reference into the
    734   /// result.
    735   Result run(Function &) { return Result(*MAM); }
    736 
    737 private:
    738   static char PassID;
    739 
    740   const ModuleAnalysisManager *MAM;
    741 };
    742 
    743 /// \brief Trivial adaptor that maps from a module to its functions.
    744 ///
    745 /// Designed to allow composition of a FunctionPass(Manager) and
    746 /// a ModulePassManager. Note that if this pass is constructed with a pointer
    747 /// to a \c ModuleAnalysisManager it will run the
    748 /// \c FunctionAnalysisManagerModuleProxy analysis prior to running the function
    749 /// pass over the module to enable a \c FunctionAnalysisManager to be used
    750 /// within this run safely.
    751 ///
    752 /// Function passes run within this adaptor can rely on having exclusive access
    753 /// to the function they are run over. They should not read or modify any other
    754 /// functions! Other threads or systems may be manipulating other functions in
    755 /// the module, and so their state should never be relied on.
    756 /// FIXME: Make the above true for all of LLVM's actual passes, some still
    757 /// violate this principle.
    758 ///
    759 /// Function passes can also read the module containing the function, but they
    760 /// should not modify that module outside of the use lists of various globals.
    761 /// For example, a function pass is not permitted to add functions to the
    762 /// module.
    763 /// FIXME: Make the above true for all of LLVM's actual passes, some still
    764 /// violate this principle.
    765 template <typename FunctionPassT> class ModuleToFunctionPassAdaptor {
    766 public:
    767   explicit ModuleToFunctionPassAdaptor(FunctionPassT Pass)
    768       : Pass(std::move(Pass)) {}
    769   // We have to explicitly define all the special member functions because MSVC
    770   // refuses to generate them.
    771   ModuleToFunctionPassAdaptor(const ModuleToFunctionPassAdaptor &Arg)
    772       : Pass(Arg.Pass) {}
    773   ModuleToFunctionPassAdaptor(ModuleToFunctionPassAdaptor &&Arg)
    774       : Pass(std::move(Arg.Pass)) {}
    775   friend void swap(ModuleToFunctionPassAdaptor &LHS,
    776                    ModuleToFunctionPassAdaptor &RHS) {
    777     using std::swap;
    778     swap(LHS.Pass, RHS.Pass);
    779   }
    780   ModuleToFunctionPassAdaptor &operator=(ModuleToFunctionPassAdaptor RHS) {
    781     swap(*this, RHS);
    782     return *this;
    783   }
    784 
    785   /// \brief Runs the function pass across every function in the module.
    786   PreservedAnalyses run(Module &M, ModuleAnalysisManager *AM) {
    787     FunctionAnalysisManager *FAM = nullptr;
    788     if (AM)
    789       // Setup the function analysis manager from its proxy.
    790       FAM = &AM->getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
    791 
    792     PreservedAnalyses PA = PreservedAnalyses::all();
    793     for (Function &F : M) {
    794       if (F.isDeclaration())
    795         continue;
    796 
    797       PreservedAnalyses PassPA = Pass.run(F, FAM);
    798 
    799       // We know that the function pass couldn't have invalidated any other
    800       // function's analyses (that's the contract of a function pass), so
    801       // directly handle the function analysis manager's invalidation here and
    802       // update our preserved set to reflect that these have already been
    803       // handled.
    804       if (FAM)
    805         PassPA = FAM->invalidate(F, std::move(PassPA));
    806 
    807       // Then intersect the preserved set so that invalidation of module
    808       // analyses will eventually occur when the module pass completes.
    809       PA.intersect(std::move(PassPA));
    810     }
    811 
    812     // By definition we preserve the proxy. This precludes *any* invalidation
    813     // of function analyses by the proxy, but that's OK because we've taken
    814     // care to invalidate analyses in the function analysis manager
    815     // incrementally above.
    816     PA.preserve<FunctionAnalysisManagerModuleProxy>();
    817     return PA;
    818   }
    819 
    820   static StringRef name() { return "ModuleToFunctionPassAdaptor"; }
    821 
    822 private:
    823   FunctionPassT Pass;
    824 };
    825 
    826 /// \brief A function to deduce a function pass type and wrap it in the
    827 /// templated adaptor.
    828 template <typename FunctionPassT>
    829 ModuleToFunctionPassAdaptor<FunctionPassT>
    830 createModuleToFunctionPassAdaptor(FunctionPassT Pass) {
    831   return ModuleToFunctionPassAdaptor<FunctionPassT>(std::move(Pass));
    832 }
    833 
    834 /// \brief A template utility pass to force an analysis result to be available.
    835 ///
    836 /// This is a no-op pass which simply forces a specific analysis pass's result
    837 /// to be available when it is run.
    838 template <typename AnalysisT> struct RequireAnalysisPass {
    839   /// \brief Run this pass over some unit of IR.
    840   ///
    841   /// This pass can be run over any unit of IR and use any analysis manager
    842   /// provided they satisfy the basic API requirements. When this pass is
    843   /// created, these methods can be instantiated to satisfy whatever the
    844   /// context requires.
    845   template <typename IRUnitT>
    846   PreservedAnalyses run(IRUnitT &Arg, AnalysisManager<IRUnitT> *AM) {
    847     if (AM)
    848       (void)AM->template getResult<AnalysisT>(Arg);
    849 
    850     return PreservedAnalyses::all();
    851   }
    852 
    853   static StringRef name() { return "RequireAnalysisPass"; }
    854 };
    855 
    856 /// \brief A template utility pass to force an analysis result to be
    857 /// invalidated.
    858 ///
    859 /// This is a no-op pass which simply forces a specific analysis result to be
    860 /// invalidated when it is run.
    861 template <typename AnalysisT> struct InvalidateAnalysisPass {
    862   /// \brief Run this pass over some unit of IR.
    863   ///
    864   /// This pass can be run over any unit of IR and use any analysis manager
    865   /// provided they satisfy the basic API requirements. When this pass is
    866   /// created, these methods can be instantiated to satisfy whatever the
    867   /// context requires.
    868   template <typename IRUnitT>
    869   PreservedAnalyses run(IRUnitT &Arg, AnalysisManager<IRUnitT> *AM) {
    870     if (AM)
    871       // We have to directly invalidate the analysis result as we can't
    872       // enumerate all other analyses and use the preserved set to control it.
    873       (void)AM->template invalidate<AnalysisT>(Arg);
    874 
    875     return PreservedAnalyses::all();
    876   }
    877 
    878   static StringRef name() { return "InvalidateAnalysisPass"; }
    879 };
    880 
    881 /// \brief A utility pass that does nothing but preserves no analyses.
    882 ///
    883 /// As a consequence fo not preserving any analyses, this pass will force all
    884 /// analysis passes to be re-run to produce fresh results if any are needed.
    885 struct InvalidateAllAnalysesPass {
    886   /// \brief Run this pass over some unit of IR.
    887   template <typename IRUnitT> PreservedAnalyses run(IRUnitT &Arg) {
    888     return PreservedAnalyses::none();
    889   }
    890 
    891   static StringRef name() { return "InvalidateAllAnalysesPass"; }
    892 };
    893 
    894 }
    895 
    896 #endif
    897