blob: 2619d8f78276d150cc701861ea5b049aa053fafa [file] [log] [blame]
Eugene Zelenkoff49b832017-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
Chandler Carruthe3e43d92017-06-06 11:49:48 +000010#include "llvm/CodeGen/MachineRegionInfo.h"
Matt Arsenault5e1c96a2014-07-19 18:29:29 +000011#include "llvm/ADT/Statistic.h"
12#include "llvm/Analysis/RegionInfoImpl.h"
Chandler Carruth1b279142015-01-14 11:23:27 +000013#include "llvm/CodeGen/MachinePostDominators.h"
Nico Weber0f38c602018-04-30 14:59:11 +000014#include "llvm/Config/llvm-config.h"
Eugene Zelenkoff49b832017-06-01 23:25:02 +000015#include "llvm/Pass.h"
16#include "llvm/Support/Compiler.h"
17#include "llvm/Support/Debug.h"
Matt Arsenault5e1c96a2014-07-19 18:29:29 +000018
Matthias Braun5e554772017-02-18 00:41:16 +000019#define DEBUG_TYPE "machine-region-info"
Richard Smith0630cb22014-07-30 00:25:24 +000020
Matt Arsenault5e1c96a2014-07-19 18:29:29 +000021using namespace llvm;
22
23STATISTIC(numMachineRegions, "The # of machine regions");
24STATISTIC(numMachineSimpleRegions, "The # of simple machine regions");
25
26namespace llvm {
Eugene Zelenkoff49b832017-06-01 23:25:02 +000027
Matt Arsenault5e1c96a2014-07-19 18:29:29 +000028template class RegionBase<RegionTraits<MachineFunction>>;
29template class RegionNodeBase<RegionTraits<MachineFunction>>;
30template class RegionInfoBase<RegionTraits<MachineFunction>>;
Eugene Zelenkoff49b832017-06-01 23:25:02 +000031
32} // end namespace llvm
Matt Arsenault5e1c96a2014-07-19 18:29:29 +000033
34//===----------------------------------------------------------------------===//
35// MachineRegion implementation
Matt Arsenault5e1c96a2014-07-19 18:29:29 +000036
37MachineRegion::MachineRegion(MachineBasicBlock *Entry, MachineBasicBlock *Exit,
38 MachineRegionInfo* RI,
39 MachineDominatorTree *DT, MachineRegion *Parent) :
Eugene Zelenkoff49b832017-06-01 23:25:02 +000040 RegionBase<RegionTraits<MachineFunction>>(Entry, Exit, RI, DT, Parent) {}
Matt Arsenault5e1c96a2014-07-19 18:29:29 +000041
Eugene Zelenkoff49b832017-06-01 23:25:02 +000042MachineRegion::~MachineRegion() = default;
Matt Arsenault5e1c96a2014-07-19 18:29:29 +000043
44//===----------------------------------------------------------------------===//
45// MachineRegionInfo implementation
Matt Arsenault5e1c96a2014-07-19 18:29:29 +000046
Eugene Zelenkoff49b832017-06-01 23:25:02 +000047MachineRegionInfo::MachineRegionInfo() = default;
Matt Arsenault5e1c96a2014-07-19 18:29:29 +000048
Eugene Zelenkoff49b832017-06-01 23:25:02 +000049MachineRegionInfo::~MachineRegionInfo() = default;
Matt Arsenault5e1c96a2014-07-19 18:29:29 +000050
51void MachineRegionInfo::updateStatistics(MachineRegion *R) {
52 ++numMachineRegions;
53
54 // TODO: Slow. Should only be enabled if -stats is used.
55 if (R->isSimple())
56 ++numMachineSimpleRegions;
57}
58
NAKAMURA Takumi1d55cc62014-07-20 11:14:55 +000059void MachineRegionInfo::recalculate(MachineFunction &F,
60 MachineDominatorTree *DT_,
61 MachinePostDominatorTree *PDT_,
62 MachineDominanceFrontier *DF_) {
Matt Arsenault5e1c96a2014-07-19 18:29:29 +000063 DT = DT_;
64 PDT = PDT_;
65 DF = DF_;
66
67 MachineBasicBlock *Entry = GraphTraits<MachineFunction*>::getEntryNode(&F);
68
69 TopLevelRegion = new MachineRegion(Entry, nullptr, this, DT, nullptr);
70 updateStatistics(TopLevelRegion);
71 calculate(F);
72}
73
74//===----------------------------------------------------------------------===//
75// MachineRegionInfoPass implementation
76//
77
78MachineRegionInfoPass::MachineRegionInfoPass() : MachineFunctionPass(ID) {
79 initializeMachineRegionInfoPassPass(*PassRegistry::getPassRegistry());
80}
81
Eugene Zelenkoff49b832017-06-01 23:25:02 +000082MachineRegionInfoPass::~MachineRegionInfoPass() = default;
Matt Arsenault5e1c96a2014-07-19 18:29:29 +000083
84bool MachineRegionInfoPass::runOnMachineFunction(MachineFunction &F) {
85 releaseMemory();
86
87 auto DT = &getAnalysis<MachineDominatorTree>();
88 auto PDT = &getAnalysis<MachinePostDominatorTree>();
89 auto DF = &getAnalysis<MachineDominanceFrontier>();
90
91 RI.recalculate(F, DT, PDT, DF);
Matthias Braun5e554772017-02-18 00:41:16 +000092
Nicola Zaghen0818e782018-05-14 12:53:11 +000093 LLVM_DEBUG(RI.dump());
Matthias Braun5e554772017-02-18 00:41:16 +000094
Matt Arsenault5e1c96a2014-07-19 18:29:29 +000095 return false;
96}
97
98void MachineRegionInfoPass::releaseMemory() {
99 RI.releaseMemory();
100}
101
102void MachineRegionInfoPass::verifyAnalysis() const {
103 // Only do verification when user wants to, otherwise this expensive check
104 // will be invoked by PMDataManager::verifyPreservedAnalysis when
105 // a regionpass (marked PreservedAll) finish.
106 if (MachineRegionInfo::VerifyRegionInfo)
107 RI.verifyAnalysis();
108}
109
110void MachineRegionInfoPass::getAnalysisUsage(AnalysisUsage &AU) const {
111 AU.setPreservesAll();
Matthias Braun5e554772017-02-18 00:41:16 +0000112 AU.addRequired<MachineDominatorTree>();
113 AU.addRequired<MachinePostDominatorTree>();
114 AU.addRequired<MachineDominanceFrontier>();
115 MachineFunctionPass::getAnalysisUsage(AU);
Matt Arsenault5e1c96a2014-07-19 18:29:29 +0000116}
117
118void MachineRegionInfoPass::print(raw_ostream &OS, const Module *) const {
119 RI.print(OS);
120}
121
Aaron Ballman1d03d382017-10-15 14:32:27 +0000122#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
Yaron Keren55307982016-01-29 20:50:44 +0000123LLVM_DUMP_METHOD void MachineRegionInfoPass::dump() const {
Matt Arsenault5e1c96a2014-07-19 18:29:29 +0000124 RI.dump();
125}
NAKAMURA Takumi8f64ffd2014-07-20 00:00:42 +0000126#endif
Matt Arsenault5e1c96a2014-07-19 18:29:29 +0000127
128char MachineRegionInfoPass::ID = 0;
Jan Sjodin465e2052017-04-11 11:40:55 +0000129char &MachineRegionInfoPassID = MachineRegionInfoPass::ID;
Matt Arsenault5e1c96a2014-07-19 18:29:29 +0000130
Matthias Braun5e554772017-02-18 00:41:16 +0000131INITIALIZE_PASS_BEGIN(MachineRegionInfoPass, DEBUG_TYPE,
132 "Detect single entry single exit regions", true, true)
Matt Arsenault5e1c96a2014-07-19 18:29:29 +0000133INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
134INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTree)
135INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontier)
Matthias Braun5e554772017-02-18 00:41:16 +0000136INITIALIZE_PASS_END(MachineRegionInfoPass, DEBUG_TYPE,
137 "Detect single entry single exit regions", true, true)
Matt Arsenault5e1c96a2014-07-19 18:29:29 +0000138
139// Create methods available outside of this file, to use them
140// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by
141// the link time optimization.
142
143namespace llvm {
Eugene Zelenkoff49b832017-06-01 23:25:02 +0000144
145FunctionPass *createMachineRegionInfoPass() {
146 return new MachineRegionInfoPass();
Matt Arsenault5e1c96a2014-07-19 18:29:29 +0000147}
148
Eugene Zelenkoff49b832017-06-01 23:25:02 +0000149} // end namespace llvm