[polly] r265272 - Revert "[FIX] Do not create a SCoP in the presence of infinite loops"

Tobias Grosser via llvm-commits llvm-commits at lists.llvm.org
Sun Apr 3 12:36:53 PDT 2016


Author: grosser
Date: Sun Apr  3 14:36:52 2016
New Revision: 265272

URL: http://llvm.org/viewvc/llvm-project?rev=265272&view=rev
Log:
Revert "[FIX] Do not create a SCoP in the presence of infinite loops"

This reverts commit r265260, as it caused the following 'make check-polly'
failures:

    Polly :: ScopDetect/index_from_unpredictable_loop.ll
    Polly :: ScopInfo/multiple_exiting_blocks.ll
    Polly :: ScopInfo/multiple_exiting_blocks_two_loop.ll
    Polly :: ScopInfo/schedule-const-post-dominator-walk-2.ll
    Polly :: ScopInfo/schedule-const-post-dominator-walk.ll
    Polly :: ScopInfo/switch-5.ll

Removed:
    polly/trunk/test/ScopInfo/schedule-constuction-endless-loop1.ll
    polly/trunk/test/ScopInfo/schedule-constuction-endless-loop2.ll
Modified:
    polly/trunk/lib/Analysis/ScopDetection.cpp
    polly/trunk/lib/Analysis/ScopInfo.cpp
    polly/trunk/test/ScopInfo/two-loops-one-infinite.ll

