LLVM  3.7.0
Public Types | Public Member Functions | Protected Member Functions | Friends | List of all members
llvm::LoopBase< N, M > Class Template Reference

LoopBase class - Instances of this class are used to represent loops that are detected in the flow graph. More...

#include <LoopInfo.h>

Inheritance diagram for llvm::LoopBase< N, M >:
[legend]

Public Types

typedef std::vector< LoopT * >
::const_iterator 
iterator
 
typedef std::vector< LoopT * >
::const_reverse_iterator 
reverse_iterator
 
typedef std::vector< BlockT * >
::const_iterator 
block_iterator
 
typedef std::pair< const
BlockT *, const BlockT * > 
Edge
 Edge type. More...
 

Public Member Functions

 LoopBase ()
 Loop ctor - This creates an empty loop. More...
 
 ~LoopBase ()
 
unsigned getLoopDepth () const
 getLoopDepth - Return the nesting level of this loop. More...
 
BlockT * getHeader () const
 
LoopT * getParentLoop () const
 
void setParentLoop (LoopT *L)
 setParentLoop is a raw interface for bypassing addChildLoop. More...
 
bool contains (const LoopT *L) const
 contains - Return true if the specified loop is contained within in this loop. More...
 
bool contains (const BlockT *BB) const
 contains - Return true if the specified basic block is in this loop. More...
 
template<class InstT >
bool contains (const InstT *Inst) const
 contains - Return true if the specified instruction is in this loop. More...
 
const std::vector< LoopT * > & getSubLoops () const
 iterator/begin/end - Return the loops contained entirely within this loop. More...
 
std::vector< LoopT * > & getSubLoopsVector ()
 
iterator begin () const
 
iterator end () const
 
reverse_iterator rbegin () const
 
reverse_iterator rend () const
 
bool empty () const
 
const std::vector< BlockT * > & getBlocks () const
 getBlocks - Get a list of the basic blocks which make up this loop. More...
 
block_iterator block_begin () const
 
block_iterator block_end () const
 
unsigned getNumBlocks () const
 getNumBlocks - Get the number of blocks in this loop in constant time. More...
 
bool isLoopExiting (const BlockT *BB) const
 isLoopExiting - True if terminator in the block can branch to another block that is outside of the current loop. More...
 
unsigned getNumBackEdges () const
 getNumBackEdges - Calculate the number of back edges to the loop header More...
 
void getExitingBlocks (SmallVectorImpl< BlockT * > &ExitingBlocks) const
 getExitingBlocks - Return all blocks inside the loop that have successors outside of the loop. More...
 
BlockT * getExitingBlock () const
 getExitingBlock - If getExitingBlocks would return exactly one block, return that block. More...
 
void getExitBlocks (SmallVectorImpl< BlockT * > &ExitBlocks) const
 getExitBlocks - Return all of the successor blocks of this loop. More...
 
BlockT * getExitBlock () const
 getExitBlock - If getExitBlocks would return exactly one block, return that block. More...
 
void getExitEdges (SmallVectorImpl< Edge > &ExitEdges) const
 getExitEdges - Return all pairs of (inside_block,outside_block). More...
 
BlockT * getLoopPreheader () const
 getLoopPreheader - If there is a preheader for this loop, return it. More...
 
BlockT * getLoopPredecessor () const
 getLoopPredecessor - If the given loop's header has exactly one unique predecessor outside the loop, return it. More...
 
BlockT * getLoopLatch () const
 getLoopLatch - If there is a single latch block for this loop, return it. More...
 
void getLoopLatches (SmallVectorImpl< BlockT * > &LoopLatches) const
 getLoopLatches - Return all loop latch blocks of this loop. More...
 
void addBasicBlockToLoop (BlockT *NewBB, LoopInfoBase< BlockT, LoopT > &LI)
 addBasicBlockToLoop - This method is used by other analyses to update loop information. More...
 
void replaceChildLoopWith (LoopT *OldChild, LoopT *NewChild)
 replaceChildLoopWith - This is used when splitting loops up. More...
 
void addChildLoop (LoopT *NewChild)
 addChildLoop - Add the specified loop to be a child of this loop. More...
 
LoopT * removeChildLoop (iterator I)
 removeChildLoop - This removes the specified child from being a subloop of this loop. More...
 
void addBlockEntry (BlockT *BB)
 addBlockEntry - This adds a basic block directly to the basic block list. More...
 
