[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

llvm-svn: 313611
This commit is contained in:
Hongbin Zheng 2017-09-19 04:59:27 +00:00
parent a80949feb5
commit e1d3e2e66e
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();