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
25namespace llvm {
26
27class RGPassManager;
28class Function;
29
30//===----------------------------------------------------------------------===//
31/// @brief A pass that runs on each Region in a function.
32///
33/// RegionPass is managed by RGPassManager.
34class RegionPass : public Pass {
35public:
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
64  virtual bool doInitialization(Region *R, RGPassManager &RGM) { return false; }
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
77  PassManagerType getPotentialPassManagerType() const override {
78    return PMT_RegionPassManager;
79  }
80  //@}
81};
82
83/// @brief The pass manager to schedule RegionPasses.
84class RGPassManager : public FunctionPass, public PMDataManager {
85  std::deque<Region*> RQ;
86  bool skipThisRegion;
87  bool redoThisRegion;
88  RegionInfo *RI;
89  Region *CurrentRegion;
90
91public:
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
104  const char *getPassName() const override {
105    return "Region Pass Manager";
106  }
107
108  PMDataManager *getAsPMDataManager() override { return this; }
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.
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
121  PassManagerType getPassManagerType() const override {
122    return PMT_RegionPassManager;
123  }
124};
125
126} // End llvm namespace
127
128#endif
129