blob: 2402ffdbbcb11642c5eb55f6f5f076c3f7dc0511 [file] [log] [blame]
Eugene Zelenko7ea69232017-06-01 23:25:02 +00001//===- lib/Codegen/MachineRegionInfo.cpp ----------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Matt Arsenault1b8d8372014-07-19 18:29:29 +000010#include "llvm/ADT/Statistic.h"
11#include "llvm/Analysis/RegionInfoImpl.h"
Chandler Carruthd9903882015-01-14 11:23:27 +000012#include "llvm/CodeGen/MachinePostDominators.h"
Eugene Zelenko7ea69232017-06-01 23:25:02 +000013#include "llvm/CodeGen/MachineRegionInfo.h"
14#include "llvm/Pass.h"
15#include "llvm/Support/Compiler.h"
16#include "llvm/Support/Debug.h"
Matt Arsenault1b8d8372014-07-19 18:29:29 +000017
Matthias Braun43130592017-02-18 00:41:16 +000018#define DEBUG_TYPE "machine-region-info"
Richard Smith5e23fb82014-07-30 00:25:24 +000019
Matt Arsenault1b8d8372014-07-19 18:29:29 +000020using namespace llvm;
21
22STATISTIC(numMachineRegions, "The # of machine regions");
23STATISTIC(numMachineSimpleRegions, "The # of simple machine regions");
24
25namespace llvm {
Eugene Zelenko7ea69232017-06-01 23:25:02 +000026
Matt Arsenault1b8d8372014-07-19 18:29:29 +000027template class RegionBase<RegionTraits<MachineFunction>>;
28template class RegionNodeBase<RegionTraits<MachineFunction>>;
29template class RegionInfoBase<RegionTraits<MachineFunction>>;
Eugene Zelenko7ea69232017-06-01 23:25:02 +000030
31} // end namespace llvm
Matt Arsenault1b8d8372014-07-19 18:29:29 +000032
33//===----------------------------------------------------------------------===//
34// MachineRegion implementation
Matt Arsenault1b8d8372014-07-19 18:29:29 +000035
36MachineRegion::MachineRegion(MachineBasicBlock *Entry, MachineBasicBlock *Exit,
37 MachineRegionInfo* RI,
38 MachineDominatorTree *DT, MachineRegion *Parent) :
Eugene Zelenko7ea69232017-06-01 23:25:02 +000039 RegionBase<RegionTraits<MachineFunction>>(Entry, Exit, RI, DT, Parent) {}
Matt Arsenault1b8d8372014-07-19 18:29:29 +000040
Eugene Zelenko7ea69232017-06-01 23:25:02 +000041MachineRegion::~MachineRegion() = default;
Matt Arsenault1b8d8372014-07-19 18:29:29 +000042
43//===----------------------------------------------------------------------===//
44// MachineRegionInfo implementation
Matt Arsenault1b8d8372014-07-19 18:29:29 +000045
Eugene Zelenko7ea69232017-06-01 23:25:02 +000046MachineRegionInfo::MachineRegionInfo() = default;
Matt Arsenault1b8d8372014-07-19 18:29:29 +000047
Eugene Zelenko7ea69232017-06-01 23:25:02 +000048MachineRegionInfo::~MachineRegionInfo() = default;
Matt Arsenault1b8d8372014-07-19 18:29:29 +000049
50void MachineRegionInfo::updateStatistics(MachineRegion *R) {
51 ++numMachineRegions;
52
53 // TODO: Slow. Should only be enabled if -stats is used.
54 if (R->isSimple())
55 ++numMachineSimpleRegions;
56}
57
NAKAMURA Takumi74a53322014-07-20 11:14:55 +000058void MachineRegionInfo::recalculate(MachineFunction &F,
59 MachineDominatorTree *DT_,
60 MachinePostDominatorTree *PDT_,
61 MachineDominanceFrontier *DF_) {
Matt Arsenault1b8d8372014-07-19 18:29:29 +000062 DT = DT_;
63 PDT = PDT_;
64 DF = DF_;
65
66 MachineBasicBlock *Entry = GraphTraits<MachineFunction*>::getEntryNode(&F);
67
68 TopLevelRegion = new MachineRegion(Entry, nullptr, this, DT, nullptr);
69 updateStatistics(TopLevelRegion);
70 calculate(F);
71}
72
73//===----------------------------------------------------------------------===//
74// MachineRegionInfoPass implementation
75//
76
77MachineRegionInfoPass::MachineRegionInfoPass() : MachineFunctionPass(ID) {
78 initializeMachineRegionInfoPassPass(*PassRegistry::getPassRegistry());
79}
80
Eugene Zelenko7ea69232017-06-01 23:25:02 +000081MachineRegionInfoPass::~MachineRegionInfoPass() = default;
Matt Arsenault1b8d8372014-07-19 18:29:29 +000082
83bool MachineRegionInfoPass::runOnMachineFunction(MachineFunction &F) {
84 releaseMemory();
85
86 auto DT = &getAnalysis<MachineDominatorTree>();
87 auto PDT = &getAnalysis<MachinePostDominatorTree>();
88 auto DF = &getAnalysis<MachineDominanceFrontier>();
89
90 RI.recalculate(F, DT, PDT, DF);
Matthias Braun43130592017-02-18 00:41:16 +000091
92 DEBUG(RI.dump());
93
Matt Arsenault1b8d8372014-07-19 18:29:29 +000094 return false;
95}
96
97void MachineRegionInfoPass::releaseMemory() {
98 RI.releaseMemory();
99}
100
101void MachineRegionInfoPass::verifyAnalysis() const {
102 // Only do verification when user wants to, otherwise this expensive check
103 // will be invoked by PMDataManager::verifyPreservedAnalysis when
104 // a regionpass (marked PreservedAll) finish.
105 if (MachineRegionInfo::VerifyRegionInfo)
106 RI.verifyAnalysis();
107}
108
109void MachineRegionInfoPass::getAnalysisUsage(AnalysisUsage &AU) const {
110 AU.setPreservesAll();
Matthias Braun43130592017-02-18 00:41:16 +0000111 AU.addRequired<MachineDominatorTree>();
112 AU.addRequired<MachinePostDominatorTree>();
113 AU.addRequired<MachineDominanceFrontier>();
114 MachineFunctionPass::getAnalysisUsage(AU);
Matt Arsenault1b8d8372014-07-19 18:29:29 +0000115}
116
117void MachineRegionInfoPass::print(raw_ostream &OS, const Module *) const {
118 RI.print(OS);
119}
120
NAKAMURA Takumi118b0c72014-07-20 00:00:42 +0000121#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
Yaron Kereneb2a2542016-01-29 20:50:44 +0000122LLVM_DUMP_METHOD void MachineRegionInfoPass::dump() const {
Matt Arsenault1b8d8372014-07-19 18:29:29 +0000123 RI.dump();
124}
NAKAMURA Takumi118b0c72014-07-20 00:00:42 +0000125#endif
Matt Arsenault1b8d8372014-07-19 18:29:29 +0000126
127char MachineRegionInfoPass::ID = 0;
Jan Sjodin695e4372017-04-11 11:40:55 +0000128char &MachineRegionInfoPassID = MachineRegionInfoPass::ID;
Matt Arsenault1b8d8372014-07-19 18:29:29 +0000129
Matthias Braun43130592017-02-18 00:41:16 +0000130INITIALIZE_PASS_BEGIN(MachineRegionInfoPass, DEBUG_TYPE,
131 "Detect single entry single exit regions", true, true)
Matt Arsenault1b8d8372014-07-19 18:29:29 +0000132INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
133INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTree)
134INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontier)
Matthias Braun43130592017-02-18 00:41:16 +0000135INITIALIZE_PASS_END(MachineRegionInfoPass, DEBUG_TYPE,
136 "Detect single entry single exit regions", true, true)
Matt Arsenault1b8d8372014-07-19 18:29:29 +0000137
138// Create methods available outside of this file, to use them
139// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by
140// the link time optimization.
141
142namespace llvm {
Eugene Zelenko7ea69232017-06-01 23:25:02 +0000143
144FunctionPass *createMachineRegionInfoPass() {
145 return new MachineRegionInfoPass();
Matt Arsenault1b8d8372014-07-19 18:29:29 +0000146}
147
Eugene Zelenko7ea69232017-06-01 23:25:02 +0000148} // end namespace llvm