isl_map_from_domain_and_range: implement in terms of isl_map_apply_range
[platform/upstream/isl.git] / isl_map.c
index 3fe5f70..b9f8b01 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -247,6 +247,11 @@ int isl_basic_map_compatible_range(struct isl_basic_map *bmap,
               bmap->dim->nparam == bset->dim->nparam;
 }
 
+isl_ctx *isl_map_get_ctx(__isl_keep isl_map *map)
+{
+       return map ? map->ctx : NULL;
+}
+
 struct isl_dim *isl_basic_map_get_dim(struct isl_basic_map *bmap)
 {
        if (!bmap)
@@ -2243,7 +2248,7 @@ __isl_give isl_basic_map *isl_basic_map_move_dims(
                        off += size;
                }
        }
-       isl_dim_map_div(dim_map, bmap, off + n);
+       isl_dim_map_div(dim_map, bmap, off);
 
        res = isl_basic_map_alloc_dim(isl_basic_map_get_dim(bmap),
                        bmap->n_div, bmap->n_eq, bmap->n_ineq);
@@ -3016,6 +3021,9 @@ static __isl_give isl_map *map_lex_lte_first(__isl_take isl_dim *dims,
        struct isl_map *map;
        int i;
 
+       if (n == 0 && equal)
+               return isl_map_universe(dims);
+
        map = isl_map_alloc_dim(isl_dim_copy(dims), n, ISL_MAP_DISJOINT);
 
        for (i = 0; i + 1 < n; ++i)
@@ -3067,6 +3075,9 @@ static __isl_give isl_map *map_lex_gte_first(__isl_take isl_dim *dims,
        struct isl_map *map;
        int i;
 
+       if (n == 0 && equal)
+               return isl_map_universe(dims);
+
        map = isl_map_alloc_dim(isl_dim_copy(dims), n, ISL_MAP_DISJOINT);
 
        for (i = 0; i + 1 < n; ++i)
@@ -3374,17 +3385,80 @@ struct isl_set *isl_set_to_underlying_set(struct isl_set *set)
        return (struct isl_set *)isl_map_underlying_set((struct isl_map *)set);
 }
 
+static __isl_give isl_basic_map *isl_basic_map_reset_dim(
+       __isl_take isl_basic_map *bmap, __isl_take isl_dim *dim)
+{
+       bmap = isl_basic_map_cow(bmap);
+       if (!bmap || !dim)
+               goto error;
+
+       isl_dim_free(bmap->dim);
+       bmap->dim = dim;
+
+       return bmap;
+error:
+       isl_basic_map_free(bmap);
+       isl_dim_free(dim);
+       return NULL;
+}
+
+static __isl_give isl_basic_set *isl_basic_set_reset_dim(
+       __isl_take isl_basic_set *bset, __isl_take isl_dim *dim)
+{
+       return (isl_basic_set *)isl_basic_map_reset_dim((isl_basic_map *)bset,
+                                                       dim);
+}
+
+__isl_give isl_map *isl_map_reset_dim(__isl_take isl_map *map,
+       __isl_take isl_dim *dim)
+{
+       int i;
+
+       map = isl_map_cow(map);
+       if (!map || !dim)
+               goto error;
+
+       for (i = 0; i < map->n; ++i) {
+               map->p[i] = isl_basic_map_reset_dim(map->p[i],
+                                                   isl_dim_copy(dim));
+               if (!map->p[i])
+                       goto error;
+       }
+       isl_dim_free(map->dim);
+       map->dim = dim;
+
+       return map;
+error:
+       isl_map_free(map);
+       isl_dim_free(dim);
+       return NULL;
+}
+
+__isl_give isl_set *isl_set_reset_dim(__isl_take isl_set *set,
+       __isl_take isl_dim *dim)
+{
+       return (struct isl_set *) isl_map_reset_dim((struct isl_map *)set, dim);
+}
+
 struct isl_basic_set *isl_basic_map_domain(struct isl_basic_map *bmap)
 {
+       isl_dim *dim;
        struct isl_basic_set *domain;
        unsigned n_in;
        unsigned n_out;
+
        if (!bmap)
                return NULL;
+       dim = isl_dim_domain(isl_basic_map_get_dim(bmap));
+
        n_in = isl_basic_map_n_in(bmap);
        n_out = isl_basic_map_n_out(bmap);
        domain = isl_basic_set_from_basic_map(bmap);
-       return isl_basic_set_project_out(domain, isl_dim_set, n_in, n_out);
+       domain = isl_basic_set_project_out(domain, isl_dim_set, n_in, n_out);
+
+       domain = isl_basic_set_reset_dim(domain, dim);
+
+       return domain;
 }
 
 struct isl_basic_set *isl_basic_map_range(struct isl_basic_map *bmap)
@@ -3455,14 +3529,14 @@ struct isl_map *isl_map_from_range(struct isl_set *set)
 
 __isl_give isl_map *isl_map_from_domain(__isl_take isl_set *set)
 {
-       return isl_map_reverse(isl_map_from_range(set));;
+       return isl_map_reverse(isl_map_from_range(set));
 }
 
 __isl_give isl_map *isl_map_from_domain_and_range(__isl_take isl_set *domain,
        __isl_take isl_set *range)
 {
-       return isl_map_product(isl_map_from_domain(domain),
-                              isl_map_from_range(range));
+       return isl_map_apply_range(isl_map_from_domain(domain),
+                                  isl_map_from_range(range));
 }
 
 struct isl_set *isl_set_from_map(struct isl_map *map)
@@ -4337,34 +4411,6 @@ __isl_give isl_set *isl_set_lexmax(__isl_take isl_set *set)
        return (isl_set *)isl_map_lexmax((isl_map *)set);
 }
 
