Home | History | Annotate | Download | only in Analysis
      1 //===- RegionPass.h - RegionPass class ------------------------------------===//
      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 //
     10 // This file defines the RegionPass class. All region based analysis,
     11 // optimization and transformation passes are derived from RegionPass.
     12 // This class is implemented following the some ideas of the LoopPass.h class.
     13 //
     14 //===----------------------------------------------------------------------===//
     15 
     16 #ifndef LLVM_ANALYSIS_REGIONPASS_H
     17 #define LLVM_ANALYSIS_REGIONPASS_H
     18 
     19 #include "llvm/Analysis/RegionInfo.h"
     20 #include "llvm/IR/Function.h"
     21 #include "llvm/Pass.h"
     22 #include "llvm/PassManagers.h"
     23 #include <deque>
     24 
     25 namespace llvm {
     26 
     27 class RGPassManager;
     28 class Function;
     29 
     30 //===----------------------------------------------------------------------===//
     31 /// @brief A pass that runs on each Region in a function.
     32 ///
     33 /// RegionPass is managed by RGPassManager.
     34 class RegionPass : public Pass {
     35 public:
     36   explicit RegionPass(char &pid) : Pass(PT_Region, pid) {}
     37 
     38   //===--------------------------------------------------------------------===//
     39   /// @name To be implemented by every RegionPass
     40   ///
     41   //@{
     42   /// @brief Run the pass on a specific Region
     43   ///
     44   /// Accessing regions not contained in the current region is not allowed.
     45   ///
     46   /// @param R The region this pass is run on.
     47   /// @param RGM The RegionPassManager that manages this Pass.
     48   ///
     49   /// @return True if the pass modifies this Region.
     50   virtual bool runOnRegion(Region *R, RGPassManager &RGM) = 0;
     51 
     52   /// @brief Get a pass to print the LLVM IR in the region.
     53   ///
     54   /// @param O      The ouput stream to print the Region.
     55   /// @param Banner The banner to separate different printed passes.
     56   ///
     57   /// @return The pass to print the LLVM IR in the region.
     58   Pass *createPrinterPass(raw_ostream &O, const std::string &Banner) const;
     59 
     60   using llvm::Pass::doInitialization;
     61   using llvm::Pass::doFinalization;
     62 
     63   virtual bool doInitialization(Region *R, RGPassManager &RGM) { return false; }
     64   virtual bool doFinalization() { return false; }
     65   //@}
     66 
     67   //===--------------------------------------------------------------------===//
     68   /// @name PassManager API
     69   ///
     70   //@{
     71   void preparePassManager(PMStack &PMS);
     72 
     73   virtual void assignPassManager(PMStack &PMS,
     74     PassManagerType PMT = PMT_RegionPassManager);
     75 
     76   virtual PassManagerType getPotentialPassManagerType() const {
     77     return PMT_RegionPassManager;
     78   }
     79   //@}
     80 };
     81 
     82 /// @brief The pass manager to schedule RegionPasses.
     83 class RGPassManager : public FunctionPass, public PMDataManager {
     84   std::deque<Region*> RQ;
     85   bool skipThisRegion;
     86   bool redoThisRegion;
     87   RegionInfo *RI;
     88   Region *CurrentRegion;
     89 
     90 public:
     91   static char ID;
     92   explicit RGPassManager();
     93 
     94   /// @brief Execute all of the passes scheduled for execution.
     95   ///
     96   /// @return True if any of the passes modifies the function.
     97   bool runOnFunction(Function &F);
     98 
     99   /// Pass Manager itself does not invalidate any analysis info.
    100   /// RGPassManager needs RegionInfo.
    101   void getAnalysisUsage(AnalysisUsage &Info) const;
    102 
    103   virtual const char *getPassName() const {
    104     return "Region Pass Manager";
    105   }
    106 
    107   virtual PMDataManager *getAsPMDataManager() { return this; }
    108   virtual Pass *getAsPass() { return this; }
    109 
    110   /// @brief Print passes managed by this manager.
    111   void dumpPassStructure(unsigned Offset);
    112 
    113   /// @brief Get passes contained by this manager.
    114   Pass *getContainedPass(unsigned N) {
    115     assert(N < PassVector.size() && "Pass number out of range!");
    116     Pass *FP = static_cast<Pass *>(PassVector[N]);
    117     return FP;
    118   }
    119 
    120   virtual PassManagerType getPassManagerType() const {
    121     return PMT_RegionPassManager;
    122   }
    123 };
    124 
    125 } // End llvm namespace
    126 
    127 #endif
    128