/* Construct a contraction from "prefix" and "domain" for a new group * in "grouping". * * The values of the prefix schedule "prefix" are used as instances * of the new group. The identifier of the group is constructed * in such a way that it does not conflict with those of earlier * groups nor with statements in the domain of the original * schedule constraints. * The isl_multi_union_pw_aff "prefix" then simply needs to be * converted to an isl_union_pw_multi_aff. However, this is not * possible if "prefix" is zero-dimensional, so in this case, * a contraction is constructed from "domain" instead. */ static isl_union_pw_multi_aff *group_contraction_from_prefix_and_domain( struct ppcg_grouping *grouping, __isl_keep isl_multi_union_pw_aff *prefix, __isl_keep isl_union_set *domain) { isl_id *id; isl_space *space; int dim; space = isl_multi_union_pw_aff_get_space(prefix); if (!space) return NULL; dim = isl_space_dim(space, isl_dim_set); id = construct_group_id(grouping, space); if (dim == 0) { isl_multi_val *mv; space = isl_multi_union_pw_aff_get_space(prefix); space = isl_space_set_tuple_id(space, isl_dim_set, id); mv = isl_multi_val_zero(space); domain = isl_union_set_copy(domain); return isl_union_pw_multi_aff_multi_val_on_domain(domain, mv); } prefix = isl_multi_union_pw_aff_copy(prefix); prefix = isl_multi_union_pw_aff_set_tuple_id(prefix, isl_dim_out, id); return isl_union_pw_multi_aff_from_multi_union_pw_aff(prefix); }
/* Construct an isl_multi_val living in "space" with all values equal to "val". */ __isl_give isl_multi_val *ppcg_multi_val_from_int(__isl_take isl_space *space, int val) { int i, n; isl_ctx *ctx; isl_val *v; isl_multi_val *mv; if (!space) return NULL; ctx = isl_space_get_ctx(space); n = isl_space_dim(space, isl_dim_set); mv = isl_multi_val_zero(space); v = isl_val_int_from_si(ctx, val); for (i = 0; i < n; ++i) mv = isl_multi_val_set_val(mv, i, isl_val_copy(v)); isl_val_free(v); return mv; }
/* Construct an isl_multi_val living in "space" with values specified * by "list". "list" is assumed to have at least as many entries * as the set dimension of "space". */ __isl_give isl_multi_val *ppcg_multi_val_from_int_list( __isl_take isl_space *space, int *list) { int i, n; isl_ctx *ctx; isl_multi_val *mv; if (!space) return NULL; ctx = isl_space_get_ctx(space); n = isl_space_dim(space, isl_dim_set); mv = isl_multi_val_zero(space); for (i = 0; i < n; ++i) { isl_val *v; v = isl_val_int_from_si(ctx, list[i]); mv = isl_multi_val_set_val(mv, i, v); } return mv; }