* Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
*/
-#include "isl_ctx.h"
-#include "isl_seq.h"
-#include "isl_set.h"
-#include "isl_lp.h"
-#include "isl_map.h"
-#include "isl_map_private.h"
+#include <isl_ctx_private.h>
+#include <isl_map_private.h>
+#include <isl/seq.h>
+#include <isl/set.h>
+#include <isl/lp.h>
+#include <isl/map.h>
#include "isl_equalities.h"
#include "isl_sample.h"
#include "isl_tab.h"
+#include <isl_mat_private.h>
struct isl_basic_map *isl_basic_map_implicit_equalities(
struct isl_basic_map *bmap)
return bmap;
tab = isl_tab_from_basic_map(bmap);
- tab = isl_tab_detect_implicit_equalities(tab);
+ if (isl_tab_detect_implicit_equalities(tab) < 0)
+ goto error;
bmap = isl_basic_map_update_from_tab(bmap, tab);
isl_tab_free(tab);
bmap = isl_basic_map_gauss(bmap, NULL);
ISL_F_SET(bmap, ISL_BASIC_MAP_NO_IMPLICIT);
return bmap;
+error:
+ isl_tab_free(tab);
+ isl_basic_map_free(bmap);
+ return NULL;
}
struct isl_basic_set *isl_basic_set_implicit_equalities(
int col;
int row;
+ if (!bset1 || !bset2)
+ goto error;
+
total = 1 + isl_basic_set_n_dim(bset1);
row = 0;
--row;
}
}
- isl_basic_set_free(bset2);
isl_assert(bset1->ctx, row == bset1->n_eq, goto error);
+ isl_basic_set_free(bset2);
bset1 = isl_basic_set_normalize_constraints(bset1);
return bset1;
error:
isl_basic_set_free(bset1);
+ isl_basic_set_free(bset2);
return NULL;
}
struct isl_vec *sample = NULL;
struct isl_tab_undo *snap;
unsigned dim;
- int k;
if (!tab)
return NULL;
if (!up)
isl_seq_neg(eq, eq, 1 + dim);
- if (isl_tab_rollback(tab, snap) < 0)
+ if (sample && isl_tab_rollback(tab, snap) < 0)
goto error;
return sample;
static struct isl_basic_set *extend_affine_hull(struct isl_tab *tab,
struct isl_basic_set *hull)
{
- int i, j, k;
+ int i, j;
unsigned dim;
if (!tab || !hull)
break;
isl_vec_free(sample);
- tab = isl_tab_add_eq(tab, hull->eq[j]);
- if (!tab)
+ if (isl_tab_add_eq(tab, hull->eq[j]) < 0)
goto error;
}
if (j == hull->n_eq)
goto error;
point = isl_basic_set_from_vec(sample);
hull = affine_hull(hull, point);
+ if (!hull)
+ return NULL;
}
return hull;
/* 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)
+__isl_give isl_basic_set *isl_basic_set_drop_constraints_involving(
+ __isl_take isl_basic_set *bset, unsigned first, unsigned n)
{
int i;
- if (!bset)
- return NULL;
+ if (n == 0)
+ return bset;
bset = isl_basic_set_cow(bset);
+ if (!bset)
+ return NULL;
+
for (i = bset->n_eq - 1; i >= 0; --i) {
if (isl_seq_first_non_zero(bset->eq[i] + 1 + first, n) == -1)
continue;
}
/* Given an unbounded tableau and an integer point satisfying the tableau,
- * construct an intial affine hull containing the recession cone
+ * construct an initial affine hull containing the recession cone
* shifted to the given point.
*
* The unbounded directions are taken from the last rows of the basis,
* isl_tab_set_initial_basis_with_cone will add some additional
* constraints to the tableau that have to be removed again.
* In this case, we therefore rollback to the state before
- * any constraints were added and then add the eqaulities back in.
+ * any constraints were added and then add the equalities back in.
*/
struct isl_tab *isl_tab_detect_equalities(struct isl_tab *tab,
struct isl_tab *tab_cone)
if (hull->n_eq > tab->n_zero) {
for (j = 0; j < hull->n_eq; ++j) {
isl_seq_normalize(tab->mat->ctx, hull->eq[j], 1 + tab->n_var);
- tab = isl_tab_add_eq(tab, hull->eq[j]);
+ if (isl_tab_add_eq(tab, hull->eq[j]) < 0)
+ goto error;
}
}
U = isl_mat_lin_to_aff(U);
bset = isl_basic_set_preimage(bset, isl_mat_copy(U));
- bset = drop_constraints_involving(bset, total - cone_dim, cone_dim);
+ bset = isl_basic_set_drop_constraints_involving(bset, total - cone_dim,
+ cone_dim);
bset = isl_basic_set_drop_dims(bset, total - cone_dim, cone_dim);
Q = isl_mat_lin_to_aff(Q);
else
isl_mat_free(U);
hull = isl_basic_set_preimage(hull, Q);
- isl_vec_free(hull->sample);
- hull->sample = sample;
+ if (hull) {
+ isl_vec_free(hull->sample);
+ hull->sample = sample;
+ } else
+ isl_vec_free(sample);
}
isl_basic_set_free(cone);
if (!T2)
return hull;
- if (!hull)
+ if (!hull) {
isl_mat_free(T1);
- else {
+ isl_mat_free(T2);
+ } else {
struct isl_vec *sample = isl_vec_copy(hull->sample);
if (sample && sample->size > 0)
sample = isl_mat_vec_product(T1, sample);
else
isl_mat_free(T1);
hull = isl_basic_set_preimage(hull, T2);
- isl_vec_free(hull->sample);
- hull->sample = sample;
+ if (hull) {
+ isl_vec_free(hull->sample);
+ hull->sample = sample;
+ } else
+ isl_vec_free(sample);
}
return hull;
{
bmap = isl_basic_map_detect_equalities(bmap);
bmap = isl_basic_map_cow(bmap);
- isl_basic_map_free_inequality(bmap, bmap->n_ineq);
+ if (bmap)
+ isl_basic_map_free_inequality(bmap, bmap->n_ineq);
+ bmap = isl_basic_map_finalize(bmap);
return bmap;
}