add isl_printer_get_output_format
[platform/upstream/isl.git] / isl_map_simplify.c
index db025eb..145428e 100644 (file)
@@ -1146,6 +1146,12 @@ int isl_basic_map_is_div_constraint(__isl_keep isl_basic_map *bmap,
        return 1;
 }
 
+int isl_basic_set_is_div_constraint(__isl_keep isl_basic_set *bset,
+       isl_int *constraint, unsigned div)
+{
+       return isl_basic_map_is_div_constraint(bset, constraint, div);
+}
+
 
 /* If the only constraints a div d=floor(f/m)
  * appears in are its two defining constraints
@@ -1277,6 +1283,7 @@ struct isl_basic_map *isl_basic_map_eliminate_vars(
        int d;
        int i, j, k;
        unsigned total;
+       int need_gauss = 0;
 
        if (n == 0)
                return bmap;
@@ -1300,6 +1307,7 @@ struct isl_basic_map *isl_basic_map_eliminate_vars(
                                continue;
                        eliminate_var_using_equality(bmap, d, bmap->eq[i], 0, NULL);
                        isl_basic_map_drop_equality(bmap, i);
+                       need_gauss = 1;
                        break;
                }
                if (i < bmap->n_eq)
@@ -1344,6 +1352,7 @@ struct isl_basic_map *isl_basic_map_eliminate_vars(
                        bmap = remove_duplicate_constraints(bmap, NULL, 0);
                        bmap = isl_basic_map_gauss(bmap, NULL);
                        bmap = isl_basic_map_remove_redundancies(bmap);
+                       need_gauss = 0;
                        if (!bmap)
                                goto error;
                        if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY))
@@ -1351,6 +1360,8 @@ struct isl_basic_map *isl_basic_map_eliminate_vars(
                }
        }
        ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
+       if (need_gauss)
+               bmap = isl_basic_map_gauss(bmap, NULL);
        return bmap;
 error:
        isl_basic_map_free(bmap);
@@ -1364,6 +1375,31 @@ struct isl_basic_set *isl_basic_set_eliminate_vars(
                        (struct isl_basic_map *)bset, pos, n);
 }
 
+/* Eliminate the specified n dimensions starting at first from the
+ * constraints using Fourier-Motzkin.  The dimensions themselves
+ * are not removed.
+ */
+__isl_give isl_basic_map *isl_basic_map_eliminate(
+       __isl_take isl_basic_map *bmap,
+       enum isl_dim_type type, unsigned first, unsigned n)
+{
+       if (!bmap)
+               return NULL;
+       if (n == 0)
+               return bmap;
+
+       if (first + n > isl_basic_map_dim(bmap, type))
+               isl_die(bmap->ctx, isl_error_invalid,
+                       "index out of bounds", goto error);
+
+       first += isl_basic_map_offset(bmap, type) - 1;
+       bmap = isl_basic_map_eliminate_vars(bmap, first, n);
+       return isl_basic_map_finalize(bmap);
+error:
+       isl_basic_map_free(bmap);
+       return NULL;
+}
+
 /* Don't assume equalities are in order, because align_divs
  * may have changed the order of the divs.
  */
@@ -1549,7 +1585,7 @@ static __isl_give isl_basic_set *uset_gist_full(__isl_take isl_basic_set *bset,
        context_ineq = context->n_ineq;
        combined = isl_basic_set_cow(isl_basic_set_copy(context));
        combined = isl_basic_set_extend_constraints(combined, 0, bset->n_ineq);
-       tab = isl_tab_from_basic_set(combined);
+       tab = isl_tab_from_basic_set(combined, 0);
        for (i = 0; i < context_ineq; ++i)
                if (isl_tab_freeze_constraint(tab, i) < 0)
                        goto error;
@@ -1738,10 +1774,8 @@ struct isl_basic_map *isl_basic_map_gist(struct isl_basic_map *bmap,
                return bmap;
        }
        if (isl_basic_map_plain_is_empty(context)) {
-               isl_space *dim = isl_space_copy(bmap->dim);
-               isl_basic_map_free(context);
                isl_basic_map_free(bmap);
-               return isl_basic_map_universe(dim);
+               return context;
        }
        if (isl_basic_map_plain_is_empty(bmap)) {
                isl_basic_map_free(context);
@@ -1779,10 +1813,8 @@ __isl_give isl_map *isl_map_gist_basic_map(__isl_take isl_map *map,
                goto error;;
 
        if (isl_basic_map_plain_is_empty(context)) {
-               isl_space *dim = isl_space_copy(map->dim);
-               isl_basic_map_free(context);
                isl_map_free(map);
-               return isl_map_universe(dim);
+               return isl_map_from_basic_map(context);
        }
 
        context = isl_basic_map_remove_redundancies(context);
@@ -1841,6 +1873,15 @@ __isl_give isl_set *isl_set_gist_basic_set(__isl_take isl_set *set,
                                        (struct isl_basic_map *)context);
 }
 
+__isl_give isl_set *isl_set_gist_params_basic_set(__isl_take isl_set *set,
+       __isl_take isl_basic_set *context)
+{
+       isl_space *space = isl_set_get_space(set);
+       isl_basic_set *dom_context = isl_basic_set_universe(space);
+       dom_context = isl_basic_set_intersect_params(dom_context, context);
+       return isl_set_gist_basic_set(set, dom_context);
+}
+
 __isl_give isl_set *isl_set_gist(__isl_take isl_set *set,
        __isl_take isl_set *context)
 {
@@ -1848,6 +1889,22 @@ __isl_give isl_set *isl_set_gist(__isl_take isl_set *set,
                                        (struct isl_map *)context);
 }
 
+__isl_give isl_map *isl_map_gist_domain(__isl_take isl_map *map,
+       __isl_take isl_set *context)
+{
+       isl_map *map_context = isl_map_universe(isl_map_get_space(map));
+       map_context = isl_map_intersect_domain(map_context, context);
+       return isl_map_gist(map, map_context);
+}
+
+__isl_give isl_map *isl_map_gist_range(__isl_take isl_map *map,
+       __isl_take isl_set *context)
+{
+       isl_map *map_context = isl_map_universe(isl_map_get_space(map));
+       map_context = isl_map_intersect_range(map_context, context);
+       return isl_map_gist(map, map_context);
+}
+
 __isl_give isl_map *isl_map_gist_params(__isl_take isl_map *map,
        __isl_take isl_set *context)
 {
@@ -2156,7 +2213,7 @@ static struct isl_basic_map *drop_more_redundant_divs(
        if (!vec)
                goto error;
 
-       tab = isl_tab_from_basic_map(bmap);
+       tab = isl_tab_from_basic_map(bmap, 0);
 
        while (n > 0) {
                int i, l, u;