[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.

llvm-svn: 265280
This commit is contained in:
Johannes Doerfert
2016-04-03 23:09:06 +00:00
parent fef609f15e
commit d5edbd61a1
5 changed files with 81 additions and 12 deletions

View 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;

View 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;

View File

@@ -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
}

View File

@@ -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
}

View 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"