From cbf53bd372b72d54d28f5595cb1bd1cac57d90d1 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Mon, 9 Jun 2014 13:06:54 +0200 Subject: [PATCH] add isl_map_factor_range Signed-off-by: Sven Verdoolaege --- doc/user.pod | 2 ++ include/isl/map.h | 1 + isl_map.c | 27 +++++++++++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index dea9cfc2..00c35a75 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -5512,6 +5512,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_factor_range( + __isl_take 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( diff --git a/include/isl/map.h b/include/isl/map.h index 5eebc329..8dcd0f78 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_factor_range(__isl_take 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); diff --git a/isl_map.c b/isl_map.c index 6db6614d..82f3335c 100644 --- a/isl_map.c +++ b/isl_map.c @@ -9730,6 +9730,33 @@ __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 -> D], return the map B -> D. + */ +__isl_give isl_map *isl_map_factor_range(__isl_take isl_map *map) +{ + isl_space *space; + int total1, keep1, total2, keep2; + + if (!map) + return NULL; + if (!isl_space_domain_is_wrapping(map->dim) || + !isl_space_range_is_wrapping(map->dim)) + isl_die(isl_map_get_ctx(map), isl_error_invalid, + "not a product", return isl_map_free(map)); + + space = isl_map_get_space(map); + total1 = isl_space_dim(space, isl_dim_in); + total2 = isl_space_dim(space, isl_dim_out); + space = isl_space_factor_range(space); + keep1 = isl_space_dim(space, isl_dim_in); + keep2 = isl_space_dim(space, isl_dim_out); + map = isl_map_project_out(map, isl_dim_in, 0, total1 - keep1); + map = isl_map_project_out(map, isl_dim_out, 0, total2 - keep2); + map = isl_map_reset_space(map, space); + + return map; +} + /* 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) -- 2.11.4.GIT