LLVM 20.0.0git
|
Core dominator tree base class. More...
#include "llvm/Support/GenericDomTree.h"
Public Types | |
enum class | VerificationLevel { Fast , Basic , Full } |
using | NodeTrait = DomTreeNodeTraits< NodeT > |
using | NodeType = typename NodeTrait::NodeType |
using | NodePtr = typename NodeTrait::NodePtr |
using | ParentPtr = typename NodeTrait::ParentPtr |
using | ParentType = std::remove_pointer_t< ParentPtr > |
using | UpdateType = cfg::Update< NodePtr > |
using | UpdateKind = cfg::UpdateKind |
using | root_iterator = typename SmallVectorImpl< NodeT * >::iterator |
Iteration over roots. | |
using | const_root_iterator = typename SmallVectorImpl< NodeT * >::const_iterator |
Public Member Functions | |
DominatorTreeBase ()=default | |
DominatorTreeBase (DominatorTreeBase &&Arg) | |
DominatorTreeBase & | operator= (DominatorTreeBase &&RHS) |
DominatorTreeBase (const DominatorTreeBase &)=delete | |
DominatorTreeBase & | operator= (const DominatorTreeBase &)=delete |
root_iterator | root_begin () |
const_root_iterator | root_begin () const |
root_iterator | root_end () |
const_root_iterator | root_end () const |
size_t | root_size () const |
iterator_range< root_iterator > | roots () |
iterator_range< const_root_iterator > | roots () const |
bool | isPostDominator () const |
isPostDominator - Returns true if analysis based of postdoms | |
bool | compare (const DominatorTreeBase &Other) const |
compare - Return false if the other dominator tree base matches this dominator tree base. | |
DomTreeNodeBase< NodeT > * | getNode (const NodeT *BB) const |
getNode - return the (Post)DominatorTree node for the specified basic block. | |
DomTreeNodeBase< NodeT > * | operator[] (const NodeT *BB) const |
See getNode. | |
DomTreeNodeBase< NodeT > * | getRootNode () |
getRootNode - This returns the entry node for the CFG of the function. | |
const DomTreeNodeBase< NodeT > * | getRootNode () const |
void | getDescendants (NodeT *R, SmallVectorImpl< NodeT * > &Result) const |
Get all nodes dominated by R, including R itself. | |
bool | properlyDominates (const DomTreeNodeBase< NodeT > *A, const DomTreeNodeBase< NodeT > *B) const |
properlyDominates - Returns true iff A dominates B and A != B. | |
bool | properlyDominates (const NodeT *A, const NodeT *B) const |
bool | isReachableFromEntry (const NodeT *A) const |
isReachableFromEntry - Return true if A is dominated by the entry block of the function containing it. | |
bool | isReachableFromEntry (const DomTreeNodeBase< NodeT > *A) const |
bool | dominates (const DomTreeNodeBase< NodeT > *A, const DomTreeNodeBase< NodeT > *B) const |
dominates - Returns true iff A dominates B. | |
bool | dominates (const NodeT *A, const NodeT *B) const |
NodeT * | getRoot () const |
NodeT * | findNearestCommonDominator (NodeT *A, NodeT *B) const |
Find nearest common dominator basic block for basic block A and B. | |
const NodeT * | findNearestCommonDominator (const NodeT *A, const NodeT *B) const |
bool | isVirtualRoot (const DomTreeNodeBase< NodeT > *A) const |
void | applyUpdates (ArrayRef< UpdateType > Updates) |
Inform the dominator tree about a sequence of CFG edge insertions and deletions and perform a batch update on the tree. | |
void | applyUpdates (ArrayRef< UpdateType > Updates, ArrayRef< UpdateType > PostViewUpdates) |
void | insertEdge (NodeT *From, NodeT *To) |
Inform the dominator tree about a CFG edge insertion and update the tree. | |
void | deleteEdge (NodeT *From, NodeT *To) |
Inform the dominator tree about a CFG edge deletion and update the tree. | |
DomTreeNodeBase< NodeT > * | addNewBlock (NodeT *BB, NodeT *DomBB) |
Add a new node to the dominator tree information. | |
DomTreeNodeBase< NodeT > * | setNewRoot (NodeT *BB) |
Add a new node to the forward dominator tree and make it a new root. | |
void | changeImmediateDominator (DomTreeNodeBase< NodeT > *N, DomTreeNodeBase< NodeT > *NewIDom) |
changeImmediateDominator - This method is used to update the dominator tree information when a node's immediate dominator changes. | |
void | changeImmediateDominator (NodeT *BB, NodeT *NewBB) |
void | eraseNode (NodeT *BB) |
eraseNode - Removes a node from the dominator tree. | |
void | splitBlock (NodeT *NewBB) |
splitBlock - BB is split and now it has one successor. | |
void | print (raw_ostream &O) const |
print - Convert to human readable form | |
void | updateDFSNumbers () const |
updateDFSNumbers - Assign In and Out numbers to the nodes while walking dominator tree in dfs order. | |
void | recalculate (ParentType &Func) |
recalculate - compute a dominator tree for the given function | |
void | recalculate (ParentType &Func, ArrayRef< UpdateType > Updates) |
template<typename T = NodeT> | |
std::enable_if_t< GraphHasNodeNumbers< T * >, void > | updateBlockNumbers () |
Update dominator tree after renumbering blocks. | |
bool | verify (VerificationLevel VL=VerificationLevel::Full) const |
verify - checks if the tree is correct. | |
void | reset () |
Static Public Attributes | |
static constexpr bool | IsPostDominator = IsPostDom |
static constexpr UpdateKind | Insert = UpdateKind::Insert |
static constexpr UpdateKind | Delete = UpdateKind::Delete |
Protected Types | |
using | DomTreeNodeStorageTy = SmallVector< std::unique_ptr< DomTreeNodeBase< NodeT > > > |
Protected Member Functions | |
void | addRoot (NodeT *BB) |
DomTreeNodeBase< NodeT > * | createNode (NodeT *BB, DomTreeNodeBase< NodeT > *IDom=nullptr) |
template<class N > | |
void | Split (typename GraphTraits< N >::NodeRef NewBB) |
void | addRoot (MachineBasicBlock *MBB) |
Protected Attributes | |
SmallVector< NodeT *, IsPostDom ? 4 :1 > | Roots |
DomTreeNodeStorageTy | DomTreeNodes |
std::conditional_t<!GraphHasNodeNumbers< NodeT * >, DenseMap< const NodeT *, unsigned >, std::tuple<> > | NodeNumberMap |
DomTreeNodeBase< NodeT > * | RootNode = nullptr |
ParentPtr | Parent = nullptr |
bool | DFSInfoValid = false |
unsigned int | SlowQueries = 0 |
unsigned | BlockNumberEpoch = 0 |
Friends | |
struct | DomTreeBuilder::SemiNCAInfo< DominatorTreeBase > |
Core dominator tree base class.
This class is a generic template over graph nodes. It is instantiated for various graphs in the LLVM IR or in the code generator.
Definition at line 237 of file GenericDomTree.h.
using llvm::DominatorTreeBase< NodeT, IsPostDom >::const_root_iterator = typename SmallVectorImpl<NodeT *>::const_iterator |
Definition at line 311 of file GenericDomTree.h.
|
protected |
Definition at line 261 of file GenericDomTree.h.
using llvm::DominatorTreeBase< NodeT, IsPostDom >::NodePtr = typename NodeTrait::NodePtr |
Definition at line 243 of file GenericDomTree.h.
using llvm::DominatorTreeBase< NodeT, IsPostDom >::NodeTrait = DomTreeNodeTraits<NodeT> |
Definition at line 241 of file GenericDomTree.h.
using llvm::DominatorTreeBase< NodeT, IsPostDom >::NodeType = typename NodeTrait::NodeType |
Definition at line 242 of file GenericDomTree.h.
using llvm::DominatorTreeBase< NodeT, IsPostDom >::ParentPtr = typename NodeTrait::ParentPtr |
Definition at line 244 of file GenericDomTree.h.
using llvm::DominatorTreeBase< NodeT, IsPostDom >::ParentType = std::remove_pointer_t<ParentPtr> |
Definition at line 247 of file GenericDomTree.h.
using llvm::DominatorTreeBase< NodeT, IsPostDom >::root_iterator = typename SmallVectorImpl<NodeT *>::iterator |
Iteration over roots.
This may include multiple blocks if we are computing post dominators. For forward dominators, this will always be a single block (the entry block).
Definition at line 310 of file GenericDomTree.h.
using llvm::DominatorTreeBase< NodeT, IsPostDom >::UpdateKind = cfg::UpdateKind |
Definition at line 251 of file GenericDomTree.h.
using llvm::DominatorTreeBase< NodeT, IsPostDom >::UpdateType = cfg::Update<NodePtr> |
Definition at line 250 of file GenericDomTree.h.
|
strong |
Enumerator | |
---|---|
Fast | |
Basic | |
Full |
Definition at line 255 of file GenericDomTree.h.
|
default |
|
inline |
Definition at line 281 of file GenericDomTree.h.
|
delete |
|
inline |
Add a new node to the dominator tree information.
This creates a new node as a child of DomBB dominator node, linking it into the children list of the immediate dominator.
BB | New node in CFG. |
DomBB | CFG node that is dominator for BB. |
Definition at line 669 of file GenericDomTree.h.
References assert(), llvm::DominatorTreeBase< NodeT, IsPostDom >::createNode(), llvm::DominatorTreeBase< NodeT, IsPostDom >::DFSInfoValid, and llvm::DominatorTreeBase< NodeT, IsPostDom >::getNode().
Referenced by cloneLoopBlocks(), CloneLoopBlocks(), llvm::cloneLoopWithPreheader(), llvm::DominatorTreeBase< NodeT, IsPostDom >::Split(), SplitBlockImpl(), llvm::UnrollAndJamLoop(), and llvm::UnrollLoop().
|
inlineprotected |
Definition at line 36 of file MachineDominators.h.
References MBB.
|
inlineprotected |
Definition at line 903 of file GenericDomTree.h.
References llvm::SmallVectorTemplateBase< T, bool >::push_back().
Referenced by llvm::DominatorTreeBase< NodeT, IsPostDom >::setNewRoot().
|
inline |
Inform the dominator tree about a sequence of CFG edge insertions and deletions and perform a batch update on the tree.
This function should be used when there were multiple CFG updates after the last dominator tree update. It takes care of performing the updates in sync with the CFG and optimizes away the redundant operations that cancel each other. The functions expects the sequence of updates to be balanced. Eg.:
What's more, the functions assumes that it's safe to ask every node in the CFG about its children and inverse children. This implies that deletions of CFG edges must not delete the CFG nodes before calling this function.
The applyUpdates function can reorder the updates and remove redundant ones internally (as long as it is done in a deterministic fashion). The batch updater is also able to detect sequences of zero and exactly one update – it's optimized to do less work in these cases.
Note that for postdominators it automatically takes care of applying updates on reverse edges internally (so there's no need to swap the From and To pointers when constructing DominatorTree::UpdateType). The type of updates is the same for DomTreeBase<T> and PostDomTreeBase<T> with the same template parameter T.
Updates | An ordered sequence of updates to perform. The current CFG and the reverse of these updates provides the pre-view of the CFG. |
Definition at line 594 of file GenericDomTree.h.
References llvm::DomTreeBuilder::ApplyUpdates().
Referenced by llvm::MemorySSAUpdater::applyUpdates(), injectPendingInvariantConditions(), splitBlock(), unswitchNontrivialInvariants(), and unswitchTrivialSwitch().
|
inline |
Updates | An ordered sequence of updates to perform. The current CFG and the reverse of these updates provides the pre-view of the CFG. |
PostViewUpdates | An ordered sequence of update to perform in order to obtain a post-view of the CFG. The DT will be updated assuming the obtained PostViewCFG is the desired end state. |
Definition at line 605 of file GenericDomTree.h.
References llvm::append_range(), llvm::DomTreeBuilder::ApplyUpdates(), and llvm::ArrayRef< T >::empty().
|
inline |
changeImmediateDominator - This method is used to update the dominator tree information when a node's immediate dominator changes.
Definition at line 705 of file GenericDomTree.h.
References assert(), llvm::DominatorTreeBase< NodeT, IsPostDom >::DFSInfoValid, and N.
Referenced by llvm::DominatorTreeBase< NodeT, IsPostDom >::changeImmediateDominator(), cloneLoopBlocks(), llvm::cloneLoopWithPreheader(), ConnectEpilog(), ConnectProlog(), llvm::EpilogueVectorizerEpilogueLoop::createEpilogueVectorizedLoopSkeleton(), llvm::InnerLoopVectorizer::emitIterationCountCheck(), llvm::EpilogueVectorizerMainLoop::emitIterationCountCheck(), llvm::InnerLoopVectorizer::emitSCEVChecks(), llvm::peelLoop(), simplifyOneLoop(), llvm::DominatorTreeBase< NodeT, IsPostDom >::Split(), SplitBlockImpl(), llvm::splitLoopBound(), llvm::UnrollLoop(), llvm::UnrollRuntimeLoopRemainder(), and llvm::LoopVersioning::versionLoop().
|
inline |
Definition at line 712 of file GenericDomTree.h.
References llvm::DominatorTreeBase< NodeT, IsPostDom >::changeImmediateDominator(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::getNode().
|
inline |
compare - Return false if the other dominator tree base matches this dominator tree base.
Otherwise return true.
Definition at line 333 of file GenericDomTree.h.
References llvm::SmallVectorTemplateCommon< T, typename >::begin(), llvm::DominatorTreeBase< NodeT, IsPostDom >::DomTreeNodes, llvm::SmallVectorTemplateCommon< T, typename >::end(), llvm::Other, llvm::DominatorTreeBase< NodeT, IsPostDom >::Parent, llvm::DominatorTreeBase< NodeT, IsPostDom >::Roots, and llvm::SmallVectorBase< Size_T >::size().
|
inlineprotected |
Definition at line 905 of file GenericDomTree.h.
References llvm::DomTreeNodeBase< NodeT >::addChild(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::DomTreeNodes.
Referenced by llvm::DominatorTreeBase< NodeT, IsPostDom >::addNewBlock(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::setNewRoot().
|
inline |
Inform the dominator tree about a CFG edge deletion and update the tree.
This function has to be called just after making the update on the actual CFG. An internal functions checks if the edge doesn't exist in the CFG in DEBUG mode. There cannot be any other updates that the dominator tree doesn't know about.
Note that for postdominators it automatically takes care of deleting a reverse edge internally (so there's no need to swap the parameters).
Definition at line 652 of file GenericDomTree.h.
References assert(), llvm::DomTreeBuilder::DeleteEdge(), From, llvm::DomTreeNodeTraits< NodeT >::getParent(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::Parent.
Referenced by DoFlattenLoopPair(), replaceArgumentUses(), and unswitchTrivialBranch().
|
inline |
dominates - Returns true iff A dominates B.
Note that this is not a constant time operation!
Definition at line 465 of file GenericDomTree.h.
References A, assert(), B, llvm::DominatorTreeBase< NodeT, IsPostDom >::DFSInfoValid, llvm::DominatorTreeBase< NodeT, IsPostDom >::isReachableFromEntry(), llvm::DominatorTreeBase< NodeT, IsPostDom >::SlowQueries, and llvm::DominatorTreeBase< NodeT, IsPostDom >::updateDFSNumbers().
Referenced by llvm::LoopInfoBase< BlockT, LoopT >::analyze(), llvm::PostDominatorTree::dominates(), llvm::DominatorTreeBase< NodeT, IsPostDom >::properlyDominates(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::Split().
bool llvm::DominatorTreeBase< NodeT, IsPostDom >::dominates | ( | const NodeT * | A, |
const NodeT * | B | ||
) | const |
Definition at line 1010 of file GenericDomTree.h.
References A, B, dominates(), and getNode().
|
inline |
eraseNode - Removes a node from the dominator tree.
Block must not dominate any other blocks. Removes node from its immediate dominator's children list. Deletes dominator node associated with basic block BB.
Definition at line 719 of file GenericDomTree.h.
References assert(), llvm::SmallVectorTemplateCommon< T, typename >::back(), llvm::DominatorTreeBase< NodeT, IsPostDom >::DFSInfoValid, llvm::DominatorTreeBase< NodeT, IsPostDom >::DomTreeNodes, llvm::SmallVectorTemplateCommon< T, typename >::end(), llvm::find(), I, llvm::DominatorTreeBase< NodeT, IsPostDom >::NodeNumberMap, llvm::SmallVectorTemplateBase< T, bool >::pop_back(), llvm::DominatorTreeBase< NodeT, IsPostDom >::Roots, and std::swap().
Referenced by llvm::MergeBlockIntoPredecessor(), and simplifyOneLoop().
|
inline |
Definition at line 547 of file GenericDomTree.h.
References A, B, and llvm::DominatorTreeBase< NodeT, IsPostDom >::findNearestCommonDominator().
|
inline |
Find nearest common dominator basic block for basic block A and B.
A and B must have tree nodes.
Definition at line 517 of file GenericDomTree.h.
References A, assert(), B, llvm::DomTreeNodeBase< NodeT >::getBlock(), llvm::DomTreeNodeTraits< NodeT >::getEntryNode(), llvm::DomTreeNodeBase< NodeT >::getLevel(), llvm::DominatorTreeBase< NodeT, IsPostDom >::getNode(), llvm::DomTreeNodeTraits< NodeT >::getParent(), llvm::DominatorTreeBase< NodeT, IsPostDom >::isPostDominator(), and std::swap().
Referenced by llvm::MachinePostDominatorTree::findNearestCommonDominator(), llvm::DominatorTreeBase< NodeT, IsPostDom >::findNearestCommonDominator(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::Split().
|
inline |
Get all nodes dominated by R, including R itself.
Definition at line 423 of file GenericDomTree.h.
References llvm::SmallVectorImpl< T >::append(), llvm::SmallVectorBase< Size_T >::empty(), llvm::DominatorTreeBase< NodeT, IsPostDom >::getNode(), N, llvm::SmallVectorImpl< T >::pop_back_val(), and llvm::SmallVectorTemplateBase< T, bool >::push_back().
Referenced by replaceArgumentUses().
|
inline |
getNode - return the (Post)DominatorTree node for the specified basic block.
This is the same as using operator[] on this class. The result may (but is not required to) be null for a forward (backwards) statically unreachable block.
Definition at line 399 of file GenericDomTree.h.
References assert(), llvm::DominatorTreeBase< NodeT, IsPostDom >::DomTreeNodes, llvm::DomTreeNodeTraits< NodeT >::getParent(), Idx, llvm::DominatorTreeBase< NodeT, IsPostDom >::Parent, and llvm::SmallVectorBase< Size_T >::size().
Referenced by llvm::DominatorTreeBase< NodeT, IsPostDom >::addNewBlock(), llvm::LoopInfoBase< BlockT, LoopT >::analyze(), llvm::DominatorTreeBase< NodeT, IsPostDom >::changeImmediateDominator(), checkAndReplaceCondition(), checkHoistValue(), cloneLoopBlocks(), CloneLoopBlocks(), llvm::cloneLoopWithPreheader(), collectUnswitchCandidatesWithInjections(), compareCmp(), llvm::ValueDFS_Compare::comparePHIRelated(), computeBlocksDominatingExits(), containsUnconditionalCallSafepoint(), domTreeLevelBefore(), eliminateConstraints(), llvm::InnerLoopVectorizer::emitIterationCountCheck(), llvm::EpilogueVectorizerMainLoop::emitIterationCountCheck(), llvm::MustBeExecutedContextExplorer::findBackwardJoinPoint(), findBestInsertionSet(), llvm::MustBeExecutedContextExplorer::findForwardJoinPoint(), llvm::MachinePostDominatorTree::findNearestCommonDominator(), llvm::DominatorTreeBase< NodeT, IsPostDom >::findNearestCommonDominator(), formLCSSAForInstructionsImpl(), llvm::DominatorTreeBase< NodeT, IsPostDom >::getDescendants(), getDominatees(), getDominators(), llvm::slpvectorizer::BoUpSLP::getSpillCost(), llvm::hoistRegion(), hoistValue(), isGuaranteedNotToBeUndefOrPoison(), llvm::DominatorTreeBase< NodeT, IsPostDom >::isReachableFromEntry(), loadCSE(), llvm::MergeBlockIntoPredecessor(), llvm::DominatorTreeBase< NodeT, IsPostDom >::operator[](), llvm::slpvectorizer::BoUpSLP::optimizeGatherSequence(), llvm::peelLoop(), preheader(), llvm::GuardWideningPass::run(), llvm::DominatorTreeBase< NodeT, IsPostDom >::setNewRoot(), shouldSplitOnPredicatedArgument(), simplifyOneLoop(), simplifyUsingControlFlow(), SinkInstruction(), llvm::sinkRegionForLoopNest(), llvm::DominatorTreeBase< NodeT, IsPostDom >::Split(), SplitBlockImpl(), llvm::UnrollAndJamLoop(), llvm::UnrollLoop(), llvm::UnrollRuntimeLoopRemainder(), and llvm::MemorySSA::verifyPrevDefInPhis().
|
inline |
Definition at line 510 of file GenericDomTree.h.
References assert(), and llvm::SmallVectorBase< Size_T >::size().
Referenced by llvm::ForwardDominanceFrontierBase< BlockT >::analyze(), getFreezeInsertPt(), llvm::EarliestEscapeInfo::isNotCapturedBefore(), and nearest_common_dominatee().
|
inline |
getRootNode - This returns the entry node for the CFG of the function.
If this tree represents the post-dominance relations for a function, however, this root may be a node with the block == NULL. This is the case when there are multiple exit nodes from a particular function. Consumers of post-dominance information must be capable of dealing with this possibility.
Definition at line 419 of file GenericDomTree.h.
References llvm::DominatorTreeBase< NodeT, IsPostDom >::RootNode.
Referenced by llvm::LoopInfoBase< BlockT, LoopT >::analyze(), llvm::PredicateInfoBuilder::buildPredicateInfo(), llvm::GraphTraits< DominatorTree * >::getEntryNode(), llvm::GraphTraits< PostDominatorTree * >::getEntryNode(), llvm::MemorySSA::OptimizeUses::optimizeUses(), llvm::DominatorTreeBase< NodeT, IsPostDom >::print(), llvm::GuardWideningPass::run(), UpdateAnalysisInformation(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::updateDFSNumbers().
|
inline |
Definition at line 420 of file GenericDomTree.h.
References llvm::DominatorTreeBase< NodeT, IsPostDom >::RootNode.
|
inline |
Inform the dominator tree about a CFG edge insertion and update the tree.
This function has to be called just before or just after making the update on the actual CFG. There cannot be any other updates that the dominator tree doesn't know about.
Note that for postdominators it automatically takes care of inserting a reverse edge internally (so there's no need to swap the parameters).
Definition at line 634 of file GenericDomTree.h.
References assert(), From, llvm::DomTreeNodeTraits< NodeT >::getParent(), llvm::DomTreeBuilder::InsertEdge(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::Parent.
Referenced by replaceArgumentUses(), and unswitchTrivialBranch().
|
inline |
isPostDominator - Returns true if analysis based of postdoms
Definition at line 329 of file GenericDomTree.h.
References llvm::DominatorTreeBase< NodeT, IsPostDom >::IsPostDominator.
Referenced by llvm::DominatorTreeBase< NodeT, IsPostDom >::findNearestCommonDominator(), llvm::DominatorTreeBase< NodeT, IsPostDom >::isReachableFromEntry(), llvm::DominatorTreeBase< NodeT, IsPostDom >::isVirtualRoot(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::setNewRoot().
|
inline |
Definition at line 460 of file GenericDomTree.h.
References A.
|
inline |
isReachableFromEntry - Return true if A is dominated by the entry block of the function containing it.
Definition at line 454 of file GenericDomTree.h.
References A, assert(), llvm::DominatorTreeBase< NodeT, IsPostDom >::getNode(), llvm::DominatorTreeBase< NodeT, IsPostDom >::isPostDominator(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::isReachableFromEntry().
Referenced by llvm::DominatorTreeBase< NodeT, IsPostDom >::dominates(), llvm::DominatorTreeBase< NodeT, IsPostDom >::isReachableFromEntry(), llvm::DominatorTreeBase< NodeT, IsPostDom >::Split(), and llvm::LoopBase< BasicBlock, Loop >::verifyLoop().
|
inline |
Definition at line 555 of file GenericDomTree.h.
References A, and llvm::DominatorTreeBase< NodeT, IsPostDom >::isPostDominator().
Referenced by llvm::MachinePostDominatorTree::findNearestCommonDominator().
|
delete |
|
inline |
Definition at line 289 of file GenericDomTree.h.
References llvm::DominatorTreeBase< NodeT, IsPostDom >::BlockNumberEpoch, llvm::DominatorTreeBase< NodeT, IsPostDom >::DFSInfoValid, llvm::DominatorTreeBase< NodeT, IsPostDom >::DomTreeNodes, llvm::DominatorTreeBase< NodeT, IsPostDom >::NodeNumberMap, llvm::DominatorTreeBase< NodeT, IsPostDom >::Parent, RHS, llvm::DominatorTreeBase< NodeT, IsPostDom >::RootNode, llvm::DominatorTreeBase< NodeT, IsPostDom >::Roots, and llvm::DominatorTreeBase< NodeT, IsPostDom >::SlowQueries.
|
inline |
See getNode.
Definition at line 408 of file GenericDomTree.h.
References llvm::DominatorTreeBase< NodeT, IsPostDom >::getNode().
|
inline |
print - Convert to human readable form
Definition at line 764 of file GenericDomTree.h.
References llvm::Block, llvm::DominatorTreeBase< NodeT, IsPostDom >::DFSInfoValid, llvm::DominatorTreeBase< NodeT, IsPostDom >::getRootNode(), llvm::DominatorTreeBase< NodeT, IsPostDom >::IsPostDominator, llvm::DominatorTreeBase< NodeT, IsPostDom >::Roots, and llvm::DominatorTreeBase< NodeT, IsPostDom >::SlowQueries.
Referenced by llvm::VPlanHCFGBuilder::buildHierarchicalCFG(), llvm::PostDominatorTreeWrapperPass::print(), and llvm::DominatorTreeWrapperPass::print().
|
inline |
properlyDominates - Returns true iff A dominates B and A != B.
Note that this is not a constant time operation!
Definition at line 441 of file GenericDomTree.h.
References A, B, and llvm::DominatorTreeBase< NodeT, IsPostDom >::dominates().
Referenced by llvm::ForwardDominanceFrontierBase< BlockT >::calculate(), ConstructSSAForLoadSet(), llvm::InnerLoopVectorizer::emitIterationCountCheck(), llvm::EpilogueVectorizerMainLoop::emitIterationCountCheck(), llvm::ScalarEvolution::isKnownViaInduction(), isLoadInvariantInLoop(), and properlyDominates().
bool llvm::DominatorTreeBase< NodeT, IsPostDom >::properlyDominates | ( | const NodeT * | A, |
const NodeT * | B | ||
) | const |
Definition at line 1022 of file GenericDomTree.h.
References A, B, dominates(), and getNode().
|
inline |
recalculate - compute a dominator tree for the given function
Definition at line 841 of file GenericDomTree.h.
References llvm::DomTreeBuilder::Calculate(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::Parent.
Referenced by AddAliasScopeMetadata(), AddAlignmentAssumptions(), llvm::VPlanTransforms::adjustFixedOrderRecurrences(), llvm::VPlanHCFGBuilder::buildHierarchicalCFG(), llvm::MachineDominatorTree::calculate(), llvm::OptimizationRemarkEmitter::OptimizationRemarkEmitter(), llvm::PostDominatorTree::PostDominatorTree(), llvm::LoopConstrainer::run(), llvm::DominatorTreeAnalysis::run(), llvm::PlaceSafepointsPass::runImpl(), llvm::PostDominatorTreeWrapperPass::runOnFunction(), verifyConvergenceControl(), and llvm::verifyVPlanIsValid().
|
inline |
Definition at line 847 of file GenericDomTree.h.
References llvm::DomTreeBuilder::CalculateWithUpdates(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::Parent.
|
inline |
Definition at line 891 of file GenericDomTree.h.
References llvm::SmallVectorImpl< T >::clear(), llvm::DominatorTreeBase< NodeT, IsPostDom >::DFSInfoValid, llvm::DominatorTreeBase< NodeT, IsPostDom >::DomTreeNodes, llvm::DominatorTreeBase< NodeT, IsPostDom >::NodeNumberMap, llvm::DominatorTreeBase< NodeT, IsPostDom >::Parent, llvm::DominatorTreeBase< NodeT, IsPostDom >::RootNode, llvm::DominatorTreeBase< NodeT, IsPostDom >::Roots, and llvm::DominatorTreeBase< NodeT, IsPostDom >::SlowQueries.
Referenced by llvm::PostDominatorTreeWrapperPass::releaseMemory(), and llvm::DominatorTreeWrapperPass::releaseMemory().
|
inline |
Definition at line 313 of file GenericDomTree.h.
References llvm::SmallVectorTemplateCommon< T, typename >::begin(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::Roots.
Referenced by llvm::DominatorTreeBase< NodeT, IsPostDom >::roots().
|
inline |
Definition at line 314 of file GenericDomTree.h.
References llvm::SmallVectorTemplateCommon< T, typename >::begin(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::Roots.
|
inline |
Definition at line 315 of file GenericDomTree.h.
References llvm::SmallVectorTemplateCommon< T, typename >::end(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::Roots.
Referenced by llvm::DominatorTreeBase< NodeT, IsPostDom >::roots().
|
inline |
Definition at line 316 of file GenericDomTree.h.
References llvm::SmallVectorTemplateCommon< T, typename >::end(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::Roots.
|
inline |
Definition at line 318 of file GenericDomTree.h.
References llvm::DominatorTreeBase< NodeT, IsPostDom >::Roots, and llvm::SmallVectorBase< Size_T >::size().
Referenced by llvm::ForwardDominanceFrontierBase< BlockT >::analyze().
|
inline |
Definition at line 320 of file GenericDomTree.h.
References llvm::make_range(), llvm::DominatorTreeBase< NodeT, IsPostDom >::root_begin(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::root_end().
|
inline |
Definition at line 323 of file GenericDomTree.h.
References llvm::make_range(), llvm::DominatorTreeBase< NodeT, IsPostDom >::root_begin(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::root_end().
|
inline |
Add a new node to the forward dominator tree and make it a new root.
BB | New node in CFG. |
Definition at line 682 of file GenericDomTree.h.
References llvm::DomTreeNodeBase< NodeT >::addChild(), llvm::DominatorTreeBase< NodeT, IsPostDom >::addRoot(), assert(), llvm::DominatorTreeBase< NodeT, IsPostDom >::createNode(), llvm::SmallVectorBase< Size_T >::empty(), llvm::SmallVectorTemplateCommon< T, typename >::front(), llvm::DominatorTreeBase< NodeT, IsPostDom >::getNode(), llvm::DominatorTreeBase< NodeT, IsPostDom >::isPostDominator(), llvm::DominatorTreeBase< NodeT, IsPostDom >::RootNode, llvm::DominatorTreeBase< NodeT, IsPostDom >::Roots, and llvm::SmallVectorBase< Size_T >::size().
Referenced by UpdateAnalysisInformation().
|
inlineprotected |
Definition at line 919 of file GenericDomTree.h.
References llvm::DominatorTreeBase< NodeT, IsPostDom >::addNewBlock(), assert(), llvm::DominatorTreeBase< NodeT, IsPostDom >::changeImmediateDominator(), llvm::DominatorTreeBase< NodeT, IsPostDom >::dominates(), llvm::SmallVectorBase< Size_T >::empty(), llvm::DominatorTreeBase< NodeT, IsPostDom >::findNearestCommonDominator(), llvm::DominatorTreeBase< NodeT, IsPostDom >::getNode(), llvm::hasSingleElement(), llvm::DominatorTreeBase< NodeT, IsPostDom >::isReachableFromEntry(), and llvm::SmallVectorBase< Size_T >::size().
|
inline |
splitBlock - BB is split and now it has one successor.
Update dominator tree to reflect this change.
Definition at line 755 of file GenericDomTree.h.
References llvm::DominatorTreeBase< NodeT, IsPostDom >::IsPostDominator.
Referenced by insertUniqueBackedgeBlock(), and UpdateAnalysisInformation().
|
inline |
Update dominator tree after renumbering blocks.
Definition at line 855 of file GenericDomTree.h.
References llvm::DominatorTreeBase< NodeT, IsPostDom >::DomTreeNodes, Idx, llvm::DominatorTreeBase< NodeT, IsPostDom >::Parent, llvm::SmallVectorImpl< T >::resize(), and llvm::SmallVectorBase< Size_T >::size().
Referenced by sortBlocks().
|
inline |
updateDFSNumbers - Assign In and Out numbers to the nodes while walking dominator tree in dfs order.
Definition at line 787 of file GenericDomTree.h.
References assert(), llvm::SmallVectorTemplateCommon< T, typename >::back(), llvm::DomTreeNodeBase< NodeT >::begin(), llvm::DominatorTreeBase< NodeT, IsPostDom >::DFSInfoValid, llvm::SmallVectorBase< Size_T >::empty(), llvm::DominatorTreeBase< NodeT, IsPostDom >::getRootNode(), llvm::DominatorTreeBase< NodeT, IsPostDom >::Parent, llvm::SmallVectorTemplateBase< T, bool >::pop_back(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::SlowQueries.
Referenced by llvm::PredicateInfoBuilder::buildPredicateInfo(), llvm::DominatorTreeBase< NodeT, IsPostDom >::dominates(), eliminateConstraints(), llvm::isSafeToMoveBefore(), llvm::PhiLoweringHelper::lowerPhis(), and llvm::SLPVectorizerPass::runImpl().
|
inline |
verify - checks if the tree is correct.
There are 3 level of verification:
Definition at line 887 of file GenericDomTree.h.
References llvm::DomTreeBuilder::Verify().
Referenced by createNaturalLoopInternal(), llvm::VPlan::execute(), llvm::LoopVectorizationPlanner::executePlan(), llvm::hoistRegion(), injectPendingInvariantConditions(), llvm::peelLoop(), llvm::LoopVectorizePass::processLoop(), llvm::FunctionToLoopPassAdaptor::run(), llvm::LoopBoundSplitPass::run(), llvm::SimpleLoopUnswitchPass::run(), runImpl(), simplifyFunctionCFG(), unifyLoopExits(), llvm::UnrollAndJamLoop(), llvm::UnrollLoop(), llvm::UnrollRuntimeLoopRemainder(), unswitchNontrivialInvariants(), unswitchTrivialSwitch(), llvm::PostDominatorTreeWrapperPass::verifyAnalysis(), and llvm::DominatorTreeWrapperPass::verifyAnalysis().
|
friend |
Definition at line 274 of file GenericDomTree.h.
|
protected |
Definition at line 274 of file GenericDomTree.h.
Referenced by llvm::DominatorTreeBase< NodeT, IsPostDom >::operator=().
|
staticconstexpr |
Definition at line 253 of file GenericDomTree.h.
Referenced by llvm::MemorySSAUpdater::applyUpdates(), and unswitchTrivialSwitch().
|
mutableprotected |
Definition at line 272 of file GenericDomTree.h.
Referenced by llvm::DominatorTreeBase< NodeT, IsPostDom >::addNewBlock(), llvm::DominatorTreeBase< NodeT, IsPostDom >::changeImmediateDominator(), llvm::DominatorTreeBase< NodeT, IsPostDom >::dominates(), llvm::DominatorTreeBase< NodeT, IsPostDom >::eraseNode(), llvm::DominatorTreeBase< NodeT, IsPostDom >::operator=(), llvm::DominatorTreeBase< NodeT, IsPostDom >::print(), llvm::DominatorTreeBase< NodeT, IsPostDom >::reset(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::updateDFSNumbers().
|
protected |
Definition at line 263 of file GenericDomTree.h.
Referenced by llvm::DominatorTreeBase< NodeT, IsPostDom >::compare(), llvm::DominatorTreeBase< NodeT, IsPostDom >::createNode(), llvm::DominatorTreeBase< NodeT, IsPostDom >::eraseNode(), llvm::DominatorTreeBase< NodeT, IsPostDom >::getNode(), llvm::DominatorTreeBase< NodeT, IsPostDom >::operator=(), llvm::DominatorTreeBase< NodeT, IsPostDom >::reset(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::updateBlockNumbers().
|
staticconstexpr |
Definition at line 252 of file GenericDomTree.h.
Referenced by llvm::MemorySSAUpdater::applyUpdates(), and unswitchTrivialSwitch().
|
staticconstexpr |
Definition at line 248 of file GenericDomTree.h.
Referenced by llvm::DominatorTreeBase< NodeT, IsPostDom >::isPostDominator(), llvm::DominatorTreeBase< NodeT, IsPostDom >::print(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::splitBlock().
|
protected |
Definition at line 268 of file GenericDomTree.h.
Referenced by llvm::DominatorTreeBase< NodeT, IsPostDom >::eraseNode(), llvm::DominatorTreeBase< NodeT, IsPostDom >::operator=(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::reset().
|
protected |
Definition at line 270 of file GenericDomTree.h.
Referenced by llvm::DominatorTreeBase< NodeT, IsPostDom >::compare(), llvm::DominatorTreeBase< NodeT, IsPostDom >::deleteEdge(), llvm::DominatorTree::DominatorTree(), llvm::DominatorTreeBase< NodeT, IsPostDom >::getNode(), llvm::DominatorTreeBase< NodeT, IsPostDom >::insertEdge(), llvm::DominatorTreeBase< NodeT, IsPostDom >::operator=(), llvm::DominatorTreeBase< NodeT, IsPostDom >::recalculate(), llvm::DominatorTreeBase< NodeT, IsPostDom >::reset(), llvm::DominatorTreeBase< NodeT, IsPostDom >::updateBlockNumbers(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::updateDFSNumbers().
|
protected |
|
protected |
Definition at line 259 of file GenericDomTree.h.
Referenced by llvm::DominatorTreeBase< NodeT, IsPostDom >::compare(), llvm::DominatorTreeBase< NodeT, IsPostDom >::eraseNode(), llvm::DominatorTreeBase< NodeT, IsPostDom >::operator=(), llvm::DominatorTreeBase< NodeT, IsPostDom >::print(), llvm::DominatorTreeBase< NodeT, IsPostDom >::reset(), llvm::DominatorTreeBase< NodeT, IsPostDom >::root_begin(), llvm::DominatorTreeBase< NodeT, IsPostDom >::root_end(), llvm::DominatorTreeBase< NodeT, IsPostDom >::root_size(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::setNewRoot().
|
mutableprotected |
Definition at line 273 of file GenericDomTree.h.
Referenced by llvm::DominatorTreeBase< NodeT, IsPostDom >::dominates(), llvm::DominatorTreeBase< NodeT, IsPostDom >::operator=(), llvm::DominatorTreeBase< NodeT, IsPostDom >::print(), llvm::DominatorTreeBase< NodeT, IsPostDom >::reset(), and llvm::DominatorTreeBase< NodeT, IsPostDom >::updateDFSNumbers().