blob: 71ad4e6aa7f520ab4a4eb50b080a69fe20dd27a2 [file] [log] [blame]
Matt Arsenault1b8d8372014-07-19 18:29:29 +00001#include "llvm/CodeGen/MachineRegionInfo.h"
Matt Arsenault1b8d8372014-07-19 18:29:29 +00002#include "llvm/ADT/Statistic.h"
3#include "llvm/Analysis/RegionInfoImpl.h"
Chandler Carruthd9903882015-01-14 11:23:27 +00004#include "llvm/CodeGen/MachinePostDominators.h"
Matt Arsenault1b8d8372014-07-19 18:29:29 +00005
Matthias Braun43130592017-02-18 00:41:16 +00006#define DEBUG_TYPE "machine-region-info"
Richard Smith5e23fb82014-07-30 00:25:24 +00007
Matt Arsenault1b8d8372014-07-19 18:29:29 +00008using namespace llvm;
9
10STATISTIC(numMachineRegions, "The # of machine regions");
11STATISTIC(numMachineSimpleRegions, "The # of simple machine regions");
12
13namespace llvm {
14template class RegionBase<RegionTraits<MachineFunction>>;
15template class RegionNodeBase<RegionTraits<MachineFunction>>;
16template class RegionInfoBase<RegionTraits<MachineFunction>>;
17}
18
19//===----------------------------------------------------------------------===//
20// MachineRegion implementation
21//
22
23MachineRegion::MachineRegion(MachineBasicBlock *Entry, MachineBasicBlock *Exit,
24 MachineRegionInfo* RI,
25 MachineDominatorTree *DT, MachineRegion *Parent) :
26 RegionBase<RegionTraits<MachineFunction>>(Entry, Exit, RI, DT, Parent) {
27
28}
29
30MachineRegion::~MachineRegion() { }
31
32//===----------------------------------------------------------------------===//
33// MachineRegionInfo implementation
34//
35
36MachineRegionInfo::MachineRegionInfo() :
37 RegionInfoBase<RegionTraits<MachineFunction>>() {
38
39}
40
41MachineRegionInfo::~MachineRegionInfo() {
42
43}
44
45void MachineRegionInfo::updateStatistics(MachineRegion *R) {
46 ++numMachineRegions;
47
48 // TODO: Slow. Should only be enabled if -stats is used.
49 if (R->isSimple())
50 ++numMachineSimpleRegions;
51}
52
NAKAMURA Takumi74a53322014-07-20 11:14:55 +000053void MachineRegionInfo::recalculate(MachineFunction &F,
54 MachineDominatorTree *DT_,
55 MachinePostDominatorTree *PDT_,
56 MachineDominanceFrontier *DF_) {
Matt Arsenault1b8d8372014-07-19 18:29:29 +000057 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);
Matthias Braun43130592017-02-18 00:41:16 +000088
89 DEBUG(RI.dump());
90
Matt Arsenault1b8d8372014-07-19 18:29:29 +000091 return false;
92}
93
94void MachineRegionInfoPass::releaseMemory() {
95 RI.releaseMemory();
96}
97
98void MachineRegionInfoPass::verifyAnalysis() const {
99 // Only do verification when user wants to, otherwise this expensive check
100 // will be invoked by PMDataManager::verifyPreservedAnalysis when
101 // a regionpass (marked PreservedAll) finish.
102 if (MachineRegionInfo::VerifyRegionInfo)
103 RI.verifyAnalysis();
104}
105
106void MachineRegionInfoPass::getAnalysisUsage(AnalysisUsage &AU) const {
107 AU.setPreservesAll();
Matthias Braun43130592017-02-18 00:41:16 +0000108 AU.addRequired<MachineDominatorTree>();
109 AU.addRequired<MachinePostDominatorTree>();
110 AU.addRequired<MachineDominanceFrontier>();
111 MachineFunctionPass::getAnalysisUsage(AU);
Matt Arsenault1b8d8372014-07-19 18:29:29 +0000112}
113
114void MachineRegionInfoPass::print(raw_ostream &OS, const Module *) const {
115 RI.print(OS);
116}
117
NAKAMURA Takumi118b0c72014-07-20 00:00:42 +0000118#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
Yaron Kereneb2a2542016-01-29 20:50:44 +0000119LLVM_DUMP_METHOD void MachineRegionInfoPass::dump() const {
Matt Arsenault1b8d8372014-07-19 18:29:29 +0000120 RI.dump();
121}
NAKAMURA Takumi118b0c72014-07-20 00:00:42 +0000122#endif
Matt Arsenault1b8d8372014-07-19 18:29:29 +0000123
124char MachineRegionInfoPass::ID = 0;
Jan Sjodin695e4372017-04-11 11:40:55 +0000125char &MachineRegionInfoPassID = MachineRegionInfoPass::ID;
Matt Arsenault1b8d8372014-07-19 18:29:29 +0000126
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