Coverage Report

Created: 2019-02-15 18:59

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/include/llvm/Analysis/RegionPass.h
Line
Count
Source (jump to first uncovered line)
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
6.13k
  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
14.3k
  virtual bool doInitialization(Region *R, RGPassManager &RGM) { return false; }
64
27.1k
  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
30.5k
  PassManagerType getPotentialPassManagerType() const override {
77
30.5k
    return PMT_RegionPassManager;
78
30.5k
  }
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
0
  StringRef getPassName() const override { return "Region Pass Manager"; }
109
110
3.52k
  PMDataManager *getAsPMDataManager() override { return this; }
111
10.8k
  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
104k
  Pass *getContainedPass(unsigned N) {
118
104k
    assert(N < PassVector.size() && "Pass number out of range!");
119
104k
    Pass *FP = static_cast<Pass *>(PassVector[N]);
120
104k
    return FP;
121
104k
  }
122
123
12.5k
  PassManagerType getPassManagerType() const override {
124
12.5k
    return PMT_RegionPassManager;
125
12.5k
  }
126
};
127
128
} // End llvm namespace
129
130
#endif