MachineRegionInfo.h 5.9 KB

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