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