void reverseBlock (unsigned from)
 reverseBlocks - interface to reverse Blocks[from, end of loop] in this loop More...
 
void reserveBlocks (unsigned size)
 reserveBlocks- interface to do reserve() for Blocks More...
 
void moveToHeader (BlockT *BB)
 moveToHeader - This method is used to move BB (which must be part of this loop) to be the loop header of the loop (the block that dominates all others). More...
 
void removeBlockFromLoop (BlockT *BB)
 removeBlockFromLoop - This removes the specified basic block from the current loop, updating the Blocks as appropriate. More...
 
void verifyLoop () const
 verifyLoop - Verify loop structure More...
 
void verifyLoopNest (DenseSet< const LoopT * > *Loops) const
 verifyLoop - Verify loop structure of this loop and all nested loops. More...
 
void print (raw_ostream &OS, unsigned Depth=0) const
 

Protected Member Functions

 LoopBase (BlockT *BB)
 

Friends

class LoopInfoBase< BlockT, LoopT >
 

Detailed Description

template<class N, class M>
class llvm::LoopBase< N, M >

LoopBase class - Instances of this class are used to represent loops that are detected in the flow graph.

Definition at line 58 of file LoopInfo.h.

Member Typedef Documentation

template<class N, class M>
typedef std::vector<BlockT*>::const_iterator llvm::LoopBase< N, M >::block_iterator

Definition at line 140 of file LoopInfo.h.

template<class N, class M>
typedef std::pair<const BlockT*, const BlockT*> llvm::LoopBase< N, M >::Edge

Edge type.

Definition at line 207 of file LoopInfo.h.

template<class N, class M>
typedef std::vector<LoopT *>::const_iterator llvm::LoopBase< N, M >::iterator

Definition at line 128 of file LoopInfo.h.

template<class N, class M>
typedef std::vector<LoopT *>::const_reverse_iterator llvm::LoopBase< N, M >::reverse_iterator

Definition at line 130 of file LoopInfo.h.

Constructor & Destructor Documentation

template<class N, class M>
llvm::LoopBase< N, M >::LoopBase ( )
inline

Loop ctor - This creates an empty loop.

Definition at line 80 of file LoopInfo.h.

template<class N, class M>
llvm::LoopBase< N, M >::~LoopBase ( )
inline

Definition at line 81 of file LoopInfo.h.

template<class N, class M>
llvm::LoopBase< N, M >::LoopBase ( BlockT *  BB)
inlineexplicitprotected

Definition at line 337 of file LoopInfo.h.

Member Function Documentation

template<class BlockT , class LoopT >
void llvm::LoopBase< BlockT, LoopT >::addBasicBlockToLoop ( BlockT *  NewBB,
LoopInfoBase< BlockT, LoopT > &  LIB 
)

addBasicBlockToLoop - This method is used by other analyses to update 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 to the specified LoopInfo object as being in the current basic block. It is not valid to replace the loop header with this method.

Definition at line 187 of file LoopInfoImpl.h.

Referenced by CloneLoop(), CloneLoopBlocks(), llvm::cloneLoopWithPreheader(), insertUniqueBackedgeBlock(), llvm::UnrollLoop(), and UpdateAnalysisInformation().

template<class N, class M>
void llvm::LoopBase< N, M >::addBlockEntry ( BlockT *  BB)
inline

addBlockEntry - This adds a basic block directly to the basic block list.

This should only be used by transformations that create new loops. Other transformations should use addBasicBlockToLoop.

Definition at line 286 of file LoopInfo.h.

Referenced by separateNestedLoop().

template<class N, class M>
void llvm::LoopBase< N, M >::addChildLoop ( LoopT *  NewChild)
inline

addChildLoop - Add the specified loop to be a child of this loop.

This updates the loop depth of the new child.

Definition at line 265 of file LoopInfo.h.

Referenced by CloneLoopBlocks(), llvm::cloneLoopWithPreheader(), llvm::LPPassManager::insertLoop(), separateNestedLoop(), and llvm::UnrollLoop().

template<class N, class M>
iterator llvm::LoopBase< N, M >::begin ( ) const
inline
template<class N, class M>
block_iterator llvm::LoopBase< N, M >::block_begin ( ) const
inline
template<class N, class M>
block_iterator llvm::LoopBase< N, M >::block_end ( ) const
inline
template<class N, class M>
bool llvm::LoopBase< N, M >::contains ( const LoopT *  L) const
inline
template<class N, class M>
bool llvm::LoopBase< N, M >::contains ( const BlockT *  BB) const
inline

