LoopInfo.h revision 697954c15da58bd8b186dbafdedd8b06db770201
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 <vector>
14#include <map>
15#include <set>
16class BasicBlock;
17
18namespace cfg {
19  class DominatorSet;
20  class LoopInfo;
21
22//===----------------------------------------------------------------------===//
23// Loop class - Instances of this class are used to represent loops that are
24// detected in the flow graph
25//
26class Loop {
27  Loop *ParentLoop;
28  std::vector<const BasicBlock *> Blocks; // First entry is the header node
29  std::vector<Loop*> SubLoops;       // Loops contained entirely within this one
30  unsigned LoopDepth;                // Nesting depth of this loop
31
32  Loop(const Loop &);                  // DO NOT IMPLEMENT
33  const Loop &operator=(const Loop &); // DO NOT IMPLEMENT
34public:
35
36  inline unsigned getLoopDepth() const { return LoopDepth; }
37  inline const BasicBlock *getHeader() const { return Blocks.front(); }
38
39  // contains - Return true of the specified basic block is in this loop
40  bool contains(const BasicBlock *BB) const;
41
42  // getSubLoops - Return the loops contained entirely within this loop
43  inline const std::vector<Loop*> &getSubLoops() const { return SubLoops; }
44  inline const std::vector<const BasicBlock*> &getBlocks() const {
45    return Blocks;
46  }
47
48private:
49  friend class LoopInfo;
50  inline Loop(const BasicBlock *BB) { Blocks.push_back(BB); LoopDepth = 0; }
51
52  void setLoopDepth(unsigned Level) {
53    LoopDepth = Level;
54    for (unsigned i = 0; i < SubLoops.size(); ++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 method.
64//
65class LoopInfo {
66  // BBMap - Mapping of basic blocks to the inner most loop they occur in
67  std::map<const BasicBlock *, Loop*> BBMap;
68  std::vector<Loop*> TopLevelLoops;
69public:
70  // LoopInfo ctor - Calculate the natural loop information for a CFG
71  LoopInfo(const DominatorSet &DS);
72
73  const std::vector<Loop*> &getTopLevelLoops() const { return TopLevelLoops; }
74
75  // getLoopFor - Return the inner most loop that BB lives in.  If a basic block
76  // is in no loop (for example the entry node), null is returned.
77  //
78  const Loop *getLoopFor(const BasicBlock *BB) const {
79    std::map<const BasicBlock *, Loop*>::const_iterator I = BBMap.find(BB);
80    return I != BBMap.end() ? I->second : 0;
81  }
82  inline const Loop *operator[](const BasicBlock *BB) const {
83    return getLoopFor(BB);
84  }
85
86  // getLoopDepth - Return the loop nesting level of the specified block...
87  unsigned getLoopDepth(const BasicBlock *BB) const {
88    const Loop *L = getLoopFor(BB);
89    return L ? L->getLoopDepth() : 0;
90  }
91
92#if 0
93  // isLoopHeader - True if the block is a loop header node
94  bool isLoopHeader(const BasicBlock *BB) const {
95    return getLoopFor(BB)->getHeader() == BB;
96  }
97  // isLoopEnd - True if block jumps to loop entry
98  bool isLoopEnd(const BasicBlock *BB) const;
99  // isLoopExit - True if block is the loop exit
100  bool isLoopExit(const BasicBlock *BB) const;
101#endif
102
103private:
104  Loop *ConsiderForLoop(const BasicBlock *BB, const DominatorSet &DS);
105};
106
107}  // End namespace cfg
108
109#endif
110