Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

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