2 * Copyright 2011 Sven Verdoolaege
3 * Copyright 2012-2013 Ecole Normale Superieure
5 * Use of this software is governed by the MIT license
7 * Written by Sven Verdoolaege,
8 * Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France
11 #include <isl_space_private.h>
13 #include <isl_multi_macro.h>
15 /* Check whether "multi" has non-zero coefficients for any dimension
16 * in the given range or if any of these dimensions appear
17 * with non-zero coefficients in any of the integer divisions involved.
19 isl_bool
FN(MULTI(BASE
),involves_dims
)(__isl_keep
MULTI(BASE
) *multi
,
20 enum isl_dim_type type
, unsigned first
, unsigned n
)
25 return isl_bool_error
;
27 return isl_bool_false
;
29 for (i
= 0; i
< multi
->n
; ++i
) {
32 involves
= FN(EL
,involves_dims
)(multi
->u
.p
[i
], type
, first
, n
);
33 if (involves
< 0 || involves
)
37 if (FN(MULTI(BASE
),has_explicit_domain
)(multi
))
38 return FN(MULTI(BASE
),involves_explicit_domain_dims
)(multi
,
41 return isl_bool_false
;
44 __isl_give
MULTI(BASE
) *FN(MULTI(BASE
),insert_dims
)(
45 __isl_take
MULTI(BASE
) *multi
,
46 enum isl_dim_type type
, unsigned first
, unsigned n
)
51 size
= FN(MULTI(BASE
),size
)(multi
);
53 return FN(MULTI(BASE
),free
)(multi
);
54 if (type
== isl_dim_out
)
55 isl_die(FN(MULTI(BASE
),get_ctx
)(multi
), isl_error_invalid
,
56 "cannot insert output/set dimensions",
57 return FN(MULTI(BASE
),free
)(multi
));
58 if (n
== 0 && !isl_space_is_named_or_nested(multi
->space
, type
))
61 multi
= FN(MULTI(BASE
),cow
)(multi
);
65 multi
->space
= isl_space_insert_dims(multi
->space
, type
, first
, n
);
67 return FN(MULTI(BASE
),free
)(multi
);
68 if (FN(MULTI(BASE
),has_explicit_domain
)(multi
))
69 multi
= FN(MULTI(BASE
),insert_explicit_domain_dims
)(multi
,
74 for (i
= 0; i
< size
; ++i
) {
75 multi
->u
.p
[i
] = FN(EL
,insert_dims
)(multi
->u
.p
[i
],
78 return FN(MULTI(BASE
),free
)(multi
);
84 __isl_give
MULTI(BASE
) *FN(MULTI(BASE
),add_dims
)(__isl_take
MULTI(BASE
) *multi
,
85 enum isl_dim_type type
, unsigned n
)
89 pos
= FN(MULTI(BASE
),dim
)(multi
, type
);
91 return FN(MULTI(BASE
),free
)(multi
);
93 return FN(MULTI(BASE
),insert_dims
)(multi
, type
, pos
, n
);
96 /* Project the domain of "multi" onto its parameter space.
97 * "multi" may not involve any of the domain dimensions.
99 __isl_give
MULTI(BASE
) *FN(MULTI(BASE
),project_domain_on_params
)(
100 __isl_take
MULTI(BASE
) *multi
)
106 n
= FN(MULTI(BASE
),dim
)(multi
, isl_dim_in
);
108 return FN(MULTI(BASE
),free
)(multi
);
109 involves
= FN(MULTI(BASE
),involves_dims
)(multi
, isl_dim_in
, 0, n
);
111 return FN(MULTI(BASE
),free
)(multi
);
113 isl_die(FN(MULTI(BASE
),get_ctx
)(multi
), isl_error_invalid
,
114 "expression involves some of the domain dimensions",
115 return FN(MULTI(BASE
),free
)(multi
));
116 multi
= FN(MULTI(BASE
),drop_dims
)(multi
, isl_dim_in
, 0, n
);
117 space
= FN(MULTI(BASE
),get_domain_space
)(multi
);
118 space
= isl_space_params(space
);
119 multi
= FN(MULTI(BASE
),reset_domain_space
)(multi
, space
);