LLVM 20.0.0git
|
This implementation of LoopSafetyInfo use ImplicitControlFlowTracking to give precise answers on "may throw" queries. More...
#include "llvm/Analysis/MustExecute.h"
Public Member Functions | |
bool | blockMayThrow (const BasicBlock *BB) const override |
Returns true iff the block BB potentially may throw exception. | |
bool | anyBlockMayThrow () const override |
Returns true iff any block of the loop for which this info is contains an instruction that may throw or otherwise exit abnormally. | |
void | computeLoopSafetyInfo (const Loop *CurLoop) override |
Computes safety information for a loop checks loop body & header for the possibility of may throw exception, it takes LoopSafetyInfo and loop as argument. | |
bool | isGuaranteedToExecute (const Instruction &Inst, const DominatorTree *DT, const Loop *CurLoop) const override |
Returns true if the instruction in a loop is guaranteed to execute at least once (under the assumption that the loop is entered). | |
bool | doesNotWriteMemoryBefore (const BasicBlock *BB, const Loop *CurLoop) const |
Returns true if we could not execute a memory-modifying instruction before we enter BB under assumption that CurLoop is entered. | |
bool | doesNotWriteMemoryBefore (const Instruction &I, const Loop *CurLoop) const |
Returns true if we could not execute a memory-modifying instruction before we execute I under assumption that CurLoop is entered. | |
void | insertInstructionTo (const Instruction *Inst, const BasicBlock *BB) |
Inform the safety info that we are planning to insert a new instruction Inst into the basic block BB . | |
void | removeInstruction (const Instruction *Inst) |
Inform safety info that we are planning to remove the instruction Inst from its block. | |
Public Member Functions inherited from llvm::LoopSafetyInfo | |
const DenseMap< BasicBlock *, ColorVector > & | getBlockColors () const |
Returns block colors map that is used to update funclet operand bundles. | |
void | copyColors (BasicBlock *New, BasicBlock *Old) |
Copy colors of block Old into the block New . | |
virtual bool | blockMayThrow (const BasicBlock *BB) const =0 |
Returns true iff the block BB potentially may throw exception. | |
virtual bool | anyBlockMayThrow () const =0 |
Returns true iff any block of the loop for which this info is contains an instruction that may throw or otherwise exit abnormally. | |
bool | allLoopPathsLeadToBlock (const Loop *CurLoop, const BasicBlock *BB, const DominatorTree *DT) const |
Return true if we must reach the block BB under assumption that the loop CurLoop is entered. | |
virtual void | computeLoopSafetyInfo (const Loop *CurLoop)=0 |
Computes safety information for a loop checks loop body & header for the possibility of may throw exception, it takes LoopSafetyInfo and loop as argument. | |
virtual bool | isGuaranteedToExecute (const Instruction &Inst, const DominatorTree *DT, const Loop *CurLoop) const =0 |
Returns true if the instruction in a loop is guaranteed to execute at least once (under the assumption that the loop is entered). | |
LoopSafetyInfo ()=default | |
virtual | ~LoopSafetyInfo ()=default |
Additional Inherited Members | |
Protected Member Functions inherited from llvm::LoopSafetyInfo | |
void | computeBlockColors (const Loop *CurLoop) |
Computes block colors. | |
This implementation of LoopSafetyInfo use ImplicitControlFlowTracking to give precise answers on "may throw" queries.
This implementation uses cache that should be invalidated by calling the methods insertInstructionTo and removeInstruction whenever we modify a basic block's contents by adding or removing instructions.
Definition at line 132 of file MustExecute.h.
|
overridevirtual |
Returns true iff any block of the loop for which this info is contains an instruction that may throw or otherwise exit abnormally.
Implements llvm::LoopSafetyInfo.
Definition at line 75 of file MustExecute.cpp.
Referenced by llvm::promoteLoopAccessesToScalars().
|
overridevirtual |
Returns true iff the block BB
potentially may throw exception.
It can be false-positive in cases when we want to avoid complex analysis.
Implements llvm::LoopSafetyInfo.
Definition at line 71 of file MustExecute.cpp.
References llvm::ImplicitControlFlowTracking::hasICF().
Computes safety information for a loop checks loop body & header for the possibility of may throw exception, it takes LoopSafetyInfo and loop as argument.
Updates safety information in LoopSafetyInfo argument. Note: This is defined to clear and reinitialize an already initialized LoopSafetyInfo. Some callers rely on this fact.
Implements llvm::LoopSafetyInfo.
Definition at line 79 of file MustExecute.cpp.
References assert(), llvm::LoopBase< BlockT, LoopT >::blocks(), llvm::InstructionPrecedenceTracking::clear(), llvm::LoopSafetyInfo::computeBlockColors(), and llvm::ImplicitControlFlowTracking::hasICF().
Referenced by shouldInsertFreeze(), and unswitchNontrivialInvariants().
bool ICFLoopSafetyInfo::doesNotWriteMemoryBefore | ( | const BasicBlock * | BB, |
const Loop * | CurLoop | ||
) | const |
Returns true if we could not execute a memory-modifying instruction before we enter BB
under assumption that CurLoop
is entered.
Definition at line 289 of file MustExecute.cpp.
References assert(), collectTransitivePredecessors(), llvm::LoopBase< BlockT, LoopT >::contains(), llvm::LoopBase< BlockT, LoopT >::getHeader(), and llvm::MemoryWriteTracking::mayWriteToMemory().
Referenced by doesNotWriteMemoryBefore(), and llvm::hoistRegion().
bool ICFLoopSafetyInfo::doesNotWriteMemoryBefore | ( | const Instruction & | I, |
const Loop * | CurLoop | ||
) | const |
Returns true if we could not execute a memory-modifying instruction before we execute I
under assumption that CurLoop
is entered.
Definition at line 309 of file MustExecute.cpp.
References assert(), llvm::LoopBase< BlockT, LoopT >::contains(), doesNotWriteMemoryBefore(), I, and llvm::MemoryWriteTracking::isDominatedByMemoryWriteFromSameBlock().
void ICFLoopSafetyInfo::insertInstructionTo | ( | const Instruction * | Inst, |
const BasicBlock * | BB | ||
) |
Inform the safety info that we are planning to insert a new instruction Inst
into the basic block BB
.
It will make all cache updates to keep it correct after this insertion.
Definition at line 93 of file MustExecute.cpp.
References llvm::InstructionPrecedenceTracking::insertInstructionTo().
Referenced by llvm::hoistRegion(), and moveInstructionBefore().
|
overridevirtual |
Returns true if the instruction in a loop is guaranteed to execute at least once (under the assumption that the loop is entered).
Implements llvm::LoopSafetyInfo.
Definition at line 282 of file MustExecute.cpp.
References llvm::LoopSafetyInfo::allLoopPathsLeadToBlock(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), and llvm::ImplicitControlFlowTracking::isDominatedByICFIFromSameBlock().
Referenced by hoist(), llvm::hoistRegion(), llvm::promoteLoopAccessesToScalars(), shouldInsertFreeze(), and unswitchNontrivialInvariants().
void ICFLoopSafetyInfo::removeInstruction | ( | const Instruction * | Inst | ) |
Inform safety info that we are planning to remove the instruction Inst
from its block.
It will make all cache updates to keep it correct after this removal.
Definition at line 99 of file MustExecute.cpp.
References llvm::InstructionPrecedenceTracking::removeInstruction().
Referenced by eraseInstruction(), and moveInstructionBefore().