2 #include "llvm/CodeGen/MachineRegionInfo.h"
3 #include "llvm/CodeGen/MachinePostDominators.h"
4 #include "llvm/ADT/Statistic.h"
5 #include "llvm/Analysis/RegionInfoImpl.h"
9 STATISTIC(numMachineRegions, "The # of machine regions");
10 STATISTIC(numMachineSimpleRegions, "The # of simple machine regions");
13 template class RegionBase<RegionTraits<MachineFunction>>;
14 template class RegionNodeBase<RegionTraits<MachineFunction>>;
15 template class RegionInfoBase<RegionTraits<MachineFunction>>;
18 //===----------------------------------------------------------------------===//
19 // MachineRegion implementation
22 MachineRegion::MachineRegion(MachineBasicBlock *Entry, MachineBasicBlock *Exit,
23 MachineRegionInfo* RI,
24 MachineDominatorTree *DT, MachineRegion *Parent) :
25 RegionBase<RegionTraits<MachineFunction>>(Entry, Exit, RI, DT, Parent) {
29 MachineRegion::~MachineRegion() { }
31 //===----------------------------------------------------------------------===//
32 // MachineRegionInfo implementation
35 MachineRegionInfo::MachineRegionInfo() :
36 RegionInfoBase<RegionTraits<MachineFunction>>() {
40 MachineRegionInfo::~MachineRegionInfo() {
44 void MachineRegionInfo::updateStatistics(MachineRegion *R) {
47 // TODO: Slow. Should only be enabled if -stats is used.
49 ++numMachineSimpleRegions;
52 void MachineRegionInfo::MachineRegionInfo::recalculate(
54 MachineDominatorTree *DT_,
55 MachinePostDominatorTree *PDT_,
56 MachineDominanceFrontier *DF_) {
61 MachineBasicBlock *Entry = GraphTraits<MachineFunction*>::getEntryNode(&F);
63 TopLevelRegion = new MachineRegion(Entry, nullptr, this, DT, nullptr);
64 updateStatistics(TopLevelRegion);
68 //===----------------------------------------------------------------------===//
69 // MachineRegionInfoPass implementation
72 MachineRegionInfoPass::MachineRegionInfoPass() : MachineFunctionPass(ID) {
73 initializeMachineRegionInfoPassPass(*PassRegistry::getPassRegistry());
76 MachineRegionInfoPass::~MachineRegionInfoPass() {
80 bool MachineRegionInfoPass::runOnMachineFunction(MachineFunction &F) {
83 auto DT = &getAnalysis<MachineDominatorTree>();
84 auto PDT = &getAnalysis<MachinePostDominatorTree>();
85 auto DF = &getAnalysis<MachineDominanceFrontier>();
87 RI.recalculate(F, DT, PDT, DF);
91 void MachineRegionInfoPass::releaseMemory() {
95 void MachineRegionInfoPass::verifyAnalysis() const {
96 // Only do verification when user wants to, otherwise this expensive check
97 // will be invoked by PMDataManager::verifyPreservedAnalysis when
98 // a regionpass (marked PreservedAll) finish.
99 if (MachineRegionInfo::VerifyRegionInfo)
103 void MachineRegionInfoPass::getAnalysisUsage(AnalysisUsage &AU) const {
104 AU.setPreservesAll();
105 AU.addRequiredTransitive<DominatorTreeWrapperPass>();
106 AU.addRequired<PostDominatorTree>();
107 AU.addRequired<DominanceFrontier>();
110 void MachineRegionInfoPass::print(raw_ostream &OS, const Module *) const {
114 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
115 void MachineRegionInfoPass::dump() const {
120 char MachineRegionInfoPass::ID = 0;
122 INITIALIZE_PASS_BEGIN(MachineRegionInfoPass, "regions",
123 "Detect single entry single exit regions", true, true)
124 INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
125 INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTree)
126 INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontier)
127 INITIALIZE_PASS_END(MachineRegionInfoPass, "regions",
128 "Detect single entry single exit regions", true, true)
130 // Create methods available outside of this file, to use them
131 // "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by
132 // the link time optimization.
135 FunctionPass *createMachineRegionInfoPass() {
136 return new MachineRegionInfoPass();