[LLVM] [RegionInfo] Introduce getExitingBlocks to get all predecessors of Exit in the current region.

This function will return true if all predecessors of Exit are in the current region, false otherwise.

Differential Revision: https://reviews.llvm.org/D36210

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@313611 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Hongbin Zheng 2017-09-19 04:59:27 +00:00
parent 4c92030df7
commit 570e4c977e
2 changed files with 28 additions and 0 deletions

View File

@ -407,6 +407,11 @@ public:
/// else NULL.
BlockT *getExitingBlock() const;
/// @brief Collect all blocks of this region's single exit edge, if existing.
///
/// @return True if this region contains all the predecessors of the exit.
bool getExitingBlocks(SmallVectorImpl<BlockT *> &Exitings) const;
/// @brief Is this a simple region?
///
/// A region is simple if it has exactly one exit and one entry edge.

View File

@ -177,6 +177,29 @@ typename RegionBase<Tr>::BlockT *RegionBase<Tr>::getEnteringBlock() const {
return enteringBlock;
}
template <class Tr>
bool RegionBase<Tr>::getExitingBlocks(
SmallVectorImpl<BlockT *> &Exitings) const {
bool CoverAll = true;
if (!exit)
return CoverAll;
for (PredIterTy PI = InvBlockTraits::child_begin(exit),
PE = InvBlockTraits::child_end(exit);
PI != PE; ++PI) {
BlockT *Pred = *PI;
if (contains(Pred)) {
Exitings.push_back(Pred);
continue;
}
CoverAll = false;
}
return CoverAll;
}
template <class Tr>
typename RegionBase<Tr>::BlockT *RegionBase<Tr>::getExitingBlock() const {
BlockT *exit = getExit();