isl_qpolynomial_substitute_equalities: don't use equalities with existentials
authorSven Verdoolaege <skimo@kotnet.org>
Thu, 4 Nov 2010 21:16:20 +0000 (22:16 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Thu, 4 Nov 2010 21:21:01 +0000 (22:21 +0100)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
isl_polynomial.c
isl_test.c

index 601d358..68e5e19 100644 (file)
@@ -1946,6 +1946,7 @@ __isl_give isl_qpolynomial *isl_qpolynomial_substitute_equalities(
        int i, j, k;
        isl_int denom;
        unsigned total;
+       unsigned n_div;
        struct isl_upoly *up;
 
        if (!eq)
@@ -1963,10 +1964,11 @@ __isl_give isl_qpolynomial *isl_qpolynomial_substitute_equalities(
                goto error;
 
        total = 1 + isl_dim_total(eq->dim);
+       n_div = eq->n_div;
        isl_int_init(denom);
        for (i = 0; i < eq->n_eq; ++i) {
-               j = isl_seq_last_non_zero(eq->eq[i], total);
-               if (j < 0 || j == 0)
+               j = isl_seq_last_non_zero(eq->eq[i], total + n_div);
+               if (j < 0 || j == 0 || j >= total)
                        continue;
 
                for (k = 0; k < qp->div->n_row; ++k) {
index 3548c91..c2f0285 100644 (file)
@@ -1409,6 +1409,7 @@ void test_bijective(struct isl_ctx *ctx)
 void test_pwqp(struct isl_ctx *ctx)
 {
        const char *str;
+       isl_set *set;
        isl_pw_qpolynomial *pwqp1, *pwqp2;
 
        str = "{ [i,j,k] -> 1 + 9 * [i/5] + 7 * [j/11] + 4 * [k/13] }";
@@ -1425,6 +1426,20 @@ void test_pwqp(struct isl_ctx *ctx)
        assert(isl_pw_qpolynomial_is_zero(pwqp1));
 
        isl_pw_qpolynomial_free(pwqp1);
+
+       str = "{ [i] -> i }";
+       pwqp1 = isl_pw_qpolynomial_read_from_str(ctx, str);
+       str = "{ [k] : exists a : k = 2a }";
+       set = isl_set_read_from_str(ctx, str, 0);
+       pwqp1 = isl_pw_qpolynomial_gist(pwqp1, set);
+       str = "{ [i] -> i }";
+       pwqp2 = isl_pw_qpolynomial_read_from_str(ctx, str);
+
+       pwqp1 = isl_pw_qpolynomial_sub(pwqp1, pwqp2);
+
+       assert(isl_pw_qpolynomial_is_zero(pwqp1));
+
+       isl_pw_qpolynomial_free(pwqp1);
 }
 
 void test_split_periods(isl_ctx *ctx)