LLVM API Documentation
00001 //===- llvm/CodeGen/MachineRegionInfo.h -------------------------*- C++ -*-===// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 00010 #ifndef LLVM_CODEGEN_MACHINEREGIONINFO_H 00011 #define LLVM_CODEGEN_MACHINEREGIONINFO_H 00012 00013 #include "llvm/Analysis/RegionInfo.h" 00014 #include "llvm/Analysis/RegionIterator.h" 00015 #include "llvm/CodeGen/MachineDominanceFrontier.h" 00016 #include "llvm/CodeGen/MachineDominators.h" 00017 #include "llvm/CodeGen/MachineFunction.h" 00018 #include "llvm/CodeGen/MachineFunctionPass.h" 00019 #include "llvm/CodeGen/MachineLoopInfo.h" 00020 00021 00022 namespace llvm { 00023 00024 class MachineDominatorTree; 00025 struct MachinePostDominatorTree; 00026 class MachineRegion; 00027 class MachineRegionNode; 00028 class MachineRegionInfo; 00029 00030 template<> 00031 struct RegionTraits<MachineFunction> { 00032 typedef MachineFunction FuncT; 00033 typedef MachineBasicBlock BlockT; 00034 typedef MachineRegion RegionT; 00035 typedef MachineRegionNode RegionNodeT; 00036 typedef MachineRegionInfo RegionInfoT; 00037 typedef MachineDominatorTree DomTreeT; 00038 typedef MachineDomTreeNode DomTreeNodeT; 00039 typedef MachinePostDominatorTree PostDomTreeT; 00040 typedef MachineDominanceFrontier DomFrontierT; 00041 typedef MachineInstr InstT; 00042 typedef MachineLoop LoopT; 00043 typedef MachineLoopInfo LoopInfoT; 00044 00045 static unsigned getNumSuccessors(MachineBasicBlock *BB) { 00046 return BB->succ_size(); 00047 } 00048 }; 00049 00050 00051 class MachineRegionNode : public RegionNodeBase<RegionTraits<MachineFunction>> { 00052 public: 00053 inline MachineRegionNode(MachineRegion *Parent, 00054 MachineBasicBlock *Entry, 00055 bool isSubRegion = false) 00056 : RegionNodeBase<RegionTraits<MachineFunction>>(Parent, Entry, isSubRegion) { 00057 00058 } 00059 00060 ~MachineRegionNode() { } 00061 00062 bool operator==(const MachineRegion &RN) const { 00063 return this == reinterpret_cast<const MachineRegionNode*>(&RN); 00064 } 00065 }; 00066 00067 class MachineRegion : public RegionBase<RegionTraits<MachineFunction>> { 00068 public: 00069 MachineRegion(MachineBasicBlock *Entry, MachineBasicBlock *Exit, 00070 MachineRegionInfo* RI, 00071 MachineDominatorTree *DT, MachineRegion *Parent = nullptr); 00072 ~MachineRegion(); 00073 00074 bool operator==(const MachineRegionNode &RN) const { 00075 return &RN == reinterpret_cast<const MachineRegionNode*>(this); 00076 } 00077 }; 00078 00079 class MachineRegionInfo : public RegionInfoBase<RegionTraits<MachineFunction>> { 00080 public: 00081 explicit MachineRegionInfo(); 00082 00083 virtual ~MachineRegionInfo(); 00084 00085 // updateStatistics - Update statistic about created regions. 00086 void updateStatistics(MachineRegion *R) final; 00087 00088 void recalculate(MachineFunction &F, 00089 MachineDominatorTree *DT, 00090 MachinePostDominatorTree *PDT, 00091 MachineDominanceFrontier *DF); 00092 }; 00093 00094 class MachineRegionInfoPass : public MachineFunctionPass { 00095 MachineRegionInfo RI; 00096 00097 public: 00098 static char ID; 00099 explicit MachineRegionInfoPass(); 00100 00101 ~MachineRegionInfoPass(); 00102 00103 MachineRegionInfo &getRegionInfo() { 00104 return RI; 00105 } 00106 00107 const MachineRegionInfo &getRegionInfo() const { 00108 return RI; 00109 } 00110 00111 /// @name MachineFunctionPass interface 00112 //@{ 00113 bool runOnMachineFunction(MachineFunction &F) override; 00114 void releaseMemory() override; 00115 void verifyAnalysis() const override; 00116 void getAnalysisUsage(AnalysisUsage &AU) const override; 00117 void print(raw_ostream &OS, const Module *) const override; 00118 void dump() const; 00119 //@} 00120 }; 00121 00122 00123 template <> 00124 template <> 00125 inline MachineBasicBlock* RegionNodeBase<RegionTraits<MachineFunction>>::getNodeAs<MachineBasicBlock>() const { 00126 assert(!isSubRegion() && "This is not a MachineBasicBlock RegionNode!"); 00127 return getEntry(); 00128 } 00129 00130 template<> 00131 template<> 00132 inline MachineRegion* RegionNodeBase<RegionTraits<MachineFunction>>::getNodeAs<MachineRegion>() const { 00133 assert(isSubRegion() && "This is not a subregion RegionNode!"); 00134 auto Unconst = const_cast<RegionNodeBase<RegionTraits<MachineFunction>>*>(this); 00135 return reinterpret_cast<MachineRegion*>(Unconst); 00136 } 00137 00138 00139 RegionNodeGraphTraits(MachineRegionNode, MachineBasicBlock, MachineRegion); 00140 RegionNodeGraphTraits(const MachineRegionNode, MachineBasicBlock, MachineRegion); 00141 00142 RegionGraphTraits(MachineRegion, MachineRegionNode); 00143 RegionGraphTraits(const MachineRegion, const MachineRegionNode); 00144 00145 template <> struct GraphTraits<MachineRegionInfo*> 00146 : public GraphTraits<FlatIt<MachineRegionNode*> > { 00147 typedef df_iterator<NodeType*, SmallPtrSet<NodeType*, 8>, false, 00148 GraphTraits<FlatIt<NodeType*> > > nodes_iterator; 00149 00150 static NodeType *getEntryNode(MachineRegionInfo *RI) { 00151 return GraphTraits<FlatIt<MachineRegion*> >::getEntryNode(RI->getTopLevelRegion()); 00152 } 00153 static nodes_iterator nodes_begin(MachineRegionInfo* RI) { 00154 return nodes_iterator::begin(getEntryNode(RI)); 00155 } 00156 static nodes_iterator nodes_end(MachineRegionInfo *RI) { 00157 return nodes_iterator::end(getEntryNode(RI)); 00158 } 00159 }; 00160 00161 template <> struct GraphTraits<MachineRegionInfoPass*> 00162 : public GraphTraits<MachineRegionInfo *> { 00163 typedef df_iterator<NodeType*, SmallPtrSet<NodeType*, 8>, false, 00164 GraphTraits<FlatIt<NodeType*> > > nodes_iterator; 00165 00166 static NodeType *getEntryNode(MachineRegionInfoPass *RI) { 00167 return GraphTraits<MachineRegionInfo*>::getEntryNode(&RI->getRegionInfo()); 00168 } 00169 static nodes_iterator nodes_begin(MachineRegionInfoPass* RI) { 00170 return GraphTraits<MachineRegionInfo*>::nodes_begin(&RI->getRegionInfo()); 00171 } 00172 static nodes_iterator nodes_end(MachineRegionInfoPass *RI) { 00173 return GraphTraits<MachineRegionInfo*>::nodes_end(&RI->getRegionInfo()); 00174 } 00175 }; 00176 00177 EXTERN_TEMPLATE_INSTANTIATION(class RegionBase<RegionTraits<MachineFunction>>); 00178 EXTERN_TEMPLATE_INSTANTIATION(class RegionNodeBase<RegionTraits<MachineFunction>>); 00179 EXTERN_TEMPLATE_INSTANTIATION(class RegionInfoBase<RegionTraits<MachineFunction>>); 00180 00181 } 00182 00183 #endif