17 #include "llvm/ADT/DenseMap.h"
18 #include "llvm/Support/GenericDomTreeConstruction.h"
23 template class llvm::DominatorTreeBase<
Block,
false>;
24 template class llvm::DominatorTreeBase<
Block,
true>;
25 template class llvm::DomTreeNodeBase<Block>;
31 template <
bool IsPostDom>
33 for (
auto entry : dominanceInfos)
34 delete entry.second.getPointer();
38 for (
auto entry : dominanceInfos)
39 delete entry.second.getPointer();
40 dominanceInfos.clear();
43 template <
bool IsPostDom>
45 auto it = dominanceInfos.find(region);
46 if (it != dominanceInfos.end()) {
47 delete it->second.getPointer();
48 dominanceInfos.erase(it);
55 template <
bool IsPostDom>
57 bool needsDomTree)
const
58 -> llvm::PointerIntPair<DomTree *, 1, bool> {
60 auto itAndInserted = dominanceInfos.insert({region, {
nullptr,
true}});
61 auto &entry = itAndInserted.first->second;
66 if (!itAndInserted.second) {
69 if (needsDomTree && !entry.getPointer() && !region->hasOneBlock()) {
70 auto *domTree =
new DomTree();
71 domTree->recalculate(*region);
72 entry.setPointer(domTree);
79 if (!region->hasOneBlock()) {
80 auto *domTree =
new DomTree();
81 domTree->recalculate(*region);
82 entry.setPointer(domTree);
89 if (!parentOp->isRegistered()) {
91 }
else if (
auto regionKindItf = dyn_cast<RegionKindInterface>(parentOp)) {
94 entry.setInt(regionKindItf.hasSSADominance(region->getRegionNumber()));
105 return ancestorOp->getBlock();
114 template <
typename FuncT>
131 if (aRegion == bRegion)
137 size_t aRegionDepth = 0;
149 size_t bRegionDepth = 0;
161 if (aRegionDepth > bRegionDepth) {
164 }
else if (aRegionDepth < bRegionDepth) {
189 template <
bool IsPostDom>
212 return getDomTree(a->
getParent()).findNearestCommonDominator(a, b);
216 template <
bool IsPostDom>
218 assert(a && b &&
"null blocks not allowed");
241 return getDomTree(regionA).properlyDominates(a, b);
246 template <
bool IsPostDom>
250 if (®ion->
front() == a)
254 return getDomTree(region).isReachableFromEntry(a);
268 bool enclosingOpOk)
const {
270 assert(aBlock && bBlock &&
"operations must be in a block");
275 return !hasSSADominance(aBlock);
279 if (aRegion != bBlock->getParent()) {
286 assert(bBlock->getParent() == aRegion);
289 if (a == b && enclosingOpOk)
294 if (aBlock == bBlock) {
298 if (hasSSADominance(aBlock)) {
306 return getDomTree(aRegion).properlyDominates(aBlock, bBlock);
315 if (
auto blockArg = dyn_cast<BlockArgument>(a))
316 return dominates(blockArg.getOwner(), b->
getBlock());
330 assert(aBlock && bBlock &&
"operations must be in a block");
335 return !hasSSADominance(aBlock);
339 if (aRegion != bBlock->getParent()) {
346 assert(bBlock->getParent() == aRegion);
355 if (aBlock == bBlock) {
357 if (hasSSADominance(aBlock)) {
365 return getDomTree(aRegion).properlyDominates(aBlock, bBlock);
static Block * traverseAncestors(Block *block, const FuncT &func)
Walks up the list of containers of the given block and calls the user-defined traversal function for ...
static bool tryGetBlocksInSameRegion(Block *&a, Block *&b)
Tries to update the given block references to live in the same region by exploring the relationship o...
static Block * getAncestorBlock(Block *block)
Return the ancestor block enclosing the specified block.
Block represents an ordered list of Operations.
Region * getParent() const
Provide a 'getParent' method for ilist_node_with_parent methods.
Operation * getParentOp()
Returns the closest surrounding operation that contains this block.
bool properlyDominates(Operation *a, Operation *b, bool enclosingOpOk=true) const
Return true if operation A properly dominates operation B, i.e.
Operation is the basic unit of execution within MLIR.
bool isBeforeInBlock(Operation *other)
Given an operation 'other' that is within the same parent block, return whether the current operation...
Operation * getParentOp()
Returns the closest surrounding operation that contains this operation or nullptr if this is a top-le...
Block * getBlock()
Returns the operation block that contains this operation.
bool properlyPostDominates(Operation *a, Operation *b)
Return true if operation A properly postdominates operation B.
This class contains a list of basic blocks and a link to the parent operation it is attached to.
Operation * findAncestorOpInRegion(Operation &op)
Returns 'op' if 'op' lies in this region, or otherwise finds the ancestor of 'op' that lies in this r...
Block * findAncestorBlockInRegion(Block &block)
Returns 'block' if 'block' lies in this region, or otherwise finds the ancestor of 'block' that lies ...
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
Operation * getDefiningOp() const
If this value is the result of an operation, return the operation that defines it.
llvm::PointerIntPair< DomTree *, 1, bool > getDominanceInfo(Region *region, bool needsDomTree) const
Return the dom tree and "hasSSADominance" bit for the given region.
bool properlyDominates(Block *a, Block *b) const
Return true if the specified block A properly dominates block B.
bool isReachableFromEntry(Block *a) const
Return true if the specified block is reachable from the entry block of its region.
Block * findNearestCommonDominator(Block *a, Block *b) const
Finds the nearest common dominator block for the two given blocks a and b.
void invalidate()
Invalidate dominance info.
Include the generated interface declarations.