2 * Copyright 2010 INRIA Saclay
4 * Use of this software is governed by the GNU LGPLv2.1 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_dim_private.h>
12 #include <isl_reordering.h>
14 __isl_give isl_reordering
*isl_reordering_alloc(isl_ctx
*ctx
, int len
)
18 exp
= isl_alloc(ctx
, struct isl_reordering
,
19 sizeof(struct isl_reordering
) + (len
- 1) * sizeof(int));
30 __isl_give isl_reordering
*isl_reordering_copy(__isl_keep isl_reordering
*exp
)
39 void isl_reordering_free(__isl_take isl_reordering
*exp
)
47 isl_dim_free(exp
->dim
);
51 /* Construct a reordering that maps the parameters of "alignee"
52 * to the corresponding parameters in a new dimension specification
53 * that has the parameters of "aligner" first, followed by
54 * any remaining parameters of "alignee" that do not occur in "aligner".
56 __isl_give isl_reordering
*isl_parameter_alignment_reordering(
57 __isl_keep isl_dim
*alignee
, __isl_keep isl_dim
*aligner
)
62 if (!alignee
|| !aligner
)
65 exp
= isl_reordering_alloc(alignee
->ctx
, alignee
->nparam
);
69 exp
->dim
= isl_dim_copy(aligner
);
71 for (i
= 0; i
< alignee
->nparam
; ++i
) {
73 name_i
= isl_dim_get_name(alignee
, isl_dim_param
, i
);
75 isl_die(alignee
->ctx
, isl_error_invalid
,
76 "cannot align unnamed parameters", goto error
);
77 for (j
= 0; j
< aligner
->nparam
; ++j
) {
79 name_j
= isl_dim_get_name(aligner
, isl_dim_param
, j
);
83 if (j
< aligner
->nparam
)
87 pos
= isl_dim_size(exp
->dim
, isl_dim_param
);
88 exp
->dim
= isl_dim_add(exp
->dim
, isl_dim_param
, 1);
89 exp
->dim
= isl_dim_set_name(exp
->dim
,
90 isl_dim_param
, pos
, name_i
);
97 isl_reordering_free(exp
);
101 __isl_give isl_reordering
*isl_reordering_extend(__isl_take isl_reordering
*exp
,
113 offset
= isl_dim_total(exp
->dim
) - exp
->len
;
114 res
= isl_reordering_alloc(exp
->dim
->ctx
, exp
->len
+ extra
);
117 res
->dim
= isl_dim_copy(exp
->dim
);
118 for (i
= 0; i
< exp
->len
; ++i
)
119 res
->pos
[i
] = exp
->pos
[i
];
120 for (i
= exp
->len
; i
< res
->len
; ++i
)
121 res
->pos
[i
] = offset
+ i
;
123 isl_reordering_free(exp
);
127 isl_reordering_free(exp
);
131 __isl_give isl_reordering
*isl_reordering_extend_dim(
132 __isl_take isl_reordering
*exp
, __isl_take isl_dim
*dim
)
141 res
= isl_reordering_extend(isl_reordering_copy(exp
),
142 isl_dim_total(dim
) - exp
->len
);
145 isl_dim_free(res
->dim
);
146 res
->dim
= isl_dim_replace(dim
, isl_dim_param
, exp
->dim
);
148 isl_reordering_free(exp
);
152 isl_reordering_free(exp
);
157 void isl_reordering_dump(__isl_keep isl_reordering
*exp
)
161 for (i
= 0; i
< exp
->len
; ++i
)
162 fprintf(stderr
, "%d -> %d; ", i
, exp
->pos
[i
]);
163 fprintf(stderr
, "\n");