From 05572aee8eec1413f9430cd84a3cece482d81987 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Wed, 25 Sep 2013 17:00:29 +0200 Subject: [PATCH] add isl_union_map_flat_domain_product Signed-off-by: Sven Verdoolaege --- doc/user.pod | 4 ++++ include/isl/union_map.h | 2 ++ isl_union_map.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index 375689ab..bdb5c6f2 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -5515,6 +5515,10 @@ instead. #include __isl_give isl_union_map * + isl_union_map_flat_domain_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); diff --git a/include/isl/union_map.h b/include/isl/union_map.h index cd495d1c..6163efd4 100644 --- a/include/isl/union_map.h +++ b/include/isl/union_map.h @@ -88,6 +88,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_domain_product( __isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2); +__isl_give isl_union_map *isl_union_map_flat_domain_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( diff --git a/isl_union_map.c b/isl_union_map.c index 7e570e67..2393421e 100644 --- a/isl_union_map.c +++ b/isl_union_map.c @@ -1421,6 +1421,34 @@ __isl_give isl_union_map *isl_union_map_range_product( return bin_op(umap1, umap2, &range_product_entry); } +/* If data->map A -> B and "map2" C -> D have the same range space, + * then add (A, C) -> (B * D) to data->res. + */ +static int flat_domain_product_entry(void **entry, void *user) +{ + struct isl_union_map_bin_data *data = user; + isl_map *map2 = *entry; + + if (!isl_space_tuple_is_equal(data->map->dim, isl_dim_out, + map2->dim, isl_dim_out)) + return 0; + + map2 = isl_map_flat_domain_product(isl_map_copy(data->map), + isl_map_copy(map2)); + + data->res = isl_union_map_add_map(data->res, map2); + + return 0; +} + +/* Given two maps A -> B and C -> D, construct a map (A, C) -> (B * D). + */ +__isl_give isl_union_map *isl_union_map_flat_domain_product( + __isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2) +{ + return bin_op(umap1, umap2, &flat_domain_product_entry); +} + static int flat_range_product_entry(void **entry, void *user) { struct isl_union_map_bin_data *data = user; -- 2.11.4.GIT