From e01cedf8eb2a55f31d3f48dc8a2775f4ad65189a Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Wed, 29 Jun 2011 15:16:22 +0200 Subject: [PATCH] add isl_pw_aff_ge_set Signed-off-by: Sven Verdoolaege --- doc/user.pod | 6 ++++++ include/isl/aff.h | 3 +++ isl_aff.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 68 insertions(+), 4 deletions(-) diff --git a/doc/user.pod b/doc/user.pod index aa758bdd..0d2eae88 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -2354,10 +2354,16 @@ Operations include __isl_give isl_basic_set *isl_aff_ge_basic_set( __isl_take isl_aff *aff1, __isl_take isl_aff *aff2); + __isl_give isl_set *isl_pw_aff_ge_set( + __isl_take isl_pw_aff *pwaff1, + __isl_take isl_pw_aff *pwaff2); The function C returns a basic set containing those elements in the shared space of C and C where C is greater than or equal to C. +The function C returns a set +containing those elements in the shared domain +of C and C where C is greater than or equal to C. #include __isl_give isl_pw_aff *isl_pw_aff_max( diff --git a/include/isl/aff.h b/include/isl/aff.h index ae0f7dfa..55c44c7f 100644 --- a/include/isl/aff.h +++ b/include/isl/aff.h @@ -126,6 +126,9 @@ __isl_give isl_pw_aff *isl_pw_aff_gist(__isl_take isl_pw_aff *pwaff, __isl_give isl_map *isl_map_from_pw_aff(__isl_take isl_pw_aff *pwaff); +__isl_give isl_set *isl_pw_aff_ge_set(__isl_take isl_pw_aff *pwaff1, + __isl_take isl_pw_aff *pwaff2); + __isl_give isl_printer *isl_printer_print_pw_aff(__isl_take isl_printer *p, __isl_keep isl_pw_aff *pwaff); void isl_pw_aff_dump(__isl_keep isl_pw_aff *pwaff); diff --git a/isl_aff.c b/isl_aff.c index b030a24f..ed66c74c 100644 --- a/isl_aff.c +++ b/isl_aff.c @@ -724,18 +724,27 @@ error: return NULL; } +/* Return a basic set containing those elements in the space + * of aff where it is non-negative. + */ +__isl_give isl_basic_set *isl_aff_nonneg_basic_set(__isl_take isl_aff *aff) +{ + isl_constraint *ineq; + + ineq = isl_inequality_from_aff(aff); + + return isl_basic_set_from_constraint(ineq); +} + /* Return a basic set containing those elements in the shared space * of aff1 and aff2 where aff1 is greater than or equal to aff2. */ __isl_give isl_basic_set *isl_aff_ge_basic_set(__isl_take isl_aff *aff1, __isl_take isl_aff *aff2) { - isl_constraint *ineq; - aff1 = isl_aff_sub(aff1, aff2); - ineq = isl_inequality_from_aff(aff1); - return isl_basic_set_from_constraint(ineq); + return isl_aff_nonneg_basic_set(aff1); } __isl_give isl_aff *isl_aff_add_on_domain(__isl_keep isl_set *dom, @@ -1042,3 +1051,49 @@ __isl_give isl_map *isl_map_from_pw_aff(__isl_take isl_pw_aff *pwaff) return map; } + +/* Return a set containing those elements in the domain + * of pwaff where it is non-negative. + */ +__isl_give isl_set *isl_pw_aff_nonneg_set(__isl_take isl_pw_aff *pwaff) +{ + int i; + isl_set *set; + + if (!pwaff) + return NULL; + + set = isl_set_empty(isl_pw_aff_get_dim(pwaff)); + + for (i = 0; i < pwaff->n; ++i) { + isl_basic_set *bset; + isl_set *set_i; + + bset = isl_aff_nonneg_basic_set(isl_aff_copy(pwaff->p[i].aff)); + set_i = isl_set_from_basic_set(bset); + set_i = isl_set_intersect(set_i, isl_set_copy(pwaff->p[i].set)); + set = isl_set_union_disjoint(set, set_i); + } + + isl_pw_aff_free(pwaff); + + return set; +} + +/* Return a set containing those elements in the shared domain + * of pwaff1 and pwaff2 where pwaff1 is greater than or equal to pwaff2. + */ +__isl_give isl_set *isl_pw_aff_ge_set(__isl_take isl_pw_aff *pwaff1, + __isl_take isl_pw_aff *pwaff2) +{ + isl_set *set1, *set2; + + set1 = isl_pw_aff_domain(isl_pw_aff_copy(pwaff1)); + set2 = isl_pw_aff_domain(isl_pw_aff_copy(pwaff2)); + set1 = isl_set_intersect(set1, set2); + pwaff1 = isl_pw_aff_intersect_domain(pwaff1, isl_set_copy(set1)); + pwaff2 = isl_pw_aff_intersect_domain(pwaff2, set1); + pwaff1 = isl_pw_aff_add(pwaff1, isl_pw_aff_neg(pwaff2)); + + return isl_pw_aff_nonneg_set(pwaff1); +} -- 2.11.4.GIT