summaryrefslogtreecommitdiffstats
path: root/polly/lib/CodeGen
diff options
context:
space:
mode:
Diffstat (limited to 'polly/lib/CodeGen')
-rw-r--r--polly/lib/CodeGen/PPCGCodeGeneration.cpp66
1 files changed, 62 insertions, 4 deletions
diff --git a/polly/lib/CodeGen/PPCGCodeGeneration.cpp b/polly/lib/CodeGen/PPCGCodeGeneration.cpp
index 2ca25ab1238..eac819d930b 100644
--- a/polly/lib/CodeGen/PPCGCodeGeneration.cpp
+++ b/polly/lib/CodeGen/PPCGCodeGeneration.cpp
@@ -1700,21 +1700,78 @@ public:
/// Derive the extent of an array.
///
- /// The extent of an array is defined by the set of memory locations for
- /// which a memory access in the iteration domain exists.
+ /// The extent of an array is the set of elements that are within the
+ /// accessed array. For the inner dimensions, the extent constraints are
+ /// 0 and the size of the corresponding array dimension. For the first
+ /// (outermost) dimension, the extent constraints are the minimal and maximal
+ /// subscript value for the first dimension.
///
/// @param Array The array to derive the extent for.
///
/// @returns An isl_set describing the extent of the array.
__isl_give isl_set *getExtent(ScopArrayInfo *Array) {
+ unsigned NumDims = Array->getNumberOfDimensions();
isl_union_map *Accesses = S->getAccesses();
Accesses = isl_union_map_intersect_domain(Accesses, S->getDomains());
+ Accesses = isl_union_map_detect_equalities(Accesses);
isl_union_set *AccessUSet = isl_union_map_range(Accesses);
+ AccessUSet = isl_union_set_coalesce(AccessUSet);
+ AccessUSet = isl_union_set_detect_equalities(AccessUSet);
+ AccessUSet = isl_union_set_coalesce(AccessUSet);
+
+ if (isl_union_set_is_empty(AccessUSet)) {
+ isl_union_set_free(AccessUSet);
+ return isl_set_empty(Array->getSpace());
+ }
+
+ if (Array->getNumberOfDimensions() == 0) {
+ isl_union_set_free(AccessUSet);
+ return isl_set_universe(Array->getSpace());
+ }
+
isl_set *AccessSet =
isl_union_set_extract_set(AccessUSet, Array->getSpace());
+
isl_union_set_free(AccessUSet);
+ isl_local_space *LS = isl_local_space_from_space(Array->getSpace());
+
+ isl_pw_aff *Val =
+ isl_pw_aff_from_aff(isl_aff_var_on_domain(LS, isl_dim_set, 0));
+
+ isl_pw_aff *OuterMin = isl_set_dim_min(isl_set_copy(AccessSet), 0);
+ isl_pw_aff *OuterMax = isl_set_dim_max(AccessSet, 0);
+ OuterMin = isl_pw_aff_add_dims(OuterMin, isl_dim_in,
+ isl_pw_aff_dim(Val, isl_dim_in));
+ OuterMax = isl_pw_aff_add_dims(OuterMax, isl_dim_in,
+ isl_pw_aff_dim(Val, isl_dim_in));
+ OuterMin =
+ isl_pw_aff_set_tuple_id(OuterMin, isl_dim_in, Array->getBasePtrId());
+ OuterMax =
+ isl_pw_aff_set_tuple_id(OuterMax, isl_dim_in, Array->getBasePtrId());
+
+ isl_set *Extent = isl_set_universe(Array->getSpace());
+
+ Extent = isl_set_intersect(
+ Extent, isl_pw_aff_le_set(OuterMin, isl_pw_aff_copy(Val)));
+ Extent = isl_set_intersect(Extent, isl_pw_aff_ge_set(OuterMax, Val));
+
+ for (unsigned i = 1; i < NumDims; ++i)
+ Extent = isl_set_lower_bound_si(Extent, isl_dim_set, i, 0);
+
+ for (unsigned i = 1; i < NumDims; ++i) {
+ isl_pw_aff *PwAff =
+ const_cast<isl_pw_aff *>(Array->getDimensionSizePw(i));
+ isl_pw_aff *Val = isl_pw_aff_from_aff(isl_aff_var_on_domain(
+ isl_local_space_from_space(Array->getSpace()), isl_dim_set, i));
+ PwAff = isl_pw_aff_add_dims(PwAff, isl_dim_in,
+ isl_pw_aff_dim(Val, isl_dim_in));
+ PwAff = isl_pw_aff_set_tuple_id(PwAff, isl_dim_in,
+ isl_pw_aff_get_tuple_id(Val, isl_dim_in));
+ auto *Set = isl_pw_aff_gt_set(PwAff, Val);
+ Extent = isl_set_intersect(Set, Extent);
+ }
- return AccessSet;
+ return Extent;
}
/// Derive the bounds of an array.
@@ -1827,7 +1884,6 @@ public:
isl_union_map_copy(PPCGScop->tagged_must_kills);
PPCGProg->to_inner = getArrayIdentity();
PPCGProg->to_outer = getArrayIdentity();
- PPCGProg->may_persist = compute_may_persist(PPCGProg);
PPCGProg->any_to_outer = nullptr;
PPCGProg->array_order = nullptr;
PPCGProg->n_stmts = std::distance(S->begin(), S->end());
@@ -1838,6 +1894,8 @@ public:
createArrays(PPCGProg);
+ PPCGProg->may_persist = compute_may_persist(PPCGProg);
+
return PPCGProg;
}
OpenPOWER on IntegriCloud