isl_union_map: construct new isl_union_map on operations that change dimensions
authorSven Verdoolaege <skimo@kotnet.org>
Tue, 10 Aug 2010 18:50:22 +0000 (20:50 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Tue, 10 Aug 2010 18:50:22 +0000 (20:50 +0200)
Otherwise, the entries in the hashtable will end up hashed on the wrong
hash value (that of the original isl_dim).

Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
isl_union_map.c

index c8c5f9b..099e1dd 100644 (file)
@@ -630,15 +630,6 @@ __isl_give isl_union_map *isl_union_map_from_domain_and_range(
                                         isl_union_map_from_range(range));
 }
 
-static int reverse_entry(void **entry, void *user)
-{
-       isl_map **map = (isl_map **)entry;
-
-       *map = isl_map_reverse(*map);
-
-       return *map ? 0 : -1;
-}
-
 static __isl_give isl_union_map *un_op(__isl_take isl_union_map *umap,
        int (*fn)(void **, void *), int cow)
 {
@@ -656,11 +647,6 @@ error:
        return NULL;
 }
 
-__isl_give isl_union_map *isl_union_map_reverse(__isl_take isl_union_map *umap)
-{
-       return un_op(umap, &reverse_entry, 1);
-}
-
 static int affine_entry(void **entry, void *user)
 {
        isl_map **map = (isl_map **)entry;
@@ -766,30 +752,6 @@ __isl_give isl_union_set *isl_union_set_lexmax(
        return isl_union_map_lexmax(uset);
 }
 
-static int domain_entry(void **entry, void *user)
-{
-       *entry = isl_map_domain(*entry);
-
-       return *entry ? 0 : -1;
-}
-
-__isl_give isl_union_set *isl_union_map_domain(__isl_take isl_union_map *umap)
-{
-       return un_op(umap, &domain_entry, 1);
-}
-
-static int range_entry(void **entry, void *user)
-{
-       *entry = isl_map_range(*entry);
-
-       return *entry ? 0 : -1;
-}
-
-__isl_give isl_union_set *isl_union_map_range(__isl_take isl_union_map *umap)
-{
-       return un_op(umap, &range_entry, 1);
-}
-
 static __isl_give isl_union_set *cond_un_op(__isl_take isl_union_map *umap,
        int (*fn)(void **, void *))
 {
@@ -810,6 +772,51 @@ error:
        return NULL;
 }
 
+static int reverse_entry(void **entry, void *user)
+{
+       isl_map *map = *entry;
+       isl_union_map **res = user;
+
+       *res = isl_union_map_add_map(*res, isl_map_reverse(isl_map_copy(map)));
+
+       return 0;
+}
+
+__isl_give isl_union_map *isl_union_map_reverse(__isl_take isl_union_map *umap)
+{
+       return cond_un_op(umap, &reverse_entry);
+}
+
+static int domain_entry(void **entry, void *user)
+{
+       isl_map *map = *entry;
+       isl_union_set **res = user;
+
+       *res = isl_union_set_add_set(*res, isl_map_domain(isl_map_copy(map)));
+
+       return 0;
+}
+
+__isl_give isl_union_set *isl_union_map_domain(__isl_take isl_union_map *umap)
+{
+       return cond_un_op(umap, &domain_entry);
+}
+
+static int range_entry(void **entry, void *user)
+{
+       isl_map *map = *entry;
+       isl_union_set **res = user;
+
+       *res = isl_union_set_add_set(*res, isl_map_range(isl_map_copy(map)));
+
+       return 0;
+}
+
+__isl_give isl_union_set *isl_union_map_range(__isl_take isl_union_map *umap)
+{
+       return cond_un_op(umap, &range_entry);
+}
+
 static int deltas_entry(void **entry, void *user)
 {
        isl_map *map = *entry;
@@ -848,16 +855,17 @@ __isl_give isl_union_map *isl_union_set_unwrap(__isl_take isl_union_set *uset)
 
 static int wrap_entry(void **entry, void *user)
 {
-       isl_map **map = (isl_map **)entry;
+       isl_map *map = *entry;
+       isl_union_set **res = user;
 
-       *map = (isl_map *)isl_map_wrap(*map);
+       *res = isl_union_set_add_set(*res, isl_map_wrap(isl_map_copy(map)));
 
-       return *map ? 0 : -1;
+       return 0;
 }
 
 __isl_give isl_union_set *isl_union_map_wrap(__isl_take isl_union_map *umap)
 {
-       return un_op(umap, &wrap_entry, 1);
+       return cond_un_op(umap, &wrap_entry);
 }
 
 struct isl_union_map_is_subset_data {