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(isl_reordering_get_ctx(r
), r
->len
);
53 dup
->space
= isl_reordering_get_space(r
);
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 __isl_null isl_reordering
*isl_reordering_free(__isl_take isl_reordering
*exp
)
81 isl_space_free(exp
->space
);
86 /* Return the isl_ctx to which "r" belongs.
88 isl_ctx
*isl_reordering_get_ctx(__isl_keep isl_reordering
*r
)
90 return isl_space_get_ctx(isl_reordering_peek_space(r
));
93 /* Return the space of "r".
95 __isl_keep isl_space
*isl_reordering_peek_space(__isl_keep isl_reordering
*r
)
102 /* Return a copy of the space of "r".
104 __isl_give isl_space
*isl_reordering_get_space(__isl_keep isl_reordering
*r
)
106 return isl_space_copy(isl_reordering_peek_space(r
));
109 /* Construct a reordering that maps the parameters of "alignee"
110 * to the corresponding parameters in a new dimension specification
111 * that has the parameters of "aligner" first, followed by
112 * any remaining parameters of "alignee" that do not occur in "aligner".
114 __isl_give isl_reordering
*isl_parameter_alignment_reordering(
115 __isl_keep isl_space
*alignee
, __isl_keep isl_space
*aligner
)
120 if (!alignee
|| !aligner
)
123 exp
= isl_reordering_alloc(alignee
->ctx
, alignee
->nparam
);
127 exp
->space
= isl_space_params(isl_space_copy(aligner
));
129 for (i
= 0; i
< alignee
->nparam
; ++i
) {
131 id_i
= isl_space_get_dim_id(alignee
, isl_dim_param
, i
);
133 isl_die(alignee
->ctx
, isl_error_invalid
,
134 "cannot align unnamed parameters", goto error
);
135 for (j
= 0; j
< aligner
->nparam
; ++j
) {
137 id_j
= isl_space_get_dim_id(aligner
, isl_dim_param
, j
);
142 if (j
< aligner
->nparam
) {
147 pos
= isl_space_dim(exp
->space
, isl_dim_param
);
148 exp
->space
= isl_space_add_dims(exp
->space
,
150 exp
->space
= isl_space_set_dim_id(exp
->space
,
151 isl_dim_param
, pos
, id_i
);
157 return isl_reordering_free(exp
);
160 isl_reordering_free(exp
);
164 __isl_give isl_reordering
*isl_reordering_extend(__isl_take isl_reordering
*exp
,
178 ctx
= isl_reordering_get_ctx(exp
);
179 space
= isl_reordering_peek_space(exp
);
180 offset
= isl_space_dim(space
, isl_dim_all
) - exp
->len
;
181 res
= isl_reordering_alloc(ctx
, exp
->len
+ extra
);
184 res
->space
= isl_reordering_get_space(exp
);
185 for (i
= 0; i
< exp
->len
; ++i
)
186 res
->pos
[i
] = exp
->pos
[i
];
187 for (i
= exp
->len
; i
< res
->len
; ++i
)
188 res
->pos
[i
] = offset
+ i
;
190 isl_reordering_free(exp
);
194 isl_reordering_free(exp
);
198 __isl_give isl_reordering
*isl_reordering_extend_space(
199 __isl_take isl_reordering
*exp
, __isl_take isl_space
*space
)
201 isl_space
*exp_space
;
207 res
= isl_reordering_extend(isl_reordering_copy(exp
),
208 isl_space_dim(space
, isl_dim_all
) - exp
->len
);
209 res
= isl_reordering_cow(res
);
212 isl_space_free(res
->space
);
213 exp_space
= isl_reordering_peek_space(exp
);
214 res
->space
= isl_space_replace_params(space
, exp_space
);
216 isl_reordering_free(exp
);
219 return isl_reordering_free(res
);
223 isl_reordering_free(exp
);
224 isl_space_free(space
);
228 void isl_reordering_dump(__isl_keep isl_reordering
*exp
)
232 isl_space_dump(exp
->space
);
233 for (i
= 0; i
< exp
->len
; ++i
)
234 fprintf(stderr
, "%d -> %d; ", i
, exp
->pos
[i
]);
235 fprintf(stderr
, "\n");