MachineRegionInfo.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #include "llvm/CodeGen/MachineRegionInfo.h"
  2. #include "llvm/ADT/Statistic.h"
  3. #include "llvm/Analysis/RegionInfoImpl.h"
  4. #include "llvm/CodeGen/MachinePostDominators.h"
  5. #define DEBUG_TYPE "region"
  6. using namespace llvm;
  7. STATISTIC(numMachineRegions, "The # of machine regions");
  8. STATISTIC(numMachineSimpleRegions, "The # of simple machine regions");
  9. namespace llvm {
  10. template class RegionBase<RegionTraits<MachineFunction>>;
  11. template class RegionNodeBase<RegionTraits<MachineFunction>>;
  12. template class RegionInfoBase<RegionTraits<MachineFunction>>;
  13. }
  14. //===----------------------------------------------------------------------===//
  15. // MachineRegion implementation
  16. //
  17. MachineRegion::MachineRegion(MachineBasicBlock *Entry, MachineBasicBlock *Exit,
  18. MachineRegionInfo* RI,
  19. MachineDominatorTree *DT, MachineRegion *Parent) :
  20. RegionBase<RegionTraits<MachineFunction>>(Entry, Exit, RI, DT, Parent) {
  21. }
  22. MachineRegion::~MachineRegion() { }
  23. //===----------------------------------------------------------------------===//
  24. // MachineRegionInfo implementation
  25. //
  26. MachineRegionInfo::MachineRegionInfo() :
  27. RegionInfoBase<RegionTraits<MachineFunction>>() {
  28. }
  29. MachineRegionInfo::~MachineRegionInfo() {
  30. }
  31. void MachineRegionInfo::updateStatistics(MachineRegion *R) {
  32. ++numMachineRegions;
  33. // TODO: Slow. Should only be enabled if -stats is used.
  34. if (R->isSimple())
  35. ++numMachineSimpleRegions;
  36. }
  37. void MachineRegionInfo::recalculate(MachineFunction &F,
  38. MachineDominatorTree *DT_,
  39. MachinePostDominatorTree *PDT_,
  40. MachineDominanceFrontier *DF_) {
  41. DT = DT_;
  42. PDT = PDT_;
  43. DF = DF_;
  44. MachineBasicBlock *Entry = GraphTraits<MachineFunction*>::getEntryNode(&F);
  45. TopLevelRegion = new MachineRegion(Entry, nullptr, this, DT, nullptr);
  46. updateStatistics(TopLevelRegion);
  47. calculate(F);
  48. }
  49. //===----------------------------------------------------------------------===//
  50. // MachineRegionInfoPass implementation
  51. //
  52. MachineRegionInfoPass::MachineRegionInfoPass() : MachineFunctionPass(ID) {
  53. initializeMachineRegionInfoPassPass(*PassRegistry::getPassRegistry());
  54. }
  55. MachineRegionInfoPass::~MachineRegionInfoPass() {
  56. }
  57. bool MachineRegionInfoPass::runOnMachineFunction(MachineFunction &F) {
  58. releaseMemory();
  59. auto DT = &getAnalysis<MachineDominatorTree>();
  60. auto PDT = &getAnalysis<MachinePostDominatorTree>();
  61. auto DF = &getAnalysis<MachineDominanceFrontier>();
  62. RI.recalculate(F, DT, PDT, DF);
  63. return false;
  64. }
  65. void MachineRegionInfoPass::releaseMemory() {
  66. RI.releaseMemory();
  67. }
  68. void MachineRegionInfoPass::verifyAnalysis() const {
  69. // Only do verification when user wants to, otherwise this expensive check
  70. // will be invoked by PMDataManager::verifyPreservedAnalysis when
  71. // a regionpass (marked PreservedAll) finish.
  72. if (MachineRegionInfo::VerifyRegionInfo)
  73. RI.verifyAnalysis();
  74. }
  75. void MachineRegionInfoPass::getAnalysisUsage(AnalysisUsage &AU) const {
  76. AU.setPreservesAll();
  77. AU.addRequiredTransitive<DominatorTreeWrapperPass>();
  78. AU.addRequired<PostDominatorTree>();
  79. AU.addRequired<DominanceFrontier>();
  80. }
  81. void MachineRegionInfoPass::print(raw_ostream &OS, const Module *) const {
  82. RI.print(OS);
  83. }
  84. #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
  85. void MachineRegionInfoPass::dump() const {
  86. RI.dump();
  87. }
  88. #endif
  89. char MachineRegionInfoPass::ID = 0;
  90. INITIALIZE_PASS_BEGIN(MachineRegionInfoPass, "regions",
  91. "Detect single entry single exit regions", true, true)
  92. INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
  93. INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTree)
  94. INITIALIZE_PASS_DEPENDENCY(MachineDominanceFrontier)
  95. INITIALIZE_PASS_END(MachineRegionInfoPass, "regions",
  96. "Detect single entry single exit regions", true, true)
  97. // Create methods available outside of this file, to use them
  98. // "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by
  99. // the link time optimization.
  100. namespace llvm {
  101. FunctionPass *createMachineRegionInfoPass() {
  102. return new MachineRegionInfoPass();
  103. }
  104. }