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