|
LLVM
4.0.0
|
Represents a single loop in the control flow graph. More...
#include <LoopInfo.h>
Classes | |
| class | LocRange |
| A range representing the start and end location of a loop. More... | |
Public Member Functions | |
| Loop () | |
| bool | isLoopInvariant (const Value *V) const |
| Return true if the specified value is loop invariant. More... | |
| bool | hasLoopInvariantOperands (const Instruction *I) const |
| Return true if all the operands of the specified instruction are loop invariant. More... | |
| bool | makeLoopInvariant (Value *V, bool &Changed, Instruction *InsertPt=nullptr) const |
| If the given value is an instruction inside of the loop and it can be hoisted, do so to make it trivially loop-invariant. More... | |
| bool | makeLoopInvariant (Instruction *I, bool &Changed, Instruction *InsertPt=nullptr) const |
| If the given instruction is inside of the loop and it can be hoisted, do so to make it trivially loop-invariant. More... | |
| PHINode * | getCanonicalInductionVariable () const |
| Check to see if the loop has a canonical induction variable: an integer recurrence that starts at 0 and increments by one each time through the loop. More... | |
| bool | isLCSSAForm (DominatorTree &DT) const |
| Return true if the Loop is in LCSSA form. More... | |
| bool | isRecursivelyLCSSAForm (DominatorTree &DT, const LoopInfo &LI) const |
| Return true if this Loop and all inner subloops are in LCSSA form. More... | |
| bool | isLoopSimplifyForm () const |
| Return true if the Loop is in the form that the LoopSimplify form transforms loops to, which is sometimes called normal form. More... | |
| bool | isSafeToClone () const |
| Return true if the loop body is safe to clone in practice. More... | |
| bool | isAnnotatedParallel () const |
| Returns true if the loop is annotated parallel. More... | |
| MDNode * | getLoopID () const |
| Return the llvm.loop loop id metadata node for this loop if it is present. More... | |
| void | setLoopID (MDNode *LoopID) const |
| Set the llvm.loop loop id metadata for this loop. More... | |
| bool | hasDedicatedExits () const |
| Return true if no exit block for the loop has a predecessor that is outside the loop. More... | |
| void | getUniqueExitBlocks (SmallVectorImpl< BasicBlock * > &ExitBlocks) const |
| Return all unique successor blocks of this loop. More... | |
| BasicBlock * | getUniqueExitBlock () const |
| If getUniqueExitBlocks would return exactly one block, return that block. More... | |
| void | dump () const |
| void | dumpVerbose () const |
| DebugLoc | getStartLoc () const |
| Return the debug location of the start of this loop. More... | |
| LocRange | getLocRange () const |
| Return the source code span of the loop. More... | |
| StringRef | getName () const |
Public Member Functions inherited from llvm::LoopBase< N, M > | |
| LoopBase () | |
| This creates an empty loop. More... | |
| ~LoopBase () | |
| unsigned | getLoopDepth () const |
| Return the nesting level of this loop. More... | |
| BlockT * | getHeader () const |
| LoopT * | getParentLoop () const |
| void | setParentLoop (LoopT *L) |
| This is a raw interface for bypassing addChildLoop. More... | |
| bool | contains (const LoopT *L) const |
| Return true if the specified loop is contained within in this loop. More... | |
| bool | contains (const BlockT *BB) const |
| Return true if the specified basic block is in this loop. More... | |
| template<class InstT > | |
| bool | contains (const InstT *Inst) const |
| Return true if the specified instruction is in this loop. More... | |
| const std::vector< LoopT * > & | getSubLoops () const |
| 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 |
| Get a list of the basic blocks which make up this loop. More... | |
| block_iterator | block_begin () const |
| block_iterator | block_end () const |
| iterator_range< block_iterator > | blocks () const |
| unsigned | getNumBlocks () const |
| Get the number of blocks in this loop in constant time. More... | |
| void | invalidate () |
| Invalidate the loop, indicating that it is no longer a loop. More... | |
| bool | isInvalid () |
| Return true if this loop is no longer valid. More... | |
| bool | isLoopExiting (const BlockT *BB) const |
| True if terminator in the block can branch to another block that is outside of the current loop. More... | |
| bool | isLoopLatch (const BlockT *BB) const |
| unsigned | getNumBackEdges () const |
| Calculate the number of back edges to the loop header. More... | |
| void | getExitingBlocks (SmallVectorImpl< BlockT * > &ExitingBlocks) const |
| Return all blocks inside the loop that have successors outside of the loop. More... | |
| BlockT * | getExitingBlock () const |
| If getExitingBlocks would return exactly one block, return that block. More... | |
| void | getExitBlocks (SmallVectorImpl< BlockT * > &ExitBlocks) const |
| Return all of the successor blocks of this loop. More... | |
| BlockT * | getExitBlock () const |
| If getExitBlocks would return exactly one block, return that block. More... | |
| void | getExitEdges (SmallVectorImpl< Edge > &ExitEdges) const |
| Return all pairs of (inside_block,outside_block). More... | |
| BlockT * | getLoopPreheader () const |
| If there is a preheader for this loop, return it. More... | |
| BlockT * | getLoopPredecessor () const |
| If the given loop's header has exactly one unique predecessor outside the loop, return it. More... | |
| BlockT * | getLoopLatch () const |
| If there is a single latch block for this loop, return it. More... | |
| void | getLoopLatches (SmallVectorImpl< BlockT * > &LoopLatches) const |
| Return all loop latch blocks of this loop. More... | |
| void | addBasicBlockToLoop (BlockT *NewBB, LoopInfoBase< BlockT, LoopT > &LI) |
| This method is used by other analyses to update loop information. More... | |
| void | replaceChildLoopWith (LoopT *OldChild, LoopT *NewChild) |
| This is used when splitting loops up. More... | |
| void | addChildLoop (LoopT *NewChild) |
| Add the specified loop to be a child of this loop. More... | |
| LoopT * | removeChildLoop (iterator I) |
| This removes the specified child from being a subloop of this loop. More... | |
| void | addBlockEntry (BlockT *BB) |
| This adds a basic block directly to the basic block list. More... | |
| void | reverseBlock (unsigned from) |
| interface to reverse Blocks[from, end of loop] in this loop More... | |
| void | reserveBlocks (unsigned size) |
| interface to do reserve() for Blocks More... | |
| void | moveToHeader (BlockT *BB) |
| 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) |
| This removes the specified basic block from the current loop, updating the Blocks as appropriate. More... | |
| void | verifyLoop () const |
| Verify loop structure. More... | |
| void | verifyLoopNest (DenseSet< const LoopT * > *Loops) const |
| Verify loop structure of this loop and all nested loops. More... | |
| void | print (raw_ostream &OS, unsigned Depth=0, bool Verbose=false) const |
| Print loop with all the BBs inside it. More... | |
Friends | |
| class | LoopInfoBase< BasicBlock, Loop > |
Additional Inherited Members | |
Public Types inherited from llvm::LoopBase< N, M > | |
| 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... | |
Protected Member Functions inherited from llvm::LoopBase< N, M > | |
| LoopBase (BlockT *BB) | |
Represents a single loop in the control flow graph.
Note that not all SCCs in the CFG are neccessarily loops.
Definition at line 368 of file LoopInfo.h.
|
inline |
Definition at line 391 of file LoopInfo.h.
| LLVM_DUMP_METHOD void Loop::dump | ( | ) | const |
Definition at line 408 of file LoopInfo.cpp.
References llvm::dbgs(), and llvm::LoopBase< N, M >::print().
| LLVM_DUMP_METHOD void Loop::dumpVerbose | ( | ) | const |
Definition at line 412 of file LoopInfo.cpp.
References llvm::dbgs(), and llvm::LoopBase< N, M >::print().
| PHINode * Loop::getCanonicalInductionVariable | ( | ) | const |
Check to see if the loop has a canonical induction variable: an integer recurrence that starts at 0 and increments by one each time through the loop.
If so, return the phi node that corresponds to it.
The IndVarSimplify pass transforms loops to have a canonical induction variable.
Definition at line 110 of file LoopInfo.cpp.
References llvm::MCID::Add, assert(), llvm::BasicBlock::begin(), llvm::LoopBase< N, M >::contains(), llvm::LoopBase< N, M >::getHeader(), llvm::PHINode::getIncomingValueForBlock(), H, I, llvm::pred_begin(), llvm::pred_end(), and std::swap().
| Loop::LocRange Loop::getLocRange | ( | ) | const |
Return the source code span of the loop.
Definition at line 311 of file LoopInfo.cpp.
References llvm::LoopBase< N, M >::getHeader(), getLoopID(), llvm::LoopBase< N, M >::getLoopPreheader(), i, and L.
Referenced by getStartLoc().
| MDNode * Loop::getLoopID | ( | ) | const |
Return the llvm.loop loop id metadata node for this loop if it is present.
If this loop contains the same llvm.loop metadata on each branch to the header then the node is returned. If any latch instruction does not contain llvm.loop or or if multiple latches contain different nodes then 0 is returned.
Definition at line 212 of file LoopInfo.cpp.
References llvm::LoopBase< N, M >::blocks(), llvm::LoopBase< N, M >::getHeader(), llvm::LoopBase< N, M >::getLoopLatch(), llvm::Instruction::getMetadata(), llvm::MDNode::getNumOperands(), llvm::MDNode::getOperand(), H, isLoopSimplifyForm(), llvm::LLVMContext::MD_loop, llvm::Successor, and llvm::TerminatorInst::successors().
Referenced by AddRuntimeUnrollDisableMetaData(), llvm::addStringMetadataToLoop(), CloneLoopBlocks(), llvm::findStringMetadataForLoop(), getLocRange(), GetUnrollMetadataForLoop(), isAnnotatedParallel(), and SetLoopAlreadyUnrolled().
|
inline |
Definition at line 501 of file LoopInfo.h.
| DebugLoc Loop::getStartLoc | ( | ) | const |
Return the debug location of the start of this loop.
This looks for a BB terminating instruction with a known debug location by looking at the preheader and header blocks. If it cannot find a terminating instruction with location information, it returns an unknown location.
Definition at line 307 of file LoopInfo.cpp.
References getLocRange(), and llvm::Loop::LocRange::getStart().
Referenced by computeUnrollCount(), createMissedAnalysis(), llvm::LoopAccessReport::emitAnalysis(), llvm::OptimizationRemarkEmitter::emitOptimizationRemark(), llvm::OptimizationRemarkEmitter::emitOptimizationRemarkAnalysis(), llvm::OptimizationRemarkEmitter::emitOptimizationRemarkAnalysisAliasing(), llvm::OptimizationRemarkEmitter::emitOptimizationRemarkMissed(), llvm::LoopVectorizePass::processLoop(), and llvm::UnrollLoop().
| BasicBlock * Loop::getUniqueExitBlock | ( | ) | const |
If getUniqueExitBlocks would return exactly one block, return that block.
Otherwise return null.
Definition at line 399 of file LoopInfo.cpp.
References getUniqueExitBlocks(), and llvm::SmallVectorTemplateCommon< T >::size().
Referenced by canPeel(), ConnectProlog(), llvm::peelLoop(), and llvm::UnrollRuntimeLoopRemainder().
| void Loop::getUniqueExitBlocks | ( | SmallVectorImpl< BasicBlock * > & | ExitBlocks | ) | const |
Return all unique successor blocks of this loop.
These are the blocks outside of the current loop which are branched to. This assumes that loop exits are in canonical form.
Definition at line 358 of file LoopInfo.cpp.
References assert(), llvm::LoopBase< N, M >::blocks(), llvm::SmallVectorImpl< T >::clear(), llvm::LoopBase< N, M >::contains(), hasDedicatedExits(), llvm::is_contained(), llvm::pred_begin(), llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::succ_begin(), llvm::succ_end(), llvm::Successor, and llvm::successors().
Referenced by getUniqueExitBlock(), llvm::LoopDeletionPass::runImpl(), SimplifyLoopInst(), and sink().
| bool Loop::hasDedicatedExits | ( | ) | const |
Return true if no exit block for the loop has a predecessor that is outside the loop.
Definition at line 344 of file LoopInfo.cpp.
References llvm::LoopBase< N, M >::contains(), llvm::LoopBase< N, M >::getExitBlocks(), and llvm::predecessors().
Referenced by getUniqueExitBlocks(), isLoopSimplifyForm(), and llvm::LoopDeletionPass::runImpl().
| bool Loop::hasLoopInvariantOperands | ( | const Instruction * | I | ) | const |
Return true if all the operands of the specified instruction are loop invariant.
Definition at line 61 of file LoopInfo.cpp.
References llvm::all_of(), isLoopInvariant(), and llvm::User::operands().
Referenced by llvm::hoistRegion(), and sinkLoopInvariantInstructions().
| bool Loop::isAnnotatedParallel | ( | ) | const |
Returns true if the loop is annotated parallel.
A parallel loop can be assumed to not contain any dependencies between iterations by the compiler. That is, any loop-carried dependency checking can be skipped completely when parallelizing the loop on the target machine. Thus, if the parallel loop information originates from the programmer, e.g. via the OpenMP parallel for pragma, it is the programmer's responsibility to ensure there are no loop-carried dependencies. The final execution order of the instructions across iterations is not guaranteed, thus, the end result might or might not implement actual concurrent execution of instructions across multiple iterations.
Definition at line 266 of file LoopInfo.cpp.
References llvm::LoopBase< N, M >::blocks(), getLoopID(), I, llvm::LLVMContext::MD_mem_parallel_loop_access, and llvm::MDNode::operands().
| bool Loop::isLCSSAForm | ( | DominatorTree & | DT | ) | const |
Return true if the Loop is in LCSSA form.
Definition at line 174 of file LoopInfo.cpp.
References llvm::all_of(), llvm::LoopBase< N, M >::blocks(), and isBlockInLCSSAForm().
Referenced by analyzeLoopUnrollCost(), llvm::formLCSSA(), and llvm::LoopDeletionPass::runImpl().
Return true if the specified value is loop invariant.
Definition at line 55 of file LoopInfo.cpp.
References llvm::LoopBase< N, M >::contains(), and I.
Referenced by llvm::canSinkOrHoistInst(), llvm::getStrideFromPointer(), hasLoopInvariantOperands(), isSafeToExecuteUnconditionally(), isSameUnderlyingObjectInLoop(), makeLoopInvariant(), and llvm::promoteLoopAccessesToScalars().
| bool Loop::isLoopSimplifyForm | ( | ) | const |
Return true if the Loop is in the form that the LoopSimplify form transforms loops to, which is sometimes called normal form.
Definition at line 190 of file LoopInfo.cpp.
References llvm::LoopBase< N, M >::getLoopLatch(), llvm::LoopBase< N, M >::getLoopPreheader(), and hasDedicatedExits().
Referenced by analyzeLoopUnrollCost(), canPeel(), getLoopID(), isSimplifiedLoopNest(), llvm::LoopVersioning::LoopVersioning(), ReduceLoopStrength(), setLoopID(), tryToUnrollLoop(), and llvm::UnrollRuntimeLoopRemainder().
| bool Loop::isRecursivelyLCSSAForm | ( | DominatorTree & | DT, |
| const LoopInfo & | LI | ||
| ) | const |
Return true if this Loop and all inner subloops are in LCSSA form.
Definition at line 181 of file LoopInfo.cpp.
References llvm::all_of(), llvm::LoopBase< N, M >::blocks(), llvm::LoopInfoBase< N, M >::getLoopFor(), and isBlockInLCSSAForm().
Referenced by llvm::LPPassManager::runOnFunction(), and separateNestedLoop().
| bool Loop::isSafeToClone | ( | ) | const |
Return true if the loop body is safe to clone in practice.
Definition at line 197 of file LoopInfo.cpp.
References llvm::LoopBase< N, M >::blocks(), and I.
Referenced by llvm::UnrollLoop().
| bool Loop::makeLoopInvariant | ( | Value * | V, |
| bool & | Changed, | ||
| Instruction * | InsertPt = nullptr |
||
| ) | const |
If the given value is an instruction inside of the loop and it can be hoisted, do so to make it trivially loop-invariant.
Return true if the value after any hoisting is loop invariant. This function can be used as a slightly more aggressive replacement for isLoopInvariant.
If InsertPt is specified, it is the point to hoist instructions to. If null, the terminator of the loop preheader is used.
Definition at line 65 of file LoopInfo.cpp.
References I.
Referenced by FindLIVLoopCondition(), makeLoopInvariant(), and simplifyOneLoop().
| bool Loop::makeLoopInvariant | ( | Instruction * | I, |
| bool & | Changed, | ||
| Instruction * | InsertPt = nullptr |
||
| ) | const |
If the given instruction is inside of the loop and it can be hoisted, do so to make it trivially loop-invariant.
Return true if the instruction after any hoisting is loop invariant. This function can be used as a slightly more aggressive replacement for isLoopInvariant.
If InsertPt is specified, it is the point to hoist instructions to. If null, the terminator of the loop preheader is used.
Definition at line 72 of file LoopInfo.cpp.
References llvm::Instruction::dropUnknownNonDebugMetadata(), llvm::LoopBase< N, M >::getLoopPreheader(), llvm::BasicBlock::getTerminator(), llvm::Instruction::isEHPad(), isLoopInvariant(), llvm::isSafeToSpeculativelyExecute(), makeLoopInvariant(), llvm::Instruction::mayReadFromMemory(), llvm::Instruction::moveBefore(), and llvm::User::operands().
| void Loop::setLoopID | ( | MDNode * | LoopID | ) | const |
Set the llvm.loop loop id metadata for this loop.
The LoopID metadata node will be added to each terminator instruction in the loop that branches to the loop header.
The LoopID metadata node should have one or more operands and the first operand should should be the node itself.
Definition at line 246 of file LoopInfo.cpp.
References assert(), llvm::LoopBase< N, M >::blocks(), llvm::LoopBase< N, M >::getHeader(), llvm::LoopBase< N, M >::getLoopLatch(), llvm::MDNode::getNumOperands(), llvm::MDNode::getOperand(), H, isLoopSimplifyForm(), llvm::LLVMContext::MD_loop, llvm::Instruction::setMetadata(), llvm::Successor, and llvm::TerminatorInst::successors().
Referenced by AddRuntimeUnrollDisableMetaData(), llvm::addStringMetadataToLoop(), CloneLoopBlocks(), DisableAllLoopOptsOnLoop(), and SetLoopAlreadyUnrolled().
|
friend |
Definition at line 509 of file LoopInfo.h.
1.8.6