add isl_schedule_node_schedule
[isl.git] / isl_lp.c
index e2757ce..5fe179a 100644 (file)
--- a/isl_lp.c
+++ b/isl_lp.c
 #include <bset_to_bmap.c>
 #include <set_to_map.c>
 
-enum isl_lp_result isl_tab_solve_lp(struct isl_basic_map *bmap, int maximize,
-                                     isl_int *f, isl_int denom, isl_int *opt,
-                                     isl_int *opt_denom,
-                                     struct isl_vec **sol)
+enum isl_lp_result isl_tab_solve_lp(__isl_keep isl_basic_map *bmap,
+       int maximize, isl_int *f, isl_int denom, isl_int *opt,
+       isl_int *opt_denom, __isl_give isl_vec **sol)
 {
        struct isl_tab *tab;
        enum isl_lp_result res;
-       unsigned dim = isl_basic_map_total_dim(bmap);
+       isl_size dim = isl_basic_map_dim(bmap, isl_dim_all);
 
+       if (dim < 0)
+               return isl_lp_error;
        if (maximize)
                isl_seq_neg(f, f, 1 + dim);
 
@@ -60,12 +61,11 @@ enum isl_lp_result isl_tab_solve_lp(struct isl_basic_map *bmap, int maximize,
  * If opt_denom is NULL, then *opt is rounded up (or down)
  * to the nearest integer.
  * The return value reflects the nature of the result (empty, unbounded,
- * minmimal or maximal value returned in *opt).
+ * minimal or maximal value returned in *opt).
  */
-enum isl_lp_result isl_basic_map_solve_lp(struct isl_basic_map *bmap, int max,
-                                     isl_int *f, isl_int d, isl_int *opt,
-                                     isl_int *opt_denom,
-                                     struct isl_vec **sol)
+enum isl_lp_result isl_basic_map_solve_lp(__isl_keep isl_basic_map *bmap,
+       int max, isl_int *f, isl_int d, isl_int *opt, isl_int *opt_denom,
+       __isl_give isl_vec **sol)
 {
        if (sol)
                *sol = NULL;
@@ -76,10 +76,9 @@ enum isl_lp_result isl_basic_map_solve_lp(struct isl_basic_map *bmap, int max,
        return isl_tab_solve_lp(bmap, max, f, d, opt, opt_denom, sol);
 }
 
-enum isl_lp_result isl_basic_set_solve_lp(struct isl_basic_set *bset, int max,
-                                     isl_int *f, isl_int d, isl_int *opt,
-                                     isl_int *opt_denom,
-                                     struct isl_vec **sol)
+enum isl_lp_result isl_basic_set_solve_lp(__isl_keep isl_basic_set *bset,
+       int max, isl_int *f, isl_int d, isl_int *opt, isl_int *opt_denom,
+       __isl_give isl_vec **sol)
 {
        return isl_basic_map_solve_lp(bset_to_bmap(bset), max,
                                        f, d, opt, opt_denom, sol);
@@ -88,7 +87,7 @@ enum isl_lp_result isl_basic_set_solve_lp(struct isl_basic_set *bset, int max,
 enum isl_lp_result isl_map_solve_lp(__isl_keep isl_map *map, int max,
                                      isl_int *f, isl_int d, isl_int *opt,
                                      isl_int *opt_denom,
-                                     struct isl_vec **sol)
+                                     __isl_give isl_vec **sol)
 {
        int i;
        isl_int o;
@@ -109,7 +108,9 @@ enum isl_lp_result isl_map_solve_lp(__isl_keep isl_map *map, int max,
                if (map->p[i]->n_div > max_div)
                        max_div = map->p[i]->n_div;
        if (max_div > 0) {
-               unsigned total = isl_space_dim(map->dim, isl_dim_all);
+               isl_size total = isl_map_dim(map, isl_dim_all);
+               if (total < 0)
+                       return isl_lp_error;
                v = isl_vec_alloc(map->ctx, 1 + total + max_div);
                if (!v)
                        return isl_lp_error;
@@ -197,7 +198,7 @@ done:
 enum isl_lp_result isl_set_solve_lp(__isl_keep isl_set *set, int max,
                                      isl_int *f, isl_int d, isl_int *opt,
                                      isl_int *opt_denom,
-                                     struct isl_vec **sol)
+                                     __isl_give isl_vec **sol)
 {
        return isl_map_solve_lp(set_to_map(set), max,
                                        f, d, opt, opt_denom, sol);
@@ -261,7 +262,7 @@ static __isl_give isl_val *isl_basic_set_opt_lp_val_aligned(
        isl_mat *bset_div = NULL;
        isl_mat *div = NULL;
        isl_val *res;
-       int bset_n_div, obj_n_div;
+       isl_size bset_n_div, obj_n_div;
 
        if (!bset || !obj)
                return NULL;
@@ -273,6 +274,8 @@ static __isl_give isl_val *isl_basic_set_opt_lp_val_aligned(
 
        bset_n_div = isl_basic_set_dim(bset, isl_dim_div);
        obj_n_div = isl_aff_dim(obj, isl_dim_div);
+       if (bset_n_div < 0 || obj_n_div < 0)
+               return NULL;
        if (bset_n_div == 0 && obj_n_div == 0)
                return basic_set_opt_lp(bset, max, obj);
 
@@ -320,13 +323,16 @@ error:
 static __isl_give isl_val *isl_basic_set_opt_lp_val(
        __isl_keep isl_basic_set *bset, int max, __isl_keep isl_aff *obj)
 {
+       isl_bool equal;
        isl_val *res;
 
        if (!bset || !obj)
                return NULL;
 
-       if (isl_space_match(bset->dim, isl_dim_param,
-                           obj->ls->dim, isl_dim_param))
+       equal = isl_basic_set_space_has_equal_params(bset, obj->ls->dim);
+       if (equal < 0)
+               return NULL;
+       if (equal)
                return isl_basic_set_opt_lp_val_aligned(bset, max, obj);
 
        bset = isl_basic_set_copy(bset);