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 ~MachineRegionNode() { }
62 bool operator==(const MachineRegion &RN) const {
63 return this == reinterpret_cast<const MachineRegionNode*>(&RN);
67 class MachineRegion : public RegionBase<RegionTraits<MachineFunction>> {
69 MachineRegion(MachineBasicBlock *Entry, MachineBasicBlock *Exit,
70 MachineRegionInfo* RI,
71 MachineDominatorTree *DT, MachineRegion *Parent = nullptr);
74 bool operator==(const MachineRegionNode &RN) const {
75 return &RN == reinterpret_cast<const MachineRegionNode*>(this);
79 class MachineRegionInfo : public RegionInfoBase<RegionTraits<MachineFunction>> {
81 explicit MachineRegionInfo();
83 virtual ~MachineRegionInfo();
85 // updateStatistics - Update statistic about created regions.
86 void updateStatistics(MachineRegion *R) final;
88 void recalculate(MachineFunction &F,
89 MachineDominatorTree *DT,
90 MachinePostDominatorTree *PDT,
91 MachineDominanceFrontier *DF);
94 class MachineRegionInfoPass : public MachineFunctionPass {
99 explicit MachineRegionInfoPass();
101 ~MachineRegionInfoPass();
103 MachineRegionInfo &getRegionInfo() {
107 const MachineRegionInfo &getRegionInfo() const {
111 /// @name MachineFunctionPass interface
113 bool runOnMachineFunction(MachineFunction &F) override;
114 void releaseMemory() override;
115 void verifyAnalysis() const override;
116 void getAnalysisUsage(AnalysisUsage &AU) const override;
117 void print(raw_ostream &OS, const Module *) const override;
125 inline MachineBasicBlock* RegionNodeBase<RegionTraits<MachineFunction>>::getNodeAs<MachineBasicBlock>() const {
126 assert(!isSubRegion() && "This is not a MachineBasicBlock RegionNode!");
132 inline MachineRegion* RegionNodeBase<RegionTraits<MachineFunction>>::getNodeAs<MachineRegion>() const {
133 assert(isSubRegion() && "This is not a subregion RegionNode!");
134 auto Unconst = const_cast<RegionNodeBase<RegionTraits<MachineFunction>>*>(this);
135 return reinterpret_cast<MachineRegion*>(Unconst);
139 RegionNodeGraphTraits(MachineRegionNode, MachineBasicBlock, MachineRegion);
140 RegionNodeGraphTraits(const MachineRegionNode, MachineBasicBlock, MachineRegion);
142 RegionGraphTraits(MachineRegion, MachineRegionNode);
143 RegionGraphTraits(const MachineRegion, const MachineRegionNode);
145 template <> struct GraphTraits<MachineRegionInfo*>
146 : public GraphTraits<FlatIt<MachineRegionNode*> > {
147 typedef df_iterator<NodeType*, SmallPtrSet<NodeType*, 8>, false,
148 GraphTraits<FlatIt<NodeType*> > > nodes_iterator;
150 static NodeType *getEntryNode(MachineRegionInfo *RI) {
151 return GraphTraits<FlatIt<MachineRegion*> >::getEntryNode(RI->getTopLevelRegion());
153 static nodes_iterator nodes_begin(MachineRegionInfo* RI) {
154 return nodes_iterator::begin(getEntryNode(RI));
156 static nodes_iterator nodes_end(MachineRegionInfo *RI) {
157 return nodes_iterator::end(getEntryNode(RI));
161 template <> struct GraphTraits<MachineRegionInfoPass*>
162 : public GraphTraits<MachineRegionInfo *> {
163 typedef df_iterator<NodeType*, SmallPtrSet<NodeType*, 8>, false,
164 GraphTraits<FlatIt<NodeType*> > > nodes_iterator;
166 static NodeType *getEntryNode(MachineRegionInfoPass *RI) {
167 return GraphTraits<MachineRegionInfo*>::getEntryNode(&RI->getRegionInfo());
169 static nodes_iterator nodes_begin(MachineRegionInfoPass* RI) {
170 return GraphTraits<MachineRegionInfo*>::nodes_begin(&RI->getRegionInfo());
172 static nodes_iterator nodes_end(MachineRegionInfoPass *RI) {
173 return GraphTraits<MachineRegionInfo*>::nodes_end(&RI->getRegionInfo());
177 EXTERN_TEMPLATE_INSTANTIATION(class RegionBase<RegionTraits<MachineFunction>>);
178 EXTERN_TEMPLATE_INSTANTIATION(class RegionNodeBase<RegionTraits<MachineFunction>>);
179 EXTERN_TEMPLATE_INSTANTIATION(class RegionInfoBase<RegionTraits<MachineFunction>>);