| //===- RegionPass.h - RegionPass class ------------------------------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines the RegionPass class. All region based analysis, |
| // optimization and transformation passes are derived from RegionPass. |
| // This class is implemented following the some ideas of the LoopPass.h class. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_REGION_PASS_H |
| #define LLVM_REGION_PASS_H |
| |
| #include "llvm/Analysis/RegionInfo.h" |
| |
| #include "llvm/Pass.h" |
| #include "llvm/PassManagers.h" |
| #include "llvm/Function.h" |
| |
| #include <deque> |
| |
| namespace llvm { |
| |
| class RGPassManager; |
| class Function; |
| |
| //===----------------------------------------------------------------------===// |
| /// @brief A pass that runs on each Region in a function. |
| /// |
| /// RegionPass is managed by RGPassManager. |
| class RegionPass : public Pass { |
| public: |
| explicit RegionPass(char &pid) : Pass(PT_Region, pid) {} |
| |
| //===--------------------------------------------------------------------===// |
| /// @name To be implemented by every RegionPass |
| /// |
| //@{ |
| /// @brief Run the pass on a specific Region |
| /// |
| /// Accessing regions not contained in the current region is not allowed. |
| /// |
| /// @param R The region this pass is run on. |
| /// @param RGM The RegionPassManager that manages this Pass. |
| /// |
| /// @return True if the pass modifies this Region. |
| virtual bool runOnRegion(Region *R, RGPassManager &RGM) = 0; |
| |
| /// @brief Get a pass to print the LLVM IR in the region. |
| /// |
| /// @param O The ouput stream to print the Region. |
| /// @param Banner The banner to separate different printed passes. |
| /// |
| /// @return The pass to print the LLVM IR in the region. |
| Pass *createPrinterPass(raw_ostream &O, const std::string &Banner) const; |
| |
| virtual bool doInitialization(Region *R, RGPassManager &RGM) { return false; } |
| virtual bool doFinalization() { return false; } |
| //@} |
| |
| //===--------------------------------------------------------------------===// |
| /// @name PassManager API |
| /// |
| //@{ |
| void preparePassManager(PMStack &PMS); |
| |
| virtual void assignPassManager(PMStack &PMS, |
| PassManagerType PMT = PMT_RegionPassManager); |
| |
| virtual PassManagerType getPotentialPassManagerType() const { |
| return PMT_RegionPassManager; |
| } |
| //@} |
| }; |
| |
| /// @brief The pass manager to schedule RegionPasses. |
| class RGPassManager : public FunctionPass, public PMDataManager { |
| std::deque<Region*> RQ; |
| bool skipThisRegion; |
| bool redoThisRegion; |
| RegionInfo *RI; |
| Region *CurrentRegion; |
| |
| public: |
| static char ID; |
| explicit RGPassManager(); |
| |
| /// @brief Execute all of the passes scheduled for execution. |
| /// |
| /// @return True if any of the passes modifies the function. |
| bool runOnFunction(Function &F); |
| |
| /// Pass Manager itself does not invalidate any analysis info. |
| /// RGPassManager needs RegionInfo. |
| void getAnalysisUsage(AnalysisUsage &Info) const; |
| |
| virtual const char *getPassName() const { |
| return "Region Pass Manager"; |
| } |
| |
| virtual PMDataManager *getAsPMDataManager() { return this; } |
| virtual Pass *getAsPass() { return this; } |
| |
| /// @brief Print passes managed by this manager. |
| void dumpPassStructure(unsigned Offset); |
| |
| /// @brief Get passes contained by this manager. |
| Pass *getContainedPass(unsigned N) { |
| assert(N < PassVector.size() && "Pass number out of range!"); |
| Pass *FP = static_cast<Pass *>(PassVector[N]); |
| return FP; |
| } |
| |
| virtual PassManagerType getPassManagerType() const { |
| return PMT_RegionPassManager; |
| } |
| }; |
| |
| } // End llvm namespace |
| |
| #endif |