1 //===- llvm/CodeGen/MachineRegionInfo.h -------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef LLVM_CODEGEN_MACHINEREGIONINFO_H
11 #define LLVM_CODEGEN_MACHINEREGIONINFO_H
13 #include "llvm/Analysis/RegionInfo.h"
14 #include "llvm/Analysis/RegionIterator.h"
15 #include "llvm/CodeGen/MachineDominanceFrontier.h"
16 #include "llvm/CodeGen/MachineDominators.h"
17 #include "llvm/CodeGen/MachineFunction.h"
18 #include "llvm/CodeGen/MachineFunctionPass.h"
19 #include "llvm/CodeGen/MachineLoopInfo.h"
24 class MachineDominatorTree;
25 struct MachinePostDominatorTree;
27 class MachineRegionNode;
28 class MachineRegionInfo;
31 struct RegionTraits<MachineFunction> {
32 typedef MachineFunction FuncT;
33 typedef MachineBasicBlock BlockT;
34 typedef MachineRegion RegionT;
35 typedef MachineRegionNode RegionNodeT;
36 typedef MachineRegionInfo RegionInfoT;
37 typedef MachineDominatorTree DomTreeT;
38 typedef MachineDomTreeNode DomTreeNodeT;
39 typedef MachinePostDominatorTree PostDomTreeT;
40 typedef MachineDominanceFrontier DomFrontierT;
41 typedef MachineInstr InstT;
42 typedef MachineLoop LoopT;
43 typedef MachineLoopInfo LoopInfoT;
45 static unsigned getNumSuccessors(MachineBasicBlock *BB) {
46 return BB->succ_size();
51 class MachineRegionNode : public RegionNodeBase<RegionTraits<MachineFunction>> {
53 inline MachineRegionNode(MachineRegion *Parent,
54 MachineBasicBlock *Entry,
55 bool isSubRegion = false)
56 : RegionNodeBase<RegionTraits<MachineFunction>>(Parent, Entry, isSubRegion) {
60 bool operator==(const MachineRegion &RN) const {
61 return this == reinterpret_cast<const MachineRegionNode*>(&RN);
65 class MachineRegion : public RegionBase<RegionTraits<MachineFunction>> {
67 MachineRegion(MachineBasicBlock *Entry, MachineBasicBlock *Exit,
68 MachineRegionInfo* RI,
69 MachineDominatorTree *DT, MachineRegion *Parent = nullptr);
72 bool operator==(const MachineRegionNode &RN) const {
73 return &RN == reinterpret_cast<const MachineRegionNode*>(this);
77 class MachineRegionInfo : public RegionInfoBase<RegionTraits<MachineFunction>> {
79 explicit MachineRegionInfo();
81 ~MachineRegionInfo() override;
83 // updateStatistics - Update statistic about created regions.
84 void updateStatistics(MachineRegion *R) final;
86 void recalculate(MachineFunction &F,
87 MachineDominatorTree *DT,
88 MachinePostDominatorTree *PDT,
89 MachineDominanceFrontier *DF);
92 class MachineRegionInfoPass : public MachineFunctionPass {
97 explicit MachineRegionInfoPass();
99 ~MachineRegionInfoPass() override;
101 MachineRegionInfo &getRegionInfo() {
105 const MachineRegionInfo &getRegionInfo() const {
109 /// @name MachineFunctionPass interface
111 bool runOnMachineFunction(MachineFunction &F) override;
112 void releaseMemory() override;
113 void verifyAnalysis() const override;
114 void getAnalysisUsage(AnalysisUsage &AU) const override;
115 void print(raw_ostream &OS, const Module *) const override;
123 inline MachineBasicBlock* RegionNodeBase<RegionTraits<MachineFunction>>::getNodeAs<MachineBasicBlock>() const {
124 assert(!isSubRegion() && "This is not a MachineBasicBlock RegionNode!");
130 inline MachineRegion* RegionNodeBase<RegionTraits<MachineFunction>>::getNodeAs<MachineRegion>() const {
131 assert(isSubRegion() && "This is not a subregion RegionNode!");
132 auto Unconst = const_cast<RegionNodeBase<RegionTraits<MachineFunction>>*>(this);
133 return reinterpret_cast<MachineRegion*>(Unconst);
137 RegionNodeGraphTraits(MachineRegionNode, MachineBasicBlock, MachineRegion);
138 RegionNodeGraphTraits(const MachineRegionNode, MachineBasicBlock, MachineRegion);
140 RegionGraphTraits(MachineRegion, MachineRegionNode);
141 RegionGraphTraits(const MachineRegion, const MachineRegionNode);
143 template <> struct GraphTraits<MachineRegionInfo*>
144 : public GraphTraits<FlatIt<MachineRegionNode*> > {
145 typedef df_iterator<NodeType*, SmallPtrSet<NodeType*, 8>, false,
146 GraphTraits<FlatIt<NodeType*> > > nodes_iterator;
148 static NodeType *getEntryNode(MachineRegionInfo *RI) {
149 return GraphTraits<FlatIt<MachineRegion*> >::getEntryNode(RI->getTopLevelRegion());
151 static nodes_iterator nodes_begin(MachineRegionInfo* RI) {
152 return nodes_iterator::begin(getEntryNode(RI));
154 static nodes_iterator nodes_end(MachineRegionInfo *RI) {
155 return nodes_iterator::end(getEntryNode(RI));
159 template <> struct GraphTraits<MachineRegionInfoPass*>
160 : public GraphTraits<MachineRegionInfo *> {
161 typedef df_iterator<NodeType*, SmallPtrSet<NodeType*, 8>, false,
162 GraphTraits<FlatIt<NodeType*> > > nodes_iterator;
164 static NodeType *getEntryNode(MachineRegionInfoPass *RI) {
165 return GraphTraits<MachineRegionInfo*>::getEntryNode(&RI->getRegionInfo());
167 static nodes_iterator nodes_begin(MachineRegionInfoPass* RI) {
168 return GraphTraits<MachineRegionInfo*>::nodes_begin(&RI->getRegionInfo());
170 static nodes_iterator nodes_end(MachineRegionInfoPass *RI) {
171 return GraphTraits<MachineRegionInfo*>::nodes_end(&RI->getRegionInfo());
175 extern template class RegionBase<RegionTraits<MachineFunction>>;
176 extern template class RegionNodeBase<RegionTraits<MachineFunction>>;
177 extern template class RegionInfoBase<RegionTraits<MachineFunction>>;