[polly] r209574 - ScopDetection: Support keep-going

Andreas Simbuerger simbuerg at fim.uni-passau.de
Sat May 24 02:25:10 PDT 2014


Author: simbuerg
Date: Sat May 24 04:25:10 2014
New Revision: 209574

URL: http://llvm.org/viewvc/llvm-project?rev=209574&view=rev
Log:
ScopDetection: Support keep-going

Support a 'keep-going' mode for the ScopDetection. In this mode, we just keep
on detecting, even if we encounter an error.

This is useful for diagnosing SCoP candidates. Sometimes you want all the
errors. Invalid SCoPs will still be refused in the end, we just refuse to
abort on the first error.

Modified:
    polly/trunk/include/polly/ScopDetectionDiagnostic.h
    polly/trunk/lib/Analysis/ScopDetection.cpp

Modified: polly/trunk/include/polly/ScopDetectionDiagnostic.h
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScopDetectionDiagnostic.h?rev=209574&r1=209573&r2=209574&view=diff
==============================================================================
--- polly/trunk/include/polly/ScopDetectionDiagnostic.h (original)
+++ polly/trunk/include/polly/ScopDetectionDiagnostic.h Sat May 24 04:25:10 2014
@@ -73,6 +73,7 @@ public:
 
   iterator begin() { return ErrorReports.begin(); }
   iterator end() { return ErrorReports.end(); }
+  size_t size() { return ErrorReports.size(); }
 
   const Region *region() const { return R; }
   void report(RejectReasonPtr Reject) { ErrorReports.push_back(Reject); }

Modified: polly/trunk/lib/Analysis/ScopDetection.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopDetection.cpp?rev=209574&r1=209573&r2=209574&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopDetection.cpp (original)
+++ polly/trunk/lib/Analysis/ScopDetection.cpp Sat May 24 04:25:10 2014
@@ -117,6 +117,11 @@ TrackFailures("polly-detect-track-failur
               cl::location(PollyTrackFailures), cl::Hidden, cl::ZeroOrMore,
               cl::init(false), cl::cat(PollyCategory));
 
+static cl::opt<bool> KeepGoing("polly-detect-keep-going",
+                               cl::desc("Do not fail on the first error."),
+                               cl::Hidden, cl::ZeroOrMore, cl::init(false),
+                               cl::cat(PollyCategory));
+
 static cl::opt<bool, true>
 PollyDelinearizeX("polly-delinearize",
                   cl::desc("Delinearize array access functions"),
@@ -589,7 +594,10 @@ void ScopDetection::findScops(Region &R)
   if (!DetectRegionsWithoutLoops && regionWithoutLoops(R, LI))
     return;
 
-  if (isValidRegion(R)) {
+  bool IsValidRegion = isValidRegion(R);
+  bool HasErrors = RejectLogs.count(&R) > 0;
+
+  if (IsValidRegion && !HasErrors) {
     ++ValidRegion;
     ValidRegions.insert(&R);
     return;
@@ -598,6 +606,10 @@ void ScopDetection::findScops(Region &R)
   for (auto &SubRegion : R)
     findScops(*SubRegion);
 
+  // Do not expand when we had errors. Bad things may happen.
+  if (IsValidRegion && HasErrors)
+    return;
+
   // Try to expand regions.
   //
   // As the region tree normally only contains canonical regions, non canonical
@@ -635,17 +647,17 @@ bool ScopDetection::allBlocksValid(Detec
 
   for (const BasicBlock *BB : R.blocks()) {
     Loop *L = LI->getLoopFor(BB);
-    if (L && L->getHeader() == BB && !isValidLoop(L, Context))
+    if (L && L->getHeader() == BB && (!isValidLoop(L, Context) && !KeepGoing))
       return false;
   }
 
   for (BasicBlock *BB : R.blocks())
-    if (!isValidCFG(*BB, Context))
+    if (!isValidCFG(*BB, Context) && !KeepGoing)
       return false;
 
   for (BasicBlock *BB : R.blocks())
     for (BasicBlock::iterator I = BB->begin(), E = --BB->end(); I != E; ++I)
-      if (!isValidInstruction(*I, Context))
+      if (!isValidInstruction(*I, Context) && !KeepGoing)
         return false;
 
   if (!hasAffineMemoryAccesses(Context))
@@ -671,7 +683,9 @@ bool ScopDetection::isValidRegion(Region
   DetectionContext Context(R, *AA, false /*verifying*/);
 
   bool RegionIsValid = isValidRegion(Context);
-  if (PollyTrackFailures && !RegionIsValid) {
+  bool HasErrors = !RegionIsValid || Context.Log.size() > 0;
+
+  if (PollyTrackFailures && HasErrors) {
     // std::map::insert does not replace.
     std::pair<reject_iterator, bool> InsertedValue =
         RejectLogs.insert(std::make_pair(&R, Context.Log));





More information about the llvm-commits mailing list