2 * Copyright 2010 INRIA Saclay
4 * Use of this software is governed by the MIT license
6 * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
7 * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
11 #include <isl_ctx_private.h>
13 #include <isl_space_private.h>
14 #include <isl_reordering.h>
16 __isl_give isl_reordering
*isl_reordering_alloc(isl_ctx
*ctx
, int len
)
20 exp
= isl_alloc(ctx
, struct isl_reordering
,
21 sizeof(struct isl_reordering
) + (len
- 1) * sizeof(int));
32 __isl_give isl_reordering
*isl_reordering_copy(__isl_keep isl_reordering
*exp
)
41 __isl_give isl_reordering
*isl_reordering_dup(__isl_keep isl_reordering
*r
)
49 dup
= isl_reordering_alloc(r
->dim
->ctx
, r
->len
);
53 dup
->dim
= isl_space_copy(r
->dim
);
55 return isl_reordering_free(dup
);
56 for (i
= 0; i
< dup
->len
; ++i
)
57 dup
->pos
[i
] = r
->pos
[i
];
62 __isl_give isl_reordering
*isl_reordering_cow(__isl_take isl_reordering
*r
)
70 return isl_reordering_dup(r
);
73 void *isl_reordering_free(__isl_take isl_reordering
*exp
)
81 isl_space_free(exp
->dim
);
86 /* Construct a reordering that maps the parameters of "alignee"
87 * to the corresponding parameters in a new dimension specification
88 * that has the parameters of "aligner" first, followed by
89 * any remaining parameters of "alignee" that do not occur in "aligner".
91 __isl_give isl_reordering
*isl_parameter_alignment_reordering(
92 __isl_keep isl_space
*alignee
, __isl_keep isl_space
*aligner
)
97 if (!alignee
|| !aligner
)
100 exp
= isl_reordering_alloc(alignee
->ctx
, alignee
->nparam
);
104 exp
->dim
= isl_space_copy(aligner
);
106 for (i
= 0; i
< alignee
->nparam
; ++i
) {
108 id_i
= isl_space_get_dim_id(alignee
, isl_dim_param
, i
);
110 isl_die(alignee
->ctx
, isl_error_invalid
,
111 "cannot align unnamed parameters", goto error
);
112 for (j
= 0; j
< aligner
->nparam
; ++j
) {
114 id_j
= isl_space_get_dim_id(aligner
, isl_dim_param
, j
);
119 if (j
< aligner
->nparam
) {
124 pos
= isl_space_dim(exp
->dim
, isl_dim_param
);
125 exp
->dim
= isl_space_add_dims(exp
->dim
, isl_dim_param
, 1);
126 exp
->dim
= isl_space_set_dim_id(exp
->dim
,
127 isl_dim_param
, pos
, id_i
);
133 return isl_reordering_free(exp
);
136 isl_reordering_free(exp
);
140 __isl_give isl_reordering
*isl_reordering_extend(__isl_take isl_reordering
*exp
,
152 offset
= isl_space_dim(exp
->dim
, isl_dim_all
) - exp
->len
;
153 res
= isl_reordering_alloc(exp
->dim
->ctx
, exp
->len
+ extra
);
156 res
->dim
= isl_space_copy(exp
->dim
);
157 for (i
= 0; i
< exp
->len
; ++i
)
158 res
->pos
[i
] = exp
->pos
[i
];
159 for (i
= exp
->len
; i
< res
->len
; ++i
)
160 res
->pos
[i
] = offset
+ i
;
162 isl_reordering_free(exp
);
166 isl_reordering_free(exp
);
170 __isl_give isl_reordering
*isl_reordering_extend_space(
171 __isl_take isl_reordering
*exp
, __isl_take isl_space
*space
)
178 res
= isl_reordering_extend(isl_reordering_copy(exp
),
179 isl_space_dim(space
, isl_dim_all
) - exp
->len
);
180 res
= isl_reordering_cow(res
);
183 isl_space_free(res
->dim
);
184 res
->dim
= isl_space_replace_params(space
, exp
->dim
);
186 isl_reordering_free(exp
);
189 return isl_reordering_free(res
);
193 isl_reordering_free(exp
);
194 isl_space_free(space
);
198 void isl_reordering_dump(__isl_keep isl_reordering
*exp
)
202 isl_space_dump(exp
->dim
);
203 for (i
= 0; i
< exp
->len
; ++i
)
204 fprintf(stderr
, "%d -> %d; ", i
, exp
->pos
[i
]);
205 fprintf(stderr
, "\n");