isl_pw_qpolynomial_involves_dims: also check whether domains involve dims
authorSven Verdoolaege <skimo@kotnet.org>
Mon, 9 May 2011 13:01:08 +0000 (15:01 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Mon, 9 May 2011 13:01:08 +0000 (15:01 +0200)
Before, isl_pw_qpolynomial_involves_dims would only check whether the
polynomials associated to the different cells involved any of the indicated
dimensions, but didn't check if the decriptions of the cells involved
any of them.
If isl_pw_qpolynomial_involves_dims is used to check whether
isl_pw_qpolynomial_drop_dims can safely be applied, then clearly we need
to test the cell constraints too.

Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
include/isl/set.h
isl_map.c
isl_pw_templ.c

index 6f09324..deeb0d3 100644 (file)
@@ -246,6 +246,11 @@ __isl_give isl_set *isl_set_remove_divs(__isl_take isl_set *set);
 __isl_give isl_set *isl_set_split_dims(__isl_take isl_set *set,
        enum isl_dim_type type, unsigned first, unsigned n);
 
+int isl_basic_set_involves_dims(__isl_keep isl_basic_set *bset,
+       enum isl_dim_type type, unsigned first, unsigned n);
+int isl_set_involves_dims(__isl_keep isl_set *set,
+       enum isl_dim_type type, unsigned first, unsigned n);
+
 void isl_set_print_internal(__isl_keep isl_set *set, FILE *out, int indent);
 int isl_set_plain_is_empty(__isl_keep isl_set *set);
 int isl_set_fast_is_empty(__isl_keep isl_set *set);
index a3e5973..c606d13 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -1487,6 +1487,51 @@ __isl_give isl_set *isl_set_remove_divs_involving_dims(__isl_take isl_set *set,
                                                              type, first, n);
 }
 
+int isl_basic_set_involves_dims(__isl_keep isl_basic_set *bset,
+       enum isl_dim_type type, unsigned first, unsigned n)
+{
+       int i;
+
+       if (!bset)
+               return -1;
+
+       if (first + n > isl_basic_set_dim(bset, type))
+               isl_die(bset->ctx, isl_error_invalid,
+                       "index out of bounds", return -1);
+
+       first += isl_basic_set_offset(bset, type);
+       for (i = 0; i < bset->n_eq; ++i)
+               if (isl_seq_first_non_zero(bset->eq[i] + first, n) >= 0)
+                       return 1;
+       for (i = 0; i < bset->n_ineq; ++i)
+               if (isl_seq_first_non_zero(bset->ineq[i] + first, n) >= 0)
+                       return 1;
+
+       return 0;
+}
+
+int isl_set_involves_dims(__isl_keep isl_set *set,
+       enum isl_dim_type type, unsigned first, unsigned n)
+{
+       int i;
+
+       if (!set)
+               return -1;
+
+       if (first + n > isl_set_dim(set, type))
+               isl_die(set->ctx, isl_error_invalid,
+                       "index out of bounds", return -1);
+
+       for (i = 0; i < set->n; ++i) {
+               int involves = isl_basic_set_involves_dims(set->p[i],
+                                                           type, first, n);
+               if (involves < 0 || !involves)
+                       return involves;
+       }
+
+       return 1;
+}
+
 /* Return true if the definition of the given div is unknown or depends
  * on unknown divs.
  */
index f2fc508..2e9ca0c 100644 (file)
@@ -492,6 +492,9 @@ int FN(PW,involves_dims)(__isl_keep PW *pw, enum isl_dim_type type,
                                                        type, first, n);
                if (involves < 0 || involves)
                        return involves;
+               involves = isl_set_involves_dims(pw->p[i].set, type, first, n);
+               if (involves < 0 || involves)
+                       return involves;
        }
        return 0;
 }