isl_map_simplify.c: remove unused set_swap_inequality
[platform/upstream/isl.git] / isl_map_simplify.c
index 302c123..984d6ef 100644 (file)
@@ -7,6 +7,7 @@
  * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
  */
 
+#include <isl_ctx_private.h>
 #include <isl_map_private.h>
 #include "isl_equalities.h"
 #include <isl/map.h>
@@ -31,11 +32,6 @@ static void swap_inequality(struct isl_basic_map *bmap, int a, int b)
        }
 }
 
-static void set_swap_inequality(struct isl_basic_set *bset, int a, int b)
-{
-       swap_inequality((struct isl_basic_map *)bset, a, b);
-}
-
 static void constraint_drop_vars(isl_int *c, unsigned n, unsigned rem)
 {
        isl_seq_cpy(c, c + n, rem);
@@ -812,7 +808,7 @@ static struct isl_basic_map *normalize_divs(
                return bmap;
 
        if (div_eq < bmap->n_eq) {
-               B = isl_mat_sub_alloc(bmap->ctx, bmap->eq, div_eq,
+               B = isl_mat_sub_alloc6(bmap->ctx, bmap->eq, div_eq,
                                        bmap->n_eq - div_eq, 0, 1 + total);
                C = isl_mat_variable_compression(B, &C2);
                if (!C || !C2)
@@ -833,7 +829,7 @@ static struct isl_basic_map *normalize_divs(
                        --j;
                isl_int_set(d->block.data[i], bmap->eq[i][1 + total + j]);
        }
-       B = isl_mat_sub_alloc(bmap->ctx, bmap->eq, 0, div_eq, 0, 1 + total);
+       B = isl_mat_sub_alloc6(bmap->ctx, bmap->eq, 0, div_eq, 0, 1 + total);
 
        if (C) {
                B = isl_mat_product(B, C);
@@ -1558,7 +1554,7 @@ static struct isl_basic_set *normalize_constraints_in_compressed_space(
                return NULL;
 
        total = isl_basic_set_total_dim(bset);
-       B = isl_mat_sub_alloc(bset->ctx, bset->eq, 0, bset->n_eq, 0, 1 + total);
+       B = isl_mat_sub_alloc6(bset->ctx, bset->eq, 0, bset->n_eq, 0, 1 + total);
        C = isl_mat_variable_compression(B, NULL);
        if (!C)
                return bset;
@@ -1566,7 +1562,7 @@ static struct isl_basic_set *normalize_constraints_in_compressed_space(
                isl_mat_free(C);
                return isl_basic_set_set_to_empty(bset);
        }
-       B = isl_mat_sub_alloc(bset->ctx, bset->ineq,
+       B = isl_mat_sub_alloc6(bset->ctx, bset->ineq,
                                                0, bset->n_ineq, 0, 1 + total);
        C = isl_mat_product(B, C);
        if (!C)
@@ -1702,6 +1698,13 @@ error:
  * We first compute the integer affine hull of the intersection,
  * compute the gist inside this affine hull and then add back
  * those equalities that are not implied by the context.
+ *
+ * If two constraints are mutually redundant, then uset_gist_full
+ * will remove the second of those constraints.  We therefore first
+ * sort the constraints so that constraints not involving existentially
+ * quantified variables are given precedence over those that do.
+ * We have to perform this sorting before the variable compression,
+ * because that may effect the order of the variables.
  */
 static __isl_give isl_basic_set *uset_gist(__isl_take isl_basic_set *bset,
        __isl_take isl_basic_set *context)
@@ -1716,14 +1719,15 @@ static __isl_give isl_basic_set *uset_gist(__isl_take isl_basic_set *bset,
                goto error;
 
        bset = isl_basic_set_intersect(bset, isl_basic_set_copy(context));
-       if (isl_basic_set_fast_is_empty(bset)) {
+       if (isl_basic_set_plain_is_empty(bset)) {
                isl_basic_set_free(context);
                return bset;
        }
+       bset = isl_basic_set_sort_constraints(bset);
        aff = isl_basic_set_affine_hull(isl_basic_set_copy(bset));
        if (!aff)
                goto error;
-       if (isl_basic_set_fast_is_empty(aff)) {
+       if (isl_basic_set_plain_is_empty(aff)) {
                isl_basic_set_free(aff);
                isl_basic_set_free(context);
                return bset;
@@ -1733,7 +1737,7 @@ static __isl_give isl_basic_set *uset_gist(__isl_take isl_basic_set *bset,
                return uset_gist_full(bset, context);
        }
        total = isl_basic_set_total_dim(bset);
-       eq = isl_mat_sub_alloc(bset->ctx, aff->eq, 0, aff->n_eq, 0, 1 + total);
+       eq = isl_mat_sub_alloc6(bset->ctx, aff->eq, 0, aff->n_eq, 0, 1 + total);
        eq = isl_mat_cow(eq);
        T = isl_mat_variable_compression(eq, &T2);
        if (T && T->n_col == 0) {
@@ -1815,13 +1819,13 @@ struct isl_basic_map *isl_basic_map_gist(struct isl_basic_map *bmap,
                isl_basic_map_free(context);
                return bmap;
        }
-       if (isl_basic_map_fast_is_empty(context)) {
+       if (isl_basic_map_plain_is_empty(context)) {
                struct isl_dim *dim = isl_dim_copy(bmap->dim);
                isl_basic_map_free(context);
                isl_basic_map_free(bmap);
                return isl_basic_map_universe(dim);
        }
-       if (isl_basic_map_fast_is_empty(bmap)) {
+       if (isl_basic_map_plain_is_empty(bmap)) {
                isl_basic_map_free(context);
                return bmap;
        }
@@ -1856,7 +1860,7 @@ __isl_give isl_map *isl_map_gist_basic_map(__isl_take isl_map *map,
        if (!map || !context)
                goto error;;
 
-       if (isl_basic_map_fast_is_empty(context)) {
+       if (isl_basic_map_plain_is_empty(context)) {
                struct isl_dim *dim = isl_dim_copy(map->dim);
                isl_basic_map_free(context);
                isl_map_free(map);
@@ -1876,7 +1880,7 @@ __isl_give isl_map *isl_map_gist_basic_map(__isl_take isl_map *map,
                                                isl_basic_map_copy(context));
                if (!map->p[i])
                        goto error;
-               if (isl_basic_map_fast_is_empty(map->p[i])) {
+               if (isl_basic_map_plain_is_empty(map->p[i])) {
                        isl_basic_map_free(map->p[i]);
                        if (i != map->n - 1)
                                map->p[i] = map->p[map->n - 1];
@@ -1925,8 +1929,8 @@ __isl_give isl_set *isl_set_gist(__isl_take isl_set *set,
  * one basic map in the context of the equalities of the other
  * basic map and check if we get a contradiction.
  */
-int isl_basic_map_fast_is_disjoint(struct isl_basic_map *bmap1,
-       struct isl_basic_map *bmap2)
+int isl_basic_map_plain_is_disjoint(__isl_keep isl_basic_map *bmap1,
+       __isl_keep isl_basic_map *bmap2)
 {
        struct isl_vec *v = NULL;
        int *elim = NULL;
@@ -1990,26 +1994,27 @@ error:
        return -1;
 }
 
-int isl_basic_set_fast_is_disjoint(struct isl_basic_set *bset1,
-       struct isl_basic_set *bset2)
+int isl_basic_set_plain_is_disjoint(__isl_keep isl_basic_set *bset1,
+       __isl_keep isl_basic_set *bset2)
 {
-       return isl_basic_map_fast_is_disjoint((struct isl_basic_map *)bset1,
+       return isl_basic_map_plain_is_disjoint((struct isl_basic_map *)bset1,
                                              (struct isl_basic_map *)bset2);
 }
 
-int isl_map_fast_is_disjoint(struct isl_map *map1, struct isl_map *map2)
+int isl_map_plain_is_disjoint(__isl_keep isl_map *map1,
+       __isl_keep isl_map *map2)
 {
        int i, j;
 
        if (!map1 || !map2)
                return -1;
 
-       if (isl_map_fast_is_equal(map1, map2))
+       if (isl_map_plain_is_equal(map1, map2))
                return 0;
 
        for (i = 0; i < map1->n; ++i) {
                for (j = 0; j < map2->n; ++j) {
-                       int d = isl_basic_map_fast_is_disjoint(map1->p[i],
+                       int d = isl_basic_map_plain_is_disjoint(map1->p[i],
                                                               map2->p[j]);
                        if (d != 1)
                                return d;
@@ -2018,12 +2023,18 @@ int isl_map_fast_is_disjoint(struct isl_map *map1, struct isl_map *map2)
        return 1;
 }
 
-int isl_set_fast_is_disjoint(struct isl_set *set1, struct isl_set *set2)
+int isl_set_plain_is_disjoint(__isl_keep isl_set *set1,
+       __isl_keep isl_set *set2)
 {
-       return isl_map_fast_is_disjoint((struct isl_map *)set1,
+       return isl_map_plain_is_disjoint((struct isl_map *)set1,
                                        (struct isl_map *)set2);
 }
 
+int isl_set_fast_is_disjoint(__isl_keep isl_set *set1, __isl_keep isl_set *set2)
+{
+       return isl_set_plain_is_disjoint(set1, set2);
+}
+
 /* Check if we can combine a given div with lower bound l and upper
  * bound u with some other div and if so return that other div.
  * Otherwise return -1.