isl_stream_read_pw_qpolynomial: read nested divs
authorSven Verdoolaege <skimo@kotnet.org>
Thu, 4 Nov 2010 16:40:42 +0000 (17:40 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Thu, 4 Nov 2010 21:21:04 +0000 (22:21 +0100)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
isl_input.c
isl_test.c

index 6da79e6..84cde79 100644 (file)
@@ -376,8 +376,9 @@ static __isl_give isl_basic_map *add_divs(__isl_take isl_basic_map *bmap,
        for (i = 0, var = v->v; i < extra; ++i, var = var->next) {
                int k = bmap->n_div - 1 - i;
 
-               isl_seq_cpy(bmap->div[k], var->def->el, 2 + var->pos);
-               isl_seq_clr(bmap->div[k] + 2 + var->pos, v->n - var->pos);
+               isl_seq_cpy(bmap->div[k], var->def->el, var->def->size);
+               isl_seq_clr(bmap->div[k] + var->def->size,
+                           2 + v->n - var->def->size);
 
                if (isl_basic_map_add_div_constraints(bmap, k) < 0)
                        goto error;
@@ -1290,26 +1291,25 @@ static int optional_power(struct isl_stream *s)
 }
 
 static __isl_give isl_div *read_div(struct isl_stream *s,
-       __isl_keep isl_basic_map *bmap, struct vars *v)
+       __isl_take isl_dim *dim, struct vars *v)
 {
-       unsigned total = isl_basic_map_total_dim(bmap);
-       int k;
-
-       bmap = isl_basic_map_copy(bmap);
-       bmap = isl_basic_map_cow(bmap);
-       bmap = isl_basic_map_extend_dim(bmap, isl_dim_copy(bmap->dim),
-                                       1, 0, 2);
+       int n;
+       isl_basic_map *bmap;
 
-       if ((k = isl_basic_map_alloc_div(bmap)) < 0)
-               goto error;
-       isl_seq_clr(bmap->div[k], 1 + 1 + total);
+       n = v->n;
+       bmap = isl_basic_map_universe(dim);
 
        if (vars_add_anon(v) < 0)
                goto error;
-       bmap = add_div_definition(s, v, bmap, k);
-       vars_drop(v, 1);
+       if (read_div_definition(s, v) < 0)
+               goto error;
+       bmap = add_divs(bmap, v);
+       bmap = isl_basic_map_order_divs(bmap);
+       if (!bmap)
+               goto error;
+       vars_drop(v, v->n - n);
 
-       return isl_basic_map_div(bmap, k);
+       return isl_basic_map_div(bmap, bmap->n_div - 1);
 error:
        isl_basic_map_free(bmap);
        return NULL;
@@ -1384,7 +1384,7 @@ static __isl_give isl_qpolynomial *read_factor(struct isl_stream *s,
                int pow;
 
                isl_stream_push_token(s, tok);
-               div = read_div(s, bmap, v);
+               div = read_div(s, isl_basic_map_get_dim(bmap), v);
                pow = optional_power(s);
                qp = isl_qpolynomial_div_pow(div, pow);
        } else if (tok->type == '-') {
index c2f0285..9c73ab4 100644 (file)
@@ -28,6 +28,15 @@ void test_parse_map(isl_ctx *ctx, const char *str)
        isl_map_free(map);
 }
 
+void test_parse_pwqp(isl_ctx *ctx, const char *str)
+{
+       isl_pw_qpolynomial *pwqp;
+
+       pwqp = isl_pw_qpolynomial_read_from_str(ctx, str);
+       assert(pwqp);
+       isl_pw_qpolynomial_free(pwqp);
+}
+
 void test_parse(struct isl_ctx *ctx)
 {
        isl_map *map, *map2;
@@ -55,6 +64,8 @@ void test_parse(struct isl_ctx *ctx)
        assert(isl_map_is_equal(map, map2));
        isl_map_free(map);
        isl_map_free(map2);
+
+       test_parse_pwqp(ctx, "{ [i] -> i + [ (i + [i/3])/2 ] }");
 }
 
 void test_read(struct isl_ctx *ctx)