summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/ShrinkWrap.cpp
diff options
context:
space:
mode:
authorQuentin Colombet <qcolombet@apple.com>2015-09-15 18:19:39 +0000
committerQuentin Colombet <qcolombet@apple.com>2015-09-15 18:19:39 +0000
commitdc29c973e5c8e3f1dfb6ea83570e4ee571008ca5 (patch)
treebd0e541685d6a22ef97bd05d669dc80d964b5d4d /llvm/lib/CodeGen/ShrinkWrap.cpp
parent0ca778eb2e21e6430ffd3fcc6e7d5a6a629949f2 (diff)
downloadbcm5719-llvm-dc29c973e5c8e3f1dfb6ea83570e4ee571008ca5.tar.gz
bcm5719-llvm-dc29c973e5c8e3f1dfb6ea83570e4ee571008ca5.zip
[ShrinkWrapping] Fix an infinite loop while looking for restore point.
This may happen when the input program itself contains an infinite loop with no exit block. In that case, we would fail to find a block post-dominating the loop such that this block is outside of the loop. This fixes PR24823. Working on reducing the test case. llvm-svn: 247710
Diffstat (limited to 'llvm/lib/CodeGen/ShrinkWrap.cpp')
-rw-r--r--llvm/lib/CodeGen/ShrinkWrap.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/ShrinkWrap.cpp b/llvm/lib/CodeGen/ShrinkWrap.cpp
index 7e2f15163cb..c406c149c00 100644
--- a/llvm/lib/CodeGen/ShrinkWrap.cpp
+++ b/llvm/lib/CodeGen/ShrinkWrap.cpp
@@ -309,6 +309,14 @@ void ShrinkWrap::updateSaveRestorePoints(MachineBasicBlock &MBB) {
}
}
else {
+ // If the loop does not exit, there is no point in looking
+ // for a post-dominator outside the loop.
+ SmallVector<MachineBasicBlock*, 4> ExitBlocks;
+ MLI->getLoopFor(Restore)->getExitingBlocks(ExitBlocks);
+ if (ExitBlocks.empty()) {
+ Restore = nullptr;
+ break;
+ }
// Push Restore outside of this loop if immediate post-dominator is
// different from restore block. If immediate post-dominator is not
// different, bail out.
OpenPOWER on IntegriCloud