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

Johannes Doerfert via llvm-commits llvm-commits at lists.llvm.org
Sun Apr 3 16:09:06 PDT 2016


Author: jdoerfert
Date: Sun Apr  3 18:09:06 2016
New Revision: 265280

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

  If a loop has no exiting blocks the region covering we use during
  schedule genertion might not cover that loop properly. For now we bail
  out as we would not optimize these loops anyway.

Added:
    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=265280&r1=265279&r2=265280&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopDetection.cpp (original)
+++ polly/trunk/lib/Analysis/ScopDetection.cpp Sun Apr  3 18:09:06 2016
@@ -1029,8 +1029,14 @@ 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->getLoopLatches(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);
   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=265280&r1=265279&r2=265280&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/ScopInfo.cpp Sun Apr  3 18:09:06 2016
@@ -3680,7 +3680,7 @@ void Scop::buildSchedule(Region *R, Loop
 
     Loop *LastLoop = LoopStack.back().L;
     if (LastLoop != L) {
-      if (!LastLoop->contains(L)) {
+      if (LastLoop && !LastLoop->contains(L)) {
         LastRNWaiting = true;
         DelayList.push_back(RN);
         continue;

Added: 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=265280&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/schedule-constuction-endless-loop1.ll (added)
+++ polly/trunk/test/ScopInfo/schedule-constuction-endless-loop1.ll Sun Apr  3 18:09:06 2016
@@ -0,0 +1,34 @@
+; 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
+}

Added: 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=265280&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/schedule-constuction-endless-loop2.ll (added)
+++ polly/trunk/test/ScopInfo/schedule-constuction-endless-loop2.ll Sun Apr  3 18:09:06 2016
@@ -0,0 +1,37 @@
+; 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=265280&r1=265279&r2=265280&view=diff
==============================================================================
--- polly/trunk/test/ScopInfo/two-loops-one-infinite.ll (original)
+++ polly/trunk/test/ScopInfo/two-loops-one-infinite.ll Sun Apr  3 18:09:06 2016
@@ -1,16 +1,8 @@
 ; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
 ;
-; Verify we detect and create the SCoP correctly
+; Verify we do not create a SCoP in the presence of infinite loops.
 ;
-; 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: }
+; CHECK-NOT:      Statements
 ;
 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