summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/user.pod15
-rw-r--r--include/isl/set.h2
-rw-r--r--isl_equalities.c33
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;
+}