From 852fc8ee2beeb2ab368187a17302bf5ffdd1547a Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Fri, 16 Sep 2016 16:39:42 +0200 Subject: [PATCH] isl_qpolynomial_eval: extract out isl_local_extend_point_vec This function will also be useful for evaluating affine expressions in a point. The extracted function has some extra checks because it may end up getting used in a different context. Signed-off-by: Sven Verdoolaege --- isl_local.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ isl_local.h | 3 +++ isl_polynomial.c | 16 +--------------- 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/isl_local.c b/isl_local.c index f14d91a6..b28a2154 100644 --- a/isl_local.c +++ b/isl_local.c @@ -10,6 +10,7 @@ * and Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France */ +#include #include #include #include @@ -182,3 +183,48 @@ int isl_local_cmp(__isl_keep isl_local *local1, __isl_keep isl_local *local2) return 0; } + +/* Extend a vector "v" representing an integer point + * in the domain space of "local" + * to one that also includes values for the local variables. + * All local variables are required to have an explicit representation. + */ +__isl_give isl_vec *isl_local_extend_point_vec(__isl_keep isl_local *local, + __isl_take isl_vec *v) +{ + unsigned n_div; + isl_bool known; + isl_mat *mat = local; + + if (!local || !v) + return isl_vec_free(v); + known = isl_local_divs_known(local); + if (known < 0) + return isl_vec_free(v); + if (!known) + isl_die(isl_local_get_ctx(local), isl_error_invalid, + "unknown local variables", return isl_vec_free(v)); + if (isl_vec_size(v) != 1 + isl_local_dim(local, isl_dim_set)) + isl_die(isl_local_get_ctx(local), isl_error_invalid, + "incorrect size", return isl_vec_free(v)); + if (!isl_int_is_one(v->el[0])) + isl_die(isl_local_get_ctx(local), isl_error_invalid, + "expecting integer point", return isl_vec_free(v)); + n_div = isl_local_dim(local, isl_dim_div); + if (n_div != 0) { + int i; + unsigned dim = isl_local_dim(local, isl_dim_set); + v = isl_vec_add_els(v, n_div); + if (!v) + return NULL; + + for (i = 0; i < n_div; ++i) { + isl_seq_inner_product(mat->row[i] + 1, v->el, + 1 + dim + i, &v->el[1+dim+i]); + isl_int_fdiv_q(v->el[1+dim+i], v->el[1+dim+i], + mat->row[i][0]); + } + } + + return v; +} diff --git a/isl_local.h b/isl_local.h index 71ade89c..80720a5a 100644 --- a/isl_local.h +++ b/isl_local.h @@ -11,4 +11,7 @@ isl_bool isl_local_divs_known(__isl_keep isl_local *local); int isl_local_cmp(__isl_keep isl_local *local1, __isl_keep isl_local *local2); +__isl_give isl_vec *isl_local_extend_point_vec(__isl_keep isl_local *local, + __isl_take isl_vec *v); + #endif diff --git a/isl_polynomial.c b/isl_polynomial.c index 64c02d21..2c5a5f5f 100644 --- a/isl_polynomial.c +++ b/isl_polynomial.c @@ -3129,21 +3129,7 @@ __isl_give isl_val *isl_qpolynomial_eval(__isl_take isl_qpolynomial *qp, if (is_void) return eval_void(qp, pnt); - ext = isl_vec_copy(pnt->vec); - if (qp->div->n_row != 0) { - int i; - unsigned dim = isl_space_dim(qp->dim, isl_dim_all); - ext = isl_vec_add_els(ext, qp->div->n_row); - if (!ext) - goto error; - - for (i = 0; i < qp->div->n_row; ++i) { - isl_seq_inner_product(qp->div->row[i] + 1, ext->el, - 1 + dim + i, &ext->el[1+dim+i]); - isl_int_fdiv_q(ext->el[1+dim+i], ext->el[1+dim+i], - qp->div->row[i][0]); - } - } + ext = isl_local_extend_point_vec(qp->div, isl_vec_copy(pnt->vec)); v = isl_upoly_eval(isl_upoly_copy(qp->upoly), ext); -- 2.11.4.GIT