Do Not Model Unbounded Loops

Code generation currently does not expect unbounded loops. When
  using ISL to compute the loop trip count, if we find that the
  iteration domain remains unbounded, we invalidate the Scop by
  creating an infeasible context.

Contributed-by: Matthew Simpson <mssimpso@codeaurora.org>

This fixes PR24634.

Differential Revision: http://reviews.llvm.org/D12493

llvm-svn: 246477
This commit is contained in:
Johannes Doerfert 2015-08-31 19:58:24 +00:00
parent a88caeab6c
commit 5f912d3797
2 changed files with 8 additions and 2 deletions
polly
lib/Analysis
test/ScopInfo

View File

@ -903,9 +903,13 @@ void ScopStmt::addLoopBoundsToDomain(TempScop &tempScop) {
isl_set *UpperBoundSet = isl_pw_aff_le_set(IV, UpperBound);
Domain = isl_set_intersect(Domain, UpperBoundSet);
} else {
// If SCEV cannot provide a loop trip count we compute it with ISL.
// If SCEV cannot provide a loop trip count, we compute it with ISL. If
// the domain remains unbounded, make the assumed context infeasible
// as code generation currently does not expect unbounded loops.
addLoopTripCountToDomain(L);
isl_pw_aff_free(IV);
if (!isl_set_dim_has_upper_bound(Domain, isl_dim_set, i))
Parent.addAssumption(isl_set_empty(Parent.getParamSpace()));
}
}

View File

@ -1,6 +1,8 @@
; RUN: opt %loadPolly -polly-detect-unprofitable -polly-allow-non-scev-backedge-taken-count -polly-scops -analyze < %s | FileCheck %s
;
; CHECK: [M, N] -> { Stmt_for_body[i0] : i0 >= 0 and N <= -1 + M };
; TODO: We do not allow unbounded loops at the moment.
;
; CHECK-NOT: Stmt_for_body
;
; void f(int *A, int N, int M) {
; for (int i = M; i > N; i++)