forked from OSchip/llvm-project
				
			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. llvm-svn: 138555
This commit is contained in:
		
							parent
							
								
									b406d227d2
								
							
						
					
					
						commit
						c532f12965
					
				| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,7 +137,7 @@ 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,
 | 
			
		||||
  isl_dim *dim = isl_dim_alloc(ctx, 0, scheduleDimensions,
 | 
			
		||||
                               scheduleDimensions * 3);
 | 
			
		||||
  isl_basic_map *tileMap = isl_basic_map_universe(isl_dim_copy(dim));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
set(POLLY_TEST_DIRECTORIES
 | 
			
		||||
  "ScopInfo"
 | 
			
		||||
  "AffineIterator"
 | 
			
		||||
  "ScopInfo"
 | 
			
		||||
  "ScheduleOptimizer"
 | 
			
		||||
  "CodeGen"
 | 
			
		||||
  "OpenMP"
 | 
			
		||||
  "polybench"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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: }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue