X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=isl_map.c;h=62eb10822a65f293bbf5d60b342e7ded35fca18a;hb=0f3b90553d7323805e5b881c0b9e4e5579b011c6;hp=dd438b650fd2867677c4d5bca3ef24a5c89818af;hpb=c5a5b3912324a8f68af977baafb407c4d8fe95d1;p=platform%2Fupstream%2Fisl.git diff --git a/isl_map.c b/isl_map.c index dd438b6..62eb108 100644 --- a/isl_map.c +++ b/isl_map.c @@ -116,6 +116,8 @@ static void isl_dim_map_dump(struct isl_dim_map *dim_map) unsigned isl_basic_map_dim(const struct isl_basic_map *bmap, enum isl_dim_type type) { + if (!bmap) + return 0; switch (type) { case isl_dim_param: case isl_dim_in: @@ -162,12 +164,12 @@ unsigned isl_basic_set_dim(const struct isl_basic_set *bset, unsigned isl_basic_set_n_dim(const struct isl_basic_set *bset) { - return bset->dim->n_out; + return isl_basic_set_dim(bset, isl_dim_set); } unsigned isl_basic_set_n_param(const struct isl_basic_set *bset) { - return bset->dim->nparam; + return isl_basic_set_dim(bset, isl_dim_param); } unsigned isl_basic_set_total_dim(const struct isl_basic_set *bset) @@ -177,12 +179,12 @@ unsigned isl_basic_set_total_dim(const struct isl_basic_set *bset) unsigned isl_set_n_dim(const struct isl_set *set) { - return set->dim->n_out; + return isl_set_dim(set, isl_dim_set); } unsigned isl_set_n_param(const struct isl_set *set) { - return set->dim->nparam; + return isl_set_dim(set, isl_dim_param); } unsigned isl_basic_map_n_in(const struct isl_basic_map *bmap) @@ -340,39 +342,28 @@ static struct isl_basic_map *basic_map_init(struct isl_ctx *ctx, int i; size_t row_size = 1 + isl_dim_total(bmap->dim) + extra; + bmap->ctx = ctx; + isl_ctx_ref(ctx); + bmap->block = isl_blk_alloc(ctx, (n_ineq + n_eq) * row_size); - if (isl_blk_is_error(bmap->block)) { - free(bmap); - return NULL; - } + if (isl_blk_is_error(bmap->block)) + goto error; bmap->ineq = isl_alloc_array(ctx, isl_int *, n_ineq + n_eq); - if (!bmap->ineq) { - isl_blk_free(ctx, bmap->block); - free(bmap); - return NULL; - } + if (!bmap->ineq) + goto error; if (extra == 0) { bmap->block2 = isl_blk_empty(); bmap->div = NULL; } else { bmap->block2 = isl_blk_alloc(ctx, extra * (1 + row_size)); - if (isl_blk_is_error(bmap->block2)) { - free(bmap->ineq); - isl_blk_free(ctx, bmap->block); - free(bmap); - return NULL; - } + if (isl_blk_is_error(bmap->block2)) + goto error; bmap->div = isl_alloc_array(ctx, isl_int *, extra); - if (!bmap->div) { - isl_blk_free(ctx, bmap->block2); - free(bmap->ineq); - isl_blk_free(ctx, bmap->block); - free(bmap); - return NULL; - } + if (!bmap->div) + goto error; } for (i = 0; i < n_ineq + n_eq; ++i) @@ -381,8 +372,6 @@ static struct isl_basic_map *basic_map_init(struct isl_ctx *ctx, for (i = 0; i < extra; ++i) bmap->div[i] = bmap->block2.data + i * (1 + row_size); - bmap->ctx = ctx; - isl_ctx_ref(ctx); bmap->ref = 1; bmap->flags = 0; bmap->c_size = n_eq + n_ineq; @@ -394,6 +383,9 @@ static struct isl_basic_map *basic_map_init(struct isl_ctx *ctx, bmap->sample = NULL; return bmap; +error: + isl_basic_map_free(bmap); + return NULL; } struct isl_basic_set *isl_basic_set_alloc(struct isl_ctx *ctx, @@ -423,7 +415,7 @@ struct isl_basic_map *isl_basic_map_alloc_dim(struct isl_dim *dim, if (!dim) return NULL; - bmap = isl_alloc_type(dim->ctx, struct isl_basic_map); + bmap = isl_calloc_type(dim->ctx, struct isl_basic_map); if (!bmap) goto error; bmap->dim = dim; @@ -1050,10 +1042,13 @@ struct isl_basic_map *isl_basic_map_extend(struct isl_basic_map *base, return NULL; dim = isl_dim_alloc(base->ctx, nparam, n_in, n_out); if (!dim) - return NULL; + goto error; bmap = isl_basic_map_extend_dim(base, dim, extra, n_eq, n_ineq); return bmap; +error: + isl_basic_map_free(base); + return NULL; } struct isl_basic_set *isl_basic_set_extend(struct isl_basic_set *base, @@ -1776,10 +1771,10 @@ struct isl_basic_map *isl_basic_map_intersect_domain( isl_basic_map_compatible_domain(bmap, bset), goto error); bmap = isl_basic_map_cow(bmap); - bmap = isl_basic_map_extend_dim(bmap, isl_dim_copy(bmap->dim), - bset->n_div, bset->n_eq, bset->n_ineq); if (!bmap) goto error; + bmap = isl_basic_map_extend_dim(bmap, isl_dim_copy(bmap->dim), + bset->n_div, bset->n_eq, bset->n_ineq); dim = isl_dim_reverse(isl_dim_copy(bset->dim)); bmap_domain = isl_basic_map_from_basic_set(bset, dim); bmap = add_constraints(bmap, bmap_domain, 0, 0); @@ -1808,10 +1803,10 @@ struct isl_basic_map *isl_basic_map_intersect_range( isl_basic_map_compatible_range(bmap, bset), goto error); bmap = isl_basic_map_cow(bmap); - bmap = isl_basic_map_extend_dim(bmap, isl_dim_copy(bmap->dim), - bset->n_div, bset->n_eq, bset->n_ineq); if (!bmap) goto error; + bmap = isl_basic_map_extend_dim(bmap, isl_dim_copy(bmap->dim), + bset->n_div, bset->n_eq, bset->n_ineq); bmap_range = isl_basic_map_from_basic_set(bset, isl_dim_copy(bset->dim)); bmap = add_constraints(bmap, bmap_range, 0, 0); @@ -1898,7 +1893,9 @@ struct isl_basic_map *isl_basic_map_intersect( bmap2->n_div, bmap2->n_eq, bmap2->n_ineq); bmap1 = add_constraints(bmap1, bmap2, 0, 0); - if (sample) { + if (!bmap1) + isl_vec_free(sample); + else if (sample) { isl_vec_free(bmap1->sample); bmap1->sample = sample; } @@ -2401,6 +2398,8 @@ __isl_give isl_basic_map *isl_basic_map_project_out( bmap = move_last(bmap, type, first, n); bmap = isl_basic_map_cow(bmap); + if (!bmap) + return NULL; row_size = 1 + isl_dim_total(bmap->dim) + bmap->extra; old = bmap->block2.data; @@ -2477,7 +2476,7 @@ __isl_give isl_map *isl_map_project_out(__isl_take isl_map *map, return map; error: isl_map_free(map); - return map; + return NULL; } /* Turn the n dimensions of type type, starting at first @@ -5301,7 +5300,7 @@ int isl_basic_map_is_empty(struct isl_basic_map *bmap) if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL)) { struct isl_basic_map *copy = isl_basic_map_copy(bmap); - copy = isl_basic_map_convex_hull(copy); + copy = isl_basic_map_remove_redundancies(copy); empty = ISL_F_ISSET(copy, ISL_BASIC_MAP_EMPTY); isl_basic_map_free(copy); return empty; @@ -6029,7 +6028,7 @@ struct isl_basic_map *isl_basic_map_normalize(struct isl_basic_map *bmap) return NULL; if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_NORMALIZED)) return bmap; - bmap = isl_basic_map_convex_hull(bmap); + bmap = isl_basic_map_remove_redundancies(bmap); bmap = isl_basic_map_sort_constraints(bmap); ISL_F_SET(bmap, ISL_BASIC_MAP_NORMALIZED); return bmap; @@ -6041,8 +6040,8 @@ struct isl_basic_set *isl_basic_set_normalize(struct isl_basic_set *bset) (struct isl_basic_map *)bset); } -static int isl_basic_map_fast_cmp(const struct isl_basic_map *bmap1, - const struct isl_basic_map *bmap2) +int isl_basic_map_fast_cmp(const __isl_keep isl_basic_map *bmap1, + const __isl_keep isl_basic_map *bmap2) { int i, cmp; unsigned total; @@ -6087,8 +6086,8 @@ static int isl_basic_map_fast_cmp(const struct isl_basic_map *bmap1, return 0; } -static int isl_basic_map_fast_is_equal(struct isl_basic_map *bmap1, - struct isl_basic_map *bmap2) +int isl_basic_map_fast_is_equal(__isl_keep isl_basic_map *bmap1, + __isl_keep isl_basic_map *bmap2) { return isl_basic_map_fast_cmp(bmap1, bmap2) == 0; } @@ -6816,6 +6815,22 @@ int isl_map_is_single_valued(__isl_keep isl_map *map) return sv; } +int isl_map_is_bijective(__isl_keep isl_map *map) +{ + int sv; + + sv = isl_map_is_single_valued(map); + if (sv < 0 || !sv) + return sv; + + map = isl_map_copy(map); + map = isl_map_reverse(map); + sv = isl_map_is_single_valued(map); + isl_map_free(map); + + return sv; +} + int isl_set_is_singleton(__isl_keep isl_set *set) { return isl_map_is_single_valued((isl_map *)set);