blob: 254eb44d99121e3fb1d8008eef8fe590c9e056fc [file] [log] [blame]
Matt Arsenault1b8d8372014-07-19 18:29:29 +00001
2#include "llvm/CodeGen/MachineRegionInfo.h"
Matt Arsenault1b8d8372014-07-19 18:29:29 +00003#include "llvm/ADT/Statistic.h"
4#include "llvm/Analysis/RegionInfoImpl.h"
Chandler Carruthd9903882015-01-14 11:23:27 +00005#include "llvm/CodeGen/MachinePostDominators.h"
Matt Arsenault1b8d8372014-07-19 18:29:29 +00006
Matthias Braun43130592017-02-18 00:41:16 +00007#define DEBUG_TYPE "machine-region-info"
Richard Smith5e23fb82014-07-30 00:25:24 +00008
Matt Arsenault1b8d8372014-07-19 18:29:29 +00009using namespace llvm;
10
11STATISTIC(numMachineRegions, "The # of machine regions");
12STATISTIC(numMachineSimpleRegions, "The # of simple machine regions");
13
14namespace llvm {
15template class RegionBase<RegionTraits<MachineFunction>>;
16template class RegionNodeBase<RegionTraits<MachineFunction>>;
17template class RegionInfoBase<RegionTraits<MachineFunction>>;
18}
19
20//===----------------------------------------------------------------------===//
21// MachineRegion implementation
22//
23
24MachineRegion::MachineRegion(MachineBasicBlock *Entry, MachineBasicBlock *Exit,
25 MachineRegionInfo* RI,
26 MachineDominatorTree *DT, MachineRegion *Parent) :
27 RegionBase<RegionTraits<MachineFunction>>(Entry, Exit, RI, DT, Parent) {
28
29}
30
31MachineRegion::~MachineRegion() { }
32
33//===----------------------------------------------------------------------===//
34// MachineRegionInfo implementation
35//
36
37MachineRegionInfo::MachineRegionInfo() :
38 RegionInfoBase<RegionTraits<MachineFunction>>() {
39
40}
41
42MachineRegionInfo::~MachineRegionInfo() {
43
44}
45
46void MachineRegionInfo::updateStatistics(MachineRegion *R) {
47 ++numMachineRegions;
48
49 // TODO: Slow. Should only be enabled if -stats is used.
50 if (R->isSimple())
51 ++numMachineSimpleRegions;
52}
53
NAKAMURA Takumi74a53322014-07-20 11:14:55 +000054void MachineRegionInfo::recalculate(MachineFunction &F,
55 MachineDominatorTree *DT_,
56 MachinePostDominatorTree *PDT_,
57 MachineDominanceFrontier *DF_) {
Matt Arsenault1b8d8372014-07-19 18:29:29 +000058 DT = DT_;
59 PDT = PDT_;
60 DF = DF_;
61
62 MachineBasicBlock *Entry = GraphTraits<MachineFunction*>::getEntryNode(&F);
63
64 TopLevelRegion = new MachineRegion(Entry, nullptr, this, DT, nullptr);
65 updateStatistics(TopLevelRegion);
66 calculate(F);
67}
68
69//===----------------------------------------------------------------------===//
70// MachineRegionInfoPass implementation
71//
72
73MachineRegionInfoPass::MachineRegionInfoPass() : MachineFunctionPass(ID) {
74 initializeMachineRegionInfoPassPass(*PassRegistry::getPassRegistry());
75}
76
77MachineRegionInfoPass::~MachineRegionInfoPass() {
78
79}
80
81bool MachineRegionInfoPass::runOnMachineFunction(MachineFunction &F) {
82 releaseMemory();
83
84 auto DT = &getAnalysis<MachineDominatorTree>();
85 auto PDT = &getAnalysis<MachinePostDominatorTree>();
86 auto DF = &getAnalysis<MachineDominanceFrontier>();
87
88 RI.recalculate(F, DT, PDT, DF);
Matthias Braun43130592017-02-18 00:41:16 +000089
90 DEBUG(RI.dump());
91
Matt Arsenault1b8d8372014-07-19 18:29:29 +000092 return false;
93}
94
95void MachineRegionInfoPass::releaseMemory() {
96 RI.releaseMemory();
97}
98
99void MachineRegionInfoPass::verifyAnalysis() const {
100 // Only do verification when user wants to, otherwise this expensive check
101 // will be invoked by PMDataManager::verifyPreservedAnalysis when
102 // a regionpass (marked PreservedAll) finish.
103 if (MachineRegionInfo::VerifyRegionInfo)
104 RI.verifyAnalysis();
105}
106
107void MachineRegionInfoPass::getAnalysisUsage(AnalysisUsage &AU) const {
108 AU.setPreservesAll();
Matthias Braun43130592017-02-18 00:41:16 +0000109 AU.addRequired<MachineDominatorTree>();
110 AU.addRequired<MachinePostDominatorTree>();
111 AU.addRequired<MachineDominanceFrontier>();
112 MachineFunctionPass::getAnalysisUsage(AU);
Matt Arsenault1b8d8372014-07-19 18:29:29 +0000113}
114
115void MachineRegionInfoPass::print(raw_ostream &OS, const Module *) const {
116 RI.print(OS);
117}
118
NAKAMURA Takumi118b0c72014-07-20 00:00:42 +0000119#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
Yaron Kereneb2a2542016-01-29 20:50:44 +0000120LLVM_DUMP_METHOD void MachineRegionInfoPass::dump() const {
Matt Arsenault1b8d8372014-07-19 18:29:29 +0000121 RI.dump();
122}
NAKAMURA Takumi118b0c72014-07-20 00:00:42 +0000123#endif
Matt Arsenault1b8d8372014-07-19 18:29:29 +0000124
125char MachineRegionInfoPass::ID = 0;
126
Matthias Braun43130592017-02-18 00:41:16 +0000127INITIALIZE_PASS_BEGIN(MachineRegionInfoPass, DEBUG_TYPE,
128 "Detect single entry single exit regions", true, true)
Matt Arsenault1b8d8372014-07-19 18:29:29 +0000129INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
130INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTree)
131INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontier)
Matthias Braun43130592017-02-18 00:41:16 +0000132INITIALIZE_PASS_END(MachineRegionInfoPass, DEBUG_TYPE,
133 "Detect single entry single exit regions", true, true)
Matt Arsenault1b8d8372014-07-19 18:29:29 +0000134
135// Create methods available outside of this file, to use them
136// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by
137// the link time optimization.
138
139namespace llvm {
140 FunctionPass *createMachineRegionInfoPass() {
141 return new MachineRegionInfoPass();
142 }
143}
144