From b23d33327513dd152232b401e4d92820a986bfb1 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Thu, 12 May 2011 13:03:10 +0200 Subject: [PATCH] add isl_basic_set_expand_divs Signed-off-by: Sven Verdoolaege --- isl_map.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ isl_map_private.h | 2 ++ 2 files changed, 50 insertions(+) diff --git a/isl_map.c b/isl_map.c index d64f2311..b648cec6 100644 --- a/isl_map.c +++ b/isl_map.c @@ -6330,6 +6330,54 @@ error: return NULL; } +/* Apply the expansion computed by isl_merge_divs. + * The expansion itself is given by "exp" while the resulting + * list of divs is given by "div". + */ +__isl_give isl_basic_set *isl_basic_set_expand_divs( + __isl_take isl_basic_set *bset, __isl_take isl_mat *div, int *exp) +{ + int i, j; + int n_div; + + bset = isl_basic_set_cow(bset); + if (!bset || !div) + goto error; + + if (div->n_row < bset->n_div) + isl_die(isl_mat_get_ctx(div), isl_error_invalid, + "not an expansion", goto error); + + bset = isl_basic_map_extend_dim(bset, isl_dim_copy(bset->dim), + div->n_row - bset->n_div, 0, + 2 * (div->n_row - bset->n_div)); + + n_div = bset->n_div; + for (i = n_div; i < div->n_row; ++i) + if (isl_basic_set_alloc_div(bset) < 0) + goto error; + + j = n_div - 1; + for (i = div->n_row - 1; i >= 0; --i) { + if (j >= 0 && exp[j] == i) { + if (i != j) + isl_basic_map_swap_div(bset, i, j); + j--; + } else { + isl_seq_cpy(bset->div[i], div->row[i], div->n_col); + if (isl_basic_map_add_div_constraints(bset, i) < 0) + goto error; + } + } + + isl_mat_free(div); + return bset; +error: + isl_basic_set_free(bset); + isl_mat_free(div); + return NULL; +} + /* Look for a div in dst that corresponds to the div "div" in src. * The divs before "div" in src and dst are assumed to be the same. * diff --git a/isl_map_private.h b/isl_map_private.h index a2d90899..0ced8c60 100644 --- a/isl_map_private.h +++ b/isl_map_private.h @@ -297,5 +297,7 @@ __isl_give isl_basic_set *isl_basic_set_from_local_space( __isl_take isl_local_space *ls); __isl_give isl_basic_map *isl_basic_map_from_local_space( __isl_take isl_local_space *ls); +__isl_give isl_basic_set *isl_basic_set_expand_divs( + __isl_take isl_basic_set *bset, __isl_take isl_mat *div, int *exp); #endif -- 2.11.4.GIT