change calling conventions of isl_basic_set_has_defining_{,in}equalit{y,ies}
[platform/upstream/isl.git] / isl_map.c
index 89f8c84..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;
@@ -4915,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
@@ -4932,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);