From 8a3a75e90b68df76b137d2ee264e0f3cfcb0df3b Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Thu, 4 Nov 2010 17:40:42 +0100 Subject: [PATCH] isl_stream_read_pw_qpolynomial: read nested divs Signed-off-by: Sven Verdoolaege --- isl_input.c | 34 +++++++++++++++++----------------- isl_test.c | 11 +++++++++++ 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/isl_input.c b/isl_input.c index 6da79e68..84cde79c 100644 --- a/isl_input.c +++ b/isl_input.c @@ -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 == '-') { diff --git a/isl_test.c b/isl_test.c index c2f0285b..9c73ab44 100644 --- a/isl_test.c +++ b/isl_test.c @@ -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) -- 2.11.4.GIT