LoopInfo.h revision a298d27808ecb8ffb574d6e50f56601db2ec5fda
1//===- llvm/Analysis/LoopInfo.h - Natural Loop Calculator --------*- C++ -*--=//
2//
3// This file defines the LoopInfo class that is used to identify natural loops
4// and determine the loop depth of various nodes of the CFG.  Note that the
5// loops identified may actually be several natural loops that share the same
6// header node... not just a single natural loop.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLVM_ANALYSIS_LOOP_INFO_H
11#define LLVM_ANALYSIS_LOOP_INFO_H
12
13#include "llvm/Pass.h"
14#include <set>
15
16namespace cfg {
17  class DominatorSet;
18  class LoopInfo;
19
20//===----------------------------------------------------------------------===//
21// Loop class - Instances of this class are used to represent loops that are
22// detected in the flow graph
23//
24class Loop {
25  Loop *ParentLoop;
26  std::vector<BasicBlock *> Blocks;  // First entry is the header node
27  std::vector<Loop*> SubLoops;       // Loops contained entirely within this one
28  unsigned LoopDepth;                // Nesting depth of this loop
29
30  Loop(const Loop &);                  // DO NOT IMPLEMENT
31  const Loop &operator=(const Loop &); // DO NOT IMPLEMENT
32public:
33
34  inline unsigned getLoopDepth() const { return LoopDepth; }
35  inline BasicBlock *getHeader() const { return Blocks.front(); }
36
37  // contains - Return true of the specified basic block is in this loop
38  bool contains(BasicBlock *BB) const;
39
40  // getSubLoops - Return the loops contained entirely within this loop
41  inline const std::vector<Loop*> &getSubLoops() const { return SubLoops; }
42  inline const std::vector<BasicBlock*> &getBlocks() const { return Blocks; }
43
44private:
45  friend class LoopInfo;
46  inline Loop(BasicBlock *BB) { Blocks.push_back(BB); LoopDepth = 0; }
47  ~Loop() {
48    for (unsigned i = 0, e = SubLoops.size(); i != e; ++i)
49      delete SubLoops[i];
50  }
51
52  void setLoopDepth(unsigned Level) {
53    LoopDepth = Level;
54    for (unsigned i = 0, e = SubLoops.size(); i != e; ++i)
55      SubLoops[i]->setLoopDepth(Level+1);
56  }
57};
58
59
60
61//===----------------------------------------------------------------------===//
62// LoopInfo - This class builds and contains all of the top level loop
63// structures in the specified function.
64//
65class LoopInfo : public FunctionPass {
66  // BBMap - Mapping of basic blocks to the inner most loop they occur in
67  std::map<BasicBlock*, Loop*> BBMap;
68  std::vector<Loop*> TopLevelLoops;
69public:
70  static AnalysisID ID;            // cfg::LoopInfo Analysis ID
71
72  // LoopInfo ctor - Calculate the natural loop information for a CFG
73  LoopInfo(AnalysisID id) { assert(id == ID); }
74  ~LoopInfo() { releaseMemory(); }
75
76  const std::vector<Loop*> &getTopLevelLoops() const { return TopLevelLoops; }
77
78  // getLoopFor - Return the inner most loop that BB lives in.  If a basic block
79  // is in no loop (for example the entry node), null is returned.
80  //
81  const Loop *getLoopFor(BasicBlock *BB) const {
82    std::map<BasicBlock *, Loop*>::const_iterator I = BBMap.find(BB);
83    return I != BBMap.end() ? I->second : 0;
84  }
85  inline const Loop *operator[](BasicBlock *BB) const {
86    return getLoopFor(BB);
87  }
88
89  // getLoopDepth - Return the loop nesting level of the specified block...
90  unsigned getLoopDepth(BasicBlock *BB) const {
91    const Loop *L = getLoopFor(BB);
92    return L ? L->getLoopDepth() : 0;
93  }
94
95#if 0
96  // isLoopHeader - True if the block is a loop header node
97  bool isLoopHeader(BasicBlock *BB) const {
98    return getLoopFor(BB)->getHeader() == BB;
99  }
100  // isLoopEnd - True if block jumps to loop entry
101  bool isLoopEnd(BasicBlock *BB) const;
102  // isLoopExit - True if block is the loop exit
103  bool isLoopExit(BasicBlock *BB) const;
104#endif
105
106  // runOnFunction - Pass framework implementation
107  virtual bool runOnFunction(Function *F);
108
109  virtual void releaseMemory();
110
111  // getAnalysisUsage - Provide loop info, require dominator set
112  //
113  virtual void getAnalysisUsage(AnalysisUsage &AU) const;
114
115private:
116  void Calculate(const DominatorSet &DS);
117  Loop *ConsiderForLoop(BasicBlock *BB, const DominatorSet &DS);
118};
119
120}  // End namespace cfg
121
122#endif
123