ScheduleOpt: Do not crash on statements with empty iteration domains

Statements with an empty iteration domain may not have a schedule assigned by
the isl schedule optimizer. As Polly expects each statement to have a schedule,
we keep the old schedule for such statements.

This fixes http://llvm.org/PR15645`

Reported-by: Johannes Doerfert  <johannesdoerfert@gmx.de>
llvm-svn: 179233
This commit is contained in:
Tobias Grosser 2013-04-10 22:48:08 +00:00
parent 8fc29db312
commit f242b806ac
2 changed files with 38 additions and 1 deletions

View File

@ -537,8 +537,21 @@ bool IslScheduleOptimizer::runOnScop(Scop &S) {
isl_union_map *StmtBand;
StmtBand = isl_union_map_intersect_domain(isl_union_map_copy(ScheduleMap),
isl_union_set_from_set(Domain));
isl_map *StmtSchedule;
isl_map *StmtSchedule = NULL;
isl_union_map_foreach_map(StmtBand, getSingleMap, &StmtSchedule);
// Statements with an empty iteration domain may not have a schedule
// assigned by the isl schedule optimizer. As Polly expects each statement
// to have a schedule, we keep the old schedule for this statement. As
// there are zero iterations to execute, the content of the schedule does
// not matter.
//
// TODO: Consider removing such statements when constructing the scop.
if (!StmtSchedule) {
StmtSchedule = Stmt->getScattering();
StmtSchedule = isl_map_set_tuple_id(StmtSchedule, isl_dim_out, NULL);
}
Stmt->setScattering(StmtSchedule);
isl_union_map_free(StmtBand);
}

View File

@ -0,0 +1,24 @@
; RUN: opt %loadPolly -polly-opt-isl -S %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Check that we handle statements with an empty iteration domain correctly.
define void @f() {
entry:
%A = alloca double
br label %for
for:
%indvar = phi i32 [ %indvar.next, %for.inc ], [ 0, %entry ]
%exitcond = icmp ne i32 %indvar, -1
br i1 %exitcond, label %for.inc, label %return
for.inc:
%indvar.next = add i32 %indvar, 1
store double 1.0, double* %A
br label %for
return:
ret void
}