blob: 515b362e540710c0f8a607b8aafc54b99b0a6b69 [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- 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
25namespace llvm {
26
27class RGPassManager;
28class Function;
29
30//===----------------------------------------------------------------------===//
31/// @brief A pass that runs on each Region in a function.
32///
33/// RegionPass is managed by RGPassManager.
34class RegionPass : public Pass {
35public:
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
64 virtual bool doInitialization(Region *R, RGPassManager &RGM) { return false; }
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
77 PassManagerType getPotentialPassManagerType() const override {
78 return PMT_RegionPassManager;
79 }
80 //@}
81
82protected:
83 /// Optional passes call this function to check whether the pass should be
84 /// skipped. This is the case when optimization bisect is over the limit.
85 bool skipRegion(Region &R) const;
86};
87
88/// @brief The pass manager to schedule RegionPasses.
89class RGPassManager : public FunctionPass, public PMDataManager {
90 std::deque<Region*> RQ;
91 bool skipThisRegion;
92 bool redoThisRegion;
93 RegionInfo *RI;
94 Region *CurrentRegion;
95
96public:
97 static char ID;
98 explicit RGPassManager();
99
100 /// @brief Execute all of the passes scheduled for execution.
101 ///
102 /// @return True if any of the passes modifies the function.
103 bool runOnFunction(Function &F) override;
104
105 /// Pass Manager itself does not invalidate any analysis info.
106 /// RGPassManager needs RegionInfo.
107 void getAnalysisUsage(AnalysisUsage &Info) const override;
108
109 StringRef getPassName() const override { return "Region Pass Manager"; }
110
111 PMDataManager *getAsPMDataManager() override { return this; }
112 Pass *getAsPass() override { return this; }
113
114 /// @brief Print passes managed by this manager.
115 void dumpPassStructure(unsigned Offset) override;
116
117 /// @brief Get passes contained by this manager.
118 Pass *getContainedPass(unsigned N) {
119 assert(N < PassVector.size() && "Pass number out of range!");
120 Pass *FP = static_cast<Pass *>(PassVector[N]);
121 return FP;
122 }
123
124 PassManagerType getPassManagerType() const override {
125 return PMT_RegionPassManager;
126 }
127};
128
129} // End llvm namespace
130
131#endif