Merge branch 'maint'
[platform/upstream/isl.git] / isl_map_simplify.c
index 767ad22..03bdc73 100644 (file)
@@ -8,11 +8,12 @@
  */
 
 #include "isl_equalities.h"
-#include "isl_map.h"
+#include <isl/map.h>
 #include "isl_map_private.h"
-#include "isl_seq.h"
+#include <isl/seq.h>
 #include "isl_tab.h"
 #include <isl_dim_private.h>
+#include <isl_mat_private.h>
 
 static void swap_equality(struct isl_basic_map *bmap, int a, int b)
 {
@@ -392,6 +393,7 @@ static void eliminate_var_using_equality(struct isl_basic_map *bmap,
                if (progress)
                        *progress = 1;
                isl_seq_elim(bmap->eq[k], eq, 1+pos, 1+total, NULL);
+               isl_seq_normalize(bmap->ctx, bmap->eq[k], 1 + total);
        }
 
        for (k = 0; k < bmap->n_ineq; ++k) {
@@ -400,6 +402,7 @@ static void eliminate_var_using_equality(struct isl_basic_map *bmap,
                if (progress)
                        *progress = 1;
                isl_seq_elim(bmap->ineq[k], eq, 1+pos, 1+total, NULL);
+               isl_seq_normalize(bmap->ctx, bmap->ineq[k], 1 + total);
                ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
        }
 
@@ -1012,7 +1015,7 @@ static struct isl_basic_map *check_for_div_constraints(
 }
 
 static struct isl_basic_map *remove_duplicate_constraints(
-       struct isl_basic_map *bmap, int *progress)
+       struct isl_basic_map *bmap, int *progress, int detect_divs)
 {
        unsigned int size;
        isl_int ***index;
@@ -1055,8 +1058,9 @@ static struct isl_basic_map *remove_duplicate_constraints(
                l = index[h] - &bmap->ineq[0];
                isl_int_add(sum, bmap->ineq[k][0], bmap->ineq[l][0]);
                if (isl_int_is_pos(sum)) {
-                       bmap = check_for_div_constraints(bmap, k, l, sum,
-                                                        progress);
+                       if (detect_divs)
+                               bmap = check_for_div_constraints(bmap, k, l,
+                                                                sum, progress);
                        continue;
                }
                if (isl_int_is_zero(sum)) {
@@ -1094,7 +1098,7 @@ struct isl_basic_map *isl_basic_map_simplify(struct isl_basic_map *bmap)
                bmap = isl_basic_map_gauss(bmap, &progress);
                /* requires equalities in normal form */
                bmap = normalize_divs(bmap, &progress);
-               bmap = remove_duplicate_constraints(bmap, &progress);
+               bmap = remove_duplicate_constraints(bmap, &progress, 1);
        }
        return bmap;
 }
@@ -1337,7 +1341,7 @@ struct isl_basic_map *isl_basic_map_eliminate_vars(
                }
                if (n_lower > 0 && n_upper > 0) {
                        bmap = isl_basic_map_normalize_constraints(bmap);
-                       bmap = remove_duplicate_constraints(bmap, NULL);
+                       bmap = remove_duplicate_constraints(bmap, NULL, 0);
                        bmap = isl_basic_map_gauss(bmap, NULL);
                        bmap = isl_basic_map_remove_redundancies(bmap);
                        if (!bmap)
@@ -1867,11 +1871,17 @@ __isl_give isl_map *isl_map_gist_basic_map(__isl_take isl_map *map,
        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) {
+       for (i = map->n - 1; i >= 0; --i) {
                map->p[i] = isl_basic_map_gist(map->p[i],
                                                isl_basic_map_copy(context));
                if (!map->p[i])
                        goto error;
+               if (isl_basic_map_fast_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];
+                       map->n--;
+               }
        }
        isl_basic_map_free(context);
        ISL_F_CLR(map, ISL_MAP_NORMALIZED);
@@ -1885,6 +1895,7 @@ error:
 __isl_give isl_map *isl_map_gist(__isl_take isl_map *map,
        __isl_take isl_map *context)
 {
+       context = isl_map_compute_divs(context);
        return isl_map_gist_basic_map(map, isl_map_simple_hull(context));
 }
 
@@ -2254,7 +2265,7 @@ static struct isl_basic_map *drop_more_redundant_divs(
        if (remove < 0)
                return bmap;
 
-       bmap = isl_basic_map_remove(bmap, isl_dim_div, remove, 1);
+       bmap = isl_basic_map_remove_dims(bmap, isl_dim_div, remove, 1);
        return isl_basic_map_drop_redundant_divs(bmap);
 error:
        free(pairs);