contains - Return true if the specified basic block is in this loop.

Definition at line 113 of file LoopInfo.h.

template<class N, class M>
template<class InstT >
bool llvm::LoopBase< N, M >::contains ( const InstT *  Inst) const
inline

contains - Return true if the specified instruction is in this loop.

Definition at line 120 of file LoopInfo.h.

template<class N, class M>
bool llvm::LoopBase< N, M >::empty ( ) const
inline

Definition at line 135 of file LoopInfo.h.

Referenced by emitBasicBlockLoopComments(), and llvm::LoopInfo::updateUnloop().

template<class N, class M>
iterator llvm::LoopBase< N, M >::end ( ) const
inline
template<class N, class M>
const std::vector<BlockT*>& llvm::LoopBase< N, M >::getBlocks ( ) const
inline

getBlocks - Get a list of the basic blocks which make up this loop.

Definition at line 139 of file LoopInfo.h.

Referenced by llvm::cloneLoopWithPreheader(), llvm::AMDGPUTTIImpl::getUnrollingPreferences(), separateNestedLoop(), and llvm::UnrollLoop().

template<class BlockT , class LoopT >
BlockT * llvm::LoopBase< BlockT, LoopT >::getExitBlock ( ) const

getExitBlock - If getExitBlocks would return exactly one block, return that block.

Otherwise return null.

Definition at line 78 of file LoopInfoImpl.h.

References llvm::SmallVectorTemplateCommon< T >::size().

Referenced by llvm::LoopVersioning::addPHINodes(), llvm::LoopVersioning::LoopVersioning(), and llvm::LoopVersioning::versionLoop().

template<class BlockT , class LoopT >
void llvm::LoopBase< BlockT, LoopT >::getExitBlocks ( SmallVectorImpl< BlockT * > &  ExitBlocks) const

getExitBlocks - Return all of the successor blocks of this loop.

These are the blocks outside of the current loop which are branched to.

Definition at line 64 of file LoopInfoImpl.h.

References contains(), I, and llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back().

Referenced by llvm::formLCSSA(), llvm::Loop::hasDedicatedExits(), isGuaranteedToExecute(), PrintLoopInfo(), processInstruction(), and simplifyOneLoop().

template<class BlockT , class LoopT >
void llvm::LoopBase< BlockT, LoopT >::getExitEdges ( SmallVectorImpl< Edge > &  ExitEdges) const

getExitEdges - Return all pairs of (inside_block,outside_block).

Definition at line 89 of file LoopInfoImpl.h.

References contains(), I, and llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back().

template<class BlockT , class LoopT >
BlockT * llvm::LoopBase< BlockT, LoopT >::getExitingBlock ( ) const
template<class BlockT , class LoopT >
void llvm::LoopBase< BlockT, LoopT >::getExitingBlocks ( SmallVectorImpl< BlockT * > &  ExitingBlocks) const

getExitingBlocks - Return all blocks inside the loop that have successors outside of the loop.

These are the blocks inside of the current loop which branch out. The returned list is always unique.

Definition at line 35 of file LoopInfoImpl.h.

References contains(), I, and llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back().

Referenced by simplifyOneLoop().

template<class N, class M>
BlockT* llvm::LoopBase< N, M >::getHeader ( ) const
inline

Definition at line 96 of file LoopInfo.h.

Referenced by llvm::RecurrenceDescriptor::AddReductionVar(), analyzeLoopUnrollCost(), llvm::LoopBlocksTraversal::begin(), canConstantEvolve(), CloneLoopBlocks(), llvm::cloneLoopWithPreheader(), llvm::computeLICMSafetyInfo(), DoInitialMatch(), emitBasicBlockLoopComments(), llvm::LoopBlocksTraversal::end(), FindLoopCounter(), findPHIToPartitionLoops(), llvm::ScalarEvolution::getAddRecExpr(), llvm::Loop::getCanonicalInductionVariable(), llvm::LoopAccessAnalysis::getInfo(), llvm::Loop::getLoopID(), llvm::LoopBase< BasicBlock, Loop >::getLoopLatches(), getLoopPhiForCounter(), llvm::LoopBase< BasicBlock, Loop >::getNumBackEdges(), llvm::SCEVExpander::getOrInsertCanonicalInductionVariable(), llvm::getStrideFromPointer(), llvm::InsertPreheaderForLoop(), insertUniqueBackedgeBlock(), isExistingPhi(), isGuaranteedToExecute(), llvm::ScalarEvolution::isLoopBackedgeGuardedByCond(), llvm::ScalarEvolution::isLoopEntryGuardedByCond(), isLoopInvariant(), llvm::RecurrenceDescriptor::isReductionPHI(), isSimplifiedLoopNest(), llvm::isStridedPtr(), isTrivialLoopExitBlock(), PickMostRelevantLoop(), llvm::SCEV::print(), llvm::IVUsers::print(), PrintLoopInfo(), PrintParentLoopComment(), PushLoopPHIs(), llvm::SCEVExpander::replaceCongruentIVs(), llvm::LPPassManager::runOnFunction(), separateNestedLoop(), SetLoopAlreadyUnrolled(), llvm::Loop::setLoopID(), llvm::ScalarEvolution::SimplifyICmpOperands(), llvm::simplifyLoopIVs(), simplifyOneLoop(), llvm::LoopPass::skipOptnoneFunction(), llvm::UnrollLoop(), llvm::UnrollRuntimeLoopProlog(), and llvm::LoopVersioning::versionLoop().

