RegionPass.h revision 314564
1276479Sdim//===- RegionPass.h - RegionPass class --------------------------*- C++ -*-===// 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" 21261991Sdim#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 /// 54261991Sdim /// @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. 58276479Sdim Pass *createPrinterPass(raw_ostream &O, 59276479Sdim const std::string &Banner) const override; 60218885Sdim 61249423Sdim using llvm::Pass::doInitialization; 62249423Sdim using llvm::Pass::doFinalization; 63249423Sdim 64218885Sdim virtual bool doInitialization(Region *R, RGPassManager &RGM) { return false; } 65218885Sdim virtual bool doFinalization() { return false; } 66218885Sdim //@} 67218885Sdim 68218885Sdim //===--------------------------------------------------------------------===// 69218885Sdim /// @name PassManager API 70218885Sdim /// 71218885Sdim //@{ 72276479Sdim void preparePassManager(PMStack &PMS) override; 73218885Sdim 74276479Sdim void assignPassManager(PMStack &PMS, 75276479Sdim PassManagerType PMT = PMT_RegionPassManager) override; 76218885Sdim 77276479Sdim PassManagerType getPotentialPassManagerType() const override { 78218885Sdim return PMT_RegionPassManager; 79218885Sdim } 80218885Sdim //@} 81218885Sdim}; 82218885Sdim 83218885Sdim/// @brief The pass manager to schedule RegionPasses. 84218885Sdimclass RGPassManager : public FunctionPass, public PMDataManager { 85218885Sdim std::deque<Region*> RQ; 86218885Sdim bool skipThisRegion; 87218885Sdim bool redoThisRegion; 88218885Sdim RegionInfo *RI; 89218885Sdim Region *CurrentRegion; 90218885Sdim 91218885Sdimpublic: 92218885Sdim static char ID; 93226633Sdim explicit RGPassManager(); 94218885Sdim 95218885Sdim /// @brief Execute all of the passes scheduled for execution. 96218885Sdim /// 97218885Sdim /// @return True if any of the passes modifies the function. 98276479Sdim bool runOnFunction(Function &F) override; 99218885Sdim 100218885Sdim /// Pass Manager itself does not invalidate any analysis info. 101218885Sdim /// RGPassManager needs RegionInfo. 102276479Sdim void getAnalysisUsage(AnalysisUsage &Info) const override; 103218885Sdim 104314564Sdim StringRef getPassName() const override { return "Region Pass Manager"; } 105218885Sdim 106276479Sdim PMDataManager *getAsPMDataManager() override { return this; } 107276479Sdim Pass *getAsPass() override { return this; } 108218885Sdim 109218885Sdim /// @brief Print passes managed by this manager. 110276479Sdim void dumpPassStructure(unsigned Offset) override; 111218885Sdim 112223017Sdim /// @brief Get 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 119276479Sdim PassManagerType getPassManagerType() const override { 120218885Sdim return PMT_RegionPassManager; 121218885Sdim } 122218885Sdim}; 123218885Sdim 124218885Sdim} // End llvm namespace 125218885Sdim 126218885Sdim#endif 127