xref: /openbsd-src/gnu/llvm/llvm/lib/CodeGen/MachineRegionInfo.cpp (revision 09467b48e8bc8b4905716062da846024139afbf2)
1*09467b48Spatrick //===- lib/Codegen/MachineRegionInfo.cpp ----------------------------------===//
2*09467b48Spatrick //
3*09467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*09467b48Spatrick // See https://llvm.org/LICENSE.txt for license information.
5*09467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*09467b48Spatrick //
7*09467b48Spatrick //===----------------------------------------------------------------------===//
8*09467b48Spatrick 
9*09467b48Spatrick #include "llvm/CodeGen/MachineRegionInfo.h"
10*09467b48Spatrick #include "llvm/ADT/Statistic.h"
11*09467b48Spatrick #include "llvm/Analysis/RegionInfoImpl.h"
12*09467b48Spatrick #include "llvm/CodeGen/MachinePostDominators.h"
13*09467b48Spatrick #include "llvm/Config/llvm-config.h"
14*09467b48Spatrick #include "llvm/InitializePasses.h"
15*09467b48Spatrick #include "llvm/Pass.h"
16*09467b48Spatrick #include "llvm/Support/Compiler.h"
17*09467b48Spatrick #include "llvm/Support/Debug.h"
18*09467b48Spatrick 
19*09467b48Spatrick #define DEBUG_TYPE "machine-region-info"
20*09467b48Spatrick 
21*09467b48Spatrick using namespace llvm;
22*09467b48Spatrick 
23*09467b48Spatrick STATISTIC(numMachineRegions,       "The # of machine regions");
24*09467b48Spatrick STATISTIC(numMachineSimpleRegions, "The # of simple machine regions");
25*09467b48Spatrick 
26*09467b48Spatrick namespace llvm {
27*09467b48Spatrick 
28*09467b48Spatrick template class RegionBase<RegionTraits<MachineFunction>>;
29*09467b48Spatrick template class RegionNodeBase<RegionTraits<MachineFunction>>;
30*09467b48Spatrick template class RegionInfoBase<RegionTraits<MachineFunction>>;
31*09467b48Spatrick 
32*09467b48Spatrick } // end namespace llvm
33*09467b48Spatrick 
34*09467b48Spatrick //===----------------------------------------------------------------------===//
35*09467b48Spatrick // MachineRegion implementation
36*09467b48Spatrick 
MachineRegion(MachineBasicBlock * Entry,MachineBasicBlock * Exit,MachineRegionInfo * RI,MachineDominatorTree * DT,MachineRegion * Parent)37*09467b48Spatrick MachineRegion::MachineRegion(MachineBasicBlock *Entry, MachineBasicBlock *Exit,
38*09467b48Spatrick                              MachineRegionInfo* RI,
39*09467b48Spatrick                              MachineDominatorTree *DT, MachineRegion *Parent) :
40*09467b48Spatrick   RegionBase<RegionTraits<MachineFunction>>(Entry, Exit, RI, DT, Parent) {}
41*09467b48Spatrick 
42*09467b48Spatrick MachineRegion::~MachineRegion() = default;
43*09467b48Spatrick 
44*09467b48Spatrick //===----------------------------------------------------------------------===//
45*09467b48Spatrick // MachineRegionInfo implementation
46*09467b48Spatrick 
47*09467b48Spatrick MachineRegionInfo::MachineRegionInfo() = default;
48*09467b48Spatrick 
49*09467b48Spatrick MachineRegionInfo::~MachineRegionInfo() = default;
50*09467b48Spatrick 
updateStatistics(MachineRegion * R)51*09467b48Spatrick void MachineRegionInfo::updateStatistics(MachineRegion *R) {
52*09467b48Spatrick   ++numMachineRegions;
53*09467b48Spatrick 
54*09467b48Spatrick   // TODO: Slow. Should only be enabled if -stats is used.
55*09467b48Spatrick   if (R->isSimple())
56*09467b48Spatrick     ++numMachineSimpleRegions;
57*09467b48Spatrick }
58*09467b48Spatrick 
recalculate(MachineFunction & F,MachineDominatorTree * DT_,MachinePostDominatorTree * PDT_,MachineDominanceFrontier * DF_)59*09467b48Spatrick void MachineRegionInfo::recalculate(MachineFunction &F,
60*09467b48Spatrick                                     MachineDominatorTree *DT_,
61*09467b48Spatrick                                     MachinePostDominatorTree *PDT_,
62*09467b48Spatrick                                     MachineDominanceFrontier *DF_) {
63*09467b48Spatrick   DT = DT_;
64*09467b48Spatrick   PDT = PDT_;
65*09467b48Spatrick   DF = DF_;
66*09467b48Spatrick 
67*09467b48Spatrick   MachineBasicBlock *Entry = GraphTraits<MachineFunction*>::getEntryNode(&F);
68*09467b48Spatrick 
69*09467b48Spatrick   TopLevelRegion = new MachineRegion(Entry, nullptr, this, DT, nullptr);
70*09467b48Spatrick   updateStatistics(TopLevelRegion);
71*09467b48Spatrick   calculate(F);
72*09467b48Spatrick }
73*09467b48Spatrick 
74*09467b48Spatrick //===----------------------------------------------------------------------===//
75*09467b48Spatrick // MachineRegionInfoPass implementation
76*09467b48Spatrick //
77*09467b48Spatrick 
MachineRegionInfoPass()78*09467b48Spatrick MachineRegionInfoPass::MachineRegionInfoPass() : MachineFunctionPass(ID) {
79*09467b48Spatrick   initializeMachineRegionInfoPassPass(*PassRegistry::getPassRegistry());
80*09467b48Spatrick }
81*09467b48Spatrick 
82*09467b48Spatrick MachineRegionInfoPass::~MachineRegionInfoPass() = default;
83*09467b48Spatrick 
runOnMachineFunction(MachineFunction & F)84*09467b48Spatrick bool MachineRegionInfoPass::runOnMachineFunction(MachineFunction &F) {
85*09467b48Spatrick   releaseMemory();
86*09467b48Spatrick 
87*09467b48Spatrick   auto DT = &getAnalysis<MachineDominatorTree>();
88*09467b48Spatrick   auto PDT = &getAnalysis<MachinePostDominatorTree>();
89*09467b48Spatrick   auto DF = &getAnalysis<MachineDominanceFrontier>();
90*09467b48Spatrick 
91*09467b48Spatrick   RI.recalculate(F, DT, PDT, DF);
92*09467b48Spatrick 
93*09467b48Spatrick   LLVM_DEBUG(RI.dump());
94*09467b48Spatrick 
95*09467b48Spatrick   return false;
96*09467b48Spatrick }
97*09467b48Spatrick 
releaseMemory()98*09467b48Spatrick void MachineRegionInfoPass::releaseMemory() {
99*09467b48Spatrick   RI.releaseMemory();
100*09467b48Spatrick }
101*09467b48Spatrick 
verifyAnalysis() const102*09467b48Spatrick void MachineRegionInfoPass::verifyAnalysis() const {
103*09467b48Spatrick   // Only do verification when user wants to, otherwise this expensive check
104*09467b48Spatrick   // will be invoked by PMDataManager::verifyPreservedAnalysis when
105*09467b48Spatrick   // a regionpass (marked PreservedAll) finish.
106*09467b48Spatrick   if (MachineRegionInfo::VerifyRegionInfo)
107*09467b48Spatrick     RI.verifyAnalysis();
108*09467b48Spatrick }
109*09467b48Spatrick 
getAnalysisUsage(AnalysisUsage & AU) const110*09467b48Spatrick void MachineRegionInfoPass::getAnalysisUsage(AnalysisUsage &AU) const {
111*09467b48Spatrick   AU.setPreservesAll();
112*09467b48Spatrick   AU.addRequired<MachineDominatorTree>();
113*09467b48Spatrick   AU.addRequired<MachinePostDominatorTree>();
114*09467b48Spatrick   AU.addRequired<MachineDominanceFrontier>();
115*09467b48Spatrick   MachineFunctionPass::getAnalysisUsage(AU);
116*09467b48Spatrick }
117*09467b48Spatrick 
print(raw_ostream & OS,const Module *) const118*09467b48Spatrick void MachineRegionInfoPass::print(raw_ostream &OS, const Module *) const {
119*09467b48Spatrick   RI.print(OS);
120*09467b48Spatrick }
121*09467b48Spatrick 
122*09467b48Spatrick #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dump() const123*09467b48Spatrick LLVM_DUMP_METHOD void MachineRegionInfoPass::dump() const {
124*09467b48Spatrick   RI.dump();
125*09467b48Spatrick }
126*09467b48Spatrick #endif
127*09467b48Spatrick 
128*09467b48Spatrick char MachineRegionInfoPass::ID = 0;
129*09467b48Spatrick char &MachineRegionInfoPassID = MachineRegionInfoPass::ID;
130*09467b48Spatrick 
131*09467b48Spatrick INITIALIZE_PASS_BEGIN(MachineRegionInfoPass, DEBUG_TYPE,
132*09467b48Spatrick                       "Detect single entry single exit regions", true, true)
133*09467b48Spatrick INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
134*09467b48Spatrick INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTree)
135*09467b48Spatrick INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontier)
136*09467b48Spatrick INITIALIZE_PASS_END(MachineRegionInfoPass, DEBUG_TYPE,
137*09467b48Spatrick                     "Detect single entry single exit regions", true, true)
138*09467b48Spatrick 
139*09467b48Spatrick // Create methods available outside of this file, to use them
140*09467b48Spatrick // "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by
141*09467b48Spatrick // the link time optimization.
142*09467b48Spatrick 
143*09467b48Spatrick namespace llvm {
144*09467b48Spatrick 
createMachineRegionInfoPass()145*09467b48Spatrick FunctionPass *createMachineRegionInfoPass() {
146*09467b48Spatrick   return new MachineRegionInfoPass();
147*09467b48Spatrick }
148*09467b48Spatrick 
149*09467b48Spatrick } // end namespace llvm
150