diff options
-rw-r--r-- | doc/user.pod | 15 | ||||
-rw-r--r-- | include/isl/set.h | 2 | ||||
-rw-r--r-- | isl_equalities.c | 33 |
3 files changed, 50 insertions, 0 deletions
diff --git a/doc/user.pod b/doc/user.pod index f208de3f..48b4f793 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -2075,6 +2075,21 @@ If the set or relation obviously lies on a hyperplane where the given dimension has a fixed value, then return that value. Otherwise return NaN. +=item * Stride + + int isl_set_dim_residue_class_val( + __isl_keep isl_set *set, + int pos, __isl_give isl_val **modulo, + __isl_give isl_val **residue); + +Check if the values of the given set dimension are equal to a fixed +value modulo some integer value. If so, assign the modulo to C<*modulo> +and the fixed value to C<*residue>. If the given dimension attains only +a single value, then assign C<0> to C<*modulo> and the fixed value to +C<*residue>. +If the dimension does not attain only a single value and if no modulo +can be found then assign C<1> to C<*modulo> and C<1> to C<*residue>. + =item * Space To check whether a set is a parameter domain, use this function: diff --git a/include/isl/set.h b/include/isl/set.h index 78c6811f..ed6a4256 100644 --- a/include/isl/set.h +++ b/include/isl/set.h @@ -462,6 +462,8 @@ int isl_basic_set_dim_residue_class(struct isl_basic_set *bset, int pos, isl_int *modulo, isl_int *residue); int isl_set_dim_residue_class(struct isl_set *set, int pos, isl_int *modulo, isl_int *residue); +int isl_set_dim_residue_class_val(__isl_keep isl_set *set, + int pos, __isl_give isl_val **modulo, __isl_give isl_val **residue); __isl_export __isl_give isl_set *isl_set_coalesce(__isl_take isl_set *set); diff --git a/isl_equalities.c b/isl_equalities.c index 9589032c..da36c3d1 100644 --- a/isl_equalities.c +++ b/isl_equalities.c @@ -14,6 +14,7 @@ #include <isl/seq.h> #include "isl_map_private.h" #include "isl_equalities.h" +#include <isl_val_private.h> /* Given a set of modulo constraints * @@ -746,3 +747,35 @@ error: isl_int_clear(r); return -1; } + +/* Check if dimension "dim" belongs to a residue class + * i_dim \equiv r mod m + * with m != 1 and if so return m in *modulo and r in *residue. + * As a special case, when i_dim has a fixed value v, then + * *modulo is set to 0 and *residue to v. + * + * If i_dim does not belong to such a residue class, then *modulo + * is set to 1 and *residue is set to 0. + */ +int isl_set_dim_residue_class_val(__isl_keep isl_set *set, + int pos, __isl_give isl_val **modulo, __isl_give isl_val **residue) +{ + *modulo = NULL; + *residue = NULL; + if (!set) + return -1; + *modulo = isl_val_alloc(isl_set_get_ctx(set)); + *residue = isl_val_alloc(isl_set_get_ctx(set)); + if (!*modulo || !*residue) + goto error; + if (isl_set_dim_residue_class(set, pos, + &(*modulo)->n, &(*residue)->n) < 0) + goto error; + isl_int_set_si((*modulo)->d, 1); + isl_int_set_si((*residue)->d, 1); + return 0; +error: + isl_val_free(*modulo); + isl_val_free(*residue); + return -1; +} |