RegionPass.h revision 65513605353c7e3ee8be6fc92892f257ad399d92
1//===- RegionPass.h - RegionPass class ------------------------------------===//
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_REGION_PASS_H
17#define LLVM_REGION_PASS_H
18
19#include "llvm/Analysis/RegionInfo.h"
20
21#include "llvm/Pass.h"
22#include "llvm/PassManagers.h"
23#include "llvm/Function.h"
24
25#include <deque>
26
27namespace llvm {
28
29class RGPassManager;
30class Function;
31
32//===----------------------------------------------------------------------===//
33/// @brief A pass that runs on each Region in a function.
34///
35/// RegionPass is managed by RGPassManager.
36class RegionPass : public Pass {
37public:
38  explicit RegionPass(char &pid) : Pass(PT_Region, pid) {}
39
40  //===--------------------------------------------------------------------===//
41  /// @name To be implemented by every RegionPass
42  ///
43  //@{
44  /// @brief Run the pass on a specific Region
45  ///
46  /// Accessing regions not contained in the current region is not allowed.
47  ///
48  /// @param R The region this pass is run on.
49  /// @param RGM The RegionPassManager that manages this Pass.
50  ///
51  /// @return True if the pass modifies this Region.
52  virtual bool runOnRegion(Region *R, RGPassManager &RGM) = 0;
53
54  /// @brief Get a pass to print the LLVM IR in the region.
55  ///
56  /// @param O      The ouput stream to print the Region.
57  /// @param Banner The banner to seperate different printed passes.
58  ///
59  /// @return The pass to print the LLVM IR in the region.
60  Pass *createPrinterPass(raw_ostream &O, const std::string &Banner) const;
61
62  virtual bool doInitialization(Region *R, RGPassManager &RGM) { return false; }
63  virtual bool doFinalization() { return false; }
64  //@}
65
66  //===--------------------------------------------------------------------===//
67  /// @name PassManager API
68  ///
69  //@{
70  void preparePassManager(PMStack &PMS);
71
72  virtual void assignPassManager(PMStack &PMS,
73    PassManagerType PMT = PMT_RegionPassManager);
74
75  virtual PassManagerType getPotentialPassManagerType() const {
76    return PMT_RegionPassManager;
77  }
78  //@}
79};
80
81/// @brief The pass manager to schedule RegionPasses.
82class RGPassManager : public FunctionPass, public PMDataManager {
83  std::deque<Region*> RQ;
84  bool skipThisRegion;
85  bool redoThisRegion;
86  RegionInfo *RI;
87  Region *CurrentRegion;
88
89public:
90  static char ID;
91  explicit RGPassManager(int Depth);
92
93  /// @brief Execute all of the passes scheduled for execution.
94  ///
95  /// @return True if any of the passes modifies the function.
96  bool runOnFunction(Function &F);
97
98  /// Pass Manager itself does not invalidate any analysis info.
99  /// RGPassManager needs RegionInfo.
100  void getAnalysisUsage(AnalysisUsage &Info) const;
101
102  virtual const char *getPassName() const {
103    return "Region Pass Manager";
104  }
105
106  virtual PMDataManager *getAsPMDataManager() { return this; }
107  virtual Pass *getAsPass() { return this; }
108
109  /// @brief Print passes managed by this manager.
110  void dumpPassStructure(unsigned Offset);
111
112  /// @brief Print passes contained by this manager.
113  Pass *getContainedPass(unsigned N) {
114    assert(N < PassVector.size() && "Pass number out of range!");
115    Pass *FP = static_cast<Pass *>(PassVector[N]);
116    return FP;
117  }
118
119  virtual PassManagerType getPassManagerType() const {
120    return PMT_RegionPassManager;
121  }
122};
123
124} // End llvm namespace
125
126#endif
127