From 1a228e25dc9731b98b79193b4c1448ad54450a54 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Fri, 3 Jun 2011 23:03:36 +0200 Subject: [PATCH] add isl_union_map_flat_range_product Signed-off-by: Sven Verdoolaege --- doc/user.pod | 8 ++++++ include/isl/map.h | 3 +++ include/isl/union_map.h | 2 ++ isl_dim.c | 10 ++++++++ isl_dim_private.h | 1 + isl_map.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ isl_union_map.c | 23 +++++++++++++++++ 7 files changed, 113 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index 4ae362c7..0d97f613 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -1658,6 +1658,8 @@ then the name of the space is also removed. __isl_take isl_basic_set *bset); __isl_give isl_set *isl_set_flatten( __isl_take isl_set *set); + __isl_give isl_map *isl_map_flatten_range( + __isl_take isl_map *map); __isl_give isl_basic_map *isl_basic_map_flatten( __isl_take isl_basic_map *bmap); __isl_give isl_map *isl_map_flatten( @@ -1879,6 +1881,12 @@ instead. __isl_give isl_set *isl_set_flat_product( __isl_take isl_set *set1, __isl_take isl_set *set2); + __isl_give isl_map *isl_map_flat_range_product( + __isl_take isl_map *map1, + __isl_take isl_map *map2); + __isl_give isl_union_map *isl_union_map_flat_range_product( + __isl_take isl_union_map *umap1, + __isl_take isl_union_map *umap2); __isl_give isl_basic_map *isl_basic_map_flat_product( __isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2); diff --git a/include/isl/map.h b/include/isl/map.h index 530152af..fab28858 100644 --- a/include/isl/map.h +++ b/include/isl/map.h @@ -295,6 +295,8 @@ __isl_give isl_basic_map *isl_basic_map_flat_product( __isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2); __isl_give isl_map *isl_map_flat_product(__isl_take isl_map *map1, __isl_take isl_map *map2); +__isl_give isl_map *isl_map_flat_range_product(__isl_take isl_map *map1, + __isl_take isl_map *map2); __isl_give isl_map *isl_map_intersect(__isl_take isl_map *map1, __isl_take isl_map *map2); __isl_give isl_map *isl_map_subtract( @@ -351,6 +353,7 @@ __isl_give isl_basic_map *isl_basic_set_unwrap(__isl_take isl_basic_set *bset); __isl_give isl_map *isl_set_unwrap(__isl_take isl_set *set); __isl_give isl_basic_map *isl_basic_map_flatten(__isl_take isl_basic_map *bmap); __isl_give isl_map *isl_map_flatten(__isl_take isl_map *map); +__isl_give isl_map *isl_map_flatten_range(__isl_take isl_map *map); __isl_give isl_basic_set *isl_basic_set_flatten(__isl_take isl_basic_set *bset); __isl_give isl_set *isl_set_flatten(__isl_take isl_set *set); __isl_give isl_map *isl_set_flatten_map(__isl_take isl_set *set); diff --git a/include/isl/union_map.h b/include/isl/union_map.h index 0478c577..b1b87bb5 100644 --- a/include/isl/union_map.h +++ b/include/isl/union_map.h @@ -62,6 +62,8 @@ __isl_give isl_union_map *isl_union_map_product(__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2); __isl_give isl_union_map *isl_union_map_range_product( __isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2); +__isl_give isl_union_map *isl_union_map_flat_range_product( + __isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2); __isl_give isl_union_map *isl_union_map_gist(__isl_take isl_union_map *umap, __isl_take isl_union_map *context); diff --git a/isl_dim.c b/isl_dim.c index 0b027840..6aa67f03 100644 --- a/isl_dim.c +++ b/isl_dim.c @@ -1198,6 +1198,16 @@ __isl_give isl_dim *isl_dim_flatten(__isl_take isl_dim *dim) return dim; } +__isl_give isl_dim *isl_dim_flatten_range(__isl_take isl_dim *dim) +{ + if (!dim) + return NULL; + if (!dim->nested[1]) + return dim; + + return isl_dim_reset(dim, isl_dim_out); +} + /* Replace the dimensions of the given type of dst by those of src. */ __isl_give isl_dim *isl_dim_replace(__isl_take isl_dim *dst, diff --git a/isl_dim_private.h b/isl_dim_private.h index 4f47eebc..c9e5ca8a 100644 --- a/isl_dim_private.h +++ b/isl_dim_private.h @@ -30,6 +30,7 @@ int isl_dim_has_named_params(__isl_keep isl_dim *dim); __isl_give isl_dim *isl_dim_reset(__isl_take isl_dim *dim, enum isl_dim_type type); __isl_give isl_dim *isl_dim_flatten(__isl_take isl_dim *dim); +__isl_give isl_dim *isl_dim_flatten_range(__isl_take isl_dim *dim); __isl_give isl_dim *isl_dim_replace(__isl_take isl_dim *dst, enum isl_dim_type type, __isl_keep isl_dim *src); diff --git a/isl_map.c b/isl_map.c index 2e3213b7..7b976922 100644 --- a/isl_map.c +++ b/isl_map.c @@ -7445,6 +7445,18 @@ __isl_give isl_map *isl_map_range_product(__isl_take isl_map *map1, &isl_basic_map_range_product); } +/* Given two maps A -> B and C -> D, construct a map (A * C) -> (B, D) + */ +__isl_give isl_map *isl_map_flat_range_product(__isl_take isl_map *map1, + __isl_take isl_map *map2) +{ + isl_map *prod; + + prod = isl_map_range_product(map1, map2); + prod = isl_map_flatten_range(prod); + return prod; +} + uint32_t isl_basic_map_get_hash(__isl_keep isl_basic_map *bmap) { int i; @@ -8261,6 +8273,31 @@ __isl_give isl_basic_set *isl_basic_set_flatten(__isl_take isl_basic_set *bset) return (isl_basic_set *)isl_basic_map_flatten((isl_basic_map *)bset); } +__isl_give isl_basic_map *isl_basic_map_flatten_range( + __isl_take isl_basic_map *bmap) +{ + if (!bmap) + return NULL; + + if (!bmap->dim->nested[1]) + return bmap; + + bmap = isl_basic_map_cow(bmap); + if (!bmap) + return NULL; + + bmap->dim = isl_dim_flatten_range(bmap->dim); + if (!bmap->dim) + goto error; + + bmap = isl_basic_map_finalize(bmap); + + return bmap; +error: + isl_basic_map_free(bmap); + return NULL; +} + __isl_give isl_map *isl_map_flatten(__isl_take isl_map *map) { int i; @@ -8308,6 +8345,35 @@ __isl_give isl_map *isl_set_flatten_map(__isl_take isl_set *set) return map; } +__isl_give isl_map *isl_map_flatten_range(__isl_take isl_map *map) +{ + int i; + + if (!map) + return NULL; + + if (!map->dim->nested[1]) + return map; + + map = isl_map_cow(map); + if (!map) + return NULL; + + for (i = 0; i < map->n; ++i) { + map->p[i] = isl_basic_map_flatten_range(map->p[i]); + if (!map->p[i]) + goto error; + } + map->dim = isl_dim_flatten_range(map->dim); + if (!map->dim) + goto error; + + return map; +error: + isl_map_free(map); + return NULL; +} + /* Reorder the dimensions of "bmap" according to the given dim_map * and set the dimension specification to "dim". */ diff --git a/isl_union_map.c b/isl_union_map.c index c95f2caa..abe03fcc 100644 --- a/isl_union_map.c +++ b/isl_union_map.c @@ -950,6 +950,29 @@ __isl_give isl_union_map *isl_union_map_range_product( return bin_op(umap1, umap2, &range_product_entry); } +static int flat_range_product_entry(void **entry, void *user) +{ + struct isl_union_map_bin_data *data = user; + isl_map *map2 = *entry; + + if (!isl_dim_tuple_match(data->map->dim, isl_dim_in, + map2->dim, isl_dim_in)) + return 0; + + map2 = isl_map_flat_range_product(isl_map_copy(data->map), + isl_map_copy(map2)); + + data->res = isl_union_map_add_map(data->res, map2); + + return 0; +} + +__isl_give isl_union_map *isl_union_map_flat_range_product( + __isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2) +{ + return bin_op(umap1, umap2, &flat_range_product_entry); +} + __isl_give isl_union_map *isl_union_map_from_range( __isl_take isl_union_set *uset) { -- 2.11.4.GIT