isl_tab_pip.c: find_solutions: fix error handling
[platform/upstream/isl.git] / isl_ilp.c
index 3aa10bd..5548ffe 100644 (file)
--- a/isl_ilp.c
+++ b/isl_ilp.c
@@ -1,3 +1,12 @@
+/*
+ * Copyright 2008-2009 Katholieke Universiteit Leuven
+ *
+ * Use of this software is governed by the GNU LGPLv2.1 license
+ *
+ * Written by Sven Verdoolaege, K.U.Leuven, Departement
+ * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
+ */
+
 #include "isl_ilp.h"
 #include "isl_map_private.h"
 #include "isl_sample.h"
@@ -250,6 +259,7 @@ static enum isl_lp_result solve_ilp_with_eq(struct isl_basic_set *bset, int max,
        struct isl_mat *T = NULL;
        struct isl_vec *v;
 
+       bset = isl_basic_set_copy(bset);
        dim = isl_basic_set_total_dim(bset);
        v = isl_vec_alloc(bset->ctx, 1 + dim);
        if (!v)
@@ -261,12 +271,13 @@ static enum isl_lp_result solve_ilp_with_eq(struct isl_basic_set *bset, int max,
                goto error;
        res = isl_basic_set_solve_ilp(bset, max, v->el, opt, sol_p);
        isl_vec_free(v);
-       if (res == isl_lp_ok && *sol_p) {
+       if (res == isl_lp_ok && sol_p) {
                *sol_p = isl_mat_vec_product(T, *sol_p);
                if (!*sol_p)
                        res = isl_lp_error;
        } else
                isl_mat_free(T);
+       isl_basic_set_free(bset);
        return res;
 error:
        isl_mat_free(T);
@@ -296,6 +307,9 @@ enum isl_lp_result isl_basic_set_solve_ilp(struct isl_basic_set *bset, int max,
 
        isl_assert(bset->ctx, isl_basic_set_n_param(bset) == 0, goto error);
 
+       if (isl_basic_set_fast_is_empty(bset))
+               return isl_lp_empty;
+
        if (bset->n_eq)
                return solve_ilp_with_eq(bset, max, f, opt, sol_p);