diff options
Diffstat (limited to 'polly/lib/Analysis/ScopDetection.cpp')
-rw-r--r-- | polly/lib/Analysis/ScopDetection.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/polly/lib/Analysis/ScopDetection.cpp b/polly/lib/Analysis/ScopDetection.cpp index c56d2cc4adb..27dfc930db8 100644 --- a/polly/lib/Analysis/ScopDetection.cpp +++ b/polly/lib/Analysis/ScopDetection.cpp @@ -1402,9 +1402,19 @@ bool ScopDetection::allBlocksValid(DetectionContext &Context) const { for (const BasicBlock *BB : CurRegion.blocks()) { Loop *L = LI.getLoopFor(BB); - if (L && L->getHeader() == BB && CurRegion.contains(L) && - (!isValidLoop(L, Context) && !KeepGoing)) - return false; + if (L && L->getHeader() == BB) { + if (CurRegion.contains(L)) { + if (!isValidLoop(L, Context) && !KeepGoing) + return false; + } else { + SmallVector<BasicBlock *, 1> Latches; + L->getLoopLatches(Latches); + for (BasicBlock *Latch : Latches) + if (CurRegion.contains(Latch)) + return invalid<ReportLoopOnlySomeLatches>(Context, /*Assert=*/true, + L); + } + } } for (BasicBlock *BB : CurRegion.blocks()) { |