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