template<class N, class M>
unsigned llvm::LoopBase< N, M >::getLoopDepth ( ) const
inline

getLoopDepth - Return the nesting level of this loop.

An outer-most loop has depth 1, for consistency with loop depth values used for basic blocks, where depth 0 is used for blocks not inside any loops.

Definition at line 89 of file LoopInfo.h.

Referenced by emitBasicBlockLoopComments(), llvm::ScalarEvolution::getAddRecExpr(), llvm::AArch64TTIImpl::getUnrollingPreferences(), PrintParentLoopComment(), and UpdateAnalysisInformation().

template<class BlockT , class LoopT >
BlockT * llvm::LoopBase< BlockT, LoopT >::getLoopLatch ( ) const
template<class N, class M>
void llvm::LoopBase< N, M >::getLoopLatches ( SmallVectorImpl< BlockT * > &  LoopLatches) const
inline

getLoopLatches - Return all loop latch blocks of this loop.

A latch block is a block that contains a branch back to the header.

Definition at line 234 of file LoopInfo.h.

template<class BlockT , class LoopT >
BlockT * llvm::LoopBase< BlockT, LoopT >::getLoopPredecessor ( ) const

getLoopPredecessor - If the given loop's header has exactly one unique predecessor outside the loop, return it.

Otherwise return null. This is less strict that the loop "preheader" concept, which requires the predecessor to have exactly one successor.

Definition at line 130 of file LoopInfoImpl.h.

References contains(), and N.

Referenced by llvm::ScalarEvolution::isLoopEntryGuardedByCond().

template<class BlockT , class LoopT >
BlockT * llvm::LoopBase< BlockT, LoopT >::getLoopPreheader ( ) const

getLoopPreheader - If there is a preheader for this loop, return it.

A loop has a preheader if there is only one edge to the header of the loop from outside of the loop. If this is the case, the block branching to the header of the loop is the preheader node.

This method returns null if there is no preheader for the loop.

Definition at line 108 of file LoopInfoImpl.h.

References SI.

Referenced by llvm::RecurrenceDescriptor::AddReductionVar(), CloneLoopBlocks(), llvm::cloneLoopWithPreheader(), genLoopLimit(), llvm::hoistRegion(), llvm::Loop::isLoopSimplifyForm(), llvm::LoopVersioning::LoopVersioning(), llvm::Loop::makeLoopInvariant(), llvm::promoteLoopAccessesToScalars(), simplifyOneLoop(), llvm::UnrollLoop(), llvm::UnrollRuntimeLoopProlog(), and llvm::LoopVersioning::versionLoop().

template<class N, class M>
unsigned llvm::LoopBase< N, M >::getNumBackEdges ( ) const
inline

getNumBackEdges - Calculate the number of back edges to the loop header

Definition at line 165 of file LoopInfo.h.

Referenced by insertUniqueBackedgeBlock(), and simplifyOneLoop().

template<class N, class M>
unsigned llvm::LoopBase< N, M >::getNumBlocks ( ) const
inline

getNumBlocks - Get the number of blocks in this loop in constant time.

Definition at line 145 of file LoopInfo.h.

Referenced by llvm::LoopBlocksTraversal::begin(), llvm::LoopBlocksDFS::isComplete(), and llvm::LoopBlocksDFS::LoopBlocksDFS().

