X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=isl_map.c;h=54eb8ed3863798ade81c19508a181125b358f9a0;hb=77db762d5bcd0266848d0a8def7c060335acf495;hp=5bc1ad28b0f6b48733f79d5e66ee0ad9a7c68af7;hpb=006eb0f667ad09902b7d83a64d47dbe11d40a548;p=platform%2Fupstream%2Fisl.git diff --git a/isl_map.c b/isl_map.c index 5bc1ad2..54eb8ed 100644 --- a/isl_map.c +++ b/isl_map.c @@ -610,7 +610,7 @@ static void constraint_drop_vars(isl_int *c, unsigned n, unsigned rem) isl_seq_clr(c + rem, n); } -struct isl_basic_set *isl_basic_set_drop_vars( +struct isl_basic_set *isl_basic_set_drop_dims( struct isl_basic_set *bset, unsigned first, unsigned n) { int i; @@ -648,7 +648,7 @@ error: return NULL; } -struct isl_set *isl_set_drop_vars( +static struct isl_set *isl_set_drop_dims( struct isl_set *set, unsigned first, unsigned n) { int i; @@ -665,7 +665,7 @@ struct isl_set *isl_set_drop_vars( goto error; for (i = 0; i < set->n; ++i) { - set->p[i] = isl_basic_set_drop_vars(set->p[i], first, n); + set->p[i] = isl_basic_set_drop_dims(set->p[i], first, n); if (!set->p[i]) goto error; } @@ -1222,6 +1222,33 @@ struct isl_basic_set *isl_basic_set_eliminate_vars( (struct isl_basic_map *)bset, pos, n); } +/* Project out n dimensions starting at first using Fourier-Motzkin */ +struct isl_set *isl_set_remove_dims(struct isl_set *set, + unsigned first, unsigned n) +{ + int i; + + if (n == 0) + return set; + + set = isl_set_cow(set); + if (!set) + return NULL; + isl_assert(set->ctx, first+n <= set->dim, goto error); + + for (i = 0; i < set->n; ++i) { + set->p[i] = isl_basic_set_eliminate_vars(set->p[i], + set->nparam + first, n); + if (!set->p[i]) + goto error; + } + set = isl_set_drop_dims(set, first, n); + return set; +error: + isl_set_free(set); + return NULL; +} + /* Elimininate divs based on inequalities */ static struct isl_basic_map *eliminate_divs_ineq( @@ -2094,6 +2121,38 @@ struct isl_basic_set *isl_basic_set_from_underlying_set( isl_basic_map_overlying_set(bset, (struct isl_basic_map *)like); } +struct isl_set *isl_set_from_underlying_set( + struct isl_set *set, struct isl_basic_set *like) +{ + int i; + + if (!set || !like) + goto error; + isl_assert(set->ctx, set->dim == like->nparam + like->dim + like->n_div, + goto error); + if (like->nparam == 0 && like->n_div == 0) { + isl_basic_set_free(like); + return set; + } + set = isl_set_cow(set); + if (!set) + goto error; + for (i = 0; i < set->n; ++i) { + set->p[i] = isl_basic_set_from_underlying_set(set->p[i], + isl_basic_set_copy(like)); + if (!set->p[i]) + goto error; + } + set->nparam = like->nparam; + set->dim = like->dim; + isl_basic_set_free(like); + return set; +error: + isl_basic_set_free(like); + isl_set_free(set); + return NULL; +} + struct isl_set *isl_map_underlying_set(struct isl_map *map) { int i; @@ -2121,6 +2180,11 @@ error: return NULL; } +struct isl_set *isl_set_to_underlying_set(struct isl_set *set) +{ + return (struct isl_set *)isl_map_underlying_set((struct isl_map *)set); +} + struct isl_basic_set *isl_basic_map_domain(struct isl_basic_map *bmap) { struct isl_basic_set *domain;