From e6a47861b2ef8c2b5a52b5da4975bb0de1d5ca0b Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Sat, 7 Aug 2010 13:49:46 +0200 Subject: [PATCH] isl_stream_read_obj: read reductions Signed-off-by: Sven Verdoolaege --- include/isl_stream.h | 1 + isl_input.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++---- isl_stream.c | 2 ++ 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/include/isl_stream.h b/include/isl_stream.h index c63b67e8..75a14564 100644 --- a/include/isl_stream.h +++ b/include/isl_stream.h @@ -27,6 +27,7 @@ enum isl_token_type { ISL_TOKEN_ERROR = -1, ISL_TOKEN_TO, ISL_TOKEN_AND, ISL_TOKEN_OR, ISL_TOKEN_EXISTS, ISL_TOKEN_DEF, ISL_TOKEN_INFTY, ISL_TOKEN_NAN, + ISL_TOKEN_MAX, ISL_TOKEN_STRING, ISL_TOKEN_LAST }; diff --git a/isl_input.c b/isl_input.c index 101f0a99..075ad8d2 100644 --- a/isl_input.c +++ b/isl_input.c @@ -1368,8 +1368,6 @@ static struct isl_obj obj_read_poly(struct isl_stream *s, struct isl_map *map; struct isl_set *set; - bmap = isl_basic_map_reverse(bmap); - qp = read_term(s, bmap, v); map = read_optional_disjuncts(s, bmap, v); set = isl_map_range(map); @@ -1382,6 +1380,51 @@ static struct isl_obj obj_read_poly(struct isl_stream *s, return obj; } +static struct isl_obj obj_read_poly_or_fold(struct isl_stream *s, + __isl_take isl_basic_map *bmap, struct vars *v, int n) +{ + struct isl_obj obj = { isl_obj_pw_qpolynomial_fold, NULL }; + struct isl_obj obj_p; + isl_qpolynomial *qp; + isl_qpolynomial_fold *fold = NULL; + isl_pw_qpolynomial_fold *pwf; + isl_map *map; + isl_set *set; + + if (!isl_stream_eat_if_available(s, ISL_TOKEN_MAX)) + return obj_read_poly(s, bmap, v, n); + + if (isl_stream_eat(s, '(')) + goto error; + + qp = read_term(s, bmap, v); + fold = isl_qpolynomial_fold_alloc(isl_fold_max, qp); + + while (isl_stream_eat_if_available(s, ',')) { + isl_qpolynomial_fold *fold_i; + qp = read_term(s, bmap, v); + fold_i = isl_qpolynomial_fold_alloc(isl_fold_max, qp); + fold = isl_qpolynomial_fold_fold(fold, fold_i); + } + + if (isl_stream_eat(s, ')')) + goto error; + + map = read_optional_disjuncts(s, bmap, v); + set = isl_map_range(map); + pwf = isl_pw_qpolynomial_fold_alloc(set, fold); + + vars_drop(v, v->n - n); + + obj.v = pwf; + return obj; +error: + isl_basic_map_free(bmap); + isl_qpolynomial_fold_free(fold); + obj.type = isl_obj_none; + return obj; +} + static __isl_give isl_basic_map *add_equalities(__isl_take isl_basic_map *bmap, isl_mat *eq) { @@ -1421,7 +1464,7 @@ static struct isl_obj obj_read_body(struct isl_stream *s, if (!next_is_tuple(s)) { bmap = isl_basic_map_alloc_dim(dim, 0, 0, 0); - return obj_read_poly(s, bmap, v, n); + return obj_read_poly_or_fold(s, bmap, v, n); } eq = isl_mat_alloc(s->ctx, 0, 1 + n); @@ -1436,7 +1479,8 @@ static struct isl_obj obj_read_body(struct isl_stream *s, if (!next_is_tuple(s)) { bmap = isl_basic_map_alloc_dim(dim, 0, 0, 0); bmap = add_equalities(bmap, eq); - return obj_read_poly(s, bmap, v, n); + bmap = isl_basic_map_reverse(bmap); + return obj_read_poly_or_fold(s, bmap, v, n); } dim = read_tuple(s, dim, isl_dim_out, v, &eq); if (!dim) diff --git a/isl_stream.c b/isl_stream.c index 1fbbc2e7..4d684ecb 100644 --- a/isl_stream.c +++ b/isl_stream.c @@ -219,6 +219,8 @@ static enum isl_token_type check_keywords(struct isl_stream *s) return ISL_TOKEN_INFTY; if (!strcasecmp(s->buffer, "NaN")) return ISL_TOKEN_NAN; + if (!strcasecmp(s->buffer, "max")) + return ISL_TOKEN_MAX; if (!s->keywords) return ISL_TOKEN_IDENT; -- 2.11.4.GIT