blob: 6dd9440500bf0fc43b0a925eee7b0bfadd25d32c [file] [log] [blame]
John Bauman89401822014-05-06 15:04:28 -04001//===- 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
30#ifndef LLVM_CODEGEN_MACHINE_LOOP_INFO_H
31#define LLVM_CODEGEN_MACHINE_LOOP_INFO_H
32
33#include "llvm/CodeGen/MachineFunctionPass.h"
34#include "llvm/Analysis/LoopInfo.h"
35
36namespace llvm {
37
38class MachineLoop : public LoopBase<MachineBasicBlock, MachineLoop> {
39public:
40 MachineLoop();
41
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
47 /// getBottomBlock - Return the "bottom" block in the loop, which is the last
48 /// block in the linear layout, ignoring any parts of the loop not
49 /// contiguous with the part the contains the header.
50 MachineBasicBlock *getBottomBlock();
51
52 void dump() const;
53
54private:
55 friend class LoopInfoBase<MachineBasicBlock, MachineLoop>;
56 explicit MachineLoop(MachineBasicBlock *MBB)
57 : LoopBase<MachineBasicBlock, MachineLoop>(MBB) {}
58};
59
60class MachineLoopInfo : public MachineFunctionPass {
61 LoopInfoBase<MachineBasicBlock, MachineLoop> LI;
62 friend class LoopBase<MachineBasicBlock, MachineLoop>;
63
64 void operator=(const MachineLoopInfo &); // do not implement
65 MachineLoopInfo(const MachineLoopInfo &); // do not implement
66
67public:
68 static char ID; // Pass identification, replacement for typeid
69
John Bauman19bac1e2014-05-06 15:23:49 -040070 MachineLoopInfo() : MachineFunctionPass(ID) {
71 initializeMachineLoopInfoPass(*PassRegistry::getPassRegistry());
72 }
John Bauman89401822014-05-06 15:04:28 -040073
74 LoopInfoBase<MachineBasicBlock, MachineLoop>& getBase() { return LI; }
75
76 /// iterator/begin/end - The interface to the top-level loops in the current
77 /// function.
78 ///
79 typedef LoopInfoBase<MachineBasicBlock, MachineLoop>::iterator iterator;
80 inline iterator begin() const { return LI.begin(); }
81 inline iterator end() const { return LI.end(); }
82 bool empty() const { return LI.empty(); }
83
84 /// getLoopFor - Return the inner most loop that BB lives in. If a basic
85 /// block is in no loop (for example the entry node), null is returned.
86 ///
87 inline MachineLoop *getLoopFor(const MachineBasicBlock *BB) const {
88 return LI.getLoopFor(BB);
89 }
90
91 /// operator[] - same as getLoopFor...
92 ///
93 inline const MachineLoop *operator[](const MachineBasicBlock *BB) const {
94 return LI.getLoopFor(BB);
95 }
96
97 /// getLoopDepth - Return the loop nesting level of the specified block...
98 ///
99 inline unsigned getLoopDepth(const MachineBasicBlock *BB) const {
100 return LI.getLoopDepth(BB);
101 }
102
103 // isLoopHeader - True if the block is a loop header node
104 inline bool isLoopHeader(MachineBasicBlock *BB) const {
105 return LI.isLoopHeader(BB);
106 }
107
108 /// runOnFunction - Calculate the natural loop information.
109 ///
110 virtual bool runOnMachineFunction(MachineFunction &F);
111
112 virtual void releaseMemory() { LI.releaseMemory(); }
113
114 virtual void getAnalysisUsage(AnalysisUsage &AU) const;
115
116 /// removeLoop - This removes the specified top-level loop from this loop info
117 /// object. The loop is not deleted, as it will presumably be inserted into
118 /// another loop.
119 inline MachineLoop *removeLoop(iterator I) { return LI.removeLoop(I); }
120
121 /// changeLoopFor - Change the top-level loop that contains BB to the
122 /// specified loop. This should be used by transformations that restructure
123 /// the loop hierarchy tree.
124 inline void changeLoopFor(MachineBasicBlock *BB, MachineLoop *L) {
125 LI.changeLoopFor(BB, L);
126 }
127
128 /// changeTopLevelLoop - Replace the specified loop in the top-level loops
129 /// list with the indicated loop.
130 inline void changeTopLevelLoop(MachineLoop *OldLoop, MachineLoop *NewLoop) {
131 LI.changeTopLevelLoop(OldLoop, NewLoop);
132 }
133
134 /// addTopLevelLoop - This adds the specified loop to the collection of
135 /// top-level loops.
136 inline void addTopLevelLoop(MachineLoop *New) {
137 LI.addTopLevelLoop(New);
138 }
139
140 /// removeBlock - This method completely removes BB from all data structures,
141 /// including all of the Loop objects it is nested in and our mapping from
142 /// MachineBasicBlocks to loops.
143 void removeBlock(MachineBasicBlock *BB) {
144 LI.removeBlock(BB);
145 }
146};
147
148
149// Allow clients to walk the list of nested loops...
150template <> struct GraphTraits<const MachineLoop*> {
151 typedef const MachineLoop NodeType;
152 typedef MachineLoopInfo::iterator ChildIteratorType;
153
154 static NodeType *getEntryNode(const MachineLoop *L) { return L; }
155 static inline ChildIteratorType child_begin(NodeType *N) {
156 return N->begin();
157 }
158 static inline ChildIteratorType child_end(NodeType *N) {
159 return N->end();
160 }
161};
162
163template <> struct GraphTraits<MachineLoop*> {
164 typedef MachineLoop NodeType;
165 typedef MachineLoopInfo::iterator ChildIteratorType;
166
167 static NodeType *getEntryNode(MachineLoop *L) { return L; }
168 static inline ChildIteratorType child_begin(NodeType *N) {
169 return N->begin();
170 }
171 static inline ChildIteratorType child_end(NodeType *N) {
172 return N->end();
173 }
174};
175
176} // End llvm namespace
177
178#endif