Counter Strike : Global Offensive Source Code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

190 lines
6.3 KiB

  1. //===- llvm/CodeGen/MachineLoopInfo.h - Natural Loop Calculator -*- 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. //
  10. // This file defines the MachineLoopInfo class that is used to identify natural
  11. // loops and determine the loop depth of various nodes of the CFG. Note that
  12. // natural loops may actually be several loops that share the same header node.
  13. //
  14. // This analysis calculates the nesting structure of loops in a function. For
  15. // each natural loop identified, this analysis identifies natural loops
  16. // contained entirely within the loop and the basic blocks the make up the loop.
  17. //
  18. // It can calculate on the fly various bits of information, for example:
  19. //
  20. // * whether there is a preheader for the loop
  21. // * the number of back edges to the header
  22. // * whether or not a particular block branches out of the loop
  23. // * the successor blocks of the loop
  24. // * the loop depth
  25. // * the trip count
  26. // * etc...
  27. //
  28. //===----------------------------------------------------------------------===//
  29. #ifndef LLVM_CODEGEN_MACHINELOOPINFO_H
  30. #define LLVM_CODEGEN_MACHINELOOPINFO_H
  31. #include "llvm/Analysis/LoopInfo.h"
  32. #include "llvm/CodeGen/MachineFunctionPass.h"
  33. namespace llvm {
  34. // Implementation in LoopInfoImpl.h
  35. #ifdef __GNUC__
  36. class MachineLoop;
  37. __extension__ extern template class LoopBase<MachineBasicBlock, MachineLoop>;
  38. #endif
  39. class MachineLoop : public LoopBase<MachineBasicBlock, MachineLoop> {
  40. public:
  41. MachineLoop();
  42. /// getTopBlock - Return the "top" block in the loop, which is the first
  43. /// block in the linear layout, ignoring any parts of the loop not
  44. /// contiguous with the part the contains the header.
  45. MachineBasicBlock *getTopBlock();
  46. /// getBottomBlock - Return the "bottom" block in the loop, which is the last
  47. /// block in the linear layout, ignoring any parts of the loop not
  48. /// contiguous with the part the contains the header.
  49. MachineBasicBlock *getBottomBlock();
  50. void dump() const;
  51. private:
  52. friend class LoopInfoBase<MachineBasicBlock, MachineLoop>;
  53. explicit MachineLoop(MachineBasicBlock *MBB)
  54. : LoopBase<MachineBasicBlock, MachineLoop>(MBB) {}
  55. };
  56. // Implementation in LoopInfoImpl.h
  57. #ifdef __GNUC__
  58. __extension__ extern template
  59. class LoopInfoBase<MachineBasicBlock, MachineLoop>;
  60. #endif
  61. class MachineLoopInfo : public MachineFunctionPass {
  62. LoopInfoBase<MachineBasicBlock, MachineLoop> LI;
  63. friend class LoopBase<MachineBasicBlock, MachineLoop>;
  64. void operator=(const MachineLoopInfo &) LLVM_DELETED_FUNCTION;
  65. MachineLoopInfo(const MachineLoopInfo &) LLVM_DELETED_FUNCTION;
  66. public:
  67. static char ID; // Pass identification, replacement for typeid
  68. MachineLoopInfo() : MachineFunctionPass(ID) {
  69. initializeMachineLoopInfoPass(*PassRegistry::getPassRegistry());
  70. }
  71. LoopInfoBase<MachineBasicBlock, MachineLoop>& getBase() { return LI; }
  72. /// iterator/begin/end - The interface to the top-level loops in the current
  73. /// function.
  74. ///
  75. typedef LoopInfoBase<MachineBasicBlock, MachineLoop>::iterator iterator;
  76. inline iterator begin() const { return LI.begin(); }
  77. inline iterator end() const { return LI.end(); }
  78. bool empty() const { return LI.empty(); }
  79. /// getLoopFor - Return the inner most loop that BB lives in. If a basic
  80. /// block is in no loop (for example the entry node), null is returned.
  81. ///
  82. inline MachineLoop *getLoopFor(const MachineBasicBlock *BB) const {
  83. return LI.getLoopFor(BB);
  84. }
  85. /// operator[] - same as getLoopFor...
  86. ///
  87. inline const MachineLoop *operator[](const MachineBasicBlock *BB) const {
  88. return LI.getLoopFor(BB);
  89. }
  90. /// getLoopDepth - Return the loop nesting level of the specified block...
  91. ///
  92. inline unsigned getLoopDepth(const MachineBasicBlock *BB) const {
  93. return LI.getLoopDepth(BB);
  94. }
  95. // isLoopHeader - True if the block is a loop header node
  96. inline bool isLoopHeader(MachineBasicBlock *BB) const {
  97. return LI.isLoopHeader(BB);
  98. }
  99. /// runOnFunction - Calculate the natural loop information.
  100. ///
  101. virtual bool runOnMachineFunction(MachineFunction &F);
  102. virtual void releaseMemory() { LI.releaseMemory(); }
  103. virtual void getAnalysisUsage(AnalysisUsage &AU) const;
  104. /// removeLoop - This removes the specified top-level loop from this loop info
  105. /// object. The loop is not deleted, as it will presumably be inserted into
  106. /// another loop.
  107. inline MachineLoop *removeLoop(iterator I) { return LI.removeLoop(I); }
  108. /// changeLoopFor - Change the top-level loop that contains BB to the
  109. /// specified loop. This should be used by transformations that restructure
  110. /// the loop hierarchy tree.
  111. inline void changeLoopFor(MachineBasicBlock *BB, MachineLoop *L) {
  112. LI.changeLoopFor(BB, L);
  113. }
  114. /// changeTopLevelLoop - Replace the specified loop in the top-level loops
  115. /// list with the indicated loop.
  116. inline void changeTopLevelLoop(MachineLoop *OldLoop, MachineLoop *NewLoop) {
  117. LI.changeTopLevelLoop(OldLoop, NewLoop);
  118. }
  119. /// addTopLevelLoop - This adds the specified loop to the collection of
  120. /// top-level loops.
  121. inline void addTopLevelLoop(MachineLoop *New) {
  122. LI.addTopLevelLoop(New);
  123. }
  124. /// removeBlock - This method completely removes BB from all data structures,
  125. /// including all of the Loop objects it is nested in and our mapping from
  126. /// MachineBasicBlocks to loops.
  127. void removeBlock(MachineBasicBlock *BB) {
  128. LI.removeBlock(BB);
  129. }
  130. };
  131. // Allow clients to walk the list of nested loops...
  132. template <> struct GraphTraits<const MachineLoop*> {
  133. typedef const MachineLoop NodeType;
  134. typedef MachineLoopInfo::iterator ChildIteratorType;
  135. static NodeType *getEntryNode(const MachineLoop *L) { return L; }
  136. static inline ChildIteratorType child_begin(NodeType *N) {
  137. return N->begin();
  138. }
  139. static inline ChildIteratorType child_end(NodeType *N) {
  140. return N->end();
  141. }
  142. };
  143. template <> struct GraphTraits<MachineLoop*> {
  144. typedef MachineLoop NodeType;
  145. typedef MachineLoopInfo::iterator ChildIteratorType;
  146. static NodeType *getEntryNode(MachineLoop *L) { return L; }
  147. static inline ChildIteratorType child_begin(NodeType *N) {
  148. return N->begin();
  149. }
  150. static inline ChildIteratorType child_end(NodeType *N) {
  151. return N->end();
  152. }
  153. };
  154. } // End llvm namespace
  155. #endif