[llvm-commits] [polly] r155135 - /polly/trunk/lib/Analysis/Dependences.cpp

Tobias Grosser grosser at fim.uni-passau.de
Thu Apr 19 09:38:16 PDT 2012


Author: grosser
Date: Thu Apr 19 11:38:16 2012
New Revision: 155135

URL: http://llvm.org/viewvc/llvm-project?rev=155135&view=rev
Log:
Dependences: Rework parallelism check

After working and explaining this function to someone, I realized it could be
simplified and better documented.

Modified:
    polly/trunk/lib/Analysis/Dependences.cpp

Modified: polly/trunk/lib/Analysis/Dependences.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/Dependences.cpp?rev=155135&r1=155134&r2=155135&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/Dependences.cpp (original)
+++ polly/trunk/lib/Analysis/Dependences.cpp Thu Apr 19 11:38:16 2012
@@ -172,55 +172,53 @@
   return schedule;
 }
 
-bool Dependences::isParallelDimension(__isl_take isl_set *Domain,
+bool Dependences::isParallelDimension(__isl_take isl_set *ScheduleSubset,
                                       unsigned ParallelDim) {
+  // To check if a loop is parallel, we perform the following steps:
+  //
+  // o Move dependences from 'Domain -> Domain' to 'Schedule -> Schedule' space.
+  // o Limit dependences to the schedule space enumerated by the loop.
+  // o Calculate distances of the dependences.
+  // o Check if one of the distances is invalid in presence of parallelism.
+
   isl_union_map *Schedule, *Deps;
-  isl_union_set *ScheduleSubset;
+  isl_map *ScheduleDeps;
   Scop *S = &getCurScop();
 
-  Schedule = getCombinedScheduleForSpace(S, ParallelDim);
   Deps = getDependences(TYPE_ALL);
 
-  ScheduleSubset = isl_union_set_from_set(Domain);
+  if (isl_union_map_is_empty(Deps)) {
+    isl_union_map_free(Deps);
+    isl_set_free(ScheduleSubset);
+    return true;
+  }
+
+  Schedule = getCombinedScheduleForSpace(S, ParallelDim);
   Deps = isl_union_map_apply_range(Deps, isl_union_map_copy(Schedule));
   Deps = isl_union_map_apply_domain(Deps, Schedule);
+  ScheduleDeps = isl_map_from_union_map(Deps);
+  ScheduleDeps = isl_map_intersect_domain(ScheduleDeps,
+                                          isl_set_copy(ScheduleSubset));
+  ScheduleDeps = isl_map_intersect_range(ScheduleDeps, ScheduleSubset);
 
-  // Dependences need to originate and to terminate in the scheduling space
-  // enumerated by this loop.
-  Deps = isl_union_map_intersect_domain(Deps,
-                                        isl_union_set_copy(ScheduleSubset));
-  Deps = isl_union_map_intersect_range(Deps, ScheduleSubset);
-
-  isl_union_set *Distance = isl_union_map_deltas(Deps);
+  isl_set *Distances = isl_map_deltas(ScheduleDeps);
 
   isl_space *Space = isl_space_set_alloc(S->getIslCtx(), 0, ParallelDim);
+  Space = isl_space_align_params(Space, S->getParamSpace());
 
-  // [0, 0, 0, 0] - All zero
-  isl_set *AllZero = isl_set_universe(isl_space_copy(Space));
-  unsigned Dimensions = isl_space_dim(Space, isl_dim_set);
-
-  for (unsigned i = 0; i < Dimensions; i++)
-    AllZero = isl_set_fix_si(AllZero, isl_dim_set, i, 0);
-
-  AllZero = isl_set_align_params(AllZero, S->getParamSpace());
+  isl_set *Invalid = isl_set_universe(Space);
 
-  // All zero, last unknown.
-  // [0, 0, 0, ?]
-  isl_set *LastUnknown = isl_set_universe(Space);
+  // [0, ..., 0, +] - All zeros and last dimension larger than zero
+  for (unsigned i = 0; i < ParallelDim - 1; i++)
+    Invalid = isl_set_fix_si(Invalid, isl_dim_set, i, 0);
 
-  for (unsigned i = 0; i < Dimensions - 1; i++)
-    LastUnknown = isl_set_fix_si(LastUnknown, isl_dim_set, i, 0);
+  Invalid = isl_set_lower_bound_si(Invalid, isl_dim_set, ParallelDim - 1, 1);
 
-  LastUnknown = isl_set_align_params(LastUnknown, S->getParamSpace());
+  Invalid = isl_set_intersect(Invalid, Distances);
 
-  // Valid distance vectors
-  isl_set *ValidDistances = isl_set_subtract(LastUnknown, AllZero);
-  ValidDistances = isl_set_complement(ValidDistances);
-  isl_union_set *ValidDistancesUS = isl_union_set_from_set(ValidDistances);
-  isl_union_set *Invalid = isl_union_set_subtract(Distance, ValidDistancesUS);
+  bool IsParallel = isl_set_is_empty(Invalid);
+  isl_set_free(Invalid);
 
-  bool IsParallel = isl_union_set_is_empty(Invalid);
-  isl_union_set_free(Invalid);
   return IsParallel;
 }
 





More information about the llvm-commits mailing list