<div dir="auto"><div>Reminder to use svn revision numbers instead of sha1 hashes. <div dir="auto"><br></div><div dir="auto">Michael </div><div dir="auto"><br></div><br><div class="gmail_extra"><br><div class="gmail_quote">Le 24 août 2017 9:48 PM, "Tobias Grosser via llvm-commits" <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> a écrit :<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: grosser<br>
Date: Thu Aug 24 12:47:15 2017<br>
New Revision: 311692<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=311692&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=311692&view=rev</a><br>
Log:<br>
Revert "[polly] Fix ScopDetectionDiagnostic test failure caused by r310940"<br>
<br>
This reverts commit 950849ece9bb8fdd2b41e3ec348b96<wbr>53b4e37df6.<br>
<br>
This commit broke various buildbots.<br>
<br>
Modified:<br>
    polly/trunk/include/polly/<wbr>ScopDetectionDiagnostic.h<br>
    polly/trunk/lib/Analysis/<wbr>ScopDetection.cpp<br>
    polly/trunk/lib/Analysis/<wbr>ScopDetectionDiagnostic.cpp<br>
    polly/trunk/test/<wbr>ScopDetectionDiagnostics/<wbr>ReportLoopHasNoExit.ll<br>
<br>
Modified: polly/trunk/include/polly/<wbr>ScopDetectionDiagnostic.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScopDetectionDiagnostic.h?rev=311692&r1=311691&r2=311692&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/polly/trunk/include/<wbr>polly/ScopDetectionDiagnostic.<wbr>h?rev=311692&r1=311691&r2=<wbr>311692&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- polly/trunk/include/polly/<wbr>ScopDetectionDiagnostic.h (original)<br>
+++ polly/trunk/include/polly/<wbr>ScopDetectionDiagnostic.h Thu Aug 24 12:47:15 2017<br>
@@ -86,6 +86,7 @@ enum class RejectReasonKind {<br>
   LastAffFunc,<br>
<br>
   LoopBound,<br>
+  LoopHasNoExit,<br>
   LoopOnlySomeLatches,<br>
<br>
   FuncCall,<br>
@@ -563,6 +564,36 @@ public:<br>
<br>
   /// @name LLVM-RTTI interface<br>
   //@{<br>
+  static bool classof(const RejectReason *RR);<br>
+  //@}<br>
+<br>
+  /// @name RejectReason interface<br>
+  //@{<br>
+  virtual std::string getRemarkName() const override;<br>
+  virtual const Value *getRemarkBB() const override;<br>
+  virtual std::string getMessage() const override;<br>
+  virtual const DebugLoc &getDebugLoc() const override;<br>
+  virtual std::string getEndUserMessage() const override;<br>
+  //@}<br>
+};<br>
+<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+/// Captures errors when loop has no exit.<br>
+class ReportLoopHasNoExit : public RejectReason {<br>
+  //===-------------------------<wbr>------------------------------<wbr>-------------===//<br>
+<br>
+  /// The loop that has no exit.<br>
+  Loop *L;<br>
+<br>
+  const DebugLoc Loc;<br>
+<br>
+public:<br>
+  ReportLoopHasNoExit(Loop *L)<br>
+      : RejectReason(RejectReasonKind:<wbr>:LoopHasNoExit), L(L),<br>
+        Loc(L->getStartLoc()) {}<br>
+<br>
+  /// @name LLVM-RTTI interface<br>
+  //@{<br>
   static bool classof(const RejectReason *RR);<br>
   //@}<br>
<br>
<br>
Modified: polly/trunk/lib/Analysis/<wbr>ScopDetection.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopDetection.cpp?rev=311692&r1=311691&r2=311692&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/polly/trunk/lib/<wbr>Analysis/ScopDetection.cpp?<wbr>rev=311692&r1=311691&r2=<wbr>311692&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- polly/trunk/lib/Analysis/<wbr>ScopDetection.cpp (original)<br>
+++ polly/trunk/lib/Analysis/<wbr>ScopDetection.cpp Thu Aug 24 12:47:15 2017<br>
@@ -1166,6 +1166,17 @@ bool ScopDetection::<wbr>isValidInstruction(I<br>
   return invalid<ReportUnknownInst>(<wbr>Context, /*Assert=*/true, &Inst);<br>
 }<br>
<br>
+/// Check whether @p L has exiting blocks.<br>
+///<br>
+/// @param L The loop of interest<br>
+///<br>
+/// @return True if the loop has exiting blocks, false otherwise.<br>
+static bool hasExitingBlocks(Loop *L) {<br>
+  SmallVector<BasicBlock *, 4> ExitingBlocks;<br>
+  L->getExitingBlocks(<wbr>ExitingBlocks);<br>
+  return !ExitingBlocks.empty();<br>
+}<br>
+<br>
 bool ScopDetection::<wbr>canUseISLTripCount(Loop *L,<br>
                                        DetectionContext &Context) const {<br>
   // Ensure the loop has valid exiting blocks as well as latches, otherwise we<br>
@@ -1186,18 +1197,34 @@ bool ScopDetection::isValidLoop(<wbr>Loop *L,<br>
   // Loops that contain part but not all of the blocks of a region cannot be<br>
   // handled by the schedule generation. Such loop constructs can happen<br>
   // because a region can contain BBs that have no path to the exit block<br>
-  // (infinite loops, UnreachableInst).<br>
-  // We do not have to verify against infinite loops here -- they are<br>
-  // postdominated only by the virtual exit and do not appear in regions.<br>
-  // Instead of an infinite loop, a dead end can also be formed by an<br>
-  // UnreachableInst. This case is already caught by isErrorBlock().<br>
-<br>
-#ifndef NDEBUG<br>
-  // Make sure that the loop has exits (i.e. is not infinite).<br>
-  SmallVector<BasicBlock *, 4> ExitingBlocks;<br>
-  L->getExitingBlocks(<wbr>ExitingBlocks);<br>
-  assert(!ExitingBlocks.empty() && "Region with an infinite loop found!");<br>
-#endif<br>
+  // (Infinite loops, UnreachableInst), but such blocks are never part of a<br>
+  // loop.<br>
+  //<br>
+  // _______________<br>
+  // | Loop Header | <-----------.<br>
+  // ---------------             |<br>
+  //        |                    |<br>
+  // _______________       ______________<br>
+  // | RegionEntry |-----> | RegionExit |-----><br>
+  // ---------------       --------------<br>
+  //        |<br>
+  // _______________<br>
+  // | EndlessLoop | <--.<br>
+  // ---------------    |<br>
+  //       |            |<br>
+  //       \------------/<br>
+  //<br>
+  // In the example above, the loop (LoopHeader,RegionEntry,<wbr>RegionExit) is<br>
+  // neither entirely contained in the region RegionEntry->RegionExit<br>
+  // (containing RegionEntry,EndlessLoop) nor is the region entirely contained<br>
+  // in the loop.<br>
+  // The block EndlessLoop is contained in the region because Region::contains<br>
+  // tests whether it is not dominated by RegionExit. This is probably to not<br>
+  // having to query the PostdominatorTree. Instead of an endless loop, a dead<br>
+  // end can also be formed by an UnreachableInst. This case is already caught<br>
+  // by isErrorBlock(). We hence only have to reject endless loops here.<br>
+  if (!hasExitingBlocks(L))<br>
+    return invalid<ReportLoopHasNoExit>(<wbr>Context, /*Assert=*/true, L);<br>
<br>
   if (canUseISLTripCount(L, Context))<br>
     return true;<br>
<br>
Modified: polly/trunk/lib/Analysis/<wbr>ScopDetectionDiagnostic.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopDetectionDiagnostic.cpp?rev=311692&r1=311691&r2=311692&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/polly/trunk/lib/<wbr>Analysis/<wbr>ScopDetectionDiagnostic.cpp?<wbr>rev=311692&r1=311691&r2=<wbr>311692&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- polly/trunk/lib/Analysis/<wbr>ScopDetectionDiagnostic.cpp (original)<br>
+++ polly/trunk/lib/Analysis/<wbr>ScopDetectionDiagnostic.cpp Thu Aug 24 12:47:15 2017<br>
@@ -60,6 +60,7 @@ llvm::Statistic RejectStatistics[] = {<br>
     SCOP_STAT(<wbr>DifferentElementSize, "Accesses with differing sizes"),<br>
     SCOP_STAT(LastAffFunc, ""),<br>
     SCOP_STAT(LoopBound, "Uncomputable loop bounds"),<br>
+    SCOP_STAT(LoopHasNoExit, "Loop without exit"),<br>
     SCOP_STAT(LoopOnlySomeLatches, "Not all loop latches in scop"),<br>
     SCOP_STAT(FuncCall, "Function call with side effects"),<br>
     SCOP_STAT(<wbr>NonSimpleMemoryAccess,<br>
@@ -459,6 +460,29 @@ std::string ReportLoopBound::getEndUserM<br>
 }<br>
<br>
 //===-------------------------<wbr>------------------------------<wbr>---------------===//<br>
+// ReportLoopHasNoExit.<br>
+<br>
+std::string ReportLoopHasNoExit::<wbr>getRemarkName() const {<br>
+  return "LoopHasNoExit";<br>
+}<br>
+<br>
+const Value *ReportLoopHasNoExit::<wbr>getRemarkBB() const { return L->getHeader(); }<br>
+<br>
+std::string ReportLoopHasNoExit::<wbr>getMessage() const {<br>
+  return "Loop " + L->getHeader()->getName() + " has no exit.";<br>
+}<br>
+<br>
+bool ReportLoopHasNoExit::classof(<wbr>const RejectReason *RR) {<br>
+  return RR->getKind() == RejectReasonKind::<wbr>LoopHasNoExit;<br>
+}<br>
+<br>
+const DebugLoc &ReportLoopHasNoExit::<wbr>getDebugLoc() const { return Loc; }<br>
+<br>
+std::string ReportLoopHasNoExit::<wbr>getEndUserMessage() const {<br>
+  return "Loop cannot be handled because it has no exit.";<br>
+}<br>
+<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
 // ReportLoopOnlySomeLatches<br>
<br>
 std::string ReportLoopOnlySomeLatches::<wbr>getRemarkName() const {<br>
@@ -475,7 +499,7 @@ std::string ReportLoopOnlySomeLatches::g<br>
 }<br>
<br>
 bool ReportLoopOnlySomeLatches::<wbr>classof(const RejectReason *RR) {<br>
-  return RR->getKind() == RejectReasonKind::<wbr>LoopOnlySomeLatches;<br>
+  return RR->getKind() == RejectReasonKind::<wbr>LoopHasNoExit;<br>
 }<br>
<br>
 const DebugLoc &ReportLoopOnlySomeLatches::<wbr>getDebugLoc() const { return Loc; }<br>
<br>
Modified: polly/trunk/test/<wbr>ScopDetectionDiagnostics/<wbr>ReportLoopHasNoExit.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopDetectionDiagnostics/ReportLoopHasNoExit.ll?rev=311692&r1=311691&r2=311692&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/polly/trunk/test/<wbr>ScopDetectionDiagnostics/<wbr>ReportLoopHasNoExit.ll?rev=<wbr>311692&r1=311691&r2=311692&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- polly/trunk/test/<wbr>ScopDetectionDiagnostics/<wbr>ReportLoopHasNoExit.ll (original)<br>
+++ polly/trunk/test/<wbr>ScopDetectionDiagnostics/<wbr>ReportLoopHasNoExit.ll Thu Aug 24 12:47:15 2017<br>
@@ -1,7 +1,7 @@<br>
 ; XFAIL: *<br>
<br>
 ; The test case stopped making sense after r310940 that added infinite loops to<br>
-; the PostDominatorTree. Infinite loops are postdominated only by the virtual<br>
+; the PostDominatorTree. Infinite loops are postdominated ony by the virtual<br>
 ; root, which causes them not to appear in regions in ScopDetection anymore.<br>
<br>
 ; RUN: opt %loadPolly -pass-remarks-missed="polly-<wbr>detect" -polly-allow-nonaffine-loops -analyze  -polly-detect < %s 2>&1 | FileCheck %s<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div></div>