RegionPass.h revision 221345
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 16218885Sdim#ifndef LLVM_REGION_PASS_H 17218885Sdim#define LLVM_REGION_PASS_H 18218885Sdim 19218885Sdim#include "llvm/Analysis/RegionInfo.h" 20218885Sdim 21218885Sdim#include "llvm/Pass.h" 22218885Sdim#include "llvm/PassManagers.h" 23218885Sdim#include "llvm/Function.h" 24218885Sdim 25218885Sdim#include <deque> 26218885Sdim 27218885Sdimnamespace llvm { 28218885Sdim 29218885Sdimclass RGPassManager; 30218885Sdimclass Function; 31218885Sdim 32218885Sdim//===----------------------------------------------------------------------===// 33218885Sdim/// @brief A pass that runs on each Region in a function. 34218885Sdim/// 35218885Sdim/// RegionPass is managed by RGPassManager. 36218885Sdimclass RegionPass : public Pass { 37218885Sdimpublic: 38218885Sdim explicit RegionPass(char &pid) : Pass(PT_Region, pid) {} 39218885Sdim 40218885Sdim //===--------------------------------------------------------------------===// 41218885Sdim /// @name To be implemented by every RegionPass 42218885Sdim /// 43218885Sdim //@{ 44218885Sdim /// @brief Run the pass on a specific Region 45218885Sdim /// 46218885Sdim /// Accessing regions not contained in the current region is not allowed. 47218885Sdim /// 48218885Sdim /// @param R The region this pass is run on. 49218885Sdim /// @param RGM The RegionPassManager that manages this Pass. 50218885Sdim /// 51218885Sdim /// @return True if the pass modifies this Region. 52218885Sdim virtual bool runOnRegion(Region *R, RGPassManager &RGM) = 0; 53218885Sdim 54218885Sdim /// @brief Get a pass to print the LLVM IR in the region. 55218885Sdim /// 56218885Sdim /// @param O The ouput stream to print the Region. 57221345Sdim /// @param Banner The banner to separate different printed passes. 58218885Sdim /// 59218885Sdim /// @return The pass to print the LLVM IR in the region. 60218885Sdim Pass *createPrinterPass(raw_ostream &O, const std::string &Banner) const; 61218885Sdim 62218885Sdim virtual bool doInitialization(Region *R, RGPassManager &RGM) { return false; } 63218885Sdim virtual bool doFinalization() { return false; } 64218885Sdim //@} 65218885Sdim 66218885Sdim //===--------------------------------------------------------------------===// 67218885Sdim /// @name PassManager API 68218885Sdim /// 69218885Sdim //@{ 70218885Sdim void preparePassManager(PMStack &PMS); 71218885Sdim 72218885Sdim virtual void assignPassManager(PMStack &PMS, 73218885Sdim PassManagerType PMT = PMT_RegionPassManager); 74218885Sdim 75218885Sdim virtual PassManagerType getPotentialPassManagerType() const { 76218885Sdim return PMT_RegionPassManager; 77218885Sdim } 78218885Sdim //@} 79218885Sdim}; 80218885Sdim 81218885Sdim/// @brief The pass manager to schedule RegionPasses. 82218885Sdimclass RGPassManager : public FunctionPass, public PMDataManager { 83218885Sdim std::deque<Region*> RQ; 84218885Sdim bool skipThisRegion; 85218885Sdim bool redoThisRegion; 86218885Sdim RegionInfo *RI; 87218885Sdim Region *CurrentRegion; 88218885Sdim 89218885Sdimpublic: 90218885Sdim static char ID; 91218885Sdim explicit RGPassManager(int Depth); 92218885Sdim 93218885Sdim /// @brief Execute all of the passes scheduled for execution. 94218885Sdim /// 95218885Sdim /// @return True if any of the passes modifies the function. 96218885Sdim bool runOnFunction(Function &F); 97218885Sdim 98218885Sdim /// Pass Manager itself does not invalidate any analysis info. 99218885Sdim /// RGPassManager needs RegionInfo. 100218885Sdim void getAnalysisUsage(AnalysisUsage &Info) const; 101218885Sdim 102218885Sdim virtual const char *getPassName() const { 103218885Sdim return "Region Pass Manager"; 104218885Sdim } 105218885Sdim 106218885Sdim virtual PMDataManager *getAsPMDataManager() { return this; } 107218885Sdim virtual Pass *getAsPass() { return this; } 108218885Sdim 109218885Sdim /// @brief Print passes managed by this manager. 110218885Sdim void dumpPassStructure(unsigned Offset); 111218885Sdim 112218885Sdim /// @brief Print passes contained by this manager. 113218885Sdim Pass *getContainedPass(unsigned N) { 114218885Sdim assert(N < PassVector.size() && "Pass number out of range!"); 115218885Sdim Pass *FP = static_cast<Pass *>(PassVector[N]); 116218885Sdim return FP; 117218885Sdim } 118218885Sdim 119218885Sdim virtual PassManagerType getPassManagerType() const { 120218885Sdim return PMT_RegionPassManager; 121218885Sdim } 122218885Sdim}; 123218885Sdim 124218885Sdim} // End llvm namespace 125218885Sdim 126218885Sdim#endif 127