add isl_aff_involves_dims
authorSven Verdoolaege <skimo@kotnet.org>
Tue, 28 Jun 2011 14:51:03 +0000 (16:51 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Fri, 1 Jul 2011 16:51:57 +0000 (18:51 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/aff.h
isl_aff.c

index 685c068..f44f3f5 100644 (file)
@@ -2246,6 +2246,11 @@ The expression can be inspected using
        __isl_give isl_div *isl_aff_get_div(
                __isl_keep isl_aff *aff, int pos);
 
+       int isl_aff_involves_dims(__isl_keep isl_aff *aff,
+               enum isl_dim_type type, unsigned first, unsigned n);
+       int isl_pw_aff_involves_dims(__isl_keep isl_pw_aff *pwaff,
+               enum isl_dim_type type, unsigned first, unsigned n);
+
        isl_ctx *isl_pw_aff_get_ctx(__isl_keep isl_pw_aff *pwaff);
        unsigned isl_pw_aff_dim(__isl_keep isl_pw_aff *pwaff,
                enum isl_dim_type type);
index 685e656..2df4420 100644 (file)
@@ -21,6 +21,8 @@ void *isl_aff_free(__isl_take isl_aff *aff);
 isl_ctx *isl_aff_get_ctx(__isl_keep isl_aff *aff);
 
 int isl_aff_dim(__isl_keep isl_aff *aff, enum isl_dim_type type);
+int isl_aff_involves_dims(__isl_keep isl_aff *aff,
+       enum isl_dim_type type, unsigned first, unsigned n);
 
 __isl_give isl_dim *isl_aff_get_dim(__isl_keep isl_aff *aff);
 __isl_give isl_local_space *isl_aff_get_local_space(__isl_keep isl_aff *aff);
@@ -95,6 +97,8 @@ __isl_give isl_pw_aff *isl_pw_aff_copy(__isl_keep isl_pw_aff *pwaff);
 void *isl_pw_aff_free(__isl_take isl_pw_aff *pwaff);
 
 unsigned isl_pw_aff_dim(__isl_keep isl_pw_aff *pwaff, enum isl_dim_type type);
+int isl_pw_aff_involves_dims(__isl_keep isl_pw_aff *pwaff,
+       enum isl_dim_type type, unsigned first, unsigned n);
 
 __isl_give isl_set *isl_pw_aff_domain(__isl_take isl_pw_aff *pwaff);
 
index 74c4b14..e61b73c 100644 (file)
--- a/isl_aff.c
+++ b/isl_aff.c
@@ -753,6 +753,77 @@ int isl_aff_is_empty(__isl_keep isl_aff *aff)
        return 0;
 }
 
+/* Set active[i] to 1 if the dimension at position i is involved
+ * in the affine expression.
+ */
+static int set_active(__isl_keep isl_aff *aff, int *active)
+{
+       int i, j;
+       unsigned total;
+       unsigned offset;
+
+       if (!aff || !active)
+               return -1;
+
+       total = aff->v->size - 2;
+       for (i = 0; i < total; ++i)
+               active[i] = !isl_int_is_zero(aff->v->el[2 + i]);
+
+       offset = isl_local_space_offset(aff->ls, isl_dim_div) - 1;
+       for (i = aff->ls->div->n_row - 1; i >= 0; --i) {
+               if (!active[offset + i])
+                       continue;
+               for (j = 0; j < total; ++j)
+                       active[j] |=
+                               !isl_int_is_zero(aff->ls->div->row[i][2 + j]);
+       }
+
+       return 0;
+}
+
+/* Check whether the given affine expression has non-zero coefficient
+ * for any dimension in the given range or if any of these dimensions
+ * appear with non-zero coefficients in any of the integer divisions
+ * involved in the affine expression.
+ */
+int isl_aff_involves_dims(__isl_keep isl_aff *aff,
+       enum isl_dim_type type, unsigned first, unsigned n)
+{
+       int i;
+       isl_ctx *ctx;
+       int *active = NULL;
+       int involves = 0;
+
+       if (!aff)
+               return -1;
+       if (n == 0)
+               return 0;
+
+       ctx = isl_aff_get_ctx(aff);
+       if (first + n > isl_aff_dim(aff, type))
+               isl_die(ctx, isl_error_invalid,
+                       "range out of bounds", return -1);
+
+       active = isl_calloc_array(ctx, int,
+                                 isl_local_space_dim(aff->ls, isl_dim_all));
+       if (set_active(aff, active) < 0)
+               goto error;
+
+       first += isl_local_space_offset(aff->ls, type) - 1;
+       for (i = 0; i < n; ++i)
+               if (active[first + i]) {
+                       involves = 1;
+                       break;
+               }
+
+       free(active);
+
+       return involves;
+error:
+       free(active);
+       return -1;
+}
+
 #undef PW
 #define PW isl_pw_aff
 #undef EL
@@ -768,7 +839,6 @@ int isl_aff_is_empty(__isl_keep isl_aff *aff)
 
 #define NO_EVAL
 #define NO_OPT
-#define NO_INVOLVES_DIMS
 #define NO_MOVE_DIMS
 #define NO_DROP_DIMS
 #define NO_INSERT_DIMS