X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=isl_ast_build.c;h=dd1aa7b65ed6fe263f10470bbe642ecc3c94c271;hb=refs%2Ftags%2Faccepted%2Ftizen%2F20130912.195944;hp=fe14b50bc8d34a2c067545ad2aba7e934fe1b2f8;hpb=4d9ca4edfc641f6535952d6167f3d406c777a9e1;p=platform%2Fupstream%2Fisl.git diff --git a/isl_ast_build.c b/isl_ast_build.c index fe14b50..dd1aa7b 100644 --- a/isl_ast_build.c +++ b/isl_ast_build.c @@ -1043,51 +1043,43 @@ __isl_give isl_id *isl_ast_build_get_iterator_id( * is the combined stride. */ static __isl_give isl_ast_build *set_stride(__isl_take isl_ast_build *build, - isl_int stride, __isl_take isl_aff *offset) + __isl_take isl_val *stride, __isl_take isl_aff *offset) { int pos; build = isl_ast_build_cow(build); - if (!build || !offset) + if (!build || !stride || !offset) goto error; pos = build->depth; if (isl_ast_build_has_stride(build, pos)) { - isl_int stride2, a, b, g; + isl_val *stride2, *a, *b, *g; isl_aff *offset2; - isl_int_init(stride2); - isl_int_init(a); - isl_int_init(b); - isl_int_init(g); - - isl_vec_get_element(build->strides, pos, &stride2); - isl_int_gcdext(g, a, b, stride, stride2); - isl_int_mul(a, a, stride); - isl_int_divexact(a, a, g); - isl_int_divexact(stride2, stride2, g); - isl_int_mul(b, b, stride2); - isl_int_mul(stride, stride, stride2); + stride2 = isl_vec_get_element_val(build->strides, pos); + g = isl_val_gcdext(isl_val_copy(stride), isl_val_copy(stride2), + &a, &b); + a = isl_val_mul(a, isl_val_copy(stride)); + a = isl_val_div(a, isl_val_copy(g)); + stride2 = isl_val_div(stride2, g); + b = isl_val_mul(b, isl_val_copy(stride2)); + stride = isl_val_mul(stride, stride2); offset2 = isl_multi_aff_get_aff(build->offsets, pos); - offset2 = isl_aff_scale(offset2, a); - offset = isl_aff_scale(offset, b); + offset2 = isl_aff_scale_val(offset2, a); + offset = isl_aff_scale_val(offset, b); offset = isl_aff_add(offset, offset2); - - isl_int_clear(stride2); - isl_int_clear(a); - isl_int_clear(b); - isl_int_clear(g); } - build->strides = isl_vec_set_element(build->strides, pos, stride); + build->strides = isl_vec_set_element_val(build->strides, pos, stride); build->offsets = isl_multi_aff_set_aff(build->offsets, pos, offset); if (!build->strides || !build->offsets) return isl_ast_build_free(build); return build; error: + isl_val_free(stride); isl_aff_free(offset); return isl_ast_build_free(build); } @@ -1108,7 +1100,7 @@ __isl_give isl_set *isl_ast_build_get_stride_constraint( { isl_aff *aff; isl_set *set; - isl_int stride; + isl_val *stride; int pos; if (!build) @@ -1119,16 +1111,12 @@ __isl_give isl_set *isl_ast_build_get_stride_constraint( if (!isl_ast_build_has_stride(build, pos)) return isl_set_universe(isl_ast_build_get_space(build, 1)); - isl_int_init(stride); - - isl_ast_build_get_stride(build, pos, &stride); + stride = isl_ast_build_get_stride(build, pos); aff = isl_ast_build_get_offset(build, pos); aff = isl_aff_add_coefficient_si(aff, isl_dim_in, pos, -1); - aff = isl_aff_mod(aff, stride); + aff = isl_aff_mod_val(aff, stride); set = isl_set_from_basic_set(isl_aff_zero_basic_set(aff)); - isl_int_clear(stride); - return set; } @@ -1150,7 +1138,7 @@ __isl_give isl_multi_aff *isl_ast_build_get_stride_expansion( isl_multi_aff *ma; int pos; isl_aff *aff, *offset; - isl_int stride; + isl_val *stride; if (!build) return NULL; @@ -1163,14 +1151,12 @@ __isl_give isl_multi_aff *isl_ast_build_get_stride_expansion( if (!isl_ast_build_has_stride(build, pos)) return ma; - isl_int_init(stride); offset = isl_ast_build_get_offset(build, pos); - isl_ast_build_get_stride(build, pos, &stride); + stride = isl_ast_build_get_stride(build, pos); aff = isl_multi_aff_get_aff(ma, pos); - aff = isl_aff_scale(aff, stride); + aff = isl_aff_scale_val(aff, stride); aff = isl_aff_add(aff, offset); ma = isl_multi_aff_set_aff(ma, pos, aff); - isl_int_clear(stride); return ma; } @@ -1250,7 +1236,8 @@ static int detect_stride(__isl_take isl_constraint *c, void *user) { struct isl_detect_stride_data *data = user; int i, n_div; - isl_int v, gcd, stride, a, b, m; + isl_ctx *ctx; + isl_val *v, *stride, *m; if (!isl_constraint_is_equality(c) || !isl_constraint_involves_dims(c, isl_dim_set, data->pos, 1)) { @@ -1258,48 +1245,42 @@ static int detect_stride(__isl_take isl_constraint *c, void *user) return 0; } - isl_int_init(a); - isl_int_init(b); - isl_int_init(v); - isl_int_init(m); - isl_int_init(gcd); - isl_int_init(stride); - - isl_int_set_si(gcd, 0); + ctx = isl_constraint_get_ctx(c); + stride = isl_val_zero(ctx); n_div = isl_constraint_dim(c, isl_dim_div); for (i = 0; i < n_div; ++i) { - isl_constraint_get_coefficient(c, isl_dim_div, i, &v); - isl_int_gcd(gcd, gcd, v); + v = isl_constraint_get_coefficient_val(c, isl_dim_div, i); + v = isl_val_gcd(stride, v); } - isl_constraint_get_coefficient(c, isl_dim_set, data->pos, &v); - isl_int_gcd(m, v, gcd); - isl_int_divexact(stride, gcd, m); - isl_int_divexact(v, v, m); + v = isl_constraint_get_coefficient_val(c, isl_dim_set, data->pos); + m = isl_val_gcd(isl_val_copy(stride), isl_val_copy(v)); + stride = isl_val_div(stride, isl_val_copy(m)); + v = isl_val_div(v, isl_val_copy(m)); - if (!isl_int_is_zero(stride) && !isl_int_is_one(stride)) { + if (!isl_val_is_zero(stride) && !isl_val_is_one(stride)) { isl_aff *aff; + isl_val *gcd, *a, *b; - isl_int_gcdext(gcd, a, b, v, stride); + gcd = isl_val_gcdext(v, isl_val_copy(stride), &a, &b); + isl_val_free(gcd); + isl_val_free(b); aff = isl_constraint_get_aff(c); for (i = 0; i < n_div; ++i) aff = isl_aff_set_coefficient_si(aff, isl_dim_div, i, 0); aff = isl_aff_set_coefficient_si(aff, isl_dim_in, data->pos, 0); - isl_int_neg(a, a); - aff = isl_aff_scale(aff, a); - aff = isl_aff_scale_down(aff, m); + a = isl_val_neg(a); + aff = isl_aff_scale_val(aff, a); + aff = isl_aff_scale_down_val(aff, m); data->build = set_stride(data->build, stride, aff); + } else { + isl_val_free(stride); + isl_val_free(m); + isl_val_free(v); } - isl_int_clear(stride); - isl_int_clear(gcd); - isl_int_clear(m); - isl_int_clear(v); - isl_int_clear(b); - isl_int_clear(a); - isl_constraint_free(c); return 0; } @@ -1539,28 +1520,25 @@ __isl_give isl_ast_build *isl_ast_build_insert_dim( * We therefore only need to update stride, offset and the options. */ __isl_give isl_ast_build *isl_ast_build_scale_down( - __isl_take isl_ast_build *build, isl_int m, + __isl_take isl_ast_build *build, __isl_take isl_val *m, __isl_take isl_union_map *umap) { isl_aff *aff; - isl_int v; + isl_val *v; int depth; build = isl_ast_build_cow(build); - if (!build || !umap) + if (!build || !umap || !m) goto error; depth = build->depth; - isl_int_init(v); - if (isl_vec_get_element(build->strides, depth, &v) < 0) - build->strides = isl_vec_free(build->strides); - isl_int_divexact(v, v, m); - build->strides = isl_vec_set_element(build->strides, depth, v); - isl_int_clear(v); + v = isl_vec_get_element_val(build->strides, depth); + v = isl_val_div(v, isl_val_copy(m)); + build->strides = isl_vec_set_element_val(build->strides, depth, v); aff = isl_multi_aff_get_aff(build->offsets, depth); - aff = isl_aff_scale_down(aff, m); + aff = isl_aff_scale_down_val(aff, m); build->offsets = isl_multi_aff_set_aff(build->offsets, depth, aff); build->options = isl_union_map_apply_domain(build->options, umap); if (!build->strides || !build->offsets || !build->options) @@ -1568,6 +1546,7 @@ __isl_give isl_ast_build *isl_ast_build_scale_down( return build; error: + isl_val_free(m); isl_union_map_free(umap); return isl_ast_build_free(build); } @@ -1740,16 +1719,17 @@ int isl_ast_build_aff_is_nonneg(__isl_keep isl_ast_build *build, */ int isl_ast_build_has_stride(__isl_keep isl_ast_build *build, int pos) { - isl_int v; + isl_val *v; int has_stride; if (!build) return -1; - isl_int_init(v); - isl_vec_get_element(build->strides, pos, &v); - has_stride = !isl_int_is_one(v); - isl_int_clear(v); + v = isl_vec_get_element_val(build->strides, pos); + if (!v) + return -1; + has_stride = !isl_val_is_one(v); + isl_val_free(v); return has_stride; } @@ -1760,15 +1740,13 @@ int isl_ast_build_has_stride(__isl_keep isl_ast_build *build, int pos) * * with a an integer, return s through *stride. */ -int isl_ast_build_get_stride(__isl_keep isl_ast_build *build, int pos, - isl_int *stride) +__isl_give isl_val *isl_ast_build_get_stride(__isl_keep isl_ast_build *build, + int pos) { if (!build) - return -1; - - isl_vec_get_element(build->strides, pos, stride); + return NULL; - return 0; + return isl_vec_get_element_val(build->strides, pos); } /* Given that the dimension at position "pos" takes on values