1 //===- RegionPass.h - RegionPass class ------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
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.
14 //===----------------------------------------------------------------------===//
16 #ifndef LLVM_REGION_PASS_H
17 #define LLVM_REGION_PASS_H
19 #include "llvm/Analysis/RegionInfo.h"
21 #include "llvm/Pass.h"
22 #include "llvm/PassManagers.h"
23 #include "llvm/Function.h"
32 //===----------------------------------------------------------------------===//
33 /// @brief A pass that runs on each Region in a function.
35 /// RegionPass is managed by RGPassManager.
36 class RegionPass : public Pass {
38 explicit RegionPass(char &pid) : Pass(PT_Region, pid) {}
40 //===--------------------------------------------------------------------===//
41 /// @name To be implemented by every RegionPass
44 /// @brief Run the pass on a specific Region
46 /// Accessing regions not contained in the current region is not allowed.
48 /// @param R The region this pass is run on.
49 /// @param RGM The RegionPassManager that manages this Pass.
51 /// @return True if the pass modifies this Region.
52 virtual bool runOnRegion(Region *R, RGPassManager &RGM) = 0;
54 /// @brief Get a pass to print the LLVM IR in the region.
56 /// @param O The ouput stream to print the Region.
57 /// @param Banner The banner to seperate different printed passes.
59 /// @return The pass to print the LLVM IR in the region.
60 Pass *createPrinterPass(raw_ostream &O, const std::string &Banner) const;
62 virtual bool doInitialization(Region *R, RGPassManager &RGM) { return false; }
63 virtual bool doFinalization() { return false; }
66 //===--------------------------------------------------------------------===//
67 /// @name PassManager API
70 void preparePassManager(PMStack &PMS);
72 virtual void assignPassManager(PMStack &PMS,
73 PassManagerType PMT = PMT_RegionPassManager);
75 virtual PassManagerType getPotentialPassManagerType() const {
76 return PMT_RegionPassManager;
81 /// @brief The pass manager to schedule RegionPasses.
82 class RGPassManager : public FunctionPass, public PMDataManager {
83 std::deque<Region*> RQ;
87 Region *CurrentRegion;
91 explicit RGPassManager(int Depth);
93 /// @brief Execute all of the passes scheduled for execution.
95 /// @return True if any of the passes modifies the function.
96 bool runOnFunction(Function &F);
98 /// Pass Manager itself does not invalidate any analysis info.
99 /// RGPassManager needs RegionInfo.
100 void getAnalysisUsage(AnalysisUsage &Info) const;
102 virtual const char *getPassName() const {
103 return "Region Pass Manager";
106 virtual PMDataManager *getAsPMDataManager() { return this; }
107 virtual Pass *getAsPass() { return this; }
109 /// @brief Print passes managed by this manager.
110 void dumpPassStructure(unsigned Offset);
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]);
119 virtual PassManagerType getPassManagerType() const {
120 return PMT_RegionPassManager;
124 } // End llvm namespace