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