From aaf2a66b5454cec0ec11b34e12aa10200f5a1adb Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Wed, 2 Nov 2011 11:28:38 +0100 Subject: [PATCH] add union_pw_*_intersect_params Signed-off-by: Sven Verdoolaege --- doc/user.pod | 8 ++++++ include/isl/polynomial.h | 7 +++++ isl_union_templ.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index 2044701d..26ac1cfa 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -3516,6 +3516,10 @@ obviously equal, use __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_intersect_domain( __isl_take isl_union_pw_qpolynomial *upwpq, __isl_take isl_union_set *uset); + __isl_give isl_union_pw_qpolynomial * + isl_union_pw_qpolynomial_intersect_params( + __isl_take isl_union_pw_qpolynomial *upwpq, + __isl_take isl_set *set); __isl_give isl_qpolynomial *isl_qpolynomial_align_params( __isl_take isl_qpolynomial *qp, @@ -3706,6 +3710,10 @@ obviously equal, use __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_intersect_domain( __isl_take isl_union_pw_qpolynomial_fold *upwf, __isl_take isl_union_set *uset); + __isl_give isl_union_pw_qpolynomial_fold * + isl_union_pw_qpolynomial_fold_intersect_params( + __isl_take isl_union_pw_qpolynomial_fold *upwf, + __isl_take isl_set *set); __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_project_domain_on_params( __isl_take isl_pw_qpolynomial_fold *pwf); diff --git a/include/isl/polynomial.h b/include/isl/polynomial.h index 96c435b9..29038751 100644 --- a/include/isl/polynomial.h +++ b/include/isl/polynomial.h @@ -457,6 +457,9 @@ __isl_give isl_union_set *isl_union_pw_qpolynomial_domain( __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_intersect_domain( __isl_take isl_union_pw_qpolynomial *upwpq, __isl_take isl_union_set *uset); +__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_intersect_params( + __isl_take isl_union_pw_qpolynomial *upwpq, + __isl_take isl_set *set); __isl_give isl_space *isl_union_pw_qpolynomial_get_space( __isl_keep isl_union_pw_qpolynomial *upwqp); @@ -515,6 +518,10 @@ __isl_give isl_union_set *isl_union_pw_qpolynomial_fold_domain( __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_intersect_domain( __isl_take isl_union_pw_qpolynomial_fold *upwf, __isl_take isl_union_set *uset); +__isl_give isl_union_pw_qpolynomial_fold * +isl_union_pw_qpolynomial_fold_intersect_params( + __isl_take isl_union_pw_qpolynomial_fold *upwf, + __isl_take isl_set *set); enum isl_fold isl_union_pw_qpolynomial_fold_get_type( __isl_keep isl_union_pw_qpolynomial_fold *upwf); diff --git a/isl_union_templ.c b/isl_union_templ.c index eb33acc7..93d004db 100644 --- a/isl_union_templ.c +++ b/isl_union_templ.c @@ -415,6 +415,78 @@ error: return NULL; } +S(UNION,any_set_data) { + isl_set *set; + UNION *res; + __isl_give PW *(*fn)(__isl_take PW*, __isl_take isl_set*); +}; + +static int any_set_entry(void **entry, void *user) +{ + S(UNION,any_set_data) *data = user; + PW *pw = *entry; + int empty; + + pw = FN(PW,copy)(pw); + pw = data->fn(pw, isl_set_copy(data->set)); + + empty = FN(PW,is_zero)(pw); + if (empty < 0) { + FN(PW,free)(pw); + return -1; + } + if (empty) { + FN(PW,free)(pw); + return 0; + } + + data->res = FN(FN(UNION,add),PARTS)(data->res, pw); + + return 0; +} + +/* Update each element of "u" by calling "fn" on the element and "set". + */ +static __isl_give UNION *any_set_op(__isl_take UNION *u, + __isl_take isl_set *set, + __isl_give PW *(*fn)(__isl_take PW*, __isl_take isl_set*)) +{ + S(UNION,any_set_data) data = { NULL, NULL, fn }; + + u = FN(UNION,align_params)(u, isl_set_get_space(set)); + set = isl_set_align_params(set, FN(UNION,get_space)(u)); + + if (!u || !set) + goto error; + + data.set = set; +#ifdef HAS_TYPE + data.res = FN(UNION,alloc)(isl_space_copy(u->dim), u->type, u->table.n); +#else + data.res = FN(UNION,alloc)(isl_space_copy(u->dim), u->table.n); +#endif + if (isl_hash_table_foreach(u->dim->ctx, &u->table, + &any_set_entry, &data) < 0) + goto error; + + FN(UNION,free)(u); + isl_set_free(set); + return data.res; +error: + FN(UNION,free)(u); + isl_set_free(set); + FN(UNION,free)(data.res); + return NULL; +} + +/* Intersect the domain of "u" with the parameter domain "context". + */ +__isl_give UNION *FN(UNION,intersect_params)(__isl_take UNION *u, + __isl_take isl_set *set) +{ + return any_set_op(u, set, &FN(PW,intersect_params)); +} + S(UNION,match_set_data) { isl_union_set *uset; UNION *res; -- 2.11.4.GIT