X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=isl_map.c;h=561f1c655d181a1cff23eed04d743fe4104ec58b;hb=19596bc4e5cd282b2e75d17077b1aaaeacbfd6f9;hp=5f55931bc2f345c4c757fc3d28e5f96d4bfa68d1;hpb=85df9e660b4ce2510d849facd3e08ff1aab4c6b4;p=platform%2Fupstream%2Fisl.git diff --git a/isl_map.c b/isl_map.c index 5f55931..561f1c6 100644 --- a/isl_map.c +++ b/isl_map.c @@ -2728,6 +2728,9 @@ int isl_basic_map_contains(struct isl_basic_map *bmap, struct isl_vec *vec) unsigned total; isl_int s; + if (!bmap || !vec) + return -1; + total = 1 + isl_basic_map_total_dim(bmap); if (total != vec->size) return -1; @@ -3852,6 +3855,26 @@ error: return NULL; } +/* Given a map A -> f(A) and an integer d, construct a map + * A -> floor(f(A)/d). + */ +__isl_give isl_map *isl_map_floordiv_val(__isl_take isl_map *map, + __isl_take isl_val *d) +{ + if (!map || !d) + goto error; + if (!isl_val_is_int(d)) + isl_die(isl_val_get_ctx(d), isl_error_invalid, + "expecting integer denominator", goto error); + map = isl_map_floordiv(map, d->n); + isl_val_free(d); + return map; +error: + isl_map_free(map); + isl_val_free(d); + return NULL; +} + static struct isl_basic_map *var_equal(struct isl_basic_map *bmap, unsigned pos) { int i; @@ -8047,6 +8070,8 @@ struct isl_basic_map *isl_basic_map_align_divs( src = isl_basic_map_order_divs(src); dst = isl_basic_map_cow(dst); + if (!dst) + return NULL; dst = isl_basic_map_extend_space(dst, isl_space_copy(dst->dim), src->n_div, 0, 2 * src->n_div); if (!dst) @@ -8094,8 +8119,11 @@ struct isl_map *isl_map_align_divs(struct isl_map *map) for (i = 1; i < map->n; ++i) map->p[0] = isl_basic_map_align_divs(map->p[0], map->p[i]); - for (i = 1; i < map->n; ++i) + for (i = 1; i < map->n; ++i) { map->p[i] = isl_basic_map_align_divs(map->p[i], map->p[0]); + if (!map->p[i]) + return isl_map_free(map); + } ISL_F_CLR(map, ISL_MAP_NORMALIZED); return map; @@ -8443,6 +8471,35 @@ int isl_basic_map_plain_is_fixed(__isl_keep isl_basic_map *bmap, isl_basic_map_offset(bmap, type) - 1 + pos, val); } +/* If "bmap" obviously lies on a hyperplane where the given dimension + * has a fixed value, then return that value. + * Otherwise return NaN. + */ +__isl_give isl_val *isl_basic_map_plain_get_val_if_fixed( + __isl_keep isl_basic_map *bmap, + enum isl_dim_type type, unsigned pos) +{ + isl_ctx *ctx; + isl_val *v; + int fixed; + + if (!bmap) + return NULL; + ctx = isl_basic_map_get_ctx(bmap); + v = isl_val_alloc(ctx); + if (!v) + return NULL; + fixed = isl_basic_map_plain_is_fixed(bmap, type, pos, &v->n); + if (fixed < 0) + return isl_val_free(v); + if (fixed) { + isl_int_set_si(v->d, 1); + return v; + } + isl_val_free(v); + return isl_val_nan(ctx); +} + int isl_map_plain_is_fixed(__isl_keep isl_map *map, enum isl_dim_type type, unsigned pos, isl_int *val) { @@ -8480,6 +8537,16 @@ __isl_give isl_val *isl_map_plain_get_val_if_fixed(__isl_keep isl_map *map, return isl_val_nan(ctx); } +/* If "set" obviously lies on a hyperplane where the given dimension + * has a fixed value, then return that value. + * Otherwise return NaN. + */ +__isl_give isl_val *isl_set_plain_get_val_if_fixed(__isl_keep isl_set *set, + enum isl_dim_type type, unsigned pos) +{ + return isl_map_plain_get_val_if_fixed(set, type, pos); +} + int isl_set_plain_is_fixed(__isl_keep isl_set *set, enum isl_dim_type type, unsigned pos, isl_int *val) {