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
;
26 if (multi
->n
== 0 || n
== 0)
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 return isl_bool_false
;
40 __isl_give
MULTI(BASE
) *FN(MULTI(BASE
),insert_dims
)(
41 __isl_take
MULTI(BASE
) *multi
,
42 enum isl_dim_type type
, unsigned first
, unsigned n
)
48 if (type
== isl_dim_out
)
49 isl_die(FN(MULTI(BASE
),get_ctx
)(multi
), isl_error_invalid
,
50 "cannot insert output/set dimensions",
51 return FN(MULTI(BASE
),free
)(multi
));
52 if (n
== 0 && !isl_space_is_named_or_nested(multi
->space
, type
))
55 multi
= FN(MULTI(BASE
),cow
)(multi
);
59 multi
->space
= isl_space_insert_dims(multi
->space
, type
, first
, n
);
61 return FN(MULTI(BASE
),free
)(multi
);
63 for (i
= 0; i
< multi
->n
; ++i
) {
64 multi
->u
.p
[i
] = FN(EL
,insert_dims
)(multi
->u
.p
[i
],
67 return FN(MULTI(BASE
),free
)(multi
);
73 __isl_give
MULTI(BASE
) *FN(MULTI(BASE
),add_dims
)(__isl_take
MULTI(BASE
) *multi
,
74 enum isl_dim_type type
, unsigned n
)
78 pos
= FN(MULTI(BASE
),dim
)(multi
, type
);
80 return FN(MULTI(BASE
),insert_dims
)(multi
, type
, pos
, n
);
83 /* Project the domain of "multi" onto its parameter space.
84 * "multi" may not involve any of the domain dimensions.
86 __isl_give
MULTI(BASE
) *FN(MULTI(BASE
),project_domain_on_params
)(
87 __isl_take
MULTI(BASE
) *multi
)
93 n
= FN(MULTI(BASE
),dim
)(multi
, isl_dim_in
);
94 involves
= FN(MULTI(BASE
),involves_dims
)(multi
, isl_dim_in
, 0, n
);
96 return FN(MULTI(BASE
),free
)(multi
);
98 isl_die(FN(MULTI(BASE
),get_ctx
)(multi
), isl_error_invalid
,
99 "expression involves some of the domain dimensions",
100 return FN(MULTI(BASE
),free
)(multi
));
101 multi
= FN(MULTI(BASE
),drop_dims
)(multi
, isl_dim_in
, 0, n
);
102 space
= FN(MULTI(BASE
),get_domain_space
)(multi
);
103 space
= isl_space_params(space
);
104 multi
= FN(MULTI(BASE
),reset_domain_space
)(multi
, space
);