RegionPass.h revision 314564
1276479Sdim//===- RegionPass.h - RegionPass class --------------------------*- C++ -*-===//
2218885Sdim//
3218885Sdim//                     The LLVM Compiler Infrastructure
4218885Sdim//
5218885Sdim// This file is distributed under the University of Illinois Open Source
6218885Sdim// License. See LICENSE.TXT for details.
7218885Sdim//
8218885Sdim//===----------------------------------------------------------------------===//
9218885Sdim//
10218885Sdim// This file defines the RegionPass class. All region based analysis,
11218885Sdim// optimization and transformation passes are derived from RegionPass.
12218885Sdim// This class is implemented following the some ideas of the LoopPass.h class.
13218885Sdim//
14218885Sdim//===----------------------------------------------------------------------===//
15218885Sdim
16249423Sdim#ifndef LLVM_ANALYSIS_REGIONPASS_H
17249423Sdim#define LLVM_ANALYSIS_REGIONPASS_H
18218885Sdim
19218885Sdim#include "llvm/Analysis/RegionInfo.h"
20249423Sdim#include "llvm/IR/Function.h"
21261991Sdim#include "llvm/IR/LegacyPassManagers.h"
22218885Sdim#include "llvm/Pass.h"
23218885Sdim#include <deque>
24218885Sdim
25218885Sdimnamespace llvm {
26218885Sdim
27218885Sdimclass RGPassManager;
28218885Sdimclass Function;
29218885Sdim
30218885Sdim//===----------------------------------------------------------------------===//
31218885Sdim/// @brief A pass that runs on each Region in a function.
32218885Sdim///
33218885Sdim/// RegionPass is managed by RGPassManager.
34218885Sdimclass RegionPass : public Pass {
35218885Sdimpublic:
36218885Sdim  explicit RegionPass(char &pid) : Pass(PT_Region, pid) {}
37218885Sdim
38218885Sdim  //===--------------------------------------------------------------------===//
39218885Sdim  /// @name To be implemented by every RegionPass
40218885Sdim  ///
41218885Sdim  //@{
42218885Sdim  /// @brief Run the pass on a specific Region
43218885Sdim  ///
44218885Sdim  /// Accessing regions not contained in the current region is not allowed.
45218885Sdim  ///
46218885Sdim  /// @param R The region this pass is run on.
47218885Sdim  /// @param RGM The RegionPassManager that manages this Pass.
48218885Sdim  ///
49218885Sdim  /// @return True if the pass modifies this Region.
50218885Sdim  virtual bool runOnRegion(Region *R, RGPassManager &RGM) = 0;
51218885Sdim
52218885Sdim  /// @brief Get a pass to print the LLVM IR in the region.
53218885Sdim  ///
54261991Sdim  /// @param O      The output stream to print the Region.
55221345Sdim  /// @param Banner The banner to separate different printed passes.
56218885Sdim  ///
57218885Sdim  /// @return The pass to print the LLVM IR in the region.
58276479Sdim  Pass *createPrinterPass(raw_ostream &O,
59276479Sdim                          const std::string &Banner) const override;
60218885Sdim
61249423Sdim  using llvm::Pass::doInitialization;
62249423Sdim  using llvm::Pass::doFinalization;
63249423Sdim
64218885Sdim  virtual bool doInitialization(Region *R, RGPassManager &RGM) { return false; }
65218885Sdim  virtual bool doFinalization() { return false; }
66218885Sdim  //@}
67218885Sdim
68218885Sdim  //===--------------------------------------------------------------------===//
69218885Sdim  /// @name PassManager API
70218885Sdim  ///
71218885Sdim  //@{
72276479Sdim  void preparePassManager(PMStack &PMS) override;
73218885Sdim
74276479Sdim  void assignPassManager(PMStack &PMS,
75276479Sdim                         PassManagerType PMT = PMT_RegionPassManager) override;
76218885Sdim
77276479Sdim  PassManagerType getPotentialPassManagerType() const override {
78218885Sdim    return PMT_RegionPassManager;
79218885Sdim  }
80218885Sdim  //@}
81218885Sdim};
82218885Sdim
83218885Sdim/// @brief The pass manager to schedule RegionPasses.
84218885Sdimclass RGPassManager : public FunctionPass, public PMDataManager {
85218885Sdim  std::deque<Region*> RQ;
86218885Sdim  bool skipThisRegion;
87218885Sdim  bool redoThisRegion;
88218885Sdim  RegionInfo *RI;
89218885Sdim  Region *CurrentRegion;
90218885Sdim
91218885Sdimpublic:
92218885Sdim  static char ID;
93226633Sdim  explicit RGPassManager();
94218885Sdim
95218885Sdim  /// @brief Execute all of the passes scheduled for execution.
96218885Sdim  ///
97218885Sdim  /// @return True if any of the passes modifies the function.
98276479Sdim  bool runOnFunction(Function &F) override;
99218885Sdim
100218885Sdim  /// Pass Manager itself does not invalidate any analysis info.
101218885Sdim  /// RGPassManager needs RegionInfo.
102276479Sdim  void getAnalysisUsage(AnalysisUsage &Info) const override;
103218885Sdim
104314564Sdim  StringRef getPassName() const override { return "Region Pass Manager"; }
105218885Sdim
106276479Sdim  PMDataManager *getAsPMDataManager() override { return this; }
107276479Sdim  Pass *getAsPass() override { return this; }
108218885Sdim
109218885Sdim  /// @brief Print passes managed by this manager.
110276479Sdim  void dumpPassStructure(unsigned Offset) override;
111218885Sdim
112223017Sdim  /// @brief Get passes contained by this manager.
113218885Sdim  Pass *getContainedPass(unsigned N) {
114218885Sdim    assert(N < PassVector.size() && "Pass number out of range!");
115218885Sdim    Pass *FP = static_cast<Pass *>(PassVector[N]);
116218885Sdim    return FP;
117218885Sdim  }
118218885Sdim
119276479Sdim  PassManagerType getPassManagerType() const override {
120218885Sdim    return PMT_RegionPassManager;
121218885Sdim  }
122218885Sdim};
123218885Sdim
124218885Sdim} // End llvm namespace
125218885Sdim
126218885Sdim#endif
127