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