add isl_union_map_domain_product
authorSven Verdoolaege <skimo@kotnet.org>
Tue, 26 Jun 2012 16:38:37 +0000 (18:38 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Thu, 2 Aug 2012 10:20:08 +0000 (12:20 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/union_map.h
isl_union_map.c

index fcc2ca3..996df86 100644 (file)
@@ -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);
index 8b531f3..9817ab5 100644 (file)
@@ -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(
index b1d0096..646ac87 100644 (file)
@@ -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;