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