Skip to content

Commit

Permalink
Omit extracting a loop if one of the exits is a landing pad.
Browse files Browse the repository at this point in the history
The landing pad must accompany the invoke when it's extracted. However, if it
does, then the loop isn't properly extracted. I.e., the resulting extraction has
a loop in it. The extracted function is then extracted, etc. resulting in an
infinite loop.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140193 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
isanbard committed Sep 20, 2011
1 parent aabc6a9 commit 84b6706
Showing 1 changed file with 11 additions and 5 deletions.
16 changes: 11 additions & 5 deletions lib/Transforms/IPO/LoopExtractor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,18 +101,24 @@ bool LoopExtractor::runOnLoop(Loop *L, LPPassManager &LPM) {
L->getHeader()->getParent()->getEntryBlock().getTerminator();
if (!isa<BranchInst>(EntryTI) ||
!cast<BranchInst>(EntryTI)->isUnconditional() ||
EntryTI->getSuccessor(0) != L->getHeader())
EntryTI->getSuccessor(0) != L->getHeader()) {
ShouldExtractLoop = true;
else {
} else {
// Check to see if any exits from the loop are more than just return
// blocks.
// blocks. We also must omit landing pads. Landing pads must accompany the
// invoke instruction. But this would result in a loop in the extracted
// function. An infinite cycle occurs when it tries to extract that loop as
// well.
SmallVector<BasicBlock*, 8> ExitBlocks;
L->getExitBlocks(ExitBlocks);
for (unsigned i = 0, e = ExitBlocks.size(); i != e; ++i)
if (!isa<ReturnInst>(ExitBlocks[i]->getTerminator())) {
for (unsigned i = 0, e = ExitBlocks.size(); i != e; ++i) {
if (!isa<ReturnInst>(ExitBlocks[i]->getTerminator()))
ShouldExtractLoop = true;
if (ExitBlocks[i]->isLandingPad()) {
ShouldExtractLoop = false;
break;
}
}
}
if (ShouldExtractLoop) {
if (NumLoops == 0) return Changed;
Expand Down

0 comments on commit 84b6706

Please sign in to comment.