34 sizeof(
struct PW) + (
n - 1) *
sizeof(
S(
PW,piece)));
66 if (!pw || !
set || !el)
73 el_dim =
FN(
EL,get_space(el));
77 pw->p[pw->n].set =
set;
78 pw->p[pw->n].FIELD = el;
102 if (skip >= 0 && !skip)
104 if (skip >= 0 && !skip)
105 return FN(
PW,add_dup_piece)(pw,
set, el);
110 return FN(
PW,free)(pw);
125 el_space =
FN(
EL,get_space)(el);
139 ok =
FN(
PW,compatible_domain)(el,
set);
154 if (
FN(
PW,check_compatible_domain)(el,
set) < 0)
159 return FN(
PW,add_piece)(pw,
set, el);
179 for (i = 0; i < pw->n; ++i)
181 FN(
EL,copy)(pw->p[i].FIELD));
215 for (i = 0; i < pw->n; ++i) {
217 FN(
EL,free)(pw->p[i].FIELD);
229 return pw ? pw->dim : NULL;
253 return FN(
PW,get_space)(pw);
270 if (pw->dim == space) {
304 if (
FN(
PW,check_pos)(pw,
pos) < 0)
306 return pw->p[
pos].set;
333 return FN(
PW,get_domain_at)(pw,
pos);
334 if (
FN(
PW,check_pos)(pw,
pos) < 0)
337 pw->p[
pos].set = NULL;
376 if (
FN(
PW,check_pos)(pw,
pos) < 0)
378 return pw->p[
pos].FIELD;
407 return FN(
PW,get_base_at)(pw,
pos);
408 if (
FN(
PW,check_pos)(pw,
pos) < 0)
410 el = pw->p[
pos].FIELD;
411 pw->p[
pos].FIELD = NULL;
428 if (
FN(
PW,check_pos)(pw,
pos) < 0 || !el)
431 if (pw->p[
pos].FIELD == el) {
441 pw->p[
pos].FIELD = el;
458 return FN(
PW,restore_base_at_)(pw,
pos, el, 0);
471 return FN(
PW,restore_base_at_)(pw,
pos, el, 1);
506 space =
FN(
EL,get_space)(el);
585 n =
FN(
PW,n_piece)(pw);
589 for (i = 0; i <
n; ++i) {
597 el =
FN(
PW,take_base_at)(pw, i);
599 pw =
FN(
PW,restore_base_at)(pw, i, el);
630 "model has unnamed parameters",
goto error);
631 if (
FN(
PW,check_named_params)(pw) < 0)
634 if (equal_params < 0)
640 space =
FN(
PW,get_domain_space)(pw);
686 if (
FN(
PW,align_params_bin)(&pw1, &pw2) < 0)
692 "fold types don't match",
goto error);
693 if (
FN(
PW,check_equal_space)(pw1, pw2) < 0)
706 n = (pw1->n + 1) * (pw2->n + 1);
710 for (i = 0; i < pw1->n; ++i) {
712 for (j = 0; j < pw2->n; ++j) {
724 sum =
FN(
EL,add_on_domain)(common,
725 FN(
EL,copy)(pw1->p[i].FIELD),
726 FN(
EL,copy)(pw2->p[j].FIELD));
733 for (j = 0; j < pw2->n; ++j) {
735 for (i = 0; i < pw1->n; ++i)
763 return FN(
PW,union_add_)(pw1, pw2);
791 for (i = 0; i < pw1->n; ++i) {
792 for (j = 0; j < pw2->n; ++j) {
801 if (empty < 0 || empty) {
808 res_ij =
fn(
FN(
EL,copy)(pw1->p[i].FIELD),
809 FN(
EL,copy)(pw2->p[j].FIELD));
844 if (
FN(
PW,check_equal_space)(pw1, pw2) < 0)
848 return FN(
PW,on_shared_domain_in)(pw1, pw2, space,
fn);
871 for (i = 0; i < pw->n; ++i)
895 return FN(
PW,free)(pw);
898 FN(
EL,free)(pw->p[i].FIELD);
900 pw->p[i] = pw->p[pw->n - 1];
907 el =
FN(
PW,take_base_at)(pw, i);
909 pw =
FN(
PW,restore_base_at_inplace)(pw, i, el);
927 FN(
PW,align_params_set)(&pw, &
set);
928 n =
FN(
PW,n_piece)(pw);
932 for (i =
n - 1; i >= 0; --i) {
938 pw =
FN(
PW,exploit_equalities_and_remove_if_empty)(pw, i);
969 return FN(
PW,restrict_domain)(pw,
set,
996static int FN(
PW,sort_field_cmp)(
const void *p1,
const void *p2,
void *
arg)
998 struct FN(
PW,piece) const *pc1 = p1;
999 struct FN(
PW,piece) const *pc2 = p2;
1001 return FN(
EL,plain_cmp)(pc1->FIELD, pc2->FIELD);
1022 if (
isl_sort(pw->p, pw->n,
sizeof(pw->p[0]),
1023 &
FN(
PW,sort_field_cmp), NULL) < 0)
1024 return FN(
PW,free)(pw);
1025 for (i = pw->n - 1; i >= 1; --i) {
1030 el =
FN(
PW,peek_base_at)(pw, i);
1031 el_prev =
FN(
PW,peek_base_at)(pw, i - 1);
1032 equal =
FN(
EL,plain_is_equal)(el, el_prev);
1034 return FN(
PW,free)(pw);
1037 set =
FN(
PW,get_domain_at)(pw, i);
1038 set_prev =
FN(
PW,get_domain_at)(pw, i - 1);
1041 return FN(
PW,free)(pw);
1043 FN(
EL,free)(pw->p[i].FIELD);
1045 pw->p[i - 1].set =
set;
1046 for (j = i + 1; j < pw->n; ++j)
1047 pw->p[j - 1] = pw->p[j];
1068 for (i = 0; i < pw->n - 1; ++i) {
1070 FN(
EL,free)(pw->p[i].FIELD);
1072 pw->p[0].FIELD = pw->p[pw->n - 1].FIELD;
1073 pw->p[0].set = pw->p[pw->n - 1].set;
1077 el =
FN(
PW,take_base_at)(pw, 0);
1079 pw =
FN(
PW,restore_base_at)(pw, 0, el);
1108 pw =
FN(
PW,sort_unique)(pw);
1118 if (is_universe < 0)
1127 pw =
FN(
PW,cow)(pw);
1143 for (i = pw->n - 1; i >= 0; --i) {
1148 if (i == pw->n - 1) {
1156 set_i =
FN(
PW,get_domain_at)(pw, i);
1159 el =
FN(
PW,take_base_at)(pw, i);
1161 pw =
FN(
PW,restore_base_at)(pw, i, el);
1162 set_i =
FN(
PW,take_domain_at)(pw, i);
1164 pw =
FN(
PW,restore_domain_at)(pw, i, set_i);
1165 if (empty < 0 || !pw)
1169 FN(
EL,free)(pw->p[i].FIELD);
1171 pw->p[i] = pw->p[pw->n - 1];
1210 pw =
FN(
PW,sort_unique)(pw);
1211 n =
FN(
PW,n_piece)(pw);
1213 return FN(
PW,free)(pw);
1215 for (i = 0; i <
n; ++i) {
1233 unsigned first,
unsigned n)
1240 if (pw->n == 0 ||
n == 0)
1245 for (i = 0; i < pw->n; ++i) {
1246 isl_bool involves =
FN(
EL,involves_dims)(pw->p[i].FIELD,
1248 if (involves < 0 || involves)
1252 if (involves < 0 || involves)
1263 space =
FN(
PW,get_space)(pw);
1265 return FN(
PW,reset_space)(pw, space);
1276 n_piece =
FN(
PW,n_piece)(pw);
1278 return FN(
PW,free)(pw);
1284 space =
FN(
PW,take_space)(pw);
1286 pw =
FN(
PW,restore_space)(pw, space);
1287 for (i = 0; i < n_piece; ++i) {
1291 el =
FN(
PW,take_base_at)(pw, i);
1293 pw =
FN(
PW,restore_base_at)(pw, i, el);
1298 pw =
FN(
PW,restore_domain_at)(pw, i,
domain);
1317 n_piece =
FN(
PW,n_piece)(pw);
1319 return FN(
PW,free)(pw);
1325 space =
FN(
PW,take_space)(pw);
1327 pw =
FN(
PW,restore_space)(pw, space);
1328 for (i = 0; i < n_piece; ++i) {
1334 pw =
FN(
PW,restore_domain_at)(pw, i,
domain);
1335 el =
FN(
PW,take_base_at)(pw, i);
1337 pw =
FN(
PW,restore_base_at)(pw, i, el);
1352 return FN(
PW,free)(pw);
1354 space =
FN(
PW,get_domain_space)(pw);
1395 space =
FN(
PW,peek_space)(pw);
1427 n =
FN(
PW,n_piece)(pw);
1428 if (
n < 0 || !space || !
domain)
1431 for (i = 0; i <
n; ++i) {
1435 set =
FN(
PW,take_domain_at)(pw, i);
1437 pw =
FN(
PW,restore_domain_at)(pw, i,
set);
1438 el =
FN(
PW,take_base_at)(pw, i);
1439 el =
FN(
EL,reset_space_and_domain)(el,
1441 pw =
FN(
PW,restore_base_at)(pw, i, el);
1446 pw =
FN(
PW,restore_space)(pw, space);
1462 FN(
PW,get_space)(pw));
1463 return FN(
PW,reset_space_and_domain)(pw, space,
domain);
1472 return FN(
PW,reset_space_and_domain)(pw, space,
domain);
1480 pw =
FN(
PW,cow)(pw);
1484 space =
FN(
PW,get_space)(pw);
1487 return FN(
PW,reset_space)(pw, space);
1490 return FN(
PW,free)(pw);
1501 if (!
FN(
PW,has_tuple_id)(pw,
type))
1504 pw =
FN(
PW,cow)(pw);
1508 space =
FN(
PW,get_space)(pw);
1511 return FN(
PW,reset_space)(pw, space);
1519 space =
FN(
PW,get_space)(pw);
1521 return FN(
PW,reset_space)(pw, space);
1531 space =
FN(
PW,get_space)(pw);
1534 return FN(
PW,reset_space)(pw, space);
1551 for (i = 0; i < pw->n; ++i)
1553 FN(
EL,copy)(pw->p[i].FIELD),
user) < 0)
1570 for (i = 0; i < pw->n; ++i) {
1573 r =
test(pw->p[i].set, pw->p[i].FIELD,
user);
1591 n =
FN(
PW,n_piece)(pw);
1608 space =
FN(
PW,get_space)(pw);
1618 return FN(
EL,zero_like_type)(pw);
1634 return FN(
EL,zero_like_type)(pw,
type);
1661 "expecting single total function",
goto error);
1662 n =
FN(
PW,n_piece)(pw);
1666 return FN(
EL,zero_like)(pw);
1667 el =
FN(
PW,take_base_at)(pw, 0);
1680 pw =
FN(
PW,cow)(pw);
1719 pw =
FN(
PW,negate_type)(pw);
1720 n =
FN(
PW,n_piece)(pw);
1724 for (i = 0; i <
n; ++i) {
1727 el =
FN(
PW,take_base_at)(pw, i);
1729 pw =
FN(
PW,restore_base_at)(pw, i, el);
1757 "expecting rational factor",
goto error);
1760 "cannot scale down by zero",
goto error);
1763 pw =
FN(
PW,negate_type)(pw);
1764 n =
FN(
PW,n_piece)(pw);
1768 for (i = 0; i <
n; ++i) {
1771 el =
FN(
PW,take_base_at)(pw, i);
1773 pw =
FN(
PW,restore_base_at)(pw, i, el);
1798 pw =
FN(
PW,sort_unique)(pw);
1801 for (i = 0; i < pw->n; ++i) {
1804 return FN(
PW,free)(pw);
1828 has_nan =
FN(
PW,involves_nan)(pw1);
1829 if (has_nan >= 0 && !has_nan)
1830 has_nan =
FN(
PW,involves_nan)(pw2);
1831 if (has_nan < 0 || has_nan)
1836 equal =
FN(
PW,has_equal_space)(pw1, pw2);
1840 pw1 =
FN(
PW,copy)(pw1);
1841 pw2 =
FN(
PW,copy)(pw2);
1842 pw1 =
FN(
PW,normalize)(pw1);
1843 pw2 =
FN(
PW,normalize)(pw2);
1848 for (i = 0;
equal && i < pw1->n; ++i) {
1854 equal =
FN(
EL,plain_is_equal)(pw1->p[i].FIELD, pw2->p[i].FIELD);
1879 for (i = 0; i < pw->n; ++i) {
1880 isl_bool has_nan =
FN(
EL,involves_nan)(pw->p[i].FIELD);
1881 if (has_nan < 0 || has_nan)
#define isl_die(ctx, errno, msg, code)
#define isl_assert(ctx, test, code)
isl_bool isl_bool_ok(int b)
#define isl_alloc(ctx, type, size)
isl_bool isl_bool_not(isl_bool b)
isl_stat isl_stat(* fn)(__isl_take ISL_KEY *key, __isl_take ISL_VAL *val, void *user)
isl_stat isl_stat void * user
isl_bool isl_bool(* test)(__isl_keep ISL_KEY *key, __isl_keep ISL_VAL *val, void *user)
__isl_null isl_id * isl_id_free(__isl_take isl_id *id)
static int coalesce(isl_ctx *ctx, int n, struct isl_coalesce_info *info)
static __isl_give isl_qpolynomial * reset_domain_space(__isl_take isl_qpolynomial *qp, void *user)
static __isl_give isl_qpolynomial * substitute_equalities(__isl_take isl_qpolynomial *qp, void *user)
static __isl_give isl_qpolynomial * realign_domain(__isl_take isl_qpolynomial *qp, void *user)
static __isl_give isl_qpolynomial * drop_dims(__isl_take isl_qpolynomial *qp, void *user)
static __isl_give isl_qpolynomial * scale_val(__isl_take isl_qpolynomial *qp, void *user)
enum isl_fold isl_fold_type_negate(enum isl_fold type)
static __isl_give isl_qpolynomial * set_dim_name(__isl_take isl_qpolynomial *qp, void *user)
__isl_give dup(__isl_keep LIST(EL) *list)
__isl_give isl_set * isl_set_normalize(__isl_take isl_set *set)
static unsigned pos(__isl_keep isl_space *space, enum isl_dim_type type)
__isl_give isl_set * isl_set_drop(__isl_take isl_set *set, enum isl_dim_type type, unsigned first, unsigned n)
__isl_give isl_set * isl_set_realign(__isl_take isl_set *set, __isl_take isl_reordering *r)
__isl_null isl_reordering * isl_reordering_free(__isl_take isl_reordering *exp)
__isl_give isl_reordering * isl_parameter_alignment_reordering(__isl_keep isl_space *alignee, __isl_keep isl_space *aligner)
__isl_give isl_space * isl_reordering_get_space(__isl_keep isl_reordering *r)
__isl_give isl_reordering * isl_reordering_copy(__isl_keep isl_reordering *exp)
static __isl_give isl_schedule_node * align_params(__isl_take isl_schedule_node *node, void *user)
static __isl_give isl_schedule_node * reset_user(__isl_take isl_schedule_node *node, void *user)
int isl_sort(void *const pbase, size_t total_elems, size_t size, int(*cmp)(const void *, const void *, void *arg), void *arg)
__isl_give isl_space * isl_space_extend_domain_with_range(__isl_take isl_space *space, __isl_take isl_space *model)
isl_bool isl_space_has_named_params(__isl_keep isl_space *space)
isl_bool isl_space_is_domain_internal(__isl_keep isl_space *space1, __isl_keep isl_space *space2)
static __isl_give isl_union_map * inplace(__isl_take isl_union_map *umap, __isl_give isl_map *(*fn)(__isl_take isl_map *))
static isl_stat project_out(__isl_take isl_map *map, void *user)
#define OPT_TYPE_ARG(loc)
#define OPT_TYPE_ARG_FIRST(loc)
#define OPT_EQUAL_TYPES(loc1, loc2)
#define OPT_TYPE_PARAM_FIRST
#define OPT_SET_TYPE(loc, val)
__isl_export __isl_give isl_set * isl_set_universe(__isl_take isl_space *space)
__isl_export __isl_give isl_set * isl_set_coalesce(__isl_take isl_set *set)
__isl_export __isl_give isl_set * isl_set_subtract(__isl_take isl_set *set1, __isl_take isl_set *set2)
isl_ctx * isl_set_get_ctx(__isl_keep isl_set *set)
__isl_export __isl_give isl_space * isl_set_get_space(__isl_keep isl_set *set)
isl_bool isl_set_plain_is_empty(__isl_keep isl_set *set)
__isl_give isl_set * isl_set_reset_space(__isl_take isl_set *set, __isl_take isl_space *space)
__isl_export __isl_give isl_set * isl_set_union(__isl_take isl_set *set1, __isl_take isl_set *set2)
__isl_export __isl_give isl_set * isl_set_intersect_params(__isl_take isl_set *set, __isl_take isl_set *params)
__isl_export __isl_give isl_set * isl_set_gist_params(__isl_take isl_set *set, __isl_take isl_set *context)
__isl_null isl_set * isl_set_free(__isl_take isl_set *set)
__isl_give isl_set * isl_set_intersect_factor_range(__isl_take isl_set *set, __isl_take isl_set *range)
__isl_give isl_set * isl_set_copy(__isl_keep isl_set *set)
__isl_give isl_set * isl_set_intersect_factor_domain(__isl_take isl_set *set, __isl_take isl_set *domain)
__isl_give isl_set * isl_set_project_out(__isl_take isl_set *set, enum isl_dim_type type, unsigned first, unsigned n)
isl_bool isl_set_involves_dims(__isl_keep isl_set *set, enum isl_dim_type type, unsigned first, unsigned n)
__isl_export __isl_give isl_set * isl_set_gist(__isl_take isl_set *set, __isl_take isl_set *context)
__isl_give isl_set * isl_set_compute_divs(__isl_take isl_set *set)
isl_bool isl_set_plain_is_equal(__isl_keep isl_set *set1, __isl_keep isl_set *set2)
isl_bool isl_set_plain_is_universe(__isl_keep isl_set *set)
__isl_export __isl_give isl_set * isl_set_intersect(__isl_take isl_set *set1, __isl_take isl_set *set2)
__isl_export __isl_give isl_set * isl_set_empty(__isl_take isl_space *space)
__isl_give isl_set * isl_set_union_disjoint(__isl_take isl_set *set1, __isl_take isl_set *set2)
__isl_export __isl_give isl_basic_set * isl_set_affine_hull(__isl_take isl_set *set)
__isl_export __isl_give isl_set * isl_set_params(__isl_take isl_set *set)
isl_bool isl_space_has_equal_params(__isl_keep isl_space *space1, __isl_keep isl_space *space2)
__isl_give isl_space * isl_space_set_tuple_id(__isl_take isl_space *space, enum isl_dim_type type, __isl_take isl_id *id)
__isl_null isl_space * isl_space_free(__isl_take isl_space *space)
__isl_export __isl_give isl_space * isl_space_params(__isl_take isl_space *space)
isl_bool isl_space_has_tuple_id(__isl_keep isl_space *space, enum isl_dim_type type)
isl_ctx * isl_space_get_ctx(__isl_keep isl_space *space)
__isl_give isl_id * isl_space_get_tuple_id(__isl_keep isl_space *space, enum isl_dim_type type)
__isl_give isl_space * isl_space_copy(__isl_keep isl_space *space)
__isl_give isl_space * isl_space_set_dim_id(__isl_take isl_space *space, enum isl_dim_type type, unsigned pos, __isl_take isl_id *id)
__isl_keep const char * isl_space_get_dim_name(__isl_keep isl_space *space, enum isl_dim_type type, unsigned pos)
__isl_keep const char * isl_space_get_tuple_name(__isl_keep isl_space *space, enum isl_dim_type type)
isl_bool isl_space_has_tuple_name(__isl_keep isl_space *space, enum isl_dim_type type)
int isl_space_find_dim_by_id(__isl_keep isl_space *space, enum isl_dim_type type, __isl_keep isl_id *id)
__isl_give isl_space * isl_space_set_dim_name(__isl_take isl_space *space, enum isl_dim_type type, unsigned pos, __isl_keep const char *name)
isl_bool isl_space_has_dim_id(__isl_keep isl_space *space, enum isl_dim_type type, unsigned pos)
__isl_export isl_bool isl_space_is_equal(__isl_keep isl_space *space1, __isl_keep isl_space *space2)
__isl_give isl_space * isl_space_drop_dims(__isl_take isl_space *space, enum isl_dim_type type, unsigned first, unsigned num)
__isl_give isl_id * isl_space_get_dim_id(__isl_keep isl_space *space, enum isl_dim_type type, unsigned pos)
isl_size isl_space_dim(__isl_keep isl_space *space, enum isl_dim_type type)
__isl_give isl_space * isl_space_reset_tuple_id(__isl_take isl_space *space, enum isl_dim_type type)
__isl_give isl_space * isl_space_reset_user(__isl_take isl_space *space)
int isl_space_find_dim_by_name(__isl_keep isl_space *space, enum isl_dim_type type, const char *name)
__isl_export __isl_give isl_space * isl_space_domain(__isl_take isl_space *space)
__isl_give isl_val * isl_val_copy(__isl_keep isl_val *v)
isl_ctx * isl_val_get_ctx(__isl_keep isl_val *val)
__isl_export isl_bool isl_val_is_neg(__isl_keep isl_val *v)
__isl_null isl_val * isl_val_free(__isl_take isl_val *v)
__isl_export isl_bool isl_val_is_zero(__isl_keep isl_val *v)
__isl_export isl_bool isl_val_is_one(__isl_keep isl_val *v)
__isl_export isl_bool isl_val_is_rat(__isl_keep isl_val *v)