X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=isl_affine_hull.c;h=e71bc104b417ff8c58461061cf75bfb23cdf4ea4;hb=9f82ab3cd18ac34f883c30594111e4eb17426e11;hp=250195bed62f5fc0eb2dc16d9cd7e1de9f37191d;hpb=747237f4a946ad88d45822eb281dc70665b81a76;p=platform%2Fupstream%2Fisl.git diff --git a/isl_affine_hull.c b/isl_affine_hull.c index 250195b..e71bc10 100644 --- a/isl_affine_hull.c +++ b/isl_affine_hull.c @@ -1,7 +1,7 @@ /* * Copyright 2008-2009 Katholieke Universiteit Leuven * - * Use of this software is governed by the GNU LGPLv2.1 license + * Use of this software is governed by the MIT license * * Written by Sven Verdoolaege, K.U.Leuven, Departement * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium @@ -487,35 +487,172 @@ error: return NULL; } +/* Drop all constraints in bmap that involve any of the dimensions + * first to first+n-1. + */ +static __isl_give isl_basic_map *isl_basic_map_drop_constraints_involving( + __isl_take isl_basic_map *bmap, unsigned first, unsigned n) +{ + int i; + + if (n == 0) + return bmap; + + bmap = isl_basic_map_cow(bmap); + + if (!bmap) + return NULL; + + for (i = bmap->n_eq - 1; i >= 0; --i) { + if (isl_seq_first_non_zero(bmap->eq[i] + 1 + first, n) == -1) + continue; + isl_basic_map_drop_equality(bmap, i); + } + + for (i = bmap->n_ineq - 1; i >= 0; --i) { + if (isl_seq_first_non_zero(bmap->ineq[i] + 1 + first, n) == -1) + continue; + isl_basic_map_drop_inequality(bmap, i); + } + + return bmap; +} + /* Drop all constraints in bset that involve any of the dimensions * first to first+n-1. */ __isl_give isl_basic_set *isl_basic_set_drop_constraints_involving( __isl_take isl_basic_set *bset, unsigned first, unsigned n) { + return isl_basic_map_drop_constraints_involving(bset, first, n); +} + +/* Drop all constraints in bmap that do not involve any of the dimensions + * first to first + n - 1 of the given type. + */ +__isl_give isl_basic_map *isl_basic_map_drop_constraints_not_involving_dims( + __isl_take isl_basic_map *bmap, + enum isl_dim_type type, unsigned first, unsigned n) +{ int i; + unsigned dim; if (n == 0) - return bset; + return isl_basic_map_set_to_empty(bmap); + bmap = isl_basic_map_cow(bmap); + if (!bmap) + return NULL; - bset = isl_basic_set_cow(bset); + dim = isl_basic_map_dim(bmap, type); + if (first + n > dim || first + n < first) + isl_die(isl_basic_map_get_ctx(bmap), isl_error_invalid, + "index out of bounds", return isl_basic_map_free(bmap)); - if (!bset) - return NULL; + first += isl_basic_map_offset(bmap, type) - 1; - for (i = bset->n_eq - 1; i >= 0; --i) { - if (isl_seq_first_non_zero(bset->eq[i] + 1 + first, n) == -1) + for (i = bmap->n_eq - 1; i >= 0; --i) { + if (isl_seq_first_non_zero(bmap->eq[i] + 1 + first, n) != -1) continue; - isl_basic_set_drop_equality(bset, i); + isl_basic_map_drop_equality(bmap, i); } - for (i = bset->n_ineq - 1; i >= 0; --i) { - if (isl_seq_first_non_zero(bset->ineq[i] + 1 + first, n) == -1) + for (i = bmap->n_ineq - 1; i >= 0; --i) { + if (isl_seq_first_non_zero(bmap->ineq[i] + 1 + first, n) != -1) continue; - isl_basic_set_drop_inequality(bset, i); + isl_basic_map_drop_inequality(bmap, i); } - return bset; + return bmap; +} + +/* Drop all constraints in bset that do not involve any of the dimensions + * first to first + n - 1 of the given type. + */ +__isl_give isl_basic_set *isl_basic_set_drop_constraints_not_involving_dims( + __isl_take isl_basic_set *bset, + enum isl_dim_type type, unsigned first, unsigned n) +{ + return isl_basic_map_drop_constraints_not_involving_dims(bset, + type, first, n); +} + +/* Drop all constraints in bmap that involve any of the dimensions + * first to first + n - 1 of the given type. + */ +__isl_give isl_basic_map *isl_basic_map_drop_constraints_involving_dims( + __isl_take isl_basic_map *bmap, + enum isl_dim_type type, unsigned first, unsigned n) +{ + unsigned dim; + + if (!bmap) + return NULL; + if (n == 0) + return bmap; + + dim = isl_basic_map_dim(bmap, type); + if (first + n > dim || first + n < first) + isl_die(isl_basic_map_get_ctx(bmap), isl_error_invalid, + "index out of bounds", return isl_basic_map_free(bmap)); + + bmap = isl_basic_map_remove_divs_involving_dims(bmap, type, first, n); + first += isl_basic_map_offset(bmap, type) - 1; + return isl_basic_map_drop_constraints_involving(bmap, first, n); +} + +/* Drop all constraints in bset that involve any of the dimensions + * first to first + n - 1 of the given type. + */ +__isl_give isl_basic_set *isl_basic_set_drop_constraints_involving_dims( + __isl_take isl_basic_set *bset, + enum isl_dim_type type, unsigned first, unsigned n) +{ + return isl_basic_map_drop_constraints_involving_dims(bset, + type, first, n); +} + +/* Drop all constraints in map that involve any of the dimensions + * first to first + n - 1 of the given type. + */ +__isl_give isl_map *isl_map_drop_constraints_involving_dims( + __isl_take isl_map *map, + enum isl_dim_type type, unsigned first, unsigned n) +{ + int i; + unsigned dim; + + if (!map) + return NULL; + if (n == 0) + return map; + + dim = isl_map_dim(map, type); + if (first + n > dim || first + n < first) + isl_die(isl_map_get_ctx(map), isl_error_invalid, + "index out of bounds", return isl_map_free(map)); + + map = isl_map_cow(map); + if (!map) + return NULL; + + for (i = 0; i < map->n; ++i) { + map->p[i] = isl_basic_map_drop_constraints_involving_dims( + map->p[i], type, first, n); + if (!map->p[i]) + return isl_map_free(map); + } + + return map; +} + +/* Drop all constraints in set that involve any of the dimensions + * first to first + n - 1 of the given type. + */ +__isl_give isl_set *isl_set_drop_constraints_involving_dims( + __isl_take isl_set *set, + enum isl_dim_type type, unsigned first, unsigned n) +{ + return isl_map_drop_constraints_involving_dims(set, type, first, n); } /* Construct an initial underapproximatino of the hull of "bset" @@ -668,7 +805,7 @@ struct isl_tab *isl_tab_detect_equalities(struct isl_tab *tab, { int j; struct isl_vec *sample; - struct isl_basic_set *hull; + struct isl_basic_set *hull = NULL; struct isl_tab_undo *snap; if (!tab || !tab_cone) @@ -733,6 +870,7 @@ struct isl_tab *isl_tab_detect_equalities(struct isl_tab *tab, return tab; error: + isl_basic_set_free(hull); isl_tab_free(tab); return NULL; } @@ -803,9 +941,10 @@ static struct isl_basic_set *affine_hull_with_cone(struct isl_basic_set *bset, hull = uset_affine_hull_bounded(bset); - if (!hull) + if (!hull) { + isl_mat_free(Q); isl_mat_free(U); - else { + } else { struct isl_vec *sample = isl_vec_copy(hull->sample); U = isl_mat_drop_cols(U, 1 + total - cone_dim, cone_dim); if (sample && sample->size > 0) @@ -925,6 +1064,7 @@ static struct isl_basic_set *equalities_in_underlying_set( return hull; error: + isl_mat_free(T1); isl_mat_free(T2); isl_basic_set_free(bset); isl_basic_set_free(hull);