1218885Sdim//===- RegionPass.h - RegionPass class ------------------------------------===//
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"
21263508Sdim#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  ///
54263508Sdim  /// @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.
58218885Sdim  Pass *createPrinterPass(raw_ostream &O, const std::string &Banner) const;
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  //@{
71218885Sdim  void preparePassManager(PMStack &PMS);
72218885Sdim
73218885Sdim  virtual void assignPassManager(PMStack &PMS,
74218885Sdim    PassManagerType PMT = PMT_RegionPassManager);
75218885Sdim
76218885Sdim  virtual PassManagerType getPotentialPassManagerType() const {
77218885Sdim    return PMT_RegionPassManager;
78218885Sdim  }
79218885Sdim  //@}
80218885Sdim};
81218885Sdim
82218885Sdim/// @brief The pass manager to schedule RegionPasses.
83218885Sdimclass RGPassManager : public FunctionPass, public PMDataManager {
84218885Sdim  std::deque<Region*> RQ;
85218885Sdim  bool skipThisRegion;
86218885Sdim  bool redoThisRegion;
87218885Sdim  RegionInfo *RI;
88218885Sdim  Region *CurrentRegion;
89218885Sdim
90218885Sdimpublic:
91218885Sdim  static char ID;
92226633Sdim  explicit RGPassManager();
93218885Sdim
94218885Sdim  /// @brief Execute all of the passes scheduled for execution.
95218885Sdim  ///
96218885Sdim  /// @return True if any of the passes modifies the function.
97218885Sdim  bool runOnFunction(Function &F);
98218885Sdim
99218885Sdim  /// Pass Manager itself does not invalidate any analysis info.
100218885Sdim  /// RGPassManager needs RegionInfo.
101218885Sdim  void getAnalysisUsage(AnalysisUsage &Info) const;
102218885Sdim
103218885Sdim  virtual const char *getPassName() const {
104218885Sdim    return "Region Pass Manager";
105218885Sdim  }
106218885Sdim
107218885Sdim  virtual PMDataManager *getAsPMDataManager() { return this; }
108218885Sdim  virtual Pass *getAsPass() { return this; }
109218885Sdim
110218885Sdim  /// @brief Print passes managed by this manager.
111218885Sdim  void dumpPassStructure(unsigned Offset);
112218885Sdim
113223017Sdim  /// @brief Get passes contained by this manager.
114218885Sdim  Pass *getContainedPass(unsigned N) {
115218885Sdim    assert(N < PassVector.size() && "Pass number out of range!");
116218885Sdim    Pass *FP = static_cast<Pass *>(PassVector[N]);
117218885Sdim    return FP;
118218885Sdim  }
119218885Sdim
120218885Sdim  virtual PassManagerType getPassManagerType() const {
121218885Sdim    return PMT_RegionPassManager;
122218885Sdim  }
123218885Sdim};
124218885Sdim
125218885Sdim} // End llvm namespace
126218885Sdim
127218885Sdim#endif
128