isl_tab_select_facet: return int instead of isl_tab *
authorSven Verdoolaege <skimo@kotnet.org>
Tue, 25 May 2010 11:22:51 +0000 (13:22 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Sat, 12 Jun 2010 11:16:36 +0000 (13:16 +0200)
isl_coalesce.c
isl_tab.c
isl_tab.h

index 73f44ed..39b6d12 100644 (file)
@@ -270,7 +270,8 @@ static int check_facets(struct isl_map *map, int i, int j,
        for (k = 0; k < map->p[i]->n_ineq; ++k) {
                if (ineq_i[k] != STATUS_CUT)
                        continue;
-               tabs[i] = isl_tab_select_facet(tabs[i], n_eq + k);
+               if (isl_tab_select_facet(tabs[i], n_eq + k) < 0)
+                       return -1;
                for (l = 0; l < map->p[j]->n_ineq; ++l) {
                        int stat;
                        if (ineq_j[l] != STATUS_CUT)
@@ -395,7 +396,8 @@ static int is_extension(struct isl_map *map, int i, int j, int k,
        snap = isl_tab_snap(tabs[i]);
        tabs[i] = isl_tab_relax(tabs[i], n_eq + k);
        snap2 = isl_tab_snap(tabs[i]);
-       tabs[i] = isl_tab_select_facet(tabs[i], n_eq + k);
+       if (isl_tab_select_facet(tabs[i], n_eq + k) < 0)
+               return -1;
        super = contains(map, j, ineq_j, tabs[i]);
        if (super) {
                if (isl_tab_rollback(tabs[i], snap2) < 0)
@@ -582,7 +584,8 @@ static int can_wrap_in_facet(struct isl_map *map, int i, int j, int k,
 
        snap = isl_tab_snap(tabs[i]);
 
-       tabs[i] = isl_tab_select_facet(tabs[i], map->p[i]->n_eq + k);
+       if (isl_tab_select_facet(tabs[i], map->p[i]->n_eq + k) < 0)
+               goto error;
        if (isl_tab_detect_redundant(tabs[i]) < 0)
                goto error;
 
@@ -700,8 +703,8 @@ static int wrap_in_facets(struct isl_map *map, int i, int j,
        wraps->n_row = 0;
 
        for (k = 0; k < n; ++k) {
-               tabs[i] = isl_tab_select_facet(tabs[i],
-                                               map->p[i]->n_eq + cuts[k]);
+               if (isl_tab_select_facet(tabs[i], map->p[i]->n_eq + cuts[k]) < 0)
+                       goto error;
                if (isl_tab_detect_redundant(tabs[i]) < 0)
                        goto error;
                set_is_redundant(tabs[i], map->p[i]->n_eq, cuts, n, k, 1);
index 7792fea..b43e318 100644 (file)
--- a/isl_tab.c
+++ b/isl_tab.c
@@ -2351,8 +2351,7 @@ struct isl_basic_set *isl_basic_set_update_from_tab(struct isl_basic_set *bset,
  * the resulting tableau is empty.
  * Otherwise, we know the value will be zero and we close the row.
  */
-static struct isl_tab *cut_to_hyperplane(struct isl_tab *tab,
-       struct isl_tab_var *var)
+static int cut_to_hyperplane(struct isl_tab *tab, struct isl_tab_var *var)
 {
        unsigned r;
        isl_int *row;
@@ -2360,12 +2359,12 @@ static struct isl_tab *cut_to_hyperplane(struct isl_tab *tab,
        unsigned off = 2 + tab->M;
 
        if (var->is_zero)
-               return tab;
-       isl_assert(tab->mat->ctx, !var->is_redundant, goto error);
-       isl_assert(tab->mat->ctx, var->is_nonneg, goto error);
+               return 0;
+       isl_assert(tab->mat->ctx, !var->is_redundant, return -1);
+       isl_assert(tab->mat->ctx, var->is_nonneg, return -1);
 
        if (isl_tab_extend_cons(tab, 1) < 0)
-               goto error;
+               return -1;
 
        r = tab->n_con;
        tab->con[r].index = tab->n_row;
@@ -2391,27 +2390,24 @@ static struct isl_tab *cut_to_hyperplane(struct isl_tab *tab,
        tab->n_row++;
        tab->n_con++;
        if (isl_tab_push_var(tab, isl_tab_undo_allocate, &tab->con[r]) < 0)
-               goto error;
+               return -1;
 
        sgn = sign_of_max(tab, &tab->con[r]);
        if (sgn < -1)
-               goto error;
+               return -1;
        if (sgn < 0) {
                if (isl_tab_mark_empty(tab) < 0)
-                       goto error;
-               return tab;
+                       return -1;
+               return 0;
        }
        tab->con[r].is_nonneg = 1;
        if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
-               goto error;
+               return -1;
        /* sgn == 0 */
        if (close_row(tab, &tab->con[r]) < 0)
-               goto error;
+               return -1;
 
-       return tab;
-error:
-       isl_tab_free(tab);
-       return NULL;
+       return 0;
 }
 
 /* Given a tableau "tab" and an inequality constraint "con" of the tableau,
@@ -2474,10 +2470,10 @@ error:
        return NULL;
 }
 
-struct isl_tab *isl_tab_select_facet(struct isl_tab *tab, int con)
+int isl_tab_select_facet(struct isl_tab *tab, int con)
 {
        if (!tab)
-               return NULL;
+               return -1;
 
        return cut_to_hyperplane(tab, &tab->con[con]);
 }
@@ -2560,7 +2556,8 @@ struct isl_tab *isl_tab_detect_implicit_equalities(struct isl_tab *tab)
                        if (close_row(tab, var) < 0)
                                goto error;
                } else if (!tab->rational && !at_least_one(tab, var)) {
-                       tab = cut_to_hyperplane(tab, var);
+                       if (cut_to_hyperplane(tab, var) < 0)
+                               goto error;
                        return isl_tab_detect_implicit_equalities(tab);
                }
                for (i = tab->n_redundant; i < tab->n_row; ++i) {
index 71bc520..e53077c 100644 (file)
--- a/isl_tab.h
+++ b/isl_tab.h
@@ -221,7 +221,7 @@ struct isl_tab_undo *isl_tab_snap(struct isl_tab *tab);
 int isl_tab_rollback(struct isl_tab *tab, struct isl_tab_undo *snap) WARN_UNUSED;
 
 struct isl_tab *isl_tab_relax(struct isl_tab *tab, int con) WARN_UNUSED;
-struct isl_tab *isl_tab_select_facet(struct isl_tab *tab, int con) WARN_UNUSED;
+int isl_tab_select_facet(struct isl_tab *tab, int con) WARN_UNUSED;
 
 void isl_tab_dump(struct isl_tab *tab, FILE *out, int indent);