goto error;
pos = global_pos(dim, type, pos);
- isl_assert(ctx, pos != isl_dim_total(dim), goto error);
+ if (pos == isl_dim_total(dim))
+ goto error;
if (pos >= dim->n_name) {
if (!name)
dim = isl_dim_reset(dim, type);
switch (type) {
case isl_dim_param:
- return isl_dim_extend(dim,
+ 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);
dim->nparam, dim->n_in, dim->n_out + n);
}
return dim;
+error:
+ isl_dim_free(dim);
+ return NULL;
}
__isl_give isl_dim *isl_dim_insert(__isl_take isl_dim *dim,
if (dim->names) {
enum isl_dim_type t;
int off;
- int size[3];
+ int s[3];
+ int *size = s - isl_dim_param;
names = isl_calloc_array(dim->ctx, struct isl_name *,
dim->nparam + dim->n_in + dim->n_out + n);
if (!names)
struct isl_name **names;
enum isl_dim_type t;
int off;
- int size[3];
+ int s[3];
+ int *size = s - isl_dim_param;
names = isl_calloc_array(dim->ctx, struct isl_name *,
dim->nparam + dim->n_in + dim->n_out);
if (!names)
struct isl_dim *isl_dim_product(struct isl_dim *left, struct isl_dim *right)
{
- struct isl_dim *dim;
+ isl_dim *dom1, *dom2, *nest1, *nest2;
if (!left || !right)
goto error;
isl_assert(left->ctx, match(left, isl_dim_param, right, isl_dim_param),
goto error);
- dim = isl_dim_alloc(left->ctx, left->nparam,
- left->n_in + right->n_in, left->n_out + right->n_out);
- if (!dim)
- goto error;
-
- dim = copy_names(dim, isl_dim_param, 0, left, isl_dim_param);
- dim = copy_names(dim, isl_dim_in, 0, left, isl_dim_in);
- dim = copy_names(dim, isl_dim_in, left->n_in, right, isl_dim_in);
- dim = copy_names(dim, isl_dim_out, 0, left, isl_dim_out);
- dim = copy_names(dim, isl_dim_out, left->n_out, right, isl_dim_out);
+ dom1 = isl_dim_domain(isl_dim_copy(left));
+ dom2 = isl_dim_domain(isl_dim_copy(right));
+ nest1 = isl_dim_wrap(isl_dim_join(isl_dim_reverse(dom1), dom2));
- isl_dim_free(left);
- isl_dim_free(right);
+ dom1 = isl_dim_range(left);
+ dom2 = isl_dim_range(right);
+ nest2 = isl_dim_wrap(isl_dim_join(isl_dim_reverse(dom1), dom2));
- return dim;
+ return isl_dim_join(isl_dim_reverse(nest1), nest2);
error:
isl_dim_free(left);
isl_dim_free(right);
case isl_dim_out: dim->n_out -= num; break;
}
dim = isl_dim_reset(dim, type);
+ if (type == isl_dim_param) {
+ if (dim && dim->nested[0] &&
+ !(dim->nested[0] = isl_dim_drop(dim->nested[0],
+ isl_dim_param, first, num)))
+ goto error;
+ if (dim && dim->nested[1] &&
+ !(dim->nested[1] = isl_dim_drop(dim->nested[1],
+ isl_dim_param, first, num)))
+ goto error;
+ }
return dim;
error:
isl_dim_free(dim);
return isl_dim_reverse(dim);
}
+__isl_give isl_dim *isl_dim_from_domain(__isl_take isl_dim *dim)
+{
+ return isl_dim_reverse(dim);
+}
+
struct isl_dim *isl_dim_range(struct isl_dim *dim)
{
if (!dim)
return isl_dim_drop_inputs(dim, 0, dim->n_in);
}
+__isl_give isl_dim *isl_dim_from_range(__isl_take isl_dim *dim)
+{
+ return dim;
+}
+
__isl_give isl_dim *isl_dim_as_set_dim(__isl_take isl_dim *dim)
{
dim = isl_dim_cow(dim);
unsigned isl_dim_total(struct isl_dim *dim)
{
- return dim->nparam + dim->n_in + dim->n_out;
+ return dim ? dim->nparam + dim->n_in + dim->n_out : 0;
}
int isl_dim_equal(struct isl_dim *dim1, struct isl_dim *dim2)
return dim;
}
+
+__isl_give isl_dim *isl_dim_flatten(__isl_take isl_dim *dim)
+{
+ if (!dim)
+ return NULL;
+ if (!dim->nested[0] && !dim->nested[1])
+ return dim;
+
+ if (dim->nested[0])
+ dim = isl_dim_reset(dim, isl_dim_in);
+ if (dim && dim->nested[1])
+ dim = isl_dim_reset(dim, isl_dim_out);
+
+ return dim;
+}
+
+/* Replace the dimensions of the given type of dst by those of src.
+ */
+__isl_give isl_dim *isl_dim_replace(__isl_take isl_dim *dst,
+ enum isl_dim_type type, __isl_keep isl_dim *src)
+{
+ dst = isl_dim_cow(dst);
+
+ if (!dst || !src)
+ goto error;
+
+ dst = isl_dim_drop(dst, type, 0, isl_dim_size(dst, type));
+ dst = isl_dim_add(dst, type, isl_dim_size(src, type));
+ dst = copy_names(dst, type, 0, src, type);
+
+ if (dst && type == isl_dim_param) {
+ int i;
+ for (i = 0; i <= 1; ++i) {
+ if (!dst->nested[i])
+ continue;
+ dst->nested[i] = isl_dim_replace(dst->nested[i],
+ type, src);
+ if (!dst->nested[i])
+ goto error;
+ }
+ }
+
+ return dst;
+error:
+ isl_dim_free(dst);
+ return NULL;
+}