mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-20 14:29:27 +00:00
Place the check for an exit landing pad where it will be run on both code paths through the if-then-else.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140195 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e4b3ef43e1
commit
b7e807f9a9
@ -105,21 +105,30 @@ bool LoopExtractor::runOnLoop(Loop *L, LPPassManager &LPM) {
|
||||
ShouldExtractLoop = true;
|
||||
} else {
|
||||
// Check to see if any exits from the loop are more than just return
|
||||
// blocks. We also must omit landing pads. Landing pads must accompany the
|
||||
// invoke instruction. But this would result in a loop in the extracted
|
||||
// blocks.
|
||||
SmallVector<BasicBlock*, 8> ExitBlocks;
|
||||
L->getExitBlocks(ExitBlocks);
|
||||
for (unsigned i = 0, e = ExitBlocks.size(); i != e; ++i)
|
||||
if (!isa<ReturnInst>(ExitBlocks[i]->getTerminator())) {
|
||||
ShouldExtractLoop = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ShouldExtractLoop) {
|
||||
// We 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()))
|
||||
ShouldExtractLoop = true;
|
||||
for (unsigned i = 0, e = ExitBlocks.size(); i != e; ++i)
|
||||
if (ExitBlocks[i]->isLandingPad()) {
|
||||
ShouldExtractLoop = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ShouldExtractLoop) {
|
||||
if (NumLoops == 0) return Changed;
|
||||
--NumLoops;
|
||||
|
Loading…
x
Reference in New Issue
Block a user