[llvm-commits] [polly] r138555 - in /polly/trunk: lib/Analysis/Dependences.cpp lib/CodeGeneration.cpp lib/ScheduleOptimizer.cpp test/CMakeLists.txt test/ScheduleOptimizer/ test/ScheduleOptimizer/2011-08-25-crash_in_vectorizer.ll

Tobias Grosser grosser at fim.uni-passau.de
Thu Aug 25 01:40:59 PDT 2011


Author: grosser
Date: Thu Aug 25 03:40:59 2011
New Revision: 138555

URL: http://llvm.org/viewvc/llvm-project?rev=138555&view=rev
Log:
Fix crashes due to unaligned parameters

Due to the recent introduction of isl_id, parameters need now always to be
aligned. This was not yet taken care of in the code path of vectorization and
dependence analysis.

Added:
    polly/trunk/test/ScheduleOptimizer/
    polly/trunk/test/ScheduleOptimizer/2011-08-25-crash_in_vectorizer.ll
Modified:
    polly/trunk/lib/Analysis/Dependences.cpp
    polly/trunk/lib/CodeGeneration.cpp
    polly/trunk/lib/ScheduleOptimizer.cpp
    polly/trunk/test/CMakeLists.txt

Modified: polly/trunk/lib/Analysis/Dependences.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/Dependences.cpp?rev=138555&r1=138554&r2=138555&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/Dependences.cpp (original)
+++ polly/trunk/lib/Analysis/Dependences.cpp Thu Aug 25 03:40:59 2011
@@ -264,6 +264,7 @@
                                       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 @@
 
   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 @@
   }
 
   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 @@
   }
 
   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);

Modified: polly/trunk/lib/CodeGeneration.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGeneration.cpp?rev=138555&r1=138554&r2=138555&view=diff
==============================================================================
--- polly/trunk/lib/CodeGeneration.cpp (original)
+++ polly/trunk/lib/CodeGeneration.cpp Thu Aug 25 03:40:59 2011
@@ -1139,8 +1139,10 @@
 
     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);
 

Modified: polly/trunk/lib/ScheduleOptimizer.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/ScheduleOptimizer.cpp?rev=138555&r1=138554&r2=138555&view=diff
==============================================================================
--- polly/trunk/lib/ScheduleOptimizer.cpp (original)
+++ polly/trunk/lib/ScheduleOptimizer.cpp Thu Aug 25 03:40:59 2011
@@ -76,8 +76,7 @@
 
     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 @@
 
     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 @@
 //	    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 @@
   //	                  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 @@
 
 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 @@
   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 @@
     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 @@
       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 @@
       finalSchedule = partialSchedule;
 
     isl_band_free(band);
+    isl_dim_free(dim);
   }
 
   return finalSchedule;

Modified: polly/trunk/test/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/CMakeLists.txt?rev=138555&r1=138554&r2=138555&view=diff
==============================================================================
--- polly/trunk/test/CMakeLists.txt (original)
+++ polly/trunk/test/CMakeLists.txt Thu Aug 25 03:40:59 2011
@@ -1,6 +1,7 @@
 set(POLLY_TEST_DIRECTORIES
-  "ScopInfo"
   "AffineIterator"
+  "ScopInfo"
+  "ScheduleOptimizer"
   "CodeGen"
   "OpenMP"
   "polybench"

Added: polly/trunk/test/ScheduleOptimizer/2011-08-25-crash_in_vectorizer.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScheduleOptimizer/2011-08-25-crash_in_vectorizer.ll?rev=138555&view=auto
==============================================================================
--- polly/trunk/test/ScheduleOptimizer/2011-08-25-crash_in_vectorizer.ll (added)
+++ polly/trunk/test/ScheduleOptimizer/2011-08-25-crash_in_vectorizer.ll Thu Aug 25 03:40:59 2011
@@ -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: }
+
+





More information about the llvm-commits mailing list