From 23bb964e1020e674c22294166ddf69f7edbd9576 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Tue, 26 Jun 2012 18:38:37 +0200 Subject: [PATCH] add isl_union_map_domain_product Signed-off-by: Sven Verdoolaege --- doc/user.pod | 3 +++ include/isl/union_map.h | 2 ++ isl_union_map.c | 25 +++++++++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index fcc2ca34..996df86c 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -2597,6 +2597,9 @@ a parametric set as well. __isl_give isl_map *isl_map_range_product( __isl_take isl_map *map1, __isl_take isl_map *map2); + __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_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 8b531f32..9817ab5f 100644 --- a/include/isl/union_map.h +++ b/include/isl/union_map.h @@ -67,6 +67,8 @@ __isl_give isl_union_map *isl_union_map_intersect_params( __isl_take isl_union_map *umap, __isl_take isl_set *set); __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_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 b1d0096f..646ac87e 100644 --- a/isl_union_map.c +++ b/isl_union_map.c @@ -1193,6 +1193,31 @@ __isl_give isl_union_set *isl_union_set_product(__isl_take isl_union_set *uset1, return bin_op(uset1, uset2, &set_product_entry); } +static int domain_product_entry(void **entry, void *user) +{ + struct isl_union_map_bin_data *data = user; + isl_map *map2 = *entry; + + if (!isl_space_tuple_match(data->map->dim, isl_dim_out, + map2->dim, isl_dim_out)) + return 0; + + map2 = isl_map_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_domain_product( + __isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2) +{ + return bin_op(umap1, umap2, &domain_product_entry); +} + static int range_product_entry(void **entry, void *user) { struct isl_union_map_bin_data *data = user; -- 2.11.4.GIT