isl_map_simplify.c: separate out isl_basic_map_is_div_constraint
[platform/upstream/isl.git] / isl_map_simplify.c
index 18daf94..4775efa 100644 (file)
@@ -854,6 +854,8 @@ static struct isl_basic_map *normalize_divs(
        }
        isl_int_clear(v);
        pos = isl_alloc_array(bmap->ctx, int, T->n_row);
+       if (!pos)
+               goto error;
        /* We have to be careful because dropping equalities may reorder them */
        dropped = 0;
        for (j = bmap->n_div - 1; j >= 0; --j) {
@@ -1103,6 +1105,43 @@ struct isl_basic_set *isl_basic_set_simplify(struct isl_basic_set *bset)
 }
 
 
+int isl_basic_map_is_div_constraint(__isl_keep isl_basic_map *bmap,
+       isl_int *constraint, unsigned div)
+{
+       unsigned pos;
+
+       if (!bmap)
+               return -1;
+
+       pos = 1 + isl_dim_total(bmap->dim) + div;
+
+       if (isl_int_eq(constraint[pos], bmap->div[div][0])) {
+               int neg;
+               isl_int_sub(bmap->div[div][1],
+                               bmap->div[div][1], bmap->div[div][0]);
+               isl_int_add_ui(bmap->div[div][1], bmap->div[div][1], 1);
+               neg = isl_seq_is_neg(constraint, bmap->div[div]+1, pos);
+               isl_int_sub_ui(bmap->div[div][1], bmap->div[div][1], 1);
+               isl_int_add(bmap->div[div][1],
+                               bmap->div[div][1], bmap->div[div][0]);
+               if (!neg)
+                       return 0;
+               if (isl_seq_first_non_zero(constraint+pos+1,
+                                           bmap->n_div-div-1) != -1)
+                       return 0;
+       } else if (isl_int_abs_eq(constraint[pos], bmap->div[div][0])) {
+               if (!isl_seq_eq(constraint, bmap->div[div]+1, pos))
+                       return 0;
+               if (isl_seq_first_non_zero(constraint+pos+1,
+                                           bmap->n_div-div-1) != -1)
+                       return 0;
+       } else
+               return 0;
+
+       return 1;
+}
+
+
 /* If the only constraints a div d=floor(f/m)
  * appears in are its two defining constraints
  *
@@ -1123,27 +1162,7 @@ static int div_is_redundant(struct isl_basic_map *bmap, int div)
        for (i = 0; i < bmap->n_ineq; ++i) {
                if (isl_int_is_zero(bmap->ineq[i][pos]))
                        continue;
-               if (isl_int_eq(bmap->ineq[i][pos], bmap->div[div][0])) {
-                       int neg;
-                       isl_int_sub(bmap->div[div][1],
-                                       bmap->div[div][1], bmap->div[div][0]);
-                       isl_int_add_ui(bmap->div[div][1], bmap->div[div][1], 1);
-                       neg = isl_seq_is_neg(bmap->ineq[i], bmap->div[div]+1, pos);
-                       isl_int_sub_ui(bmap->div[div][1], bmap->div[div][1], 1);
-                       isl_int_add(bmap->div[div][1],
-                                       bmap->div[div][1], bmap->div[div][0]);
-                       if (!neg)
-                               return 0;
-                       if (isl_seq_first_non_zero(bmap->ineq[i]+pos+1,
-                                                   bmap->n_div-div-1) != -1)
-                               return 0;
-               } else if (isl_int_abs_eq(bmap->ineq[i][pos], bmap->div[div][0])) {
-                       if (!isl_seq_eq(bmap->ineq[i], bmap->div[div]+1, pos))
-                               return 0;
-                       if (isl_seq_first_non_zero(bmap->ineq[i]+pos+1,
-                                                   bmap->n_div-div-1) != -1)
-                               return 0;
-               } else
+               if (!isl_basic_map_is_div_constraint(bmap, bmap->ineq[i], div))
                        return 0;
        }
 
@@ -1319,7 +1338,7 @@ struct isl_basic_map *isl_basic_map_eliminate_vars(
                        bmap = isl_basic_map_normalize_constraints(bmap);
                        bmap = remove_duplicate_constraints(bmap, NULL);
                        bmap = isl_basic_map_gauss(bmap, NULL);
-                       bmap = isl_basic_map_convex_hull(bmap);
+                       bmap = isl_basic_map_remove_redundancies(bmap);
                        if (!bmap)
                                goto error;
                        if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY))
@@ -1806,8 +1825,8 @@ struct isl_basic_map *isl_basic_map_gist(struct isl_basic_map *bmap,
                return bmap;
        }
 
-       bmap = isl_basic_map_convex_hull(bmap);
-       context = isl_basic_map_convex_hull(context);
+       bmap = isl_basic_map_remove_redundancies(bmap);
+       context = isl_basic_map_remove_redundancies(context);
 
        if (context->n_eq)
                bmap = normalize_divs_in_context(bmap, context);
@@ -1847,7 +1866,7 @@ __isl_give isl_map *isl_map_gist_basic_map(__isl_take isl_map *map,
                return isl_map_universe(dim);
        }
 
-       context = isl_basic_map_convex_hull(context);
+       context = isl_basic_map_remove_redundancies(context);
        map = isl_map_cow(map);
        if (!map || !context)
                goto error;;