| //===- 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 |