Skip to content

Commit

Permalink
RegionInfo: Correctly expand regions
Browse files Browse the repository at this point in the history
Instead of playing around with dominance to verify if the possible expansion of
a scop region is indeed a single entry single exit region, we now distinguish
two cases. In case we only append a basic block, all edges entering this basic
block need to have come from within the region that is expanded. In case we join
two regions, the source basic blocks of the edges that end at the entry node of
the region that is appended most be part of either the original region or the
region that is appended.

This change will be tested through Polly.

This fixes llvm.org/PR25242

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251267 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
tobiasgrosser committed Oct 25, 2015
1 parent 165b4f4 commit aaf72bc
Showing 1 changed file with 10 additions and 14 deletions.
24 changes: 10 additions & 14 deletions include/llvm/Analysis/RegionInfoImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -444,16 +444,14 @@ typename Tr::RegionT *RegionBase<Tr>::getExpandedRegion() const {
if (NumSuccessors == 0)
return nullptr;

for (PredIterTy PI = InvBlockTraits::child_begin(getExit()),
PE = InvBlockTraits::child_end(getExit());
PI != PE; ++PI) {
if (!DT->dominates(getEntry(), *PI))
return nullptr;
}

RegionT *R = RI->getRegionFor(exit);

if (R->getEntry() != exit) {
for (PredIterTy PI = InvBlockTraits::child_begin(getExit()),
PE = InvBlockTraits::child_end(getExit());
PI != PE; ++PI)
if (!contains(*PI))
return nullptr;
if (Tr::getNumSuccessors(exit) == 1)
return new RegionT(getEntry(), *BlockTraits::child_begin(exit), RI, DT);
return nullptr;
Expand All @@ -462,13 +460,11 @@ typename Tr::RegionT *RegionBase<Tr>::getExpandedRegion() const {
while (R->getParent() && R->getParent()->getEntry() == exit)
R = R->getParent();

if (!DT->dominates(getEntry(), R->getExit())) {
for (PredIterTy PI = InvBlockTraits::child_begin(getExit()),
PE = InvBlockTraits::child_end(getExit());
PI != PE; ++PI) {
if (!DT->dominates(R->getExit(), *PI))
return nullptr;
}
for (PredIterTy PI = InvBlockTraits::child_begin(getExit()),
PE = InvBlockTraits::child_end(getExit());
PI != PE; ++PI) {
if (!(contains(*PI) || R->contains(*PI)))
return nullptr;
}

return new RegionT(getEntry(), R->getExit(), RI, DT);
Expand Down

0 comments on commit aaf72bc

Please sign in to comment.