blob: c54a794d75cc586f6940d8015d694a986ec3b3c5 [file] [log] [blame]
Matt Arsenault1b8d8372014-07-19 18:29:29 +00001
2#include "llvm/CodeGen/MachineRegionInfo.h"
3#include "llvm/CodeGen/MachinePostDominators.h"
4#include "llvm/ADT/Statistic.h"
5#include "llvm/Analysis/RegionInfoImpl.h"
6
7using namespace llvm;
8
9STATISTIC(numMachineRegions, "The # of machine regions");
10STATISTIC(numMachineSimpleRegions, "The # of simple machine regions");
11
12namespace llvm {
13template class RegionBase<RegionTraits<MachineFunction>>;
14template class RegionNodeBase<RegionTraits<MachineFunction>>;
15template class RegionInfoBase<RegionTraits<MachineFunction>>;
16}
17
18//===----------------------------------------------------------------------===//
19// MachineRegion implementation
20//
21
22MachineRegion::MachineRegion(MachineBasicBlock *Entry, MachineBasicBlock *Exit,
23 MachineRegionInfo* RI,
24 MachineDominatorTree *DT, MachineRegion *Parent) :
25 RegionBase<RegionTraits<MachineFunction>>(Entry, Exit, RI, DT, Parent) {
26
27}
28
29MachineRegion::~MachineRegion() { }
30
31//===----------------------------------------------------------------------===//
32// MachineRegionInfo implementation
33//
34
35MachineRegionInfo::MachineRegionInfo() :
36 RegionInfoBase<RegionTraits<MachineFunction>>() {
37
38}
39
40MachineRegionInfo::~MachineRegionInfo() {
41
42}
43
44void MachineRegionInfo::updateStatistics(MachineRegion *R) {
45 ++numMachineRegions;
46
47 // TODO: Slow. Should only be enabled if -stats is used.
48 if (R->isSimple())
49 ++numMachineSimpleRegions;
50}
51
52void MachineRegionInfo::MachineRegionInfo::recalculate(
53 MachineFunction &F,
54 MachineDominatorTree *DT_,
55 MachinePostDominatorTree *PDT_,
56 MachineDominanceFrontier *DF_) {
57 DT = DT_;
58 PDT = PDT_;
59 DF = DF_;
60
61 MachineBasicBlock *Entry = GraphTraits<MachineFunction*>::getEntryNode(&F);
62
63 TopLevelRegion = new MachineRegion(Entry, nullptr, this, DT, nullptr);
64 updateStatistics(TopLevelRegion);
65 calculate(F);
66}
67
68//===----------------------------------------------------------------------===//
69// MachineRegionInfoPass implementation
70//
71
72MachineRegionInfoPass::MachineRegionInfoPass() : MachineFunctionPass(ID) {
73 initializeMachineRegionInfoPassPass(*PassRegistry::getPassRegistry());
74}
75
76MachineRegionInfoPass::~MachineRegionInfoPass() {
77
78}
79
80bool MachineRegionInfoPass::runOnMachineFunction(MachineFunction &F) {
81 releaseMemory();
82
83 auto DT = &getAnalysis<MachineDominatorTree>();
84 auto PDT = &getAnalysis<MachinePostDominatorTree>();
85 auto DF = &getAnalysis<MachineDominanceFrontier>();
86
87 RI.recalculate(F, DT, PDT, DF);
88 return false;
89}
90
91void MachineRegionInfoPass::releaseMemory() {
92 RI.releaseMemory();
93}
94
95void MachineRegionInfoPass::verifyAnalysis() const {
96 // Only do verification when user wants to, otherwise this expensive check
97 // will be invoked by PMDataManager::verifyPreservedAnalysis when
98 // a regionpass (marked PreservedAll) finish.
99 if (MachineRegionInfo::VerifyRegionInfo)
100 RI.verifyAnalysis();
101}
102
103void MachineRegionInfoPass::getAnalysisUsage(AnalysisUsage &AU) const {
104 AU.setPreservesAll();
105 AU.addRequiredTransitive<DominatorTreeWrapperPass>();
106 AU.addRequired<PostDominatorTree>();
107 AU.addRequired<DominanceFrontier>();
108}
109
110void MachineRegionInfoPass::print(raw_ostream &OS, const Module *) const {
111 RI.print(OS);
112}
113
114void MachineRegionInfoPass::dump() const {
115 RI.dump();
116}
117
118char MachineRegionInfoPass::ID = 0;
119
120INITIALIZE_PASS_BEGIN(MachineRegionInfoPass, "regions",
121 "Detect single entry single exit regions", true, true)
122INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
123INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTree)
124INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontier)
125INITIALIZE_PASS_END(MachineRegionInfoPass, "regions",
126 "Detect single entry single exit regions", true, true)
127
128// Create methods available outside of this file, to use them
129// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by
130// the link time optimization.
131
132namespace llvm {
133 FunctionPass *createMachineRegionInfoPass() {
134 return new MachineRegionInfoPass();
135 }
136}
137