[ShrinkWrapping] Fix an infinite loop while looking for restore point.
authorQuentin Colombet <qcolombet@apple.com>
Tue, 15 Sep 2015 18:19:39 +0000 (18:19 +0000)
committerQuentin Colombet <qcolombet@apple.com>
Tue, 15 Sep 2015 18:19:39 +0000 (18:19 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247710 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/ShrinkWrap.cpp

index 7e2f15163cb4babc02390d66d49f0b7041aed2fc..c406c149c0071a5a8443f74c0f9f87b263ce02ab 100644 (file)
@@ -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.