blob: 5b1864a37629783bdcba8afeb76f17b0c2243c98 [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- RegionPass.h - RegionPass class --------------------------*- C++ -*-===//
2//
Andrew Walbran16937d02019-10-22 13:54:20 +01003// 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
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01006//
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
24namespace llvm {
25
26class RGPassManager;
27class Function;
28
29//===----------------------------------------------------------------------===//
Andrew Scullcdfcccc2018-10-05 20:58:37 +010030/// A pass that runs on each Region in a function.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010031///
32/// RegionPass is managed by RGPassManager.
33class RegionPass : public Pass {
34public:
35 explicit RegionPass(char &pid) : Pass(PT_Region, pid) {}
36
37 //===--------------------------------------------------------------------===//
38 /// @name To be implemented by every RegionPass
39 ///
40 //@{
Andrew Scullcdfcccc2018-10-05 20:58:37 +010041 /// Run the pass on a specific Region
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010042 ///
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
Andrew Scullcdfcccc2018-10-05 20:58:37 +010051 /// Get a pass to print the LLVM IR in the region.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010052 ///
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
81protected:
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
Andrew Scullcdfcccc2018-10-05 20:58:37 +010087/// The pass manager to schedule RegionPasses.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010088class RGPassManager : public FunctionPass, public PMDataManager {
89 std::deque<Region*> RQ;
90 bool skipThisRegion;
91 bool redoThisRegion;
92 RegionInfo *RI;
93 Region *CurrentRegion;
94
95public:
96 static char ID;
97 explicit RGPassManager();
98
Andrew Scullcdfcccc2018-10-05 20:58:37 +010099 /// Execute all of the passes scheduled for execution.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100100 ///
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
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100113 /// Print passes managed by this manager.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100114 void dumpPassStructure(unsigned Offset) override;
115
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100116 /// Get passes contained by this manager.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100117 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