From fad5f1206282e12558c7755f9214ddcced7e7ee5 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Thu, 8 Aug 2013 14:41:23 +0200 Subject: [PATCH] add isl_map_range_factor_{domain,range} Signed-off-by: Sven Verdoolaege --- doc/user.pod | 8 ++++++++ include/isl/map.h | 2 ++ isl_map.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index b300a6d2..d4425377 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -3074,6 +3074,14 @@ instead. __isl_take isl_map *map1, __isl_take isl_map *map2); +The arguments of a call to C can be extracted +from the result using the following two functions. + + __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); + =item * Simplification __isl_give isl_basic_set *isl_basic_set_gist( diff --git a/include/isl/map.h b/include/isl/map.h index 6d37157f..265169c7 100644 --- a/include/isl/map.h +++ b/include/isl/map.h @@ -378,6 +378,8 @@ __isl_give isl_map *isl_map_flat_domain_product(__isl_take isl_map *map1, __isl_give isl_map *isl_map_flat_range_product(__isl_take isl_map *map1, __isl_take isl_map *map2); int isl_map_range_is_wrapping(__isl_keep 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); __isl_export __isl_give isl_map *isl_map_intersect(__isl_take isl_map *map1, __isl_take isl_map *map2); diff --git a/isl_map.c b/isl_map.c index c708cba3..6bebe6d4 100644 --- a/isl_map.c +++ b/isl_map.c @@ -9322,6 +9322,52 @@ __isl_give isl_map *isl_map_range_product(__isl_take isl_map *map1, &map_range_product_aligned); } +/* Given a map A -> [B -> C], extract the map A -> B. + */ +__isl_give isl_map *isl_map_range_factor_domain(__isl_take isl_map *map) +{ + isl_space *space; + int total, keep; + + if (!map) + return NULL; + if (!isl_space_range_is_wrapping(map->dim)) + isl_die(isl_map_get_ctx(map), isl_error_invalid, + "range is not a product", return isl_map_free(map)); + + space = isl_map_get_space(map); + total = isl_space_dim(space, isl_dim_out); + space = isl_space_range_factor_domain(space); + keep = isl_space_dim(space, isl_dim_out); + map = isl_map_project_out(map, isl_dim_out, keep, total - keep); + map = isl_map_reset_space(map, space); + + return map; +} + +/* Given a map A -> [B -> C], extract the map A -> C. + */ +__isl_give isl_map *isl_map_range_factor_range(__isl_take isl_map *map) +{ + isl_space *space; + int total, keep; + + if (!map) + return NULL; + if (!isl_space_range_is_wrapping(map->dim)) + isl_die(isl_map_get_ctx(map), isl_error_invalid, + "range is not a product", return isl_map_free(map)); + + space = isl_map_get_space(map); + total = isl_space_dim(space, isl_dim_out); + space = isl_space_range_factor_range(space); + keep = isl_space_dim(space, isl_dim_out); + map = isl_map_project_out(map, isl_dim_out, 0, total - keep); + map = isl_map_reset_space(map, space); + + return map; +} + /* Given two maps A -> B and C -> D, construct a map (A, C) -> (B * D) */ __isl_give isl_map *isl_map_flat_domain_product(__isl_take isl_map *map1, -- 2.11.4.GIT