summaryrefslogtreecommitdiffstats
path: root/polly/lib/Analysis/ScopDetection.cpp
diff options
context:
space:
mode:
authorJakub Kuderski <kubakuderski@gmail.com>2017-08-22 22:01:53 +0000
committerJakub Kuderski <kubakuderski@gmail.com>2017-08-22 22:01:53 +0000
commit0ac1e585fc92eaccfb3b1719f3aafc9cb915e708 (patch)
tree2fabb1e2eb509900453aea45b238debd69754de8 /polly/lib/Analysis/ScopDetection.cpp
parent4942a0b0f30a68c4931098296a44e5f92cb9a8c0 (diff)
downloadbcm5719-llvm-0ac1e585fc92eaccfb3b1719f3aafc9cb915e708.tar.gz
bcm5719-llvm-0ac1e585fc92eaccfb3b1719f3aafc9cb915e708.zip
[polly] Fix ScopDetectionDiagnostic test failure caused by r310940
Summary: ScopDetection used to check if a loop withing a region was infinite and emitted a diagnostic in such cases. After r310940 there's no point checking against that situation, as infinite loops don't appear in regions anymore. The test failure was observed on these two polly buildbots: http://lab.llvm.org:8011/builders/polly-arm-linux/builds/8368 http://lab.llvm.org:8011/builders/polly-amd64-linux/builds/10310 This patch XFAILs `ReportLoopHasNoExit.ll` and turns infinite loop detection into an assert. Reviewers: grosser, sanjoy, bollu Reviewed By: grosser Subscribers: efriedma, aemerson, kristof.beyls, dberlin, llvm-commits Tags: #polly Differential Revision: https://reviews.llvm.org/D36776 llvm-svn: 311503
Diffstat (limited to 'polly/lib/Analysis/ScopDetection.cpp')
-rw-r--r--polly/lib/Analysis/ScopDetection.cpp51
1 files changed, 12 insertions, 39 deletions
diff --git a/polly/lib/Analysis/ScopDetection.cpp b/polly/lib/Analysis/ScopDetection.cpp
index d6c9849b90e..02f515af13e 100644
--- a/polly/lib/Analysis/ScopDetection.cpp
+++ b/polly/lib/Analysis/ScopDetection.cpp
@@ -1180,17 +1180,6 @@ bool ScopDetection::isValidInstruction(Instruction &Inst,
return invalid<ReportUnknownInst>(Context, /*Assert=*/true, &Inst);
}
-/// Check whether @p L has exiting blocks.
-///
-/// @param L The loop of interest
-///
-/// @return True if the loop has exiting blocks, false otherwise.
-static bool hasExitingBlocks(Loop *L) {
- SmallVector<BasicBlock *, 4> ExitingBlocks;
- L->getExitingBlocks(ExitingBlocks);
- return !ExitingBlocks.empty();
-}
-
bool ScopDetection::canUseISLTripCount(Loop *L,
DetectionContext &Context) const {
// Ensure the loop has valid exiting blocks as well as latches, otherwise we
@@ -1211,34 +1200,18 @@ bool ScopDetection::isValidLoop(Loop *L, DetectionContext &Context) const {
// Loops that contain part but not all of the blocks of a region cannot be
// handled by the schedule generation. Such loop constructs can happen
// because a region can contain BBs that have no path to the exit block
- // (Infinite loops, UnreachableInst), but such blocks are never part of a
- // loop.
- //
- // _______________
- // | Loop Header | <-----------.
- // --------------- |
- // | |
- // _______________ ______________
- // | RegionEntry |-----> | RegionExit |----->
- // --------------- --------------
- // |
- // _______________
- // | EndlessLoop | <--.
- // --------------- |
- // | |
- // \------------/
- //
- // In the example above, the loop (LoopHeader,RegionEntry,RegionExit) is
- // neither entirely contained in the region RegionEntry->RegionExit
- // (containing RegionEntry,EndlessLoop) nor is the region entirely contained
- // in the loop.
- // The block EndlessLoop is contained in the region because Region::contains
- // tests whether it is not dominated by RegionExit. This is probably to not
- // having to query the PostdominatorTree. Instead of an endless loop, a dead
- // end can also be formed by an UnreachableInst. This case is already caught
- // by isErrorBlock(). We hence only have to reject endless loops here.
- if (!hasExitingBlocks(L))
- return invalid<ReportLoopHasNoExit>(Context, /*Assert=*/true, L);
+ // (infinite loops, UnreachableInst).
+ // We do not have to verify against infinite loops here -- they are
+ // postdominated only by the virtual exit and do not appear in regions.
+ // Instead of an infinite loop, a dead end can also be formed by an
+ // UnreachableInst. This case is already caught by isErrorBlock().
+
+#ifndef NDEBUG
+ // Make sure that the loop has exits (i.e. is not infinite).
+ SmallVector<BasicBlock *, 4> ExitingBlocks;
+ L->getExitingBlocks(ExitingBlocks);
+ assert(!ExitingBlocks.empty() && "Region with an infinite loop found!");
+#endif
if (canUseISLTripCount(L, Context))
return true;
OpenPOWER on IntegriCloud