From aef7523d666a761cba64cd7285929b6c0a1c90e0 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Tue, 6 May 2014 15:33:06 +0200 Subject: [PATCH] add isl_union_pw_*_subtract_domain Signed-off-by: Sven Verdoolaege --- doc/user.pod | 12 ++++++++++ include/isl/aff.h | 3 +++ include/isl/polynomial.h | 7 ++++++ isl_test.c | 19 ++++++++++++++++ isl_union_templ.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 98 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index 9abfb64b..acdd8f47 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -5077,6 +5077,10 @@ at least one element and all elements need to live in the same space. isl_pw_multi_aff_subtract_domain( __isl_take isl_pw_multi_aff *pma, __isl_take isl_set *set); + __isl_give isl_union_pw_multi_aff * + isl_union_pw_multi_aff_subtract_domain( + __isl_take isl_union_pw_multi_aff *upma, + __isl_take isl_union_set *uset); #include __isl_give isl_pw_qpolynomial * @@ -5087,6 +5091,14 @@ at least one element and all elements need to live in the same space. isl_pw_qpolynomial_fold_subtract_domain( __isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_set *set); + __isl_give isl_union_pw_qpolynomial * + isl_union_pw_qpolynomial_subtract_domain( + __isl_take isl_union_pw_qpolynomial *upwpq, + __isl_take isl_union_set *uset); + __isl_give isl_union_pw_qpolynomial_fold * + isl_union_pw_qpolynomial_fold_subtract_domain( + __isl_take isl_union_pw_qpolynomial_fold *upwf, + __isl_take isl_union_set *uset); =item * Application diff --git a/include/isl/aff.h b/include/isl/aff.h index 651dd77d..b76125bc 100644 --- a/include/isl/aff.h +++ b/include/isl/aff.h @@ -593,6 +593,9 @@ __isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_intersect_params( __isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_intersect_domain( __isl_take isl_union_pw_multi_aff *upma, __isl_take isl_union_set *uset); +__isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_subtract_domain( + __isl_take isl_union_pw_multi_aff *upma, + __isl_take isl_union_set *uset); __isl_give isl_union_map *isl_union_map_from_union_pw_multi_aff( __isl_take isl_union_pw_multi_aff *upma); diff --git a/include/isl/polynomial.h b/include/isl/polynomial.h index ea88cfa1..62f080bd 100644 --- a/include/isl/polynomial.h +++ b/include/isl/polynomial.h @@ -490,6 +490,9 @@ __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_intersect_domain( __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_union_pw_qpolynomial *isl_union_pw_qpolynomial_subtract_domain( + __isl_take isl_union_pw_qpolynomial *upwpq, + __isl_take isl_union_set *uset); __isl_give isl_space *isl_union_pw_qpolynomial_get_space( __isl_keep isl_union_pw_qpolynomial *upwqp); @@ -566,6 +569,10 @@ __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_union_pw_qpolynomial_fold * +isl_union_pw_qpolynomial_fold_subtract_domain( + __isl_take isl_union_pw_qpolynomial_fold *upwf, + __isl_take isl_union_set *uset); enum isl_fold isl_union_pw_qpolynomial_fold_get_type( __isl_keep isl_union_pw_qpolynomial_fold *upwf); diff --git a/isl_test.c b/isl_test.c index cb9075ad..5e919784 100644 --- a/isl_test.c +++ b/isl_test.c @@ -2461,6 +2461,7 @@ static int test_subtract(isl_ctx *ctx) { int i; isl_union_map *umap1, *umap2; + isl_union_pw_multi_aff *upma1, *upma2; isl_union_set *uset; int equal; @@ -2482,6 +2483,24 @@ static int test_subtract(isl_ctx *ctx) "incorrect subtract domain result", return -1); } + for (i = 0; i < ARRAY_SIZE(subtract_domain_tests); ++i) { + upma1 = isl_union_pw_multi_aff_read_from_str(ctx, + subtract_domain_tests[i].minuend); + uset = isl_union_set_read_from_str(ctx, + subtract_domain_tests[i].subtrahend); + upma2 = isl_union_pw_multi_aff_read_from_str(ctx, + subtract_domain_tests[i].difference); + upma1 = isl_union_pw_multi_aff_subtract_domain(upma1, uset); + equal = isl_union_pw_multi_aff_plain_is_equal(upma1, upma2); + isl_union_pw_multi_aff_free(upma1); + isl_union_pw_multi_aff_free(upma2); + if (equal < 0) + return -1; + if (!equal) + isl_die(ctx, isl_error_unknown, + "incorrect subtract domain result", return -1); + } + return 0; } diff --git a/isl_union_templ.c b/isl_union_templ.c index 4cd1d9dd..ed7404e7 100644 --- a/isl_union_templ.c +++ b/isl_union_templ.c @@ -784,6 +784,63 @@ __isl_give UNION *FN(UNION,intersect_domain)(__isl_take UNION *u, return match_domain_op(u, uset, &FN(PW,intersect_domain)); } +/* Internal data structure for isl_union_*_subtract_domain. + * uset is the set that needs to be removed from the domain. + * res collects the results. + */ +S(UNION,subtract_domain_data) { + isl_union_set *uset; + UNION *res; +}; + +/* Take the set (which may be empty) in data->uset that lives + * in the same space as the domain of "pw", subtract it from the domain + * of "pw" and add the result to data->res. + */ +static int FN(UNION,subtract_domain_entry)(__isl_take PW *pw, void *user) +{ + S(UNION,subtract_domain_data) *data = user; + isl_space *space; + isl_set *set; + + space = FN(PW,get_domain_space)(pw); + set = isl_union_set_extract_set(data->uset, space); + pw = FN(PW,subtract_domain)(pw, set); + data->res = FN(FN(UNION,add),PARTS)(data->res, pw); + + return 0; +} + +/* Subtract "uset' from the domain of "u". + */ +__isl_give UNION *FN(UNION,subtract_domain)(__isl_take UNION *u, + __isl_take isl_union_set *uset) +{ + S(UNION,subtract_domain_data) data; + + if (!u || !uset) + goto error; + + data.uset = uset; +#ifdef HAS_TYPE + data.res = FN(UNION,alloc)(isl_space_copy(u->space), u->type, + u->table.n); +#else + data.res = FN(UNION,alloc)(isl_space_copy(u->space), u->table.n); +#endif + if (FN(FN(UNION,foreach),PARTS)(u, + &FN(UNION,subtract_domain_entry), &data) < 0) + data.res = FN(UNION,free)(data.res); + + FN(UNION,free)(u); + isl_union_set_free(uset); + return data.res; +error: + FN(UNION,free)(u); + isl_union_set_free(uset); + return NULL; +} + __isl_give UNION *FN(UNION,gist)(__isl_take UNION *u, __isl_take isl_union_set *uset) { -- 2.11.4.GIT