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