template<class N, class M>
LoopT* llvm::LoopBase< N, M >::getParentLoop ( ) const
inline
template<class N, class M>
const std::vector<LoopT *>& llvm::LoopBase< N, M >::getSubLoops ( ) const
inline

iterator/begin/end - Return the loops contained entirely within this loop.

Definition at line 126 of file LoopInfo.h.

Referenced by separateNestedLoop().

template<class N, class M>
std::vector<LoopT *>& llvm::LoopBase< N, M >::getSubLoopsVector ( )
inline

Definition at line 127 of file LoopInfo.h.

template<class N, class M>
bool llvm::LoopBase< N, M >::isLoopExiting ( const BlockT *  BB) const
inline

isLoopExiting - True if terminator in the block can branch to another block that is outside of the current loop.

Definition at line 152 of file LoopInfo.h.

Referenced by llvm::VirtRegAuxInfo::calculateSpillWeightAndHint(), getExitingBlock(), llvm::ScalarEvolution::getSmallConstantTripCount(), llvm::ScalarEvolution::getSmallConstantTripMultiple(), and mustBeFiniteCountedLoop().

template<class N, class M>
void llvm::LoopBase< N, M >::moveToHeader ( BlockT *  BB)
inline

moveToHeader - This method is used to move BB (which must be part of this loop) to be the loop header of the loop (the block that dominates all others).

Definition at line 304 of file LoopInfo.h.

Referenced by separateNestedLoop(), and UpdateAnalysisInformation().

template<class BlockT , class LoopT >
void llvm::LoopBase< BlockT, LoopT >::print ( raw_ostream OS,
unsigned  Depth = 0 
) const
template<class N, class M>
reverse_iterator llvm::LoopBase< N, M >::rbegin ( ) const
inline
template<class N, class M>
void llvm::LoopBase< N, M >::removeBlockFromLoop ( BlockT *  BB)
inline

removeBlockFromLoop - This removes the specified basic block from the current loop, updating the Blocks as appropriate.

This does not update the mapping in the LoopInfo class.

Definition at line 319 of file LoopInfo.h.

Referenced by separateNestedLoop().

template<class N, class M>
LoopT* llvm::LoopBase< N, M >::removeChildLoop ( iterator  I)
inline

removeChildLoop - This removes the specified child from being a subloop of this loop.

The loop is not deleted, as it will presumably be inserted into another loop.

Definition at line 274 of file LoopInfo.h.

Referenced by separateNestedLoop(), and llvm::LoopInfo::updateUnloop().

template<class N, class M>
reverse_iterator llvm::LoopBase< N, M >::rend ( ) const
inline
template<class BlockT , class LoopT >
void llvm::LoopBase< BlockT, LoopT >::replaceChildLoopWith ( LoopT *  OldChild,
LoopT *  NewChild 
)

replaceChildLoopWith - This is used when splitting loops up.

It replaces the OldChild entry in our children list with NewChild, and updates the parent pointer of OldChild to be null and the NewChild to be this loop. This updates the loop depth of the new child.

Definition at line 211 of file LoopInfoImpl.h.

References I.

template<class N, class M>
void llvm::LoopBase< N, M >::reserveBlocks ( unsigned  size)
inline

reserveBlocks- interface to do reserve() for Blocks

Definition at line 297 of file LoopInfo.h.

template<class N, class M>
void llvm::LoopBase< N, M >::reverseBlock ( unsigned  from)
inline

reverseBlocks - interface to reverse Blocks[from, end of loop] in this loop

Definition at line 292 of file LoopInfo.h.

template<class N, class M>
void llvm::LoopBase< N, M >::setParentLoop ( LoopT *  L)
inline

setParentLoop is a raw interface for bypassing addChildLoop.

Definition at line 100 of file LoopInfo.h.

template<class BlockT , class LoopT >
void llvm::LoopBase< BlockT, LoopT >::verifyLoop ( ) const
template<class BlockT , class LoopT >
void llvm::LoopBase< BlockT, LoopT >::verifyLoopNest ( DenseSet< const LoopT * > *  Loops) const

verifyLoop - Verify loop structure of this loop and all nested loops.

Definition at line 308 of file LoopInfoImpl.h.

References llvm::sys::path::begin(), llvm::sys::path::end(), I, and llvm::DenseSet< ValueT, ValueInfoT >::insert().

Friends And Related Function Documentation

template<class N, class M>
friend class LoopInfoBase< BlockT, LoopT >
friend

Definition at line 336 of file LoopInfo.h.


The documentation for this class was generated from the following files: