add isl_aff_drop_dims
[platform/upstream/isl.git] / isl_union_map.c
index 2846f8e..abe03fc 100644 (file)
@@ -932,6 +932,10 @@ static int 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_range_product(isl_map_copy(data->map),
                                     isl_map_copy(map2));
 
@@ -946,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)
 {