isl_pw_qpolynomial_fold_bound: fix handling or zero input with wrapped domain
authorSven Verdoolaege <sven@nestor.cs.kuleuven.be>
Sun, 14 Nov 2010 13:14:55 +0000 (14:14 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Sun, 14 Nov 2010 14:40:09 +0000 (15:40 +0100)
That is, make sure the result has the right domain even if the input is zero.

Signed-off-by: Sven Verdoolaege <sven@nestor.cs.kuleuven.be>
isl_bound.c
isl_test.c

index bdddfad..10c70bc 100644 (file)
@@ -218,33 +218,26 @@ __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_bound(
        dim = isl_pw_qpolynomial_fold_get_dim(pwf);
        nvar = isl_dim_size(dim, isl_dim_set);
 
-       if (isl_pw_qpolynomial_fold_is_zero(pwf)) {
-               isl_pw_qpolynomial_fold_free(pwf);
+       if (isl_dim_is_wrapping(dim)) {
+               dim = isl_dim_unwrap(dim);
+               nvar = isl_dim_size(dim, isl_dim_out);
+               dim = isl_dim_domain(dim);
+       } else
                dim = isl_dim_drop(dim, isl_dim_set, 0, nvar);
+
+       if (nvar == 0) {
                if (tight)
                        *tight = 1;
-               return isl_pw_qpolynomial_fold_zero(dim, pwf->type);
+               return isl_pw_qpolynomial_fold_reset_dim(pwf, dim);
        }
 
-       if (nvar == 0) {
-               isl_dim_free(dim);
+       if (isl_pw_qpolynomial_fold_is_zero(pwf)) {
+               isl_pw_qpolynomial_fold_free(pwf);
                if (tight)
                        *tight = 1;
-               return pwf;
+               return isl_pw_qpolynomial_fold_zero(dim, pwf->type);
        }
 
-       if (isl_dim_is_wrapping(dim)) {
-               dim = isl_dim_unwrap(dim);
-               nvar = isl_dim_size(dim, isl_dim_out);
-               dim = isl_dim_domain(dim);
-               if (nvar == 0) {
-                       if (tight)
-                               *tight = 1;
-                       return isl_pw_qpolynomial_fold_reset_dim(pwf, dim);
-               }
-       } else
-               dim = isl_dim_drop(dim, isl_dim_set, 0, nvar);
-
        bound.pwf = isl_pw_qpolynomial_fold_zero(isl_dim_copy(dim), pwf->type);
        bound.pwf_tight = isl_pw_qpolynomial_fold_zero(isl_dim_copy(dim),
                                                        pwf->type);
index 190083b..1765919 100644 (file)
@@ -1515,6 +1515,19 @@ void test_union(isl_ctx *ctx)
        isl_union_map_free(umap2);
 }
 
+void test_bound(isl_ctx *ctx)
+{
+       const char *str;
+       isl_pw_qpolynomial *pwqp;
+       isl_pw_qpolynomial_fold *pwf;
+
+       str = "{ [[a, b, c, d] -> [e]] -> 0 }";
+       pwqp = isl_pw_qpolynomial_read_from_str(ctx, str);
+       pwf = isl_pw_qpolynomial_bound(pwqp, isl_fold_max, NULL);
+       assert(isl_pw_qpolynomial_fold_dim(pwf, isl_dim_set) == 4);
+       isl_pw_qpolynomial_fold_free(pwf);
+}
+
 int main()
 {
        struct isl_ctx *ctx;
@@ -1523,6 +1536,7 @@ int main()
        assert(srcdir);
 
        ctx = isl_ctx_alloc();
+       test_bound(ctx);
        test_union(ctx);
        test_split_periods(ctx);
        test_parse(ctx);