RegionPass.h revision 221345
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
16218885Sdim#ifndef LLVM_REGION_PASS_H
17218885Sdim#define LLVM_REGION_PASS_H
18218885Sdim
19218885Sdim#include "llvm/Analysis/RegionInfo.h"
20218885Sdim
21218885Sdim#include "llvm/Pass.h"
22218885Sdim#include "llvm/PassManagers.h"
23218885Sdim#include "llvm/Function.h"
24218885Sdim
25218885Sdim#include <deque>
26218885Sdim
27218885Sdimnamespace llvm {
28218885Sdim
29218885Sdimclass RGPassManager;
30218885Sdimclass Function;
31218885Sdim
32218885Sdim//===----------------------------------------------------------------------===//
33218885Sdim/// @brief A pass that runs on each Region in a function.
34218885Sdim///
35218885Sdim/// RegionPass is managed by RGPassManager.
36218885Sdimclass RegionPass : public Pass {
37218885Sdimpublic:
38218885Sdim  explicit RegionPass(char &pid) : Pass(PT_Region, pid) {}
39218885Sdim
40218885Sdim  //===--------------------------------------------------------------------===//
41218885Sdim  /// @name To be implemented by every RegionPass
42218885Sdim  ///
43218885Sdim  //@{
44218885Sdim  /// @brief Run the pass on a specific Region
45218885Sdim  ///
46218885Sdim  /// Accessing regions not contained in the current region is not allowed.
47218885Sdim  ///
48218885Sdim  /// @param R The region this pass is run on.
49218885Sdim  /// @param RGM The RegionPassManager that manages this Pass.
50218885Sdim  ///
51218885Sdim  /// @return True if the pass modifies this Region.
52218885Sdim  virtual bool runOnRegion(Region *R, RGPassManager &RGM) = 0;
53218885Sdim
54218885Sdim  /// @brief Get a pass to print the LLVM IR in the region.
55218885Sdim  ///
56218885Sdim  /// @param O      The ouput stream to print the Region.
57221345Sdim  /// @param Banner The banner to separate different printed passes.
58218885Sdim  ///
59218885Sdim  /// @return The pass to print the LLVM IR in the region.
60218885Sdim  Pass *createPrinterPass(raw_ostream &O, const std::string &Banner) const;
61218885Sdim
62218885Sdim  virtual bool doInitialization(Region *R, RGPassManager &RGM) { return false; }
63218885Sdim  virtual bool doFinalization() { return false; }
64218885Sdim  //@}
65218885Sdim
66218885Sdim  //===--------------------------------------------------------------------===//
67218885Sdim  /// @name PassManager API
68218885Sdim  ///
69218885Sdim  //@{
70218885Sdim  void preparePassManager(PMStack &PMS);
71218885Sdim
72218885Sdim  virtual void assignPassManager(PMStack &PMS,
73218885Sdim    PassManagerType PMT = PMT_RegionPassManager);
74218885Sdim
75218885Sdim  virtual PassManagerType getPotentialPassManagerType() const {
76218885Sdim    return PMT_RegionPassManager;
77218885Sdim  }
78218885Sdim  //@}
79218885Sdim};
80218885Sdim
81218885Sdim/// @brief The pass manager to schedule RegionPasses.
82218885Sdimclass RGPassManager : public FunctionPass, public PMDataManager {
83218885Sdim  std::deque<Region*> RQ;
84218885Sdim  bool skipThisRegion;
85218885Sdim  bool redoThisRegion;
86218885Sdim  RegionInfo *RI;
87218885Sdim  Region *CurrentRegion;
88218885Sdim
89218885Sdimpublic:
90218885Sdim  static char ID;
91218885Sdim  explicit RGPassManager(int Depth);
92218885Sdim
93218885Sdim  /// @brief Execute all of the passes scheduled for execution.
94218885Sdim  ///
95218885Sdim  /// @return True if any of the passes modifies the function.
96218885Sdim  bool runOnFunction(Function &F);
97218885Sdim
98218885Sdim  /// Pass Manager itself does not invalidate any analysis info.
99218885Sdim  /// RGPassManager needs RegionInfo.
100218885Sdim  void getAnalysisUsage(AnalysisUsage &Info) const;
101218885Sdim
102218885Sdim  virtual const char *getPassName() const {
103218885Sdim    return "Region Pass Manager";
104218885Sdim  }
105218885Sdim
106218885Sdim  virtual PMDataManager *getAsPMDataManager() { return this; }
107218885Sdim  virtual Pass *getAsPass() { return this; }
108218885Sdim
109218885Sdim  /// @brief Print passes managed by this manager.
110218885Sdim  void dumpPassStructure(unsigned Offset);
111218885Sdim
112218885Sdim  /// @brief Print 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
119218885Sdim  virtual PassManagerType getPassManagerType() const {
120218885Sdim    return PMT_RegionPassManager;
121218885Sdim  }
122218885Sdim};
123218885Sdim
124218885Sdim} // End llvm namespace
125218885Sdim
126218885Sdim#endif
127