~ubuntu-branches/ubuntu/quantal/llvm-3.1/quantal

« back to all changes in this revision

Viewing changes to include/llvm/Analysis/RegionPass.h

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2012-03-29 19:09:51 UTC
  • Revision ID: package-import@ubuntu.com-20120329190951-aq83ivog4cg8bxun
Tags: upstream-3.1~svn153643
ImportĀ upstreamĀ versionĀ 3.1~svn153643

Show diffs side-by-side

added added

removed removed

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