Lines Matching full:data
40 /* Internal data structure used inside isl_ast_expr_add_term.
60 * data->build->domain by stealing part of the constant term of
74 * if data->cst and data->v have the same sign.
79 __isl_keep isl_val *d, struct isl_ast_add_term_data *data) in is_non_neg_after_stealing() argument
86 if (isl_val_sgn(data->cst) != isl_val_sgn(data->v)) in is_non_neg_after_stealing()
89 shift = isl_val_div(isl_val_copy(data->cst), isl_val_copy(data->v)); in is_non_neg_after_stealing()
99 non_neg = isl_ast_build_aff_is_nonneg(data->build, shifted); in is_non_neg_after_stealing()
108 * non-negative over data->build->domain.
117 * to make it positive and adjust data->cst accordingly.
119 * data->build->domain and take
132 __isl_keep isl_val *d, struct isl_ast_add_term_data *data) in steal_from_cst() argument
137 domain = isl_ast_build_get_domain(data->build); in steal_from_cst()
146 t = isl_val_mul(t, isl_val_copy(data->v)); in steal_from_cst()
147 data->cst = isl_val_sub(data->cst, t); in steal_from_cst()
168 /* Create an isl_ast_expr evaluating the div at position "pos" in data->ls.
169 * The result is simplified in terms of data->build->domain.
170 * This function may change (the sign of) data->v.
172 * data->ls is known to be non-NULL.
190 * and still use pdiv_q, while changing the sign of data->v.
202 static __isl_give isl_ast_expr *var_div(struct isl_ast_add_term_data *data, in var_div() argument
205 isl_ctx *ctx = isl_local_space_get_ctx(data->ls); in var_div()
210 aff = isl_local_space_get_div(data->ls, pos); in var_div()
217 non_neg = isl_ast_build_aff_is_nonneg(data->build, aff); in var_div()
221 non_neg = isl_ast_build_aff_is_nonneg(data->build, opp); in var_div()
223 data->v = isl_val_neg(data->v); in var_div()
230 non_neg = is_non_neg_after_stealing(aff, d, data); in var_div()
232 aff = steal_from_cst(aff, d, data); in var_div()
240 return div_mod(type, aff, d, data->build); in var_div()
243 /* Create an isl_ast_expr evaluating the specified dimension of data->ls.
244 * The result is simplified in terms of data->build->domain.
245 * This function may change (the sign of) data->v.
249 * - set variables are constructed from the iterator isl_ids in data->build
250 * - parameters are constructed from the isl_ids in data->ls
252 static __isl_give isl_ast_expr *var(struct isl_ast_add_term_data *data, in var() argument
255 isl_ctx *ctx = isl_local_space_get_ctx(data->ls); in var()
259 return var_div(data, pos); in var()
262 id = isl_ast_build_get_iterator_id(data->build, pos); in var()
266 if (!isl_local_space_has_dim_id(data->ls, type, pos)) in var()
269 id = isl_local_space_get_dim_id(data->ls, type, pos); in var()
410 /* Add an expression for "*v" times the specified dimension of data->ls
413 * may modify data->cst in order to make the numerator non-negative.
414 * The result is simplified in terms of data->build->domain.
435 __isl_take isl_val *v, struct isl_ast_add_term_data *data) in isl_ast_expr_add_term() argument
442 data->v = v; in isl_ast_expr_add_term()
443 term = var(data, type, pos); in isl_ast_expr_add_term()
444 v = data->v; in isl_ast_expr_add_term()
485 /* Internal data structure used inside extract_modulos.
527 * arg mod data->d
538 static isl_bool is_even_test(struct isl_extract_mod_data *data, in is_even_test() argument
544 res = isl_val_eq_si(data->d, 2); in is_even_test()
555 /* Given that data->v * div_i in data->aff is equal to
559 * with data->d * f = data->v and "arg" non-negative on data->build, add
563 * to data->add and
567 * to data->neg or data->pos depending on the sign of -f.
584 static isl_stat extract_term_and_mod(struct isl_extract_mod_data *data, in extract_term_and_mod() argument
591 even = is_even_test(data, arg); in extract_term_and_mod()
595 term = oppose_div_arg(term, isl_val_copy(data->d)); in extract_term_and_mod()
596 data->v = isl_val_neg(data->v); in extract_term_and_mod()
600 data->v = isl_val_div(data->v, isl_val_copy(data->d)); in extract_term_and_mod()
601 s = isl_val_sgn(data->v); in extract_term_and_mod()
602 data->v = isl_val_abs(data->v); in extract_term_and_mod()
603 expr = isl_ast_expr_mod(data->v, arg, data->d, data->build); in extract_term_and_mod()
606 data->neg = ast_expr_add(data->neg, expr); in extract_term_and_mod()
608 data->pos = ast_expr_add(data->pos, expr); in extract_term_and_mod()
609 data->aff = isl_aff_set_coefficient_si(data->aff, in extract_term_and_mod()
610 isl_dim_div, data->i, 0); in extract_term_and_mod()
612 data->v = isl_val_neg(data->v); in extract_term_and_mod()
613 term = isl_aff_scale_val(term, isl_val_copy(data->v)); in extract_term_and_mod()
615 if (!data->add) in extract_term_and_mod()
616 data->add = term; in extract_term_and_mod()
618 data->add = isl_aff_add(data->add, term); in extract_term_and_mod()
619 if (!data->add) in extract_term_and_mod()
625 /* Given that data->v * div_i in data->aff is of the form
629 * with div nonnegative on data->build, rewrite it as
637 * to data->add and
641 * to data->neg or data->pos depending on the sign of -f.
643 static isl_stat extract_mod(struct isl_extract_mod_data *data) in extract_mod() argument
645 return extract_term_and_mod(data, isl_aff_copy(data->div), in extract_mod()
646 isl_aff_copy(data->div)); in extract_mod()
649 /* Given that data->v * div_i in data->aff is of the form
653 * check if div is non-negative on data->build and, if so,
654 * extract the corresponding modulo from data->aff.
659 * is non-negative on data->build. If so, replace (1) by
663 * and extract the corresponding modulo from data->aff.
665 * This function may modify data->div.
667 static isl_stat extract_nonneg_mod(struct isl_extract_mod_data *data) in extract_nonneg_mod() argument
671 mod = isl_ast_build_aff_is_nonneg(data->build, data->div); in extract_nonneg_mod()
675 return extract_mod(data); in extract_nonneg_mod()
677 data->div = oppose_div_arg(data->div, isl_val_copy(data->d)); in extract_nonneg_mod()
678 mod = isl_ast_build_aff_is_nonneg(data->build, data->div); in extract_nonneg_mod()
682 data->v = isl_val_neg(data->v); in extract_nonneg_mod()
683 return extract_mod(data); in extract_nonneg_mod()
688 data->aff = isl_aff_free(data->aff); in extract_nonneg_mod()
692 /* Is the affine expression of constraint "c" "simpler" than data->nonneg
703 static int mod_constraint_is_simpler(struct isl_extract_mod_data *data, in mod_constraint_is_simpler() argument
709 if (!data->nonneg) in mod_constraint_is_simpler()
713 v2 = isl_val_abs(isl_aff_get_constant_val(data->nonneg)); in mod_constraint_is_simpler()
722 * of data->div modulo data->d. If so, and if "c" is "simpler" than
723 * data->nonneg, then replace data->nonneg by the affine expression of "c"
724 * and set data->sign accordingly.
726 * Both "c" and data->div are assumed not to involve any integer divisions.
729 * "c" and data->div have the same non-zero coefficients.
731 * Note that while the coefficients of data->div can be reasonably expected
745 struct isl_extract_mod_data *data = user; in check_parallel_or_opposite() local
760 b = isl_aff_involves_dims(data->div, a_type[t], i, 1); in check_parallel_or_opposite()
785 v2 = isl_aff_get_coefficient_val(data->div, in check_parallel_or_opposite()
789 parallel = isl_val_is_divisible_by(v1, data->d); in check_parallel_or_opposite()
794 opposite = isl_val_is_divisible_by(v1, data->d); in check_parallel_or_opposite()
803 if ((parallel || opposite) && mod_constraint_is_simpler(data, c)) { in check_parallel_or_opposite()
804 isl_aff_free(data->nonneg); in check_parallel_or_opposite()
805 data->nonneg = isl_constraint_get_aff(c); in check_parallel_or_opposite()
806 data->sign = parallel ? 1 : -1; in check_parallel_or_opposite()
811 if (data->sign != 0 && data->nonneg == NULL) in check_parallel_or_opposite()
820 /* Given that data->v * div_i in data->aff is of the form
824 * see if we can find an expression div' that is non-negative over data->build
848 * from the constraints of data->build->domain (which is therefore
849 * guaranteed to be non-negative on data->build), where we remove
855 * non-negative on data->build.
857 * While looking for an appropriate constraint in data->build->domain,
861 * (or d - 1 - the constant term of "div" if data->sign < 0)
899 static isl_stat try_extract_mod(struct isl_extract_mod_data *data) in try_extract_mod() argument
906 if (!data->build) in try_extract_mod()
909 n = isl_aff_dim(data->div, isl_dim_div); in try_extract_mod()
913 if (isl_aff_involves_dims(data->div, isl_dim_div, 0, n)) in try_extract_mod()
914 return extract_nonneg_mod(data); in try_extract_mod()
916 hull = isl_set_simple_hull(isl_set_copy(data->build->domain)); in try_extract_mod()
918 data->sign = 0; in try_extract_mod()
919 data->nonneg = NULL; in try_extract_mod()
921 data); in try_extract_mod()
924 if (!data->sign || r < 0) { in try_extract_mod()
925 isl_aff_free(data->nonneg); in try_extract_mod()
928 return extract_nonneg_mod(data); in try_extract_mod()
931 v1 = isl_aff_get_constant_val(data->div); in try_extract_mod()
932 v2 = isl_aff_get_constant_val(data->nonneg); in try_extract_mod()
933 if (data->sign < 0) { in try_extract_mod()
935 v1 = isl_val_add(v1, isl_val_copy(data->d)); in try_extract_mod()
939 v1 = isl_val_mod(v1, isl_val_copy(data->d)); in try_extract_mod()
941 v2 = isl_val_div(isl_val_copy(v1), isl_val_copy(data->d)); in try_extract_mod()
944 v2 = isl_val_mul(v2, isl_val_copy(data->d)); in try_extract_mod()
947 data->nonneg = isl_aff_set_constant_val(data->nonneg, v1); in try_extract_mod()
950 if (data->sign < 0) { in try_extract_mod()
951 data->div = oppose_div_arg(data->div, isl_val_copy(data->d)); in try_extract_mod()
952 data->v = isl_val_neg(data->v); in try_extract_mod()
955 return extract_term_and_mod(data, in try_extract_mod()
956 isl_aff_copy(data->div), data->nonneg); in try_extract_mod()
958 data->aff = isl_aff_free(data->aff); in try_extract_mod()
962 /* Check if "data->aff" involves any (implicit) modulo computations based
963 * on div "data->i".
965 * to those modulo computations to data->pos and/or data->neg.
993 static int extract_modulo(struct isl_extract_mod_data *data) in extract_modulo() argument
995 data->div = isl_aff_get_div(data->aff, data->i); in extract_modulo()
996 data->d = isl_aff_get_denominator_val(data->div); in extract_modulo()
997 if (isl_val_is_divisible_by(data->v, data->d)) { in extract_modulo()
998 data->div = isl_aff_scale_val(data->div, isl_val_copy(data->d)); in extract_modulo()
999 if (try_extract_mod(data) < 0) in extract_modulo()
1000 data->aff = isl_aff_free(data->aff); in extract_modulo()
1002 isl_aff_free(data->div); in extract_modulo()
1003 isl_val_free(data->d); in extract_modulo()
1034 struct isl_extract_mod_data data = { build, aff, *pos, *neg }; in extract_modulos() local
1045 n = isl_aff_dim(data.aff, isl_dim_div); in extract_modulos()
1048 for (data.i = 0; data.i < n; ++data.i) { in extract_modulos()
1049 data.v = isl_aff_get_coefficient_val(data.aff, in extract_modulos()
1050 isl_dim_div, data.i); in extract_modulos()
1051 if (!data.v) in extract_modulos()
1053 if (isl_val_is_zero(data.v) || in extract_modulos()
1054 isl_val_is_one(data.v) || isl_val_is_negone(data.v)) { in extract_modulos()
1055 isl_val_free(data.v); in extract_modulos()
1058 if (extract_modulo(&data) < 0) in extract_modulos()
1059 data.aff = isl_aff_free(data.aff); in extract_modulos()
1060 isl_val_free(data.v); in extract_modulos()
1061 if (!data.aff) in extract_modulos()
1065 if (data.add) in extract_modulos()
1066 data.aff = isl_aff_add(data.aff, data.add); in extract_modulos()
1068 *pos = data.pos; in extract_modulos()
1069 *neg = data.neg; in extract_modulos()
1070 return data.aff; in extract_modulos()
1115 /* Internal data structure for extract_rational.
1130 * add it to data->rat if "v" is not a multiple of data->d.
1135 struct isl_ast_extract_rational_data *data = user; in add_rational() local
1138 if (isl_val_is_divisible_by(v, data->d)) { in add_rational()
1142 rat = isl_aff_var_on_domain(isl_local_space_copy(data->ls), type, pos); in add_rational()
1144 data->rat = isl_aff_add(data->rat, rat); in add_rational()
1159 struct isl_ast_extract_rational_data data = { NULL }; in extract_rational() local
1165 data.d = isl_aff_get_denominator_val(aff); in extract_rational()
1166 if (!data.d) in extract_rational()
1168 if (isl_val_is_one(data.d)) { in extract_rational()
1169 isl_val_free(data.d); in extract_rational()
1173 aff = isl_aff_scale_val(aff, isl_val_copy(data.d)); in extract_rational()
1175 data.ls = isl_aff_get_domain_local_space(aff); in extract_rational()
1176 data.rat = isl_aff_zero_on_domain(isl_local_space_copy(data.ls)); in extract_rational()
1178 if (every_non_zero_coefficient(aff, 0, &add_rational, &data) < 0) in extract_rational()
1182 if (isl_val_is_divisible_by(v, data.d)) { in extract_rational()
1187 rat_0 = isl_aff_val_on_domain(isl_local_space_copy(data.ls), v); in extract_rational()
1188 data.rat = isl_aff_add(data.rat, rat_0); in extract_rational()
1191 isl_local_space_free(data.ls); in extract_rational()
1193 aff = isl_aff_sub(aff, isl_aff_copy(data.rat)); in extract_rational()
1194 aff = isl_aff_scale_down_val(aff, isl_val_copy(data.d)); in extract_rational()
1196 rat_expr = div_mod(isl_ast_expr_op_div, data.rat, data.d, build); in extract_rational()
1201 isl_aff_free(data.rat); in extract_rational()
1202 isl_local_space_free(data.ls); in extract_rational()
1204 isl_val_free(data.d); in extract_rational()
1208 /* Internal data structure for isl_ast_expr_from_aff.
1220 * add the corresponding AST expression to data->expr.
1225 struct isl_ast_add_terms_data *data = user; in add_term() local
1227 data->expr = in add_term()
1228 isl_ast_expr_add_term(data->expr, type, pos, v, data->term); in add_term()
1234 * The result is simplified in terms of data->build->domain.
1237 __isl_keep isl_aff *aff, struct isl_ast_add_term_data *data) in add_terms() argument
1239 struct isl_ast_add_terms_data terms_data = { data, expr }; in add_terms()
1285 /* Internal data structure for coefficients_of_sign.
1295 /* Clear the specified coefficient of data->aff if the value "v"
1301 struct isl_ast_coefficients_of_sign_data *data = user; in clear_opposite_sign() local
1305 if (data->sign * isl_val_sgn(v) < 0) in clear_opposite_sign()
1306 data->aff = isl_aff_set_coefficient_si(data->aff, type, pos, 0); in clear_opposite_sign()
1318 * the coefficient of an integer division in data.aff
1319 * could result in the removal of that integer division from data.aff,
1320 * changing the positions of all subsequent integer divisions of data.aff,
1326 struct isl_ast_coefficients_of_sign_data data; in coefficients_of_sign() local
1328 data.sign = sign; in coefficients_of_sign()
1329 data.aff = isl_aff_copy(aff); in coefficients_of_sign()
1330 if (every_non_zero_coefficient(aff, 1, &clear_opposite_sign, &data) < 0) in coefficients_of_sign()
1331 data.aff = isl_aff_free(data.aff); in coefficients_of_sign()
1334 data.aff = isl_aff_set_constant_si(data.aff, 0); in coefficients_of_sign()
1336 return data.aff; in coefficients_of_sign()
1548 struct isl_ast_add_term_data data; in isl_ast_expr_from_constraint_no_stride() local
1556 data.build = build; in isl_ast_expr_from_constraint_no_stride()
1557 data.ls = isl_aff_get_domain_local_space(aff); in isl_ast_expr_from_constraint_no_stride()
1558 data.cst = isl_aff_get_constant_val(aff); in isl_ast_expr_from_constraint_no_stride()
1563 expr_pos = add_terms(expr_pos, aff_pos, &data); in isl_ast_expr_from_constraint_no_stride()
1564 data.cst = isl_val_neg(data.cst); in isl_ast_expr_from_constraint_no_stride()
1565 expr_neg = add_terms(expr_neg, aff_neg, &data); in isl_ast_expr_from_constraint_no_stride()
1566 data.cst = isl_val_neg(data.cst); in isl_ast_expr_from_constraint_no_stride()
1567 isl_local_space_free(data.ls); in isl_ast_expr_from_constraint_no_stride()
1570 constant_is_considered_positive(data.cst, expr_pos, expr_neg); in isl_ast_expr_from_constraint_no_stride()
1575 expr_pos = isl_ast_expr_add_int(expr_pos, data.cst); in isl_ast_expr_from_constraint_no_stride()
1577 data.cst = isl_val_neg(data.cst); in isl_ast_expr_from_constraint_no_stride()
1578 expr_neg = isl_ast_expr_add_int(expr_neg, data.cst); in isl_ast_expr_from_constraint_no_stride()
1818 /* State of data about previous pieces in
1821 * isl_state_none: no data about previous pieces
1822 * isl_state_single: data about a single previous piece
1823 * isl_state_min: data represents minimum of several pieces
1824 * isl_state_max: data represents maximum of several pieces
1857 /* Internal data structure for isl_ast_build_expr_from_pw_aff_internal.
1878 /* Initialize "data" based on "build" and "pa".
1880 static isl_stat isl_from_pw_aff_data_init(struct isl_from_pw_aff_data *data, in isl_from_pw_aff_data_init() argument
1893 data->max = n; in isl_from_pw_aff_data_init()
1894 data->p = isl_calloc_array(ctx, struct isl_from_pw_aff_piece, n); in isl_from_pw_aff_data_init()
1895 if (!data->p) in isl_from_pw_aff_data_init()
1897 data->build = build; in isl_from_pw_aff_data_init()
1898 data->dom = isl_pw_aff_domain(isl_pw_aff_copy(pa)); in isl_from_pw_aff_data_init()
1899 data->n = 0; in isl_from_pw_aff_data_init()
1904 /* Free all memory allocated for "data".
1906 static void isl_from_pw_aff_data_clear(struct isl_from_pw_aff_data *data) in isl_from_pw_aff_data_clear() argument
1910 isl_set_free(data->dom); in isl_from_pw_aff_data_clear()
1911 if (!data->p) in isl_from_pw_aff_data_clear()
1914 for (i = 0; i < data->max; ++i) { in isl_from_pw_aff_data_clear()
1915 isl_set_free(data->p[i].set); in isl_from_pw_aff_data_clear()
1916 isl_set_list_free(data->p[i].set_list); in isl_from_pw_aff_data_clear()
1917 isl_aff_list_free(data->p[i].aff_list); in isl_from_pw_aff_data_clear()
1919 free(data->p); in isl_from_pw_aff_data_clear()
1922 /* Initialize the current entry of "data" to an unused piece.
1924 static void set_none(struct isl_from_pw_aff_data *data) in set_none() argument
1926 data->p[data->n].state = isl_state_none; in set_none()
1927 data->p[data->n].set_list = NULL; in set_none()
1928 data->p[data->n].aff_list = NULL; in set_none()
1931 /* Store "set" and "aff" in the current entry of "data" as a single subpiece.
1933 static void set_single(struct isl_from_pw_aff_data *data, in set_single() argument
1936 data->p[data->n].state = isl_state_single; in set_single()
1937 data->p[data->n].set_list = isl_set_list_from_set(set); in set_single()
1938 data->p[data->n].aff_list = isl_aff_list_from_aff(aff); in set_single()
1941 /* Extend the current entry of "data" with "set" and "aff"
1944 static isl_stat extend_min(struct isl_from_pw_aff_data *data, in extend_min() argument
1947 int n = data->n; in extend_min()
1948 data->p[n].state = isl_state_min; in extend_min()
1949 data->p[n].set_list = isl_set_list_add(data->p[n].set_list, set); in extend_min()
1950 data->p[n].aff_list = isl_aff_list_add(data->p[n].aff_list, aff); in extend_min()
1952 if (!data->p[n].set_list || !data->p[n].aff_list) in extend_min()
1957 /* Extend the current entry of "data" with "set" and "aff"
1960 static isl_stat extend_max(struct isl_from_pw_aff_data *data, in extend_max() argument
1963 int n = data->n; in extend_max()
1964 data->p[n].state = isl_state_max; in extend_max()
1965 data->p[n].set_list = isl_set_list_add(data->p[n].set_list, set); in extend_max()
1966 data->p[n].aff_list = isl_aff_list_add(data->p[n].aff_list, aff); in extend_max()
1968 if (!data->p[n].set_list || !data->p[n].aff_list) in extend_max()
1973 /* Extend the domain of the current entry of "data", which is assumed
1978 static isl_stat extend_domain(struct isl_from_pw_aff_data *data, in extend_domain() argument
1981 int n = data->n; in extend_domain()
1984 set_n = isl_set_list_get_set(data->p[n].set_list, 0); in extend_domain()
1986 data->p[n].set_list = in extend_domain()
1987 isl_set_list_set_set(data->p[n].set_list, 0, set_n); in extend_domain()
1990 data->p[n].aff_list = in extend_domain()
1991 isl_aff_list_set_aff(data->p[n].aff_list, 0, aff); in extend_domain()
1995 if (!data->p[n].set_list || !data->p[n].aff_list) in extend_domain()
2045 * the piece at position "pos" in "data", allowing for a further extension
2048 * an isl_ast_expr corresponding to data->aff_list on data->set and
2051 * Afterwards, the state of "data" is set to isl_state_none.
2053 * The constraints of data->set are added to the generated
2055 * the AST expression constructed from data->aff_list.
2058 struct isl_from_pw_aff_data *data, in add_intermediate_piece() argument
2066 set = data->p[pos].set; in add_intermediate_piece()
2067 data->p[pos].set = NULL; in add_intermediate_piece()
2068 ctx = isl_ast_build_get_ctx(data->build); in add_intermediate_piece()
2070 gist = isl_set_gist(isl_set_copy(set), isl_set_copy(data->dom)); in add_intermediate_piece()
2071 arg = isl_ast_build_expr_from_set_internal(data->build, gist); in add_intermediate_piece()
2073 build = isl_ast_build_copy(data->build); in add_intermediate_piece()
2075 arg = ast_expr_from_aff_list(data->p[pos].aff_list, in add_intermediate_piece()
2076 data->p[pos].state, build); in add_intermediate_piece()
2077 data->p[pos].aff_list = NULL; in add_intermediate_piece()
2080 data->p[pos].state = isl_state_none; in add_intermediate_piece()
2089 * the final piece, located at position "pos" in "data".
2091 * to evaluate data->aff_list and the domain is ignored.
2094 * The constraints of data->set are however added to the generated
2096 * the AST expression constructed from data->aff_list.
2098 static isl_stat add_last_piece(struct isl_from_pw_aff_data *data, in add_last_piece() argument
2104 if (data->p[pos].state == isl_state_none) in add_last_piece()
2105 isl_die(isl_ast_build_get_ctx(data->build), isl_error_invalid, in add_last_piece()
2108 build = isl_ast_build_copy(data->build); in add_last_piece()
2109 build = isl_ast_build_restrict_generated(build, data->p[pos].set); in add_last_piece()
2110 data->p[pos].set = NULL; in add_last_piece()
2111 last = ast_expr_from_aff_list(data->p[pos].aff_list, in add_last_piece()
2112 data->p[pos].state, build); in add_last_piece()
2114 data->p[pos].aff_list = NULL; in add_last_piece()
2116 data->p[pos].state = isl_state_none; in add_last_piece()
2142 /* Construct an isl_ast_expr from the pieces in "data".
2145 * When this function is called, data->n points to the current piece.
2146 * If this is an effective piece, then first increment data->n such
2147 * that data->n contains the number of pieces.
2160 static isl_ast_expr *build_pieces(struct isl_from_pw_aff_data *data) in build_pieces() argument
2168 if (data->p[data->n].state != isl_state_none) in build_pieces()
2169 data->n++; in build_pieces()
2170 ctx = isl_ast_build_get_ctx(data->build); in build_pieces()
2171 if (data->n == 0) in build_pieces()
2175 for (i = 0; i < data->n; ++i) { in build_pieces()
2176 data->p[i].set = isl_set_list_union(data->p[i].set_list); in build_pieces()
2177 if (data->p[i].state != isl_state_single) in build_pieces()
2178 data->p[i].set = isl_set_coalesce(data->p[i].set); in build_pieces()
2179 data->p[i].set_list = NULL; in build_pieces()
2182 if (isl_sort(data->p, data->n, sizeof(data->p[0]), in build_pieces()
2189 for (i = 0; i + 1 < data->n; ++i) { in build_pieces()
2190 next = add_intermediate_piece(data, i, next); in build_pieces()
2195 if (add_last_piece(data, data->n - 1, next) < 0) in build_pieces()
2206 /* Is the domain of the current entry of "data", which is assumed
2209 static isl_bool single_is_subset(struct isl_from_pw_aff_data *data, in single_is_subset() argument
2215 set_n = isl_set_list_get_set(data->p[data->n].set_list, 0); in single_is_subset()
2257 /* Can the list of subpieces in the last piece of "data" be extended with
2276 static isl_bool extends(struct isl_from_pw_aff_data *data, in extends() argument
2289 is_rational = is_single_rational_aff(data->p[data->n].aff_list); in extends()
2293 ctx = isl_ast_build_get_ctx(data->build); in extends()
2297 n = isl_set_list_n_set(data->p[data->n].set_list); in extends()
2301 dom = isl_ast_build_get_domain(data->build); in extends()
2310 aff_i = isl_aff_list_get_aff(data->p[data->n].aff_list, i); in extends()
2312 required = isl_set_list_get_set(data->p[data->n].set_list, i); in extends()
2313 dom = isl_ast_build_get_domain(data->build); in extends()
2323 aff_i = isl_aff_list_get_aff(data->p[data->n].aff_list, i); in extends()
2337 /* Can the list of pieces in "data" be extended with "set" and "aff"
2344 static isl_bool extends_min(struct isl_from_pw_aff_data *data, in extends_min() argument
2347 return extends(data, set, aff, &isl_aff_ge_basic_set); in extends_min()
2350 /* Can the list of pieces in "data" be extended with "set" and "aff"
2357 static isl_bool extends_max(struct isl_from_pw_aff_data *data, in extends_max() argument
2360 return extends(data, set, aff, &isl_aff_le_basic_set); in extends_max()
2365 * If the last piece of "data" contains a single subpiece and
2372 * If the last piece of "data" contains either a single subpiece
2378 * in "data" (if the current piece contains any data), and then store
2379 * the current subpiece in the current piece of "data" for later handling.
2384 struct isl_from_pw_aff_data *data = user; in ast_expr_from_pw_aff() local
2388 state = data->p[data->n].state; in ast_expr_from_pw_aff()
2393 aff0 = isl_aff_list_get_aff(data->p[data->n].aff_list, 0); in ast_expr_from_pw_aff()
2397 subset2 = single_is_subset(data, eq); in ast_expr_from_pw_aff()
2402 return extend_domain(data, set, aff, 0); in ast_expr_from_pw_aff()
2404 return extend_domain(data, set, aff, 1); in ast_expr_from_pw_aff()
2407 test = extends_min(data, set, aff); in ast_expr_from_pw_aff()
2411 return extend_min(data, set, aff); in ast_expr_from_pw_aff()
2414 test = extends_max(data, set, aff); in ast_expr_from_pw_aff()
2418 return extend_max(data, set, aff); in ast_expr_from_pw_aff()
2421 data->n++; in ast_expr_from_pw_aff()
2422 set_single(data, set, aff); in ast_expr_from_pw_aff()
2439 struct isl_from_pw_aff_data data = { NULL }; in isl_ast_build_expr_from_pw_aff_internal() local
2447 if (isl_from_pw_aff_data_init(&data, build, pa) < 0) in isl_ast_build_expr_from_pw_aff_internal()
2449 set_none(&data); in isl_ast_build_expr_from_pw_aff_internal()
2451 if (isl_pw_aff_foreach_piece(pa, &ast_expr_from_pw_aff, &data) >= 0) in isl_ast_build_expr_from_pw_aff_internal()
2452 res = build_pieces(&data); in isl_ast_build_expr_from_pw_aff_internal()
2455 isl_from_pw_aff_data_clear(&data); in isl_ast_build_expr_from_pw_aff_internal()
2459 isl_from_pw_aff_data_clear(&data); in isl_ast_build_expr_from_pw_aff_internal()