if (!tab)
return NULL;
+ if (tab->bset) {
+ struct isl_basic_set *bset = tab->bset;
+
+ isl_assert(tab->mat->ctx, tab->n_eq == bset->n_eq, goto error);
+ isl_assert(tab->mat->ctx,
+ tab->n_con == bset->n_eq + bset->n_ineq, goto error);
+ tab->bset = isl_basic_set_add_ineq(tab->bset, ineq);
+ isl_tab_push(tab, isl_tab_undo_bset_ineq);
+ if (!tab->bset)
+ goto error;
+ }
r = isl_tab_add_row(tab, ineq);
if (r < 0)
goto error;
return NULL;
}
+static int add_zero_row(struct isl_tab *tab)
+{
+ int r;
+ isl_int *row;
+
+ r = isl_tab_allocate_con(tab);
+ if (r < 0)
+ return -1;
+
+ row = tab->mat->row[tab->con[r].index];
+ isl_seq_clr(row + 1, 1 + tab->M + tab->n_col);
+ isl_int_set_si(row[0], 1);
+
+ return r;
+}
+
/* Add equality "eq" and check if it conflicts with the
* previously added constraints or if it is obviously redundant.
*/
return tab;
}
+ if (tab->bset) {
+ tab->bset = isl_basic_set_add_ineq(tab->bset, eq);
+ isl_tab_push(tab, isl_tab_undo_bset_ineq);
+ isl_seq_neg(eq, eq, 1 + tab->n_var);
+ tab->bset = isl_basic_set_add_ineq(tab->bset, eq);
+ isl_seq_neg(eq, eq, 1 + tab->n_var);
+ isl_tab_push(tab, isl_tab_undo_bset_ineq);
+ if (!tab->bset)
+ goto error;
+ if (add_zero_row(tab) < 0)
+ goto error;
+ }
+
sgn = isl_int_sgn(tab->mat->row[row][1]);
if (sgn > 0) {
{
int r1, r2;
int row;
+ struct isl_tab_undo *snap;
if (!tab)
return NULL;
- if (tab->bset) {
- tab->bset = isl_basic_set_add_eq(tab->bset, eq);
- isl_tab_push(tab, isl_tab_undo_bset_eq);
- if (!tab->bset)
- goto error;
- }
+ snap = isl_tab_snap(tab);
r1 = isl_tab_add_row(tab, eq);
if (r1 < 0)
goto error;
if (!isl_int_is_zero(tab->mat->row[row][1]) ||
(tab->M && !isl_int_is_zero(tab->mat->row[row][2])))
return isl_tab_mark_empty(tab);
+ if (isl_tab_rollback(tab, snap) < 0)
+ goto error;
return tab;
}
}
}
+ if (tab->bset) {
+ tab->bset = isl_basic_set_add_ineq(tab->bset, eq);
+ isl_tab_push(tab, isl_tab_undo_bset_ineq);
+ isl_seq_neg(eq, eq, 1 + tab->n_var);
+ tab->bset = isl_basic_set_add_ineq(tab->bset, eq);
+ isl_seq_neg(eq, eq, 1 + tab->n_var);
+ isl_tab_push(tab, isl_tab_undo_bset_ineq);
+ if (!tab->bset)
+ goto error;
+ }
+
return tab;
error:
isl_tab_free(tab);