RegionPass.h revision 0b8c9a80f20772c3793201ab5b251d3520b9cea3
1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng//===- RegionPass.h - RegionPass class ------------------------------------===// 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// The LLVM Compiler Infrastructure 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// This file is distributed under the University of Illinois Open Source 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// License. See LICENSE.TXT for details. 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng//===----------------------------------------------------------------------===// 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// This file defines the RegionPass class. All region based analysis, 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// optimization and transformation passes are derived from RegionPass. 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// This class is implemented following the some ideas of the LoopPass.h class. 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng// 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng//===----------------------------------------------------------------------===// 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef LLVM_REGION_PASS_H 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define LLVM_REGION_PASS_H 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "llvm/Analysis/RegionInfo.h" 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "llvm/IR/Function.h" 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "llvm/Pass.h" 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "llvm/PassManagers.h" 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <deque> 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengnamespace llvm { 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengclass RGPassManager; 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengclass Function; 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng//===----------------------------------------------------------------------===// 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/// @brief A pass that runs on each Region in a function. 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/// 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/// RegionPass is managed by RGPassManager. 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengclass RegionPass : public Pass { 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengpublic: 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng explicit RegionPass(char &pid) : Pass(PT_Region, pid) {} 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng //===--------------------------------------------------------------------===// 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// @name To be implemented by every RegionPass 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng //@{ 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// @brief Run the pass on a specific Region 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// Accessing regions not contained in the current region is not allowed. 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// @param R The region this pass is run on. 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// @param RGM The RegionPassManager that manages this Pass. 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// @return True if the pass modifies this Region. 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng virtual bool runOnRegion(Region *R, RGPassManager &RGM) = 0; 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// @brief Get a pass to print the LLVM IR in the region. 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// @param O The ouput stream to print the Region. 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// @param Banner The banner to separate different printed passes. 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// @return The pass to print the LLVM IR in the region. 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng Pass *createPrinterPass(raw_ostream &O, const std::string &Banner) const; 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng using llvm::Pass::doInitialization; 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng using llvm::Pass::doFinalization; 62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng virtual bool doInitialization(Region *R, RGPassManager &RGM) { return false; } 64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng virtual bool doFinalization() { return false; } 65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng //@} 66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng //===--------------------------------------------------------------------===// 68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// @name PassManager API 69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// 70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng //@{ 71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng void preparePassManager(PMStack &PMS); 72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng virtual void assignPassManager(PMStack &PMS, 74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng PassManagerType PMT = PMT_RegionPassManager); 75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng virtual PassManagerType getPotentialPassManagerType() const { 77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return PMT_RegionPassManager; 78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng //@} 80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/// @brief The pass manager to schedule RegionPasses. 83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengclass RGPassManager : public FunctionPass, public PMDataManager { 84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng std::deque<Region*> RQ; 85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool skipThisRegion; 86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool redoThisRegion; 87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng RegionInfo *RI; 88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng Region *CurrentRegion; 89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengpublic: 91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng static char ID; 92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng explicit RGPassManager(); 93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// @brief Execute all of the passes scheduled for execution. 95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// 96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// @return True if any of the passes modifies the function. 97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool runOnFunction(Function &F); 98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// Pass Manager itself does not invalidate any analysis info. 100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// RGPassManager needs RegionInfo. 101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng void getAnalysisUsage(AnalysisUsage &Info) const; 102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng virtual const char *getPassName() const { 104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return "Region Pass Manager"; 105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng virtual PMDataManager *getAsPMDataManager() { return this; } 108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng virtual Pass *getAsPass() { return this; } 109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// @brief Print passes managed by this manager. 111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng void dumpPassStructure(unsigned Offset); 112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /// @brief Get passes contained by this manager. 114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng Pass *getContainedPass(unsigned N) { 115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng assert(N < PassVector.size() && "Pass number out of range!"); 116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng Pass *FP = static_cast<Pass *>(PassVector[N]); 117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return FP; 118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng virtual PassManagerType getPassManagerType() const { 121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return PMT_RegionPassManager; 122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 124 125} // End llvm namespace 126 127#endif 128