From 310f7d031f4dd9f497dfb24fcfb50e90de1634f4 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Thu, 10 Nov 2011 14:57:41 +0100 Subject: [PATCH] add isl_map_subtract_range Signed-off-by: Sven Verdoolaege --- doc/user.pod | 3 +++ include/isl/map.h | 2 ++ isl_map_private.h | 2 ++ isl_map_subtract.c | 26 ++++++++++++++++++++++++++ 4 files changed, 33 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index 9fccccfb..ca66e193 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -2290,6 +2290,9 @@ the same (number of) parameters. __isl_give isl_map *isl_map_subtract_domain( __isl_take isl_map *map, __isl_take isl_set *dom); + __isl_give isl_map *isl_map_subtract_range( + __isl_take isl_map *map, + __isl_take isl_set *dom); __isl_give isl_union_set *isl_union_set_subtract( __isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2); diff --git a/include/isl/map.h b/include/isl/map.h index 2e11ae4c..7f18dc63 100644 --- a/include/isl/map.h +++ b/include/isl/map.h @@ -360,6 +360,8 @@ __isl_give isl_map *isl_map_subtract( __isl_take isl_map *map2); __isl_give isl_map *isl_map_subtract_domain(__isl_take isl_map *map, __isl_take isl_set *dom); +__isl_give isl_map *isl_map_subtract_range(__isl_take isl_map *map, + __isl_take isl_set *dom); struct isl_map *isl_map_fix_input_si(struct isl_map *map, unsigned input, int value); __isl_give isl_map *isl_map_fix_si(__isl_take isl_map *map, diff --git a/isl_map_private.h b/isl_map_private.h index 6bfac801..f3c6cd29 100644 --- a/isl_map_private.h +++ b/isl_map_private.h @@ -336,4 +336,6 @@ __isl_give isl_set *isl_set_substitute(__isl_take isl_set *set, __isl_give isl_set *isl_set_gist_params_basic_set(__isl_take isl_set *set, __isl_take isl_basic_set *context); +int isl_map_compatible_range(__isl_keep isl_map *map, __isl_keep isl_set *set); + #endif diff --git a/isl_map_subtract.c b/isl_map_subtract.c index 8b4c881c..1fd40868 100644 --- a/isl_map_subtract.c +++ b/isl_map_subtract.c @@ -562,6 +562,32 @@ __isl_give isl_map *isl_map_subtract_domain(__isl_take isl_map *map, return isl_map_align_params_map_map_and(map, dom, &map_subtract_domain); } +/* Remove the elements of "dom" from the range of "map". + */ +static __isl_give isl_map *map_subtract_range(__isl_take isl_map *map, + __isl_take isl_set *dom) +{ + isl_map *ext_dom; + + if (!isl_map_compatible_range(map, dom)) + isl_die(isl_set_get_ctx(dom), isl_error_invalid, + "incompatible spaces", goto error); + + ext_dom = isl_map_universe(isl_map_get_space(map)); + ext_dom = isl_map_intersect_range(ext_dom, dom); + return isl_map_subtract(map, ext_dom); +error: + isl_map_free(map); + isl_set_free(dom); + return NULL; +} + +__isl_give isl_map *isl_map_subtract_range(__isl_take isl_map *map, + __isl_take isl_set *dom) +{ + return isl_map_align_params_map_map_and(map, dom, &map_subtract_range); +} + /* A diff collector that aborts as soon as its add function is called, * setting empty to 0. */ -- 2.11.4.GIT