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