change calling conventions of isl_basic_set_has_defining_{,in}equalit{y,ies}
[platform/upstream/isl.git] / isl_map.c
index c7146f1..1677c75 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -90,6 +90,25 @@ static void isl_dim_map_dump(struct isl_dim_map *dim_map)
        fprintf(stderr, "\n");
 }
 
+unsigned isl_basic_map_dim(const struct isl_basic_map *bmap,
+                               enum isl_dim_type type)
+{
+       struct isl_dim *dim = bmap->dim;
+       switch (type) {
+       case isl_dim_param:     return dim->nparam;
+       case isl_dim_in:        return dim->n_in;
+       case isl_dim_out:       return dim->n_out;
+       case isl_dim_div:       return bmap->n_div;
+       case isl_dim_all:       return isl_basic_map_total_dim(bmap);
+       }
+}
+
+unsigned isl_basic_set_dim(const struct isl_basic_set *bset,
+                               enum isl_dim_type type)
+{
+       return isl_basic_map_dim((const struct isl_basic_map*)bset, type);
+}
+
 unsigned isl_basic_set_n_dim(const struct isl_basic_set *bset)
 {
        return bset->dim->n_out;
@@ -2914,6 +2933,7 @@ struct isl_basic_map *isl_basic_map_overlying_set(
                                goto error;
        }
        isl_basic_map_free(like);
+       bmap = isl_basic_map_simplify(bmap);
        bmap = isl_basic_map_finalize(bmap);
        return bmap;
 error:
@@ -3515,11 +3535,22 @@ error:
 
 struct isl_map *isl_basic_map_compute_divs(struct isl_basic_map *bmap)
 {
+       int i;
+       unsigned off;
+
        if (!bmap)
                return NULL;
-       if (bmap->n_div == 0)
-               return isl_map_from_basic_map(bmap);
-       return isl_pip_basic_map_compute_divs(bmap);
+       off = isl_dim_total(bmap->dim);
+       for (i = 0; i < bmap->n_div; ++i) {
+               if (isl_int_is_zero(bmap->div[i][0]))
+                       return isl_pip_basic_map_compute_divs(bmap);
+               isl_assert(bmap->ctx, isl_int_is_zero(bmap->div[i][1+1+off+i]),
+                               goto error);
+       }
+       return isl_map_from_basic_map(bmap);
+error:
+       isl_basic_map_free(bmap);
+       return NULL;
 }
 
 struct isl_map *isl_map_compute_divs(struct isl_map *map)
@@ -4301,6 +4332,9 @@ struct isl_basic_map *isl_basic_map_align_divs(
        if (src->n_div == 0)
                return dst;
 
+       for (i = 0; i < src->n_div; ++i)
+               isl_assert(src->ctx, !isl_int_is_zero(src->div[i][0]), goto error);
+
        src = order_divs(src);
        dst = isl_basic_map_extend_dim(dst, isl_dim_copy(dst->dim),
                        src->n_div, 0, 2 * src->n_div);
@@ -4900,6 +4934,60 @@ error:
        return bset;
 }
 
+static struct isl_basic_set *uset_gist(struct isl_basic_set *bset,
+       struct isl_basic_set *context);
+
+static struct isl_basic_set *uset_gist_context_eq(struct isl_basic_set *bset,
+       struct isl_basic_set *context)
+{
+       struct isl_mat *T;
+       struct isl_mat *T2;
+       struct isl_ctx *ctx = context->ctx;
+       struct isl_basic_set *reduced_context;
+       reduced_context = isl_basic_set_remove_equalities(
+                               isl_basic_set_copy(context), &T, &T2);
+       if (!reduced_context)
+               goto error;
+       bset = isl_basic_set_preimage(ctx, bset, T);
+       bset = uset_gist(bset, reduced_context);
+       bset = isl_basic_set_preimage(ctx, bset, T2);
+       bset = isl_basic_set_reduce_using_equalities(bset, context);
+       return bset;
+error:
+       isl_basic_set_free(context);
+       isl_basic_set_free(bset);
+       return NULL;
+}
+
+static struct isl_basic_set *uset_gist_set_eq(struct isl_basic_set *bset,
+       struct isl_basic_set *context)
+{
+       struct isl_mat *T;
+       struct isl_mat *T2;
+       struct isl_ctx *ctx = context->ctx;
+       struct isl_basic_set *affine_hull = NULL;
+
+       affine_hull = isl_basic_set_copy(bset);
+       affine_hull = isl_basic_set_cow(affine_hull);
+       if (!affine_hull)
+               goto error;
+       isl_basic_set_free_inequality(affine_hull, affine_hull->n_ineq);
+
+       bset = isl_basic_set_remove_equalities(bset, &T, &T2);
+       if (!bset)
+               goto error;
+       context = isl_basic_set_preimage(ctx, context, T);
+       bset = uset_gist(bset, context);
+       bset = isl_basic_set_preimage(ctx, bset, T2);
+       bset = isl_basic_set_intersect(bset, affine_hull);
+       return bset;
+error:
+       isl_basic_set_free(affine_hull);
+       isl_basic_set_free(context);
+       isl_basic_set_free(bset);
+       return NULL;
+}
+
 /* Remove all information from bset that is redundant in the context
  * of context.  In particular, equalities that are linear combinations
  * of those in context are removed.  Then the inequalities that are
@@ -4917,23 +5005,12 @@ static struct isl_basic_set *uset_gist(struct isl_basic_set *bset,
        if (!bset || !context)
                goto error;
 
-       if (context->n_eq > 0) {
-               struct isl_mat *T;
-               struct isl_mat *T2;
-               struct isl_ctx *ctx = context->ctx;
-               struct isl_basic_set *reduced_context;
-               reduced_context = isl_basic_set_remove_equalities(
-                                       isl_basic_set_copy(context), &T, &T2);
-               if (!reduced_context)
-                       goto error;
-               bset = isl_basic_set_preimage(ctx, bset, T);
-               bset = uset_gist(bset, reduced_context);
-               bset = isl_basic_set_preimage(ctx, bset, T2);
-               bset = isl_basic_set_reduce_using_equalities(bset, context);
-               return bset;
-       }
+       if (context->n_eq > 0)
+               return uset_gist_context_eq(bset, context);
        if (!context->n_ineq)
                goto done;
+       if (bset->n_eq > 0)
+               return uset_gist_set_eq(bset, context);
        bset = remove_shifted_constraints(bset, context);
        combined = isl_basic_set_extend_constraints(isl_basic_set_copy(bset),
                        context->n_eq, context->n_ineq);
@@ -4994,6 +5071,9 @@ error:
        return NULL;
 }
 
+/*
+ * Assumes context has no implicit divs.
+ */
 struct isl_map *isl_map_gist(struct isl_map *map, struct isl_basic_map *context)
 {
        int i;
@@ -5002,6 +5082,7 @@ struct isl_map *isl_map_gist(struct isl_map *map, struct isl_basic_map *context)
        if (!map || !context)
                return NULL;
        isl_assert(map->ctx, isl_dim_equal(map->dim, context->dim), goto error);
+       map = isl_map_compute_divs(map);
        for (i = 0; i < map->n; ++i)
                context = isl_basic_map_align_divs(context, map->p[i]);
        for (i = 0; i < map->n; ++i) {