MachineRegionInfo.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. //===- llvm/CodeGen/MachineRegionInfo.h -------------------------*- C++ -*-===//
  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. #ifndef LLVM_CODEGEN_MACHINEREGIONINFO_H
  10. #define LLVM_CODEGEN_MACHINEREGIONINFO_H
  11. #include "llvm/Analysis/RegionInfo.h"
  12. #include "llvm/Analysis/RegionIterator.h"
  13. #include "llvm/CodeGen/MachineDominanceFrontier.h"
  14. #include "llvm/CodeGen/MachineDominators.h"
  15. #include "llvm/CodeGen/MachineFunction.h"
  16. #include "llvm/CodeGen/MachineFunctionPass.h"
  17. #include "llvm/CodeGen/MachineLoopInfo.h"
  18. namespace llvm {
  19. class MachineDominatorTree;
  20. struct MachinePostDominatorTree;
  21. class MachineRegion;
  22. class MachineRegionNode;
  23. class MachineRegionInfo;
  24. template<>
  25. struct RegionTraits<MachineFunction> {
  26. typedef MachineFunction FuncT;
  27. typedef MachineBasicBlock BlockT;
  28. typedef MachineRegion RegionT;
  29. typedef MachineRegionNode RegionNodeT;
  30. typedef MachineRegionInfo RegionInfoT;
  31. typedef MachineDominatorTree DomTreeT;
  32. typedef MachineDomTreeNode DomTreeNodeT;
  33. typedef MachinePostDominatorTree PostDomTreeT;
  34. typedef MachineDominanceFrontier DomFrontierT;
  35. typedef MachineInstr InstT;
  36. typedef MachineLoop LoopT;
  37. typedef MachineLoopInfo LoopInfoT;
  38. static unsigned getNumSuccessors(MachineBasicBlock *BB) {
  39. return BB->succ_size();
  40. }
  41. };
  42. class MachineRegionNode : public RegionNodeBase<RegionTraits<MachineFunction>> {
  43. public:
  44. inline MachineRegionNode(MachineRegion *Parent,
  45. MachineBasicBlock *Entry,
  46. bool isSubRegion = false)
  47. : RegionNodeBase<RegionTraits<MachineFunction>>(Parent, Entry, isSubRegion) {
  48. }
  49. bool operator==(const MachineRegion &RN) const {
  50. return this == reinterpret_cast<const MachineRegionNode*>(&RN);
  51. }
  52. };
  53. class MachineRegion : public RegionBase<RegionTraits<MachineFunction>> {
  54. public:
  55. MachineRegion(MachineBasicBlock *Entry, MachineBasicBlock *Exit,
  56. MachineRegionInfo* RI,
  57. MachineDominatorTree *DT, MachineRegion *Parent = nullptr);
  58. ~MachineRegion();
  59. bool operator==(const MachineRegionNode &RN) const {
  60. return &RN == reinterpret_cast<const MachineRegionNode*>(this);
  61. }
  62. };
  63. class MachineRegionInfo : public RegionInfoBase<RegionTraits<MachineFunction>> {
  64. public:
  65. explicit MachineRegionInfo();
  66. ~MachineRegionInfo() override;
  67. // updateStatistics - Update statistic about created regions.
  68. void updateStatistics(MachineRegion *R) final;
  69. void recalculate(MachineFunction &F,
  70. MachineDominatorTree *DT,
  71. MachinePostDominatorTree *PDT,
  72. MachineDominanceFrontier *DF);
  73. };
  74. class MachineRegionInfoPass : public MachineFunctionPass {
  75. MachineRegionInfo RI;
  76. public:
  77. static char ID;
  78. explicit MachineRegionInfoPass();
  79. ~MachineRegionInfoPass() override;
  80. MachineRegionInfo &getRegionInfo() {
  81. return RI;
  82. }
  83. const MachineRegionInfo &getRegionInfo() const {
  84. return RI;
  85. }
  86. /// @name MachineFunctionPass interface
  87. //@{
  88. bool runOnMachineFunction(MachineFunction &F) override;
  89. void releaseMemory() override;
  90. void verifyAnalysis() const override;
  91. void getAnalysisUsage(AnalysisUsage &AU) const override;
  92. void print(raw_ostream &OS, const Module *) const override;
  93. void dump() const;
  94. //@}
  95. };
  96. template <>
  97. template <>
  98. inline MachineBasicBlock* RegionNodeBase<RegionTraits<MachineFunction>>::getNodeAs<MachineBasicBlock>() const {
  99. assert(!isSubRegion() && "This is not a MachineBasicBlock RegionNode!");
  100. return getEntry();
  101. }
  102. template<>
  103. template<>
  104. inline MachineRegion* RegionNodeBase<RegionTraits<MachineFunction>>::getNodeAs<MachineRegion>() const {
  105. assert(isSubRegion() && "This is not a subregion RegionNode!");
  106. auto Unconst = const_cast<RegionNodeBase<RegionTraits<MachineFunction>>*>(this);
  107. return reinterpret_cast<MachineRegion*>(Unconst);
  108. }
  109. RegionNodeGraphTraits(MachineRegionNode, MachineBasicBlock, MachineRegion);
  110. RegionNodeGraphTraits(const MachineRegionNode, MachineBasicBlock, MachineRegion);
  111. RegionGraphTraits(MachineRegion, MachineRegionNode);
  112. RegionGraphTraits(const MachineRegion, const MachineRegionNode);
  113. template <> struct GraphTraits<MachineRegionInfo*>
  114. : public GraphTraits<FlatIt<MachineRegionNode*> > {
  115. typedef df_iterator<NodeType*, SmallPtrSet<NodeType*, 8>, false,
  116. GraphTraits<FlatIt<NodeType*> > > nodes_iterator;
  117. static NodeType *getEntryNode(MachineRegionInfo *RI) {
  118. return GraphTraits<FlatIt<MachineRegion*> >::getEntryNode(RI->getTopLevelRegion());
  119. }
  120. static nodes_iterator nodes_begin(MachineRegionInfo* RI) {
  121. return nodes_iterator::begin(getEntryNode(RI));
  122. }
  123. static nodes_iterator nodes_end(MachineRegionInfo *RI) {
  124. return nodes_iterator::end(getEntryNode(RI));
  125. }
  126. };
  127. template <> struct GraphTraits<MachineRegionInfoPass*>
  128. : public GraphTraits<MachineRegionInfo *> {
  129. typedef df_iterator<NodeType*, SmallPtrSet<NodeType*, 8>, false,
  130. GraphTraits<FlatIt<NodeType*> > > nodes_iterator;
  131. static NodeType *getEntryNode(MachineRegionInfoPass *RI) {
  132. return GraphTraits<MachineRegionInfo*>::getEntryNode(&RI->getRegionInfo());
  133. }
  134. static nodes_iterator nodes_begin(MachineRegionInfoPass* RI) {
  135. return GraphTraits<MachineRegionInfo*>::nodes_begin(&RI->getRegionInfo());
  136. }
  137. static nodes_iterator nodes_end(MachineRegionInfoPass *RI) {
  138. return GraphTraits<MachineRegionInfo*>::nodes_end(&RI->getRegionInfo());
  139. }
  140. };
  141. extern template class RegionBase<RegionTraits<MachineFunction>>;
  142. extern template class RegionNodeBase<RegionTraits<MachineFunction>>;
  143. extern template class RegionInfoBase<RegionTraits<MachineFunction>>;
  144. }
  145. #endif