[FIX] Do not create a SCoP in the presence of infinite loops
authorJohannes Doerfert <doerfert@cs.uni-saarland.de>
Sun, 3 Apr 2016 23:09:06 +0000 (23:09 +0000)
committerJohannes Doerfert <doerfert@cs.uni-saarland.de>
Sun, 3 Apr 2016 23:09:06 +0000 (23:09 +0000)
  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.

llvm-svn: 265280

polly/lib/Analysis/ScopDetection.cpp
polly/lib/Analysis/ScopInfo.cpp
polly/test/ScopInfo/schedule-constuction-endless-loop1.ll [new file with mode: 0644]
polly/test/ScopInfo/schedule-constuction-endless-loop2.ll [new file with mode: 0644]
polly/test/ScopInfo/two-loops-one-infinite.ll

index 594d656..c0dba12 100644 (file)
@@ -1029,8 +1029,14 @@ bool ScopDetection::canUseISLTripCount(Loop *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;
index 166ddd5..a4fdbcf 100644 (file)
@@ -3680,7 +3680,7 @@ void Scop::buildSchedule(Region *R, LoopStackTy &LoopStack, ScopDetection &SD,
 
     Loop *LastLoop = LoopStack.back().L;
     if (LastLoop != L) {
-      if (!LastLoop->contains(L)) {
+      if (LastLoop && !LastLoop->contains(L)) {
         LastRNWaiting = true;
         DelayList.push_back(RN);
         continue;
diff --git a/polly/test/ScopInfo/schedule-constuction-endless-loop1.ll b/polly/test/ScopInfo/schedule-constuction-endless-loop1.ll
new file mode 100644 (file)
index 0000000..50af71b
--- /dev/null
@@ -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
+}
diff --git a/polly/test/ScopInfo/schedule-constuction-endless-loop2.ll b/polly/test/ScopInfo/schedule-constuction-endless-loop2.ll
new file mode 100644 (file)
index 0000000..d190ddd
--- /dev/null
@@ -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
+}
index 21a4f4e..974194f 100644 (file)
@@ -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"