-static struct isl_map *isl_map_reset_dim(struct isl_map *map,
-       struct isl_dim *dim)
-{
-       int i;
-
-       if (!map || !dim)
-               goto error;
-
-       for (i = 0; i < map->n; ++i) {
-               isl_dim_free(map->p[i]->dim);
-               map->p[i]->dim = isl_dim_copy(dim);
-       }
-       isl_dim_free(map->dim);
-       map->dim = dim;
-
-       return map;
-error:
-       isl_map_free(map);
-       isl_dim_free(dim);
-       return NULL;
-}
-
-static struct isl_set *isl_set_reset_dim(struct isl_set *set,
-       struct isl_dim *dim)
-{
-       return (struct isl_set *) isl_map_reset_dim((struct isl_map *)set, dim);
-}
-
 /* Apply a preimage specified by "mat" on the parameters of "bset".
  * bset is assumed to have only parameters and divs.
  */
@@ -5274,10 +5320,18 @@ int isl_basic_set_is_universe(struct isl_basic_set *bset)
 
 int isl_map_fast_is_universe(__isl_keep isl_map *map)
 {
+       int i;
+
        if (!map)
                return -1;
 
-       return map->n == 1 && isl_basic_map_is_universe(map->p[0]);
+       for (i = 0; i < map->n; ++i) {
+               int r = isl_basic_map_is_universe(map->p[i]);
+               if (r < 0 || r)
+                       return r;
+       }
+
+       return 0;
 }
 
 int isl_set_fast_is_universe(__isl_keep isl_set *set)
@@ -6040,8 +6094,8 @@ struct isl_basic_set *isl_basic_set_normalize(struct isl_basic_set *bset)
                                                (struct isl_basic_map *)bset);
 }
 
-static int isl_basic_map_fast_cmp(const struct isl_basic_map *bmap1,
-       const struct isl_basic_map *bmap2)
+int isl_basic_map_fast_cmp(const __isl_keep isl_basic_map *bmap1,
+       const __isl_keep isl_basic_map *bmap2)
 {
        int i, cmp;
        unsigned total;
@@ -6086,8 +6140,8 @@ static int isl_basic_map_fast_cmp(const struct isl_basic_map *bmap1,
        return 0;
 }
 
-static int isl_basic_map_fast_is_equal(struct isl_basic_map *bmap1,
-       struct isl_basic_map *bmap2)
+int isl_basic_map_fast_is_equal(__isl_keep isl_basic_map *bmap1,
+       __isl_keep isl_basic_map *bmap2)
 {
        return isl_basic_map_fast_cmp(bmap1, bmap2) == 0;
 }