[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