mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-03 19:02:35 +00:00
* LoopInfo now keeps track of exit blocks from the loop
* New LoopInfo::isLoopHeader method * Remove some #if 0 code llvm-svn: 5649
This commit is contained in:
parent
bfe33a49ef
commit
4efef545d2
@ -1,9 +1,17 @@
|
|||||||
//===- llvm/Analysis/LoopInfo.h - Natural Loop Calculator --------*- C++ -*--=//
|
//===- llvm/Analysis/LoopInfo.h - Natural Loop Calculator --------*- C++ -*--=//
|
||||||
//
|
//
|
||||||
// This file defines the LoopInfo class that is used to identify natural loops
|
// This file defines the LoopInfo class that is used to identify natural loops
|
||||||
// and determine the loop depth of various nodes of the CFG. Note that the
|
// and determine the loop depth of various nodes of the CFG. Note that natural
|
||||||
// loops identified may actually be several natural loops that share the same
|
// loops may actually be several loops that share the same header node...
|
||||||
// header node... not just a single natural loop.
|
//
|
||||||
|
// This analysis calculates the nesting structure of loops in a function. For
|
||||||
|
// each natural loop identified, this analysis identifies natural loops
|
||||||
|
// contained entirely within the function, the basic blocks the make up the
|
||||||
|
// loop, the nesting depth of the loop, and the successor blocks of the loop.
|
||||||
|
//
|
||||||
|
// It can calculate on the fly a variety of different bits of information, such
|
||||||
|
// as whether there is a preheader for the loop, the number of back edges to the
|
||||||
|
// header, and whether or not a particular block branches out of the loop.
|
||||||
//
|
//
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
@ -22,8 +30,9 @@ class LoopInfo;
|
|||||||
///
|
///
|
||||||
class Loop {
|
class Loop {
|
||||||
Loop *ParentLoop;
|
Loop *ParentLoop;
|
||||||
std::vector<BasicBlock *> Blocks; // First entry is the header node
|
|
||||||
std::vector<Loop*> SubLoops; // Loops contained entirely within this one
|
std::vector<Loop*> SubLoops; // Loops contained entirely within this one
|
||||||
|
std::vector<BasicBlock *> Blocks; // First entry is the header node
|
||||||
|
std::vector<BasicBlock *> ExitBlocks; // Reachable blocks outside the loop
|
||||||
unsigned LoopDepth; // Nesting depth of this loop
|
unsigned LoopDepth; // Nesting depth of this loop
|
||||||
|
|
||||||
Loop(const Loop &); // DO NOT IMPLEMENT
|
Loop(const Loop &); // DO NOT IMPLEMENT
|
||||||
@ -39,14 +48,25 @@ public:
|
|||||||
|
|
||||||
/// getSubLoops - Return the loops contained entirely within this loop
|
/// getSubLoops - Return the loops contained entirely within this loop
|
||||||
///
|
///
|
||||||
inline const std::vector<Loop*> &getSubLoops() const { return SubLoops; }
|
const std::vector<Loop*> &getSubLoops() const { return SubLoops; }
|
||||||
inline const std::vector<BasicBlock*> &getBlocks() const { return Blocks; }
|
|
||||||
|
/// getBlocks - Get a list of the basic blocks which make up this loop.
|
||||||
|
///
|
||||||
|
const std::vector<BasicBlock*> &getBlocks() const { return Blocks; }
|
||||||
|
|
||||||
|
/// getExitBlocks - Return all of the successor blocks of this loop. These
|
||||||
|
/// are the blocks _outside of the current loop_ which are branched to.
|
||||||
|
///
|
||||||
|
const std::vector<BasicBlock*> &getExitBlocks() const { return ExitBlocks; }
|
||||||
|
|
||||||
/// isLoopExit - True if terminator in the block can branch to another block
|
/// isLoopExit - True if terminator in the block can branch to another block
|
||||||
/// that is outside of the current loop.
|
/// that is outside of the current loop. The reached block should be in the
|
||||||
|
/// ExitBlocks list.
|
||||||
|
///
|
||||||
bool isLoopExit(const BasicBlock *BB) const;
|
bool isLoopExit(const BasicBlock *BB) const;
|
||||||
|
|
||||||
/// Find number of back edges
|
/// getNumBackEdges - Calculate the number of back edges to the loop header
|
||||||
|
///
|
||||||
unsigned getNumBackEdges() const;
|
unsigned getNumBackEdges() const;
|
||||||
|
|
||||||
/// getLoopPreheader - If there is a preheader for this loop, return it. A
|
/// getLoopPreheader - If there is a preheader for this loop, return it. A
|
||||||
@ -61,14 +81,20 @@ public:
|
|||||||
///
|
///
|
||||||
BasicBlock *getLoopPreheader() const;
|
BasicBlock *getLoopPreheader() const;
|
||||||
|
|
||||||
/// addBasicBlockToLoop - This function is used by other analyses to update
|
/// addBasicBlockToLoop - This method is used by other analyses to update loop
|
||||||
/// loop information. NewBB is set to be a new member of the current loop.
|
/// information. NewBB is set to be a new member of the current loop.
|
||||||
/// Because of this, it is added as a member of all parent loops, and is added
|
/// Because of this, it is added as a member of all parent loops, and is added
|
||||||
/// to the specified LoopInfo object as being in the current basic block. It
|
/// to the specified LoopInfo object as being in the current basic block. It
|
||||||
/// is not valid to replace the loop header with this method.
|
/// is not valid to replace the loop header with this method.
|
||||||
///
|
///
|
||||||
void addBasicBlockToLoop(BasicBlock *NewBB, LoopInfo &LI);
|
void addBasicBlockToLoop(BasicBlock *NewBB, LoopInfo &LI);
|
||||||
|
|
||||||
|
/// changeExitBlock - This method is used to update loop information. One
|
||||||
|
/// instance of the specified Old basic block is removed from the exit list
|
||||||
|
/// and replaced with New.
|
||||||
|
///
|
||||||
|
void changeExitBlock(BasicBlock *Old, BasicBlock *New);
|
||||||
|
|
||||||
void print(std::ostream &O) const;
|
void print(std::ostream &O) const;
|
||||||
private:
|
private:
|
||||||
friend class LoopInfo;
|
friend class LoopInfo;
|
||||||
@ -124,14 +150,10 @@ public:
|
|||||||
return L ? L->getLoopDepth() : 0;
|
return L ? L->getLoopDepth() : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
// isLoopHeader - True if the block is a loop header node
|
// isLoopHeader - True if the block is a loop header node
|
||||||
bool isLoopHeader(BasicBlock *BB) const {
|
bool isLoopHeader(BasicBlock *BB) const {
|
||||||
return getLoopFor(BB)->getHeader() == BB;
|
return getLoopFor(BB)->getHeader() == BB;
|
||||||
}
|
}
|
||||||
// isLoopEnd - True if block jumps to loop entry
|
|
||||||
bool isLoopEnd(BasicBlock *BB) const;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/// runOnFunction - Calculate the natural loop information.
|
/// runOnFunction - Calculate the natural loop information.
|
||||||
///
|
///
|
||||||
|
Loading…
x
Reference in New Issue
Block a user