1218885Sdim//===- RegionPass.h - RegionPass class ------------------------------------===// 2218885Sdim// 3218885Sdim// The LLVM Compiler Infrastructure 4218885Sdim// 5218885Sdim// This file is distributed under the University of Illinois Open Source 6218885Sdim// License. See LICENSE.TXT for details. 7218885Sdim// 8218885Sdim//===----------------------------------------------------------------------===// 9218885Sdim// 10218885Sdim// This file defines the RegionPass class. All region based analysis, 11218885Sdim// optimization and transformation passes are derived from RegionPass. 12218885Sdim// This class is implemented following the some ideas of the LoopPass.h class. 13218885Sdim// 14218885Sdim//===----------------------------------------------------------------------===// 15218885Sdim 16249423Sdim#ifndef LLVM_ANALYSIS_REGIONPASS_H 17249423Sdim#define LLVM_ANALYSIS_REGIONPASS_H 18218885Sdim 19218885Sdim#include "llvm/Analysis/RegionInfo.h" 20249423Sdim#include "llvm/IR/Function.h" 21263508Sdim#include "llvm/IR/LegacyPassManagers.h" 22218885Sdim#include "llvm/Pass.h" 23218885Sdim#include <deque> 24218885Sdim 25218885Sdimnamespace llvm { 26218885Sdim 27218885Sdimclass RGPassManager; 28218885Sdimclass Function; 29218885Sdim 30218885Sdim//===----------------------------------------------------------------------===// 31218885Sdim/// @brief A pass that runs on each Region in a function. 32218885Sdim/// 33218885Sdim/// RegionPass is managed by RGPassManager. 34218885Sdimclass RegionPass : public Pass { 35218885Sdimpublic: 36218885Sdim explicit RegionPass(char &pid) : Pass(PT_Region, pid) {} 37218885Sdim 38218885Sdim //===--------------------------------------------------------------------===// 39218885Sdim /// @name To be implemented by every RegionPass 40218885Sdim /// 41218885Sdim //@{ 42218885Sdim /// @brief Run the pass on a specific Region 43218885Sdim /// 44218885Sdim /// Accessing regions not contained in the current region is not allowed. 45218885Sdim /// 46218885Sdim /// @param R The region this pass is run on. 47218885Sdim /// @param RGM The RegionPassManager that manages this Pass. 48218885Sdim /// 49218885Sdim /// @return True if the pass modifies this Region. 50218885Sdim virtual bool runOnRegion(Region *R, RGPassManager &RGM) = 0; 51218885Sdim 52218885Sdim /// @brief Get a pass to print the LLVM IR in the region. 53218885Sdim /// 54263508Sdim /// @param O The output stream to print the Region. 55221345Sdim /// @param Banner The banner to separate different printed passes. 56218885Sdim /// 57218885Sdim /// @return The pass to print the LLVM IR in the region. 58218885Sdim Pass *createPrinterPass(raw_ostream &O, const std::string &Banner) const; 59218885Sdim 60249423Sdim using llvm::Pass::doInitialization; 61249423Sdim using llvm::Pass::doFinalization; 62249423Sdim 63218885Sdim virtual bool doInitialization(Region *R, RGPassManager &RGM) { return false; } 64218885Sdim virtual bool doFinalization() { return false; } 65218885Sdim //@} 66218885Sdim 67218885Sdim //===--------------------------------------------------------------------===// 68218885Sdim /// @name PassManager API 69218885Sdim /// 70218885Sdim //@{ 71218885Sdim void preparePassManager(PMStack &PMS); 72218885Sdim 73218885Sdim virtual void assignPassManager(PMStack &PMS, 74218885Sdim PassManagerType PMT = PMT_RegionPassManager); 75218885Sdim 76218885Sdim virtual PassManagerType getPotentialPassManagerType() const { 77218885Sdim return PMT_RegionPassManager; 78218885Sdim } 79218885Sdim //@} 80218885Sdim}; 81218885Sdim 82218885Sdim/// @brief The pass manager to schedule RegionPasses. 83218885Sdimclass RGPassManager : public FunctionPass, public PMDataManager { 84218885Sdim std::deque<Region*> RQ; 85218885Sdim bool skipThisRegion; 86218885Sdim bool redoThisRegion; 87218885Sdim RegionInfo *RI; 88218885Sdim Region *CurrentRegion; 89218885Sdim 90218885Sdimpublic: 91218885Sdim static char ID; 92226633Sdim explicit RGPassManager(); 93218885Sdim 94218885Sdim /// @brief Execute all of the passes scheduled for execution. 95218885Sdim /// 96218885Sdim /// @return True if any of the passes modifies the function. 97218885Sdim bool runOnFunction(Function &F); 98218885Sdim 99218885Sdim /// Pass Manager itself does not invalidate any analysis info. 100218885Sdim /// RGPassManager needs RegionInfo. 101218885Sdim void getAnalysisUsage(AnalysisUsage &Info) const; 102218885Sdim 103218885Sdim virtual const char *getPassName() const { 104218885Sdim return "Region Pass Manager"; 105218885Sdim } 106218885Sdim 107218885Sdim virtual PMDataManager *getAsPMDataManager() { return this; } 108218885Sdim virtual Pass *getAsPass() { return this; } 109218885Sdim 110218885Sdim /// @brief Print passes managed by this manager. 111218885Sdim void dumpPassStructure(unsigned Offset); 112218885Sdim 113223017Sdim /// @brief Get passes contained by this manager. 114218885Sdim Pass *getContainedPass(unsigned N) { 115218885Sdim assert(N < PassVector.size() && "Pass number out of range!"); 116218885Sdim Pass *FP = static_cast<Pass *>(PassVector[N]); 117218885Sdim return FP; 118218885Sdim } 119218885Sdim 120218885Sdim virtual PassManagerType getPassManagerType() const { 121218885Sdim return PMT_RegionPassManager; 122218885Sdim } 123218885Sdim}; 124218885Sdim 125218885Sdim} // End llvm namespace 126218885Sdim 127218885Sdim#endif 128