- if (!dim)
- return NULL;
- if (type == isl_dim_in)
- return dim->nested[0];
- if (type == isl_dim_out)
- return dim->nested[1];
- return NULL;
-}
-
-int isl_dim_tuple_match(__isl_keep isl_dim *dim1, enum isl_dim_type dim1_type,
- __isl_keep isl_dim *dim2, enum isl_dim_type dim2_type)
-{
- struct isl_name *name1, *name2;
- isl_dim *nested1, *nested2;
-
- if (n(dim1, dim1_type) != n(dim2, dim2_type))
- return 0;
- name1 = tuple_name(dim1, dim1_type);
- name2 = tuple_name(dim2, dim2_type);
- if (!name1 ^ !name2)
- return 0;
- if (name1 && name1->name != name2->name)
- return 0;
- nested1 = nested(dim1, dim1_type);
- nested2 = nested(dim2, dim2_type);
- if (!nested1 ^ !nested2)
- return 0;
- if (nested1 && !isl_dim_equal(nested1, nested2))
- return 0;
- return 1;
-}
-
-static int match(struct isl_dim *dim1, enum isl_dim_type dim1_type,
- struct isl_dim *dim2, enum isl_dim_type dim2_type)
-{
- int i;
-
- if (!isl_dim_tuple_match(dim1, dim1_type, dim2, dim2_type))
- return 0;
-
- if (!dim1->names && !dim2->names)
- return 1;
-
- for (i = 0; i < n(dim1, dim1_type); ++i) {
- if (get_name(dim1, dim1_type, i) !=
- get_name(dim2, dim2_type, i))
- return 0;
- }
- return 1;
-}
-
-int isl_dim_match(struct isl_dim *dim1, enum isl_dim_type dim1_type,
- struct isl_dim *dim2, enum isl_dim_type dim2_type)
-{
- return match(dim1, dim1_type, dim2, dim2_type);
-}
-
-static void get_names(struct isl_dim *dim, enum isl_dim_type type,
- unsigned first, unsigned n, struct isl_name **names)
-{
- int i;
-
- for (i = 0; i < n ; ++i)
- names[i] = get_name(dim, type, first+i);
-}
-
-struct isl_dim *isl_dim_extend(struct isl_dim *dim,
- unsigned nparam, unsigned n_in, unsigned n_out)
-{
- struct isl_name **names = NULL;
-
- if (!dim)
- return NULL;
- if (dim->nparam == nparam && dim->n_in == n_in && dim->n_out == n_out)
- return dim;
-
- isl_assert(dim->ctx, dim->nparam <= nparam, goto error);
- isl_assert(dim->ctx, dim->n_in <= n_in, goto error);
- isl_assert(dim->ctx, dim->n_out <= n_out, goto error);
-
- dim = isl_dim_cow(dim);
-
- if (dim->names) {
- names = isl_calloc_array(dim->ctx, struct isl_name *,
- nparam + n_in + n_out);
- if (!names)
- goto error;
- get_names(dim, isl_dim_param, 0, dim->nparam, names);
- get_names(dim, isl_dim_in, 0, dim->n_in, names + nparam);
- get_names(dim, isl_dim_out, 0, dim->n_out,
- names + nparam + n_in);
- free(dim->names);
- dim->names = names;
- dim->n_name = nparam + n_in + n_out;
- }
- dim->nparam = nparam;
- dim->n_in = n_in;
- dim->n_out = n_out;
-
- return dim;
-error:
- free(names);
- isl_dim_free(dim);
- return NULL;
-}
-
-struct isl_dim *isl_dim_add(struct isl_dim *dim, enum isl_dim_type type,
- unsigned n)
-{
- if (!dim)
- return NULL;
- dim = isl_dim_reset(dim, type);
- switch (type) {
- case isl_dim_param:
- dim = isl_dim_extend(dim,
- dim->nparam + n, dim->n_in, dim->n_out);
- if (dim && dim->nested[0] &&
- !(dim->nested[0] = isl_dim_add(dim->nested[0],
- isl_dim_param, n)))
- goto error;
- if (dim && dim->nested[1] &&
- !(dim->nested[1] = isl_dim_add(dim->nested[1],
- isl_dim_param, n)))
- goto error;
- return dim;
- case isl_dim_in:
- return isl_dim_extend(dim,
- dim->nparam, dim->n_in + n, dim->n_out);
- case isl_dim_out:
- return isl_dim_extend(dim,
- dim->nparam, dim->n_in, dim->n_out + n);
- default:
- isl_die(dim->ctx, isl_error_invalid,
- "cannot add dimensions of specified type", goto error);
- }
-error:
- isl_dim_free(dim);
- return NULL;