xref: /aosp_15_r20/external/llvm/lib/CodeGen/MachineRegionInfo.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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