diff options
-rw-r--r-- | polly/lib/Analysis/Dependences.cpp | 6 | ||||
-rw-r--r-- | polly/lib/CodeGeneration.cpp | 4 | ||||
-rw-r--r-- | polly/lib/ScheduleOptimizer.cpp | 28 | ||||
-rw-r--r-- | polly/test/CMakeLists.txt | 3 | ||||
-rw-r--r-- | polly/test/ScheduleOptimizer/2011-08-25-crash_in_vectorizer.ll | 50 |
5 files changed, 72 insertions, 19 deletions
diff --git a/polly/lib/Analysis/Dependences.cpp b/polly/lib/Analysis/Dependences.cpp index c9c2351fc97..042b833f4aa 100644 --- a/polly/lib/Analysis/Dependences.cpp +++ b/polly/lib/Analysis/Dependences.cpp @@ -264,6 +264,7 @@ bool Dependences::isParallelDimension(isl_set *loopDomain, unsigned parallelDimension) { Scop *S = &getCurScop(); isl_union_map *schedule = getCombinedScheduleForDim(S, parallelDimension); + isl_dim *dimModel = isl_union_map_get_dim(schedule); // Calculate distance vector. isl_union_set *scheduleSubset; @@ -310,8 +311,7 @@ bool Dependences::isParallelDimension(isl_set *loopDomain, isl_union_set *distance_waw = isl_union_map_deltas(restrictedDeps_waw); - isl_dim *dim = isl_dim_set_alloc(S->getCtx(), S->getNumParams(), - parallelDimension); + isl_dim *dim = isl_dim_set_alloc(S->getCtx(), 0, parallelDimension); // [0, 0, 0, 0] - All zero isl_basic_set *allZeroBS = isl_basic_set_universe(isl_dim_copy(dim)); @@ -328,6 +328,7 @@ bool Dependences::isParallelDimension(isl_set *loopDomain, } isl_set *allZero = isl_set_from_basic_set(allZeroBS); + allZero = isl_set_align_params(allZero, isl_dim_copy(dimModel)); // All zero, last unknown. // [0, 0, 0, ?] @@ -345,6 +346,7 @@ bool Dependences::isParallelDimension(isl_set *loopDomain, } isl_set *lastUnknown = isl_set_from_basic_set(lastUnknownBS); + lastUnknown = isl_set_align_params(lastUnknown, dimModel); // Valid distance vectors isl_set *validDistances = isl_set_subtract(lastUnknown, allZero); diff --git a/polly/lib/CodeGeneration.cpp b/polly/lib/CodeGeneration.cpp index cfede95a6af..c9c2742f6bb 100644 --- a/polly/lib/CodeGeneration.cpp +++ b/polly/lib/CodeGeneration.cpp @@ -1139,8 +1139,10 @@ public: isl_set *elements = isl_map_range(sub); - if (!isl_set_is_singleton(elements)) + if (!isl_set_is_singleton(elements)) { + isl_set_free(elements); return -1; + } isl_point *p = isl_set_sample_point(elements); diff --git a/polly/lib/ScheduleOptimizer.cpp b/polly/lib/ScheduleOptimizer.cpp index f0bfa0aadfd..4bc5db334d0 100644 --- a/polly/lib/ScheduleOptimizer.cpp +++ b/polly/lib/ScheduleOptimizer.cpp @@ -76,8 +76,7 @@ static void extendScattering(Scop &S, unsigned scatDimensions) { isl_map *scattering = stmt->getScattering(); isl_dim *dim = isl_dim_alloc(isl_map_get_ctx(scattering), - isl_map_n_param(scattering), - isl_map_n_out(scattering), + 0, isl_map_n_out(scattering), scatDimensions); isl_basic_map *changeScattering = isl_basic_map_universe(isl_dim_copy(dim)); @@ -96,6 +95,8 @@ static void extendScattering(Scop &S, unsigned scatDimensions) { isl_map *changeScatteringMap = isl_map_from_basic_map(changeScattering); + isl_dim *dimModel = isl_map_get_dim(scattering); + changeScatteringMap = isl_map_align_params(changeScatteringMap, dimModel); stmt->setScattering(isl_map_apply_range(scattering, changeScatteringMap)); isl_dim_free(dim); } @@ -128,7 +129,7 @@ static void extendScattering(Scop &S, unsigned scatDimensions) { // S(i,j) // static isl_basic_map *getTileMap(isl_ctx *ctx, int scheduleDimensions, - int parameterDimensions, int tileSize = 32) { + isl_dim *dimModel, int tileSize = 32) { // We construct // // tileMap := [p0] -> {[s0, s1] -> [t0, t1, p0, p1, a0, a1]: @@ -136,8 +137,8 @@ static isl_basic_map *getTileMap(isl_ctx *ctx, int scheduleDimensions, // s1 = a1 * 32 and s1 = p1 and t1 <= p1 < t1 + 32} // // and project out the auxilary dimensions a0 and a1. - isl_dim *dim = isl_dim_alloc(ctx, parameterDimensions, scheduleDimensions, - scheduleDimensions * 3); + isl_dim *dim = isl_dim_alloc(ctx, 0, scheduleDimensions, + scheduleDimensions * 3); isl_basic_map *tileMap = isl_basic_map_universe(isl_dim_copy(dim)); for (int x = 0; x < scheduleDimensions; x++) { @@ -188,7 +189,7 @@ static isl_basic_map *getTileMap(isl_ctx *ctx, int scheduleDimensions, isl_union_map *getTiledPartialSchedule(isl_band *band) { isl_union_map *partialSchedule; - int scheduleDimensions, parameterDimensions; + int scheduleDimensions; isl_ctx *ctx; isl_dim *dim; isl_basic_map *tileMap; @@ -198,15 +199,12 @@ isl_union_map *getTiledPartialSchedule(isl_band *band) { ctx = isl_union_map_get_ctx(partialSchedule); dim = isl_union_map_get_dim(partialSchedule); scheduleDimensions = isl_band_n_member(band); - parameterDimensions = isl_dim_size(dim, isl_dim_param); - tileMap = getTileMap(ctx, scheduleDimensions, parameterDimensions); + tileMap = getTileMap(ctx, scheduleDimensions, dim); tileUnionMap = isl_union_map_from_map(isl_map_from_basic_map(tileMap)); - + tileUnionMap = isl_union_map_align_params(tileUnionMap, dim); partialSchedule = isl_union_map_apply_range(partialSchedule, tileUnionMap); - isl_dim_free(dim); - return partialSchedule; } @@ -288,8 +286,6 @@ static isl_union_map *tileBandList(isl_band_list *blist) { partialSchedule = getTiledPartialSchedule(band); int scheduleDimensions = isl_band_n_member(band); isl_dim *dim = isl_union_map_get_dim(partialSchedule); - int parameterDimensions = isl_dim_size(dim, isl_dim_param); - isl_dim_free(dim); if (isl_band_has_children(band)) { @@ -307,9 +303,10 @@ static isl_union_map *tileBandList(isl_band_list *blist) { for (int i = scheduleDimensions - 1 ; i >= 0 ; i--) { if (isl_band_member_is_zero_distance(band, i)) { tileMap = getPrevectorMap(ctx, scheduleDimensions + i, - scheduleDimensions * 2, - parameterDimensions); + scheduleDimensions * 2, 0); tileUnionMap = isl_union_map_from_map(tileMap); + tileUnionMap = isl_union_map_align_params(tileUnionMap, + isl_dim_copy(dim)); partialSchedule = isl_union_map_apply_range(partialSchedule, tileUnionMap); break; @@ -323,6 +320,7 @@ static isl_union_map *tileBandList(isl_band_list *blist) { finalSchedule = partialSchedule; isl_band_free(band); + isl_dim_free(dim); } return finalSchedule; diff --git a/polly/test/CMakeLists.txt b/polly/test/CMakeLists.txt index fc902926449..fcfd874f73e 100644 --- a/polly/test/CMakeLists.txt +++ b/polly/test/CMakeLists.txt @@ -1,6 +1,7 @@ set(POLLY_TEST_DIRECTORIES - "ScopInfo" "AffineIterator" + "ScopInfo" + "ScheduleOptimizer" "CodeGen" "OpenMP" "polybench" diff --git a/polly/test/ScheduleOptimizer/2011-08-25-crash_in_vectorizer.ll b/polly/test/ScheduleOptimizer/2011-08-25-crash_in_vectorizer.ll new file mode 100644 index 00000000000..43b64257866 --- /dev/null +++ b/polly/test/ScheduleOptimizer/2011-08-25-crash_in_vectorizer.ll @@ -0,0 +1,50 @@ +; RUN: opt %loadPolly -polly-optimize-isl -polly-cloog -analyze %s -S | FileCheck %s +; RUN: opt %loadPolly -polly-optimize-isl -polly-cloog -analyze -enable-schedule-prevector %s -S | FileCheck %s -check-prefix=VECTOR + + +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" +target triple = "x86_64-pc-linux-gnu" + +define void @f(i32* nocapture %A, i32 %N, i32 %C) nounwind { +bb: + %tmp1 = icmp sgt i32 %N, 0 + br i1 %tmp1, label %.lr.ph, label %._crit_edge + +.lr.ph: ; preds = %bb + %tmp = zext i32 %N to i64 + br label %bb2 + +bb2: ; preds = %bb2, %.lr.ph + %indvar = phi i64 [ 0, %.lr.ph ], [ %indvar.next, %bb2 ] + %scevgep = getelementptr i32* %A, i64 %indvar + %tmp3 = load i32* %scevgep, align 4 + %tmp4 = add nsw i32 %tmp3, %C + store i32 %tmp4, i32* %scevgep, align 4 + %indvar.next = add i64 %indvar, 1 + %exitcond = icmp eq i64 %indvar.next, %tmp + br i1 %exitcond, label %._crit_edge, label %bb2 + +._crit_edge: ; preds = %bb2, %bb + ret void +} + +; CHECK: if (M >= 1) { +; CHECK: for (c1=0;c1<=M-1;c1+=32) { +; CHECK: for (c2=c1;c2<=min(M-1,c1+31);c2++) { +; CHECK: Stmt_bb2(c2); +; CHECK: } +; CHECK: } +; CHECK: } + +; VECTOR: if (M >= 1) { +; VECTOR: for (c1=0;c1<=M-1;c1+=32) { +; VECTOR: for (c2=-4*floord(-c1,4);c2<=min(M-1,c1+31);c2+=4) { +; VECTOR: for (c3=c2;c3<=min(M-1,c2+3);c3++) { +; VECTOR: Stmt_bb2(c3); +; VECTOR: } +; VECTOR: } +; VECTOR: } +; VECTOR: } + + |