add isl_set_dim_residue_class_val
authorSven Verdoolaege <skimo@kotnet.org>
Thu, 18 Apr 2013 06:54:03 +0000 (08:54 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Tue, 28 May 2013 18:42:48 +0000 (20:42 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/set.h
isl_equalities.c

index f208de3..48b4f79 100644 (file)
@@ -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:
index 78c6811..ed6a425 100644 (file)
@@ -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);
index 9589032..da36c3d 100644 (file)
@@ -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;
+}