1276479Sdim//===- RegionPass.h - RegionPass class --------------------------*- C++ -*-===// 2218885Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6218885Sdim// 7218885Sdim//===----------------------------------------------------------------------===// 8218885Sdim// 9218885Sdim// This file defines the RegionPass class. All region based analysis, 10218885Sdim// optimization and transformation passes are derived from RegionPass. 11218885Sdim// This class is implemented following the some ideas of the LoopPass.h class. 12218885Sdim// 13218885Sdim//===----------------------------------------------------------------------===// 14218885Sdim 15249423Sdim#ifndef LLVM_ANALYSIS_REGIONPASS_H 16249423Sdim#define LLVM_ANALYSIS_REGIONPASS_H 17218885Sdim 18218885Sdim#include "llvm/Analysis/RegionInfo.h" 19249423Sdim#include "llvm/IR/Function.h" 20261991Sdim#include "llvm/IR/LegacyPassManagers.h" 21218885Sdim#include "llvm/Pass.h" 22218885Sdim#include <deque> 23218885Sdim 24218885Sdimnamespace llvm { 25218885Sdim 26218885Sdimclass RGPassManager; 27218885Sdimclass Function; 28218885Sdim 29218885Sdim//===----------------------------------------------------------------------===// 30341825Sdim/// A pass that runs on each Region in a function. 31218885Sdim/// 32218885Sdim/// RegionPass is managed by RGPassManager. 33218885Sdimclass RegionPass : public Pass { 34218885Sdimpublic: 35218885Sdim explicit RegionPass(char &pid) : Pass(PT_Region, pid) {} 36218885Sdim 37218885Sdim //===--------------------------------------------------------------------===// 38218885Sdim /// @name To be implemented by every RegionPass 39218885Sdim /// 40218885Sdim //@{ 41341825Sdim /// Run the pass on a specific Region 42218885Sdim /// 43218885Sdim /// Accessing regions not contained in the current region is not allowed. 44218885Sdim /// 45218885Sdim /// @param R The region this pass is run on. 46218885Sdim /// @param RGM The RegionPassManager that manages this Pass. 47218885Sdim /// 48218885Sdim /// @return True if the pass modifies this Region. 49218885Sdim virtual bool runOnRegion(Region *R, RGPassManager &RGM) = 0; 50218885Sdim 51341825Sdim /// Get a pass to print the LLVM IR in the region. 52218885Sdim /// 53261991Sdim /// @param O The output stream to print the Region. 54221345Sdim /// @param Banner The banner to separate different printed passes. 55218885Sdim /// 56218885Sdim /// @return The pass to print the LLVM IR in the region. 57276479Sdim Pass *createPrinterPass(raw_ostream &O, 58276479Sdim const std::string &Banner) const override; 59218885Sdim 60249423Sdim using llvm::Pass::doInitialization; 61249423Sdim using llvm::Pass::doFinalization; 62249423Sdim 63218885Sdim virtual bool doInitialization(Region *R, RGPassManager &RGM) { return false; } 64218885Sdim virtual bool doFinalization() { return false; } 65218885Sdim //@} 66218885Sdim 67218885Sdim //===--------------------------------------------------------------------===// 68218885Sdim /// @name PassManager API 69218885Sdim /// 70218885Sdim //@{ 71276479Sdim void preparePassManager(PMStack &PMS) override; 72218885Sdim 73276479Sdim void assignPassManager(PMStack &PMS, 74276479Sdim PassManagerType PMT = PMT_RegionPassManager) override; 75218885Sdim 76276479Sdim PassManagerType getPotentialPassManagerType() const override { 77218885Sdim return PMT_RegionPassManager; 78218885Sdim } 79218885Sdim //@} 80321369Sdim 81321369Sdimprotected: 82321369Sdim /// Optional passes call this function to check whether the pass should be 83321369Sdim /// skipped. This is the case when optimization bisect is over the limit. 84321369Sdim bool skipRegion(Region &R) const; 85218885Sdim}; 86218885Sdim 87341825Sdim/// The pass manager to schedule RegionPasses. 88218885Sdimclass RGPassManager : public FunctionPass, public PMDataManager { 89218885Sdim std::deque<Region*> RQ; 90218885Sdim bool skipThisRegion; 91218885Sdim bool redoThisRegion; 92218885Sdim RegionInfo *RI; 93218885Sdim Region *CurrentRegion; 94218885Sdim 95218885Sdimpublic: 96218885Sdim static char ID; 97226633Sdim explicit RGPassManager(); 98218885Sdim 99341825Sdim /// Execute all of the passes scheduled for execution. 100218885Sdim /// 101218885Sdim /// @return True if any of the passes modifies the function. 102276479Sdim bool runOnFunction(Function &F) override; 103218885Sdim 104218885Sdim /// Pass Manager itself does not invalidate any analysis info. 105218885Sdim /// RGPassManager needs RegionInfo. 106276479Sdim void getAnalysisUsage(AnalysisUsage &Info) const override; 107218885Sdim 108314564Sdim StringRef getPassName() const override { return "Region Pass Manager"; } 109218885Sdim 110276479Sdim PMDataManager *getAsPMDataManager() override { return this; } 111276479Sdim Pass *getAsPass() override { return this; } 112218885Sdim 113341825Sdim /// Print passes managed by this manager. 114276479Sdim void dumpPassStructure(unsigned Offset) override; 115218885Sdim 116341825Sdim /// Get passes contained by this manager. 117218885Sdim Pass *getContainedPass(unsigned N) { 118218885Sdim assert(N < PassVector.size() && "Pass number out of range!"); 119218885Sdim Pass *FP = static_cast<Pass *>(PassVector[N]); 120218885Sdim return FP; 121218885Sdim } 122218885Sdim 123276479Sdim PassManagerType getPassManagerType() const override { 124218885Sdim return PMT_RegionPassManager; 125218885Sdim } 126218885Sdim}; 127218885Sdim 128218885Sdim} // End llvm namespace 129218885Sdim 130218885Sdim#endif 131