isl_tab_basic_map_partial_lexopt: detect and exploit simple symmetries
[platform/upstream/isl.git] / isl_sample.c
index 37bcebc..e12fb9c 100644 (file)
@@ -9,9 +9,9 @@
 
 #include "isl_sample.h"
 #include "isl_sample_piplib.h"
-#include "isl_vec.h"
-#include "isl_mat.h"
-#include "isl_seq.h"
+#include <isl/vec.h>
+#include <isl/mat.h>
+#include <isl/seq.h>
 #include "isl_map_private.h"
 #include "isl_equalities.h"
 #include "isl_tab.h"
@@ -61,6 +61,10 @@ static struct isl_vec *interval_sample(struct isl_basic_set *bset)
                return zero_sample(bset);
 
        sample = isl_vec_alloc(bset->ctx, 2);
+       if (!sample)
+               goto error;
+       if (!bset)
+               return NULL;
        isl_int_set_si(sample->block.data[0], 1);
 
        if (bset->n_eq > 0) {
@@ -504,7 +508,8 @@ struct isl_vec *isl_tab_sample(struct isl_tab *tab)
                        continue;
                }
                isl_int_neg(tab->basis->row[1 + level][0], min->el[level]);
-               tab = isl_tab_add_valid_eq(tab, tab->basis->row[1 + level]);
+               if (isl_tab_add_valid_eq(tab, tab->basis->row[1 + level]) < 0)
+                       goto error;
                isl_int_set_si(tab->basis->row[1 + level][0], 0);
                if (level + tab->n_unbounded < dim - 1) {
                        ++level;
@@ -777,7 +782,8 @@ static struct isl_vec *round_up_in_cone(struct isl_vec *vec,
 
        total = isl_basic_set_total_dim(cone);
        cone = isl_basic_set_preimage(cone, U);
-       cone = isl_basic_set_remove_dims(cone, 0, total - (vec->size - 1));
+       cone = isl_basic_set_remove_dims(cone, isl_dim_set,
+                                        0, total - (vec->size - 1));
 
        cone = shift_cone(cone, vec);
 
@@ -822,28 +828,6 @@ error:
        return NULL;
 }
 
-/* Drop all constraints in bset that involve any of the dimensions
- * first to first+n-1.
- */
-static struct isl_basic_set *drop_constraints_involving
-       (struct isl_basic_set *bset, unsigned first, unsigned n)
-{
-       int i;
-
-       if (!bset)
-               return NULL;
-
-       bset = isl_basic_set_cow(bset);
-
-       for (i = bset->n_ineq - 1; i >= 0; --i) {
-               if (isl_seq_first_non_zero(bset->ineq[i] + 1 + first, n) == -1)
-                       continue;
-               isl_basic_set_drop_inequality(bset, i);
-       }
-
-       return bset;
-}
-
 /* Give a basic set "bset" with recession cone "cone", compute and
  * return an integer point in bset, if any.
  *
@@ -909,7 +893,8 @@ __isl_give isl_vec *isl_basic_set_sample_with_cone(
        bset = isl_basic_set_preimage(bset, isl_mat_copy(U));
 
        bounded = isl_basic_set_copy(bset);
-       bounded = drop_constraints_involving(bounded, total - cone_dim, cone_dim);
+       bounded = isl_basic_set_drop_constraints_involving(bounded,
+                                                  total - cone_dim, cone_dim);
        bounded = isl_basic_set_drop_dims(bounded, total - cone_dim, cone_dim);
        sample = sample_bounded(bounded);
        if (!sample || sample->size == 0) {