Modified: polly/trunk/lib/Analysis/ScopDetection.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopDetection.cpp?rev=265272&r1=265271&r2=265272&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopDetection.cpp (original)
+++ polly/trunk/lib/Analysis/ScopDetection.cpp Sun Apr  3 14:36:52 2016
@@ -1029,14 +1029,8 @@ bool ScopDetection::canUseISLTripCount(L
   // Ensure the loop has valid exiting blocks as well as latches, otherwise we
   // need to overapproximate it as a boxed loop.
   SmallVector<BasicBlock *, 4> LoopControlBlocks;
-  L->getExitingBlocks(LoopControlBlocks);
-
-  // Loops without exiting blocks cannot be handled by the schedule generation
-  // as it depends on a region covering that is not given.
-  if (LoopControlBlocks.empty())
-    return false;
-
   L->getLoopLatches(LoopControlBlocks);
+  L->getExitingBlocks(LoopControlBlocks);
   for (BasicBlock *ControlBB : LoopControlBlocks) {
     if (!isValidCFG(*ControlBB, true, false, Context))
       return false;

Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=265272&r1=265271&r2=265272&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/ScopInfo.cpp Sun Apr  3 14:36:52 2016
@@ -3618,15 +3618,8 @@ void Scop::buildSchedule(ScopDetection &
   Loop *L = getLoopSurroundingRegion(getRegion(), LI);
   LoopStackTy LoopStack({LoopStackElementTy(L, nullptr, 0)});
   buildSchedule(getRegion().getNode(), LoopStack, SD, LI);
-  assert(!LoopStack.empty());
-  if (LoopStack.size() == 1 && LoopStack.back().L == L) {
-    Schedule = LoopStack[0].Schedule;
-  } else {
-    // If something went wrong we have to cleanup.
-    assert(!hasFeasibleRuntimeContext());
-    while (!LoopStack.empty())
-      isl_schedule_free(LoopStack.pop_back_val().Schedule);
-  }
+  assert(LoopStack.size() == 1 && LoopStack.back().L == L);
+  Schedule = LoopStack[0].Schedule;
 }
 
 /// To generate a schedule for the elements in a Region we traverse the Region
@@ -3669,22 +3662,9 @@ void Scop::buildSchedule(Region *R, Loop
   // iterator. If it is set we have to explore the next sub-region/block from
   // the iterator (if any) to guarantee progress. If it is not set we first try
   // the next queued sub-region/blocks.
-  unsigned RemainingWork = WorkList.size() + DelayList.size() + 1;
   while (!WorkList.empty() || !DelayList.empty()) {
-    Loop *LastLoop = LoopStack.back().L;
     RegionNode *RN;
 
-    // FIXME: We will bail out if we cannot make progress. So far that is only
-    //        known to happen in the presence of infinite loops without an exit
-    //        edge. For such cases there is no region covering only the loop and
-    //        our reasoning fails.
-    if (WorkList.size() + DelayList.size() >= RemainingWork) {
-      invalidate(INFINITELOOP, R->getEntry()->getTerminator()->getDebugLoc());
-      LastLoop = nullptr;
-    }
-
-    RemainingWork = WorkList.size() + DelayList.size();
-
     if ((LastRNWaiting && !WorkList.empty()) || DelayList.size() == 0) {
       RN = WorkList.front();
       WorkList.pop_front();
@@ -3698,8 +3678,9 @@ void Scop::buildSchedule(Region *R, Loop
     if (!getRegion().contains(L))
       L = OuterScopLoop;
 
+    Loop *LastLoop = LoopStack.back().L;
     if (LastLoop != L) {
-      if (LastLoop && !LastLoop->contains(L)) {
+      if (!LastLoop->contains(L)) {
         LastRNWaiting = true;
         DelayList.push_back(RN);
         continue;

Removed: polly/trunk/test/ScopInfo/schedule-constuction-endless-loop1.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/schedule-constuction-endless-loop1.ll?rev=265271&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/schedule-constuction-endless-loop1.ll (original)
+++ polly/trunk/test/ScopInfo/schedule-constuction-endless-loop1.ll (removed)
@@ -1,34 +0,0 @@
-; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
-;
-; Check that we do not build a SCoP and do not crash.
-;
-; CHECK-NOT: Statements
-;
-target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
-
-; Function Attrs: nounwind uwtable
-define void @int_upsample(i32* %A) {
-entry:
-  %0 = load i8, i8* undef, align 1
-  %conv7 = zext i8 %0 to i32
-  br label %while.body.preheader
-
-while.body.preheader:                             ; preds = %entry
-  br label %while.body
-
-while.body:                                       ; preds = %if.end, %while.body.preheader
-  %outrow.036 = phi i32 [ %add23, %if.end ], [ 0, %while.body.preheader ]
-  br i1 true, label %if.end, label %while.body16
-
-while.body16:                                     ; preds = %while.body16, %while.body
-  br label %while.body16
-
-if.end:                                           ; preds = %while.body
-  store i32 0, i32* %A
-  %add23 = add nuw nsw i32 %outrow.036, 1
-  %cmp = icmp slt i32 %add23, 0
-  br i1 %cmp, label %while.body, label %while.end24
-
-while.end24:                                      ; preds = %if.end
-  ret void
-}

Removed: polly/trunk/test/ScopInfo/schedule-constuction-endless-loop2.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/schedule-constuction-endless-loop2.ll?rev=265271&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/schedule-constuction-endless-loop2.ll (original)
+++ polly/trunk/test/ScopInfo/schedule-constuction-endless-loop2.ll (removed)
@@ -1,37 +0,0 @@
-; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
-;
-; Check that we do not build a SCoP and do not crash.
-;
-; CHECK-NOT: Statements
-;
-target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
-
-; Function Attrs: nounwind uwtable
-define void @int_upsample(i32* %A) {
-entry:
-  %0 = load i8, i8* undef, align 1
-  %conv7 = zext i8 %0 to i32
-  br label %while.body.preheader
-
-while.body.preheader:                             ; preds = %entry
-  br label %while.body
-
-while.body:                                       ; preds = %if.end, %while.body.preheader
-  %outrow.036 = phi i32 [ %add23, %if.end ], [ 0, %while.body.preheader ]
-  br i1 true, label %if.end, label %while.body16
-
-while.body16:                                     ; preds = %while.body16, %while.body
-  br label %while.body16.split
-
-while.body16.split:
-  br label %while.body16
-
-if.end:                                           ; preds = %while.body
-  store i32 0, i32* %A
-  %add23 = add nuw nsw i32 %outrow.036, 1
-  %cmp = icmp slt i32 %add23, 0
-  br i1 %cmp, label %while.body, label %while.end24
-
-while.end24:                                      ; preds = %if.end
-  ret void
-}

Modified: polly/trunk/test/ScopInfo/two-loops-one-infinite.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/two-loops-one-infinite.ll?rev=265272&r1=265271&r2=265272&view=diff
==============================================================================
--- polly/trunk/test/ScopInfo/two-loops-one-infinite.ll (original)
+++ polly/trunk/test/ScopInfo/two-loops-one-infinite.ll Sun Apr  3 14:36:52 2016
@@ -1,8 +1,16 @@
 ; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
 ;
-; Verify we do not create a SCoP in the presence of infinite loops.
+; Verify we detect and create the SCoP correctly
 ;
-; CHECK-NOT:      Statements
+; CHECK:      Statements {
+; CHECK-NEXT:   Stmt_while_body_us
+; CHECK-NEXT:     Domain :=
+; CHECK-NEXT:       [a13] -> { Stmt_while_body_us[] };
+; CHECK-NEXT:     Schedule :=
+; CHECK-NEXT:       [a13] -> { Stmt_while_body_us[] -> [] };
+; CHECK-NEXT:     MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT:       [a13] -> { Stmt_while_body_us[] -> MemRef_uuu[] };
+; CHECK-NEXT: }
 ;
 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n8:16:32-S64"
 




More information about the llvm-commits mailing list