From 8a7ad80b0508ea0c954b6268cafd635daddfda75 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Mon, 1 Sep 2014 11:22:37 +0200 Subject: [PATCH] add isl_map_domain_factor_domain Signed-off-by: Sven Verdoolaege --- doc/user.pod | 2 ++ include/isl/map.h | 1 + isl_map.c | 23 +++++++++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index ad85af7d..f3ffbe64 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -5508,6 +5508,8 @@ The arguments of a call to C can be extracted from the result using the following functions. #include + __isl_give isl_map *isl_map_domain_factor_domain( + __isl_take isl_map *map); __isl_give isl_map *isl_map_domain_factor_range( __isl_take isl_map *map); __isl_give isl_map *isl_map_range_factor_domain( diff --git a/include/isl/map.h b/include/isl/map.h index d04abc36..5eebc329 100644 --- a/include/isl/map.h +++ b/include/isl/map.h @@ -390,6 +390,7 @@ __isl_give isl_map *isl_map_flat_range_product(__isl_take isl_map *map1, __isl_take isl_map *map2); int isl_map_domain_is_wrapping(__isl_keep isl_map *map); int isl_map_range_is_wrapping(__isl_keep isl_map *map); +__isl_give isl_map *isl_map_domain_factor_domain(__isl_take isl_map *map); __isl_give isl_map *isl_map_domain_factor_range(__isl_take isl_map *map); __isl_give isl_map *isl_map_range_factor_domain(__isl_take isl_map *map); __isl_give isl_map *isl_map_range_factor_range(__isl_take isl_map *map); diff --git a/isl_map.c b/isl_map.c index ccdd555a..6db6614d 100644 --- a/isl_map.c +++ b/isl_map.c @@ -9730,6 +9730,29 @@ __isl_give isl_map *isl_map_range_product(__isl_take isl_map *map1, &map_range_product_aligned); } +/* Given a map of the form [A -> B] -> C, return the map A -> C. + */ +__isl_give isl_map *isl_map_domain_factor_domain(__isl_take isl_map *map) +{ + isl_space *space; + int total, keep; + + if (!map) + return NULL; + if (!isl_space_domain_is_wrapping(map->dim)) + isl_die(isl_map_get_ctx(map), isl_error_invalid, + "domain is not a product", return isl_map_free(map)); + + space = isl_map_get_space(map); + total = isl_space_dim(space, isl_dim_in); + space = isl_space_domain_factor_domain(space); + keep = isl_space_dim(space, isl_dim_in); + map = isl_map_project_out(map, isl_dim_in, keep, total - keep); + map = isl_map_reset_space(map, space); + + return map; +} + /* Given a map of the form [A -> B] -> C, return the map B -> C. */ __isl_give isl_map *isl_map_domain_factor_range(__isl_take isl_map *map) -- 2.11.4.GIT