forked from OSchip/llvm-project
[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:
parent
a80949feb5
commit
e1d3e2e66e
|
@ -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.
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue