1 From b561f860f2fefa84459750d576807d214e4aad97 Mon Sep 17 00:00:00 2001
2 From: Sven Verdoolaege <skimo@kotnet.org>
3 Date: Sun, 12 Jan 2014 14:35:00 +0100
4 Subject: [PATCH] cloog_domain_cube: reimplement using documented functions
6 The original implementation used the undocumented
7 isl_basic_set_interval function, which will be removed
8 in the next release of isl.
10 Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
11 Signed-off-by: Cedric Bastoul <cedric.bastoul@unistra.fr>
13 source/isl/domain.c | 20 ++++++++++----------
14 1 files changed, 10 insertions(+), 10 deletions(-)
16 diff --git a/source/isl/domain.c b/source/isl/domain.c
17 index d11da7b..620584d 100644
18 --- a/source/isl/domain.c
19 +++ b/source/isl/domain.c
20 @@ -1389,20 +1389,20 @@ CloogDomain *cloog_domain_cube(CloogState *state,
21 int dim, cloog_int_t min, cloog_int_t max)
24 - struct isl_basic_set *cube;
25 - struct isl_basic_set *interval;
26 - struct isl_basic_set_list *list;
31 return cloog_domain_universe(state, dim);
33 - interval = isl_basic_set_interval(state->backend->ctx, min, max);
34 - list = isl_basic_set_list_alloc(state->backend->ctx, dim);
35 - for (i = 0; i < dim; ++i)
36 - list = isl_basic_set_list_add(list, isl_basic_set_copy(interval));
37 - isl_basic_set_free(interval);
38 - cube = isl_basic_set_list_product(list);
39 - return cloog_domain_from_isl_set(isl_set_from_basic_set(cube));
40 + space = isl_space_set_alloc(state->backend->ctx, 0, dim);
41 + cube = isl_set_universe(space);
42 + for (i = 0; i < dim; ++i) {
43 + cube = isl_set_lower_bound(cube, isl_dim_set, i, min);
44 + cube = isl_set_upper_bound(cube, isl_dim_set, i, max);
47 + return cloog_domain_from_isl_set(cube);
54 From 2d8b7c6b43ee46fee978a57fa6877de49675f357 Mon Sep 17 00:00:00 2001
55 From: Taj Muhammad Khan <taj.khan@lri.fr>
56 Date: Thu, 5 Dec 2013 07:55:16 +0530
57 Subject: [PATCH] Use isl_val instead of isl_int
59 isl is moving from the macro-based isl_int to a more generic
60 integer type isl_val, so CLooG does with this patch.
61 Authors are Uday Bondhugula, Taj Muhammad Khan and Cedric Bastoul.
63 include/cloog/isl/constraintset.h | 6 +
64 source/isl/constraints.c | 247 +++++++++++++++++++---------
65 source/isl/domain.c | 329 ++++++++++++++++++++++++-------------
66 3 files changed, 389 insertions(+), 193 deletions(-)
68 diff --git a/include/cloog/isl/constraintset.h b/include/cloog/isl/constraintset.h
69 index c3c2eed..5d48cdb 100644
70 --- a/include/cloog/isl/constraintset.h
71 +++ b/include/cloog/isl/constraintset.h
72 @@ -27,6 +27,12 @@ CloogConstraintSet *cloog_constraint_set_from_isl_basic_set(struct isl_basic_set
73 CloogConstraint *cloog_constraint_from_isl_constraint(struct isl_constraint *constraint);
74 isl_constraint *cloog_constraint_to_isl(CloogConstraint *constraint);
76 +__isl_give isl_val *cloog_int_to_isl_val(isl_ctx* ctx, cloog_int_t c);
77 +void isl_val_to_cloog_int(__isl_keep isl_val *val, cloog_int_t *cint);
79 +__isl_give isl_val *cloog_constraint_coefficient_get_val(CloogConstraint *constraint,
82 #if defined(__cplusplus)
85 diff --git a/source/isl/constraints.c b/source/isl/constraints.c
86 index e860000..73d72df 100644
87 --- a/source/isl/constraints.c
88 +++ b/source/isl/constraints.c
90 #include <cloog/isl/backend.h>
94 +#include <isl/val_gmp.h>
97 #define ALLOC(type) (type*)malloc(sizeof(type))
98 #define ALLOCN(type,n) (type*)malloc((n)*sizeof(type))
100 +__isl_give isl_val *cloog_int_to_isl_val(isl_ctx* ctx, cloog_int_t c)
103 +#if defined(CLOOG_INT_INT)
104 + v = isl_val_int_from_si(ctx, c);
105 +#elif defined(CLOOG_INT_LONG)
106 + v = isl_val_int_from_si(ctx, c);
107 +#elif defined(CLOOG_INT_LONG_LONG)
108 + v = isl_val_int_from_si(ctx, c);
109 +#elif defined(CLOOG_INT_GMP)
110 + v = isl_val_int_from_gmp(ctx, c);
112 +#error "No integer type defined"
118 + * CLooG'll be dealing in integers so we expect numerator/1 form
119 + * from isl_val. Thus get numerator to assign to cloog_int
121 +void isl_val_to_cloog_int(__isl_keep isl_val *val, cloog_int_t *cint)
123 + assert(isl_val_is_int(val));
124 +#if defined(CLOOG_INT_INT)
125 + *cint = isl_val_get_num_si(val);
126 +#elif defined(CLOOG_INT_LONG)
127 + *cint = isl_val_get_num_si(val);
128 +#elif defined(CLOOG_INT_LONG_LONG)
129 + *cint = isl_val_get_num_si(val);
130 +#elif defined(CLOOG_INT_GMP)
131 + isl_val_get_num_gmp(val, *cint);
133 +#error "No integer type defined"
138 CloogConstraintSet *cloog_constraint_set_from_isl_basic_set(struct isl_basic_set *bset)
140 return (CloogConstraintSet *)bset;
141 @@ -266,53 +306,65 @@ int cloog_equal_count(CloogEqualities *equal)
142 static int cloog_constraint_equal_type(CloogConstraint *cc, int level)
147 int type = EQTYPE_NONE;
148 struct isl_constraint *constraint = cloog_constraint_to_isl(cc);
151 - isl_constraint_get_constant(constraint, &c);
152 - if (!isl_int_is_zero(c))
153 + c = isl_constraint_get_constant_val(constraint);
154 + if (!isl_val_is_zero(c))
155 type = EQTYPE_CONSTANT;
156 - isl_constraint_get_coefficient(constraint, isl_dim_set, level - 1, &c);
157 - if (!isl_int_is_one(c) && !isl_int_is_negone(c))
159 + c = isl_constraint_get_coefficient_val(constraint, isl_dim_set, level - 1);
160 + if (!isl_val_is_one(c) && !isl_val_is_negone(c))
161 type = EQTYPE_EXAFFINE;
163 for (i = 0; i < isl_constraint_dim(constraint, isl_dim_param); ++i) {
164 - isl_constraint_get_coefficient(constraint, isl_dim_param, i, &c);
165 - if (isl_int_is_zero(c))
166 + c = isl_constraint_get_coefficient_val(constraint, isl_dim_param, i);
167 + if (isl_val_is_zero(c)){
170 - if ((!isl_int_is_one(c) && !isl_int_is_negone(c)) ||
172 + if ((!isl_val_is_one(c) && !isl_val_is_negone(c)) ||
173 type != EQTYPE_NONE) {
174 type = EQTYPE_EXAFFINE;
178 type = EQTYPE_PUREITEM;
181 for (i = 0; i < isl_constraint_dim(constraint, isl_dim_set); ++i) {
184 - isl_constraint_get_coefficient(constraint, isl_dim_set, i, &c);
185 - if (isl_int_is_zero(c))
186 + c = isl_constraint_get_coefficient_val(constraint, isl_dim_set, i);
187 + if (isl_val_is_zero(c)){
190 - if ((!isl_int_is_one(c) && !isl_int_is_negone(c)) ||
192 + if ((!isl_val_is_one(c) && !isl_val_is_negone(c)) ||
193 type != EQTYPE_NONE) {
194 type = EQTYPE_EXAFFINE;
198 type = EQTYPE_PUREITEM;
201 for (i = 0; i < isl_constraint_dim(constraint, isl_dim_div); ++i) {
202 - isl_constraint_get_coefficient(constraint, isl_dim_div, i, &c);
203 - if (isl_int_is_zero(c))
204 + c = isl_constraint_get_coefficient_val(constraint, isl_dim_div, i);
205 + if (isl_val_is_zero(c)){
208 - if ((!isl_int_is_one(c) && !isl_int_is_negone(c)) ||
210 + if ((!isl_val_is_one(c) && !isl_val_is_negone(c)) ||
211 type != EQTYPE_NONE) {
212 type = EQTYPE_EXAFFINE;
216 type = EQTYPE_PUREITEM;
221 if (type == EQTYPE_NONE)
222 type = EQTYPE_CONSTANT;
223 @@ -447,27 +499,31 @@ static struct clast_expr *div_expr(CloogConstraint *constraint, int pos,
226 unsigned dim = cloog_constraint_total_dimension(constraint);
229 struct clast_reduction *r;
230 struct clast_expr *e = NULL;
234 + cloog_int_init(cint);
235 div = isl_constraint_get_div(cloog_constraint_to_isl(constraint), pos);
238 for (i = 0, nb_elts = 0; i < dim; ++i) {
239 struct cloog_isl_dim dim;
241 dim = constraint_cloog_dim_to_isl_dim(constraint, i);
242 if (dim.type == isl_dim_set)
243 dim.type = isl_dim_in;
244 - isl_aff_get_coefficient(div, dim.type, dim.pos, &c);
245 - if (!cloog_int_is_zero(c))
246 + c = isl_aff_get_coefficient_val(div, dim.type, dim.pos);
247 + if (!isl_val_is_zero(c))
252 - isl_aff_get_constant(div, &c);
253 - if (!cloog_int_is_zero(c))
254 + c = isl_aff_get_constant_val(div);
255 + if (!isl_val_is_zero(c))
259 r = new_clast_reduction(clast_red_sum, nb_elts);
260 for (i = 0, nb_elts = 0; i < dim; ++i) {
261 @@ -477,22 +533,35 @@ static struct clast_expr *div_expr(CloogConstraint *constraint, int pos,
262 dim = constraint_cloog_dim_to_isl_dim(constraint, i);
263 if (dim.type == isl_dim_set)
264 dim.type = isl_dim_in;
265 - isl_aff_get_coefficient(div, dim.type, dim.pos, &c);
266 - if (cloog_int_is_zero(c))
267 + c = isl_aff_get_coefficient_val(div, dim.type, dim.pos);
268 + if (isl_val_is_zero(c)){
273 v = cloog_constraint_variable_expr(constraint, 1 + i, names);
275 - r->elts[nb_elts++] = &new_clast_term(c, v)->expr;
276 + /* We are interested only in the numerator */
277 + cloog_int_set_si(cint, isl_val_get_num_si(c));
278 + r->elts[nb_elts++] = &new_clast_term(cint, v)->expr;
283 + c = isl_aff_get_constant_val(div);
284 + if (!isl_val_is_zero(c)) {
285 + /* We are interested only in the numerator */
286 + cloog_int_set_si(cint, isl_val_get_num_si(c));
287 + r->elts[nb_elts++] = &new_clast_term(cint, NULL)->expr;
289 - isl_aff_get_constant(div, &c);
290 - if (!cloog_int_is_zero(c))
291 - r->elts[nb_elts++] = &new_clast_term(c, NULL)->expr;
294 - isl_aff_get_denominator(div, &c);
295 - e = &new_clast_binary(clast_bin_fdiv, &r->expr, c)->expr;
296 + c = isl_aff_get_denominator_val(div);
297 + isl_val_to_cloog_int(c, &cint);
299 + e = &new_clast_binary(clast_bin_fdiv, &r->expr, cint)->expr;
301 - cloog_int_clear(c);
302 + cloog_int_clear(cint);
306 @@ -529,37 +598,34 @@ struct clast_expr *cloog_constraint_variable_expr(CloogConstraint *constraint,
308 int cloog_constraint_involves(CloogConstraint *constraint, int v)
315 - cloog_constraint_coefficient_get(constraint, v, &c);
316 - res = !isl_int_is_zero(c);
318 + c = cloog_constraint_coefficient_get_val(constraint, v);
319 + res = !isl_val_is_zero(c);
324 int cloog_constraint_is_lower_bound(CloogConstraint *constraint, int v)
331 - cloog_constraint_coefficient_get(constraint, v, &c);
332 - res = isl_int_is_pos(c);
334 + c = cloog_constraint_coefficient_get_val(constraint, v);
335 + res = isl_val_is_pos(c);
340 int cloog_constraint_is_upper_bound(CloogConstraint *constraint, int v)
347 - cloog_constraint_coefficient_get(constraint, v, &c);
348 - res = isl_int_is_neg(c);
350 + c = cloog_constraint_coefficient_get_val(constraint, v);
351 + res = isl_val_is_neg(c);
356 @@ -585,15 +651,37 @@ void cloog_constraint_coefficient_get(CloogConstraint *constraint,
358 struct cloog_isl_dim dim;
365 + dim = constraint_cloog_dim_to_isl_dim(constraint, var);
366 + c = cloog_constraint_to_isl(constraint);
367 + ival = isl_constraint_get_coefficient_val(c, dim.type, dim.pos);
369 + isl_val_to_cloog_int(ival, val);
370 + isl_val_free(ival);
373 +isl_val *cloog_constraint_coefficient_get_val(CloogConstraint *constraint,
376 + struct cloog_isl_dim dim;
384 dim = constraint_cloog_dim_to_isl_dim(constraint, var);
385 c = cloog_constraint_to_isl(constraint);
386 - isl_constraint_get_coefficient(c, dim.type, dim.pos, val);
387 + val = isl_constraint_get_coefficient_val(c, dim.type, dim.pos);
393 void cloog_constraint_coefficient_set(CloogConstraint *constraint,
394 int var, cloog_int_t val)
396 @@ -604,14 +692,26 @@ void cloog_constraint_coefficient_set(CloogConstraint *constraint,
398 dim = constraint_cloog_dim_to_isl_dim(constraint, var);
399 c = cloog_constraint_to_isl(constraint);
400 - isl_constraint_set_coefficient(c, dim.type, dim.pos, val);
401 + isl_constraint_set_coefficient_val(c, dim.type, dim.pos,
402 + cloog_int_to_isl_val(isl_constraint_get_ctx(c), val));
405 void cloog_constraint_constant_get(CloogConstraint *constraint, cloog_int_t *val)
407 - isl_constraint_get_constant(cloog_constraint_to_isl(constraint), val);
409 + ival = isl_constraint_get_constant_val(cloog_constraint_to_isl(constraint));
410 + isl_val_to_cloog_int(ival, val);
411 + isl_val_free(ival);
415 +__isl_give isl_val *cloog_constraint_constant_get_val(CloogConstraint *constraint)
417 + return isl_constraint_get_constant_val(cloog_constraint_to_isl(constraint));
423 * Copy the coefficient of constraint c into dst in PolyLib order,
424 * i.e., first the coefficients of the variables, then the coefficients
425 @@ -700,15 +800,11 @@ CloogConstraintSet *cloog_constraint_set_for_reduction(CloogConstraint *upper,
427 static int add_constant_term(CloogConstraint *c, void *user)
429 - isl_int *bound = (isl_int *)user;
434 - cloog_constraint_constant_get(c, &v);
435 - isl_int_add(*bound, *bound, v);
436 + isl_val **bound = (isl_val **)user;
440 + v = cloog_constraint_constant_get_val(c);
441 + *bound = isl_val_add(*bound, v);
445 @@ -822,11 +918,14 @@ CloogConstraintSet *cloog_constraint_set_reduce(CloogConstraintSet *constraints,
446 c = isl_constraint_set_coefficient_si(c, isl_dim_set, dim.pos, -1);
447 bset = isl_basic_set_add_constraint(bset, c);
449 - isl_int_set_si(*bound, 0);
450 + cloog_int_set_si(*bound, 0);
451 + isl_val *v = cloog_int_to_isl_val(isl_basic_set_get_ctx(bset), *bound);
452 constraints = cloog_constraint_set_from_isl_basic_set(bset);
453 cloog_constraint_set_foreach_constraint(constraints,
454 - add_constant_term, bound);
455 + add_constant_term, &v);
456 + isl_val_to_cloog_int(v, bound); //return the value to bound
459 isl_basic_set_free(orig);
460 return cloog_constraint_set_from_isl_basic_set(bset);
462 @@ -896,31 +995,27 @@ static isl_aff *extract_stride_offset(__isl_keep isl_constraint *c,
463 isl_space *dim = isl_constraint_get_space(c);
464 isl_local_space *ls = isl_local_space_from_space(dim);
465 isl_aff *offset = isl_aff_zero_on_domain(ls);
468 unsigned nparam, nvar;
472 nparam = isl_constraint_dim(c, isl_dim_param);
473 nvar = isl_constraint_dim(c, isl_dim_set);
475 for (i = 0; i < nparam; ++i) {
476 - isl_constraint_get_coefficient(c, isl_dim_param, i, &u);
477 - isl_int_mul(u, u, stride->factor);
478 - offset = isl_aff_set_coefficient(offset, isl_dim_param, i, u);
479 + u = isl_constraint_get_coefficient_val(c, isl_dim_param, i);
480 + u = isl_val_mul(u, cloog_int_to_isl_val(isl_constraint_get_ctx(c), stride->factor));
481 + offset = isl_aff_set_coefficient_val(offset, isl_dim_param, i, u);
483 for (i = 0; i < nvar; ++i) {
486 - isl_constraint_get_coefficient(c, isl_dim_set, i, &u);
487 - isl_int_mul(u, u, stride->factor);
488 - offset = isl_aff_set_coefficient(offset, isl_dim_in, i, u);
489 + u = isl_constraint_get_coefficient_val(c, isl_dim_set, i);
490 + u = isl_val_mul(u, cloog_int_to_isl_val(isl_constraint_get_ctx(c), stride->factor));
491 + offset = isl_aff_set_coefficient_val(offset, isl_dim_in, i, u);
493 - isl_constraint_get_constant(c, &u);
494 - isl_int_mul(u, u, stride->factor);
495 - offset = isl_aff_set_constant(offset, u);
498 + u = isl_constraint_get_constant_val(c);
499 + u = isl_val_mul(u, cloog_int_to_isl_val(isl_constraint_get_ctx(c), stride->factor));
500 + offset = isl_aff_set_constant_val(offset, u);
504 @@ -953,9 +1048,9 @@ CloogConstraint *cloog_constraint_stride_lower_bound(CloogConstraint *c,
505 offset = extract_stride_offset(stride_c, level, stride);
507 lower = isl_aff_sub(lower, isl_aff_copy(offset));
508 - lower = isl_aff_scale_down(lower, stride->stride);
509 + lower = isl_aff_scale_down_val(lower, cloog_int_to_isl_val(isl_constraint_get_ctx(stride_c), stride->stride));
510 lower = isl_aff_ceil(lower);
511 - lower = isl_aff_scale(lower, stride->stride);
512 + lower = isl_aff_scale_val(lower, cloog_int_to_isl_val(isl_constraint_get_ctx(stride_c), stride->stride));
513 lower = isl_aff_add(lower, offset);
514 lower = isl_aff_neg(lower);
515 lower = isl_aff_add_coefficient_si(lower, isl_dim_in, level - 1, 1);
516 diff --git a/source/isl/domain.c b/source/isl/domain.c
517 index 620584d..dc81a96 100644
518 --- a/source/isl/domain.c
519 +++ b/source/isl/domain.c
521 #include <isl/list.h>
522 #include <isl/constraint.h>
526 +#include <isl/map.h>
527 +#include <isl/val.h>
528 +#include <isl/val_gmp.h>
531 #include <osl/macros.h>
532 @@ -510,15 +514,18 @@ static struct isl_constraint *isl_constraint_read_from_matrix(
534 constraint = isl_inequality_alloc(ls);
536 - for (j = 0; j < nvariables; ++j)
537 - isl_constraint_set_coefficient(constraint, isl_dim_out, j,
539 + for (j = 0; j < nvariables; ++j) {
540 + isl_val *val = cloog_int_to_isl_val(isl_constraint_get_ctx(constraint), row[1 + j]);
541 + isl_constraint_set_coefficient_val(constraint, isl_dim_out, j, val);
544 - for (j = 0; j < nparam; ++j)
545 - isl_constraint_set_coefficient(constraint, isl_dim_param, j,
546 - row[1 + nvariables + j]);
547 + for (j = 0; j < nparam; ++j) {
548 + isl_val *val = cloog_int_to_isl_val(isl_constraint_get_ctx(constraint), row[1 + nvariables + j]);
549 + isl_constraint_set_coefficient_val(constraint, isl_dim_param, j, val);
552 - isl_constraint_set_constant(constraint, row[1 + nvariables + nparam]);
553 + isl_val *val = cloog_int_to_isl_val(isl_constraint_get_ctx(constraint), row[1 + nvariables + nparam]);
554 + isl_constraint_set_constant_val(constraint, val);
558 @@ -631,7 +638,6 @@ CloogDomain *cloog_domain_from_osl_relation(CloogState *state,
564 * Converts an openscop scattering relation to a CLooG scattering.
565 * \param[in,out] state CLooG state.
566 @@ -779,10 +785,22 @@ int cloog_domain_is_otl(CloogDomain *domain, int level)
567 void cloog_domain_stride(CloogDomain *domain, int strided_level,
568 cloog_int_t *stride, cloog_int_t *offset)
571 isl_set *set = isl_set_from_cloog_domain(domain);
572 - isl_set_dim_residue_class(set, strided_level - 1, stride, offset);
573 - if (!isl_int_is_zero(*offset))
574 - isl_int_sub(*offset, *stride, *offset);
575 + isl_val *stride_val = NULL;
576 + isl_val *offset_val = NULL;
577 + ret = isl_set_dim_residue_class_val(set, strided_level - 1, &stride_val, &offset_val);
579 + cloog_die("failure to compute stride.\n");
580 + isl_val_to_cloog_int(stride_val, stride);
581 + isl_val_to_cloog_int(offset_val, offset);
583 + if (!cloog_int_is_zero(*offset))
584 + cloog_int_sub(*offset, *stride, *offset);
586 + isl_val_free(stride_val);
587 + isl_val_free(offset_val);
592 @@ -796,7 +814,7 @@ static int constraint_can_stride(__isl_take isl_constraint *c, void *user)
594 struct cloog_can_stride *ccs = (struct cloog_can_stride *)user;
600 if (isl_constraint_is_equality(c)) {
601 @@ -804,21 +822,22 @@ static int constraint_can_stride(__isl_take isl_constraint *c, void *user)
606 - isl_constraint_get_coefficient(c, isl_dim_set, ccs->level - 1, &v);
607 - if (isl_int_is_pos(v)) {
608 + v = isl_constraint_get_coefficient_val(c, isl_dim_set, ccs->level - 1);
609 + if (isl_val_is_pos(v)) {
610 n_div = isl_constraint_dim(c, isl_dim_div);
612 for (i = 0; i < n_div; ++i) {
613 - isl_constraint_get_coefficient(c, isl_dim_div, i, &v);
614 - if (!isl_int_is_zero(v))
616 + v = isl_constraint_get_coefficient_val(c, isl_dim_div, i);
617 + if (!isl_val_is_zero(v))
624 - isl_constraint_free(c);
627 + isl_constraint_free(c);
631 @@ -903,7 +922,7 @@ struct cloog_stride_lower {
632 static int constraint_stride_lower(__isl_take isl_constraint *c, void *user)
634 struct cloog_stride_lower *csl = (struct cloog_stride_lower *)user;
637 isl_constraint *bound;
640 @@ -912,31 +931,31 @@ static int constraint_stride_lower(__isl_take isl_constraint *c, void *user)
645 - isl_constraint_get_coefficient(c, isl_dim_set, csl->level - 1, &v);
646 - if (!isl_int_is_pos(v)) {
648 + v = isl_constraint_get_coefficient_val(c, isl_dim_set, csl->level - 1);
649 + if (!isl_val_is_pos(v)) {
651 isl_constraint_free(c);
657 b = isl_constraint_get_bound(c, isl_dim_set, csl->level - 1);
660 - b = isl_aff_add_constant(b, csl->stride->offset);
661 - b = isl_aff_scale_down(b, csl->stride->stride);
662 + b = isl_aff_add_constant_val(b, cloog_int_to_isl_val(isl_constraint_get_ctx(c), csl->stride->offset));
663 + b = isl_aff_scale_down_val(b, cloog_int_to_isl_val(isl_constraint_get_ctx(c), csl->stride->stride));
664 b = isl_aff_floor(b);
665 - b = isl_aff_scale(b, csl->stride->stride);
666 - isl_int_neg(v, csl->stride->offset);
667 - b = isl_aff_add_constant(b, v);
668 + b = isl_aff_scale_val(b, cloog_int_to_isl_val(isl_constraint_get_ctx(c), csl->stride->stride));
669 + v = cloog_int_to_isl_val(isl_constraint_get_ctx(c), csl->stride->offset);
670 + v = isl_val_neg(v);
671 + b = isl_aff_add_constant_val(b, v);
672 b = isl_aff_add_coefficient_si(b, isl_dim_in, csl->level - 1, 1);
674 bound = isl_inequality_from_aff(b);
676 csl->bounds = isl_basic_set_add_constraint(csl->bounds, bound);
679 isl_constraint_free(c);
682 @@ -960,7 +979,7 @@ static int constraint_stride_lower(__isl_take isl_constraint *c, void *user)
683 static int constraint_stride_lower_c(__isl_take isl_constraint *c, void *user)
685 struct cloog_stride_lower *csl = (struct cloog_stride_lower *)user;
688 isl_constraint *bound;
689 isl_constraint *csl_c;
691 @@ -970,10 +989,9 @@ static int constraint_stride_lower_c(__isl_take isl_constraint *c, void *user)
696 - isl_constraint_get_coefficient(c, isl_dim_set, csl->level - 1, &v);
697 - if (!isl_int_is_pos(v)) {
699 + v = isl_constraint_get_coefficient_val(c, isl_dim_set, csl->level - 1);
700 + if (!isl_val_is_pos(v)) {
702 isl_constraint_free(c);
705 @@ -984,15 +1002,15 @@ static int constraint_stride_lower_c(__isl_take isl_constraint *c, void *user)
706 d = isl_constraint_get_aff(csl_c);
707 d = isl_aff_drop_dims(d, isl_dim_div, 0, isl_aff_dim(d, isl_dim_div));
708 d = isl_aff_set_coefficient_si(d, isl_dim_in, csl->level - 1, 0);
709 - d = isl_aff_scale(d, csl->stride->factor);
710 + d = isl_aff_scale_val(d, cloog_int_to_isl_val(isl_constraint_get_ctx(csl_c), csl->stride->factor));
712 b = isl_constraint_get_bound(c, isl_dim_set, csl->level - 1);
715 b = isl_aff_add(b, isl_aff_copy(d));
716 - b = isl_aff_scale_down(b, csl->stride->stride);
717 + b = isl_aff_scale_down_val(b, cloog_int_to_isl_val(isl_constraint_get_ctx(csl_c), csl->stride->stride));
718 b = isl_aff_floor(b);
719 - b = isl_aff_scale(b, csl->stride->stride);
720 + b = isl_aff_scale_val(b, cloog_int_to_isl_val(isl_constraint_get_ctx(csl_c), csl->stride->stride));
721 b = isl_aff_sub(b, d);
722 b = isl_aff_add_coefficient_si(b, isl_dim_in, csl->level - 1, 1);
724 @@ -1000,7 +1018,7 @@ static int constraint_stride_lower_c(__isl_take isl_constraint *c, void *user)
726 csl->bounds = isl_basic_set_add_constraint(csl->bounds, bound);
730 isl_constraint_free(c);
733 @@ -1090,28 +1108,30 @@ struct cloog_bound_split {
734 static int constraint_bound_split(__isl_take isl_constraint *c, void *user)
736 struct cloog_bound_split *cbs = (struct cloog_bound_split *)user;
743 - isl_constraint_get_coefficient(c, isl_dim_set, cbs->level - 1, &v);
744 - if (!cbs->lower && isl_int_is_pos(v))
745 + v = isl_constraint_get_coefficient_val(c, isl_dim_set, cbs->level - 1);
746 + if (!cbs->lower && isl_val_is_pos(v))
747 cbs->lower = handle = 1;
748 - else if (!cbs->upper && isl_int_is_neg(v))
749 + else if (!cbs->upper && isl_val_is_neg(v))
750 cbs->upper = handle = 1;
753 for (i = 0; i < isl_set_dim(cbs->set, isl_dim_param); ++i) {
754 - isl_constraint_get_coefficient(c, isl_dim_param, i, &v);
755 - if (isl_int_is_zero(v))
757 + v = isl_constraint_get_coefficient_val(c, isl_dim_param, i);
758 + if (isl_val_is_zero(v))
761 cbs->set = isl_set_split_dims(cbs->set,
762 isl_dim_param, i, 1);
766 - isl_constraint_free(c);
769 + isl_constraint_free(c);
770 return (cbs->lower && cbs->upper) ? -1 : 0;
773 @@ -1203,7 +1223,7 @@ static int injective_scattering(CloogScatteringList *list)
774 * - scattdims is the total number of scattering dimentions.
776 int cloog_scattering_lazy_block(CloogScattering *s1, CloogScattering *s2,
777 - CloogScatteringList *scattering, int scattdims)
778 + CloogScatteringList *scattering, int scattdims)
781 struct isl_space *dim;
782 @@ -1211,8 +1231,8 @@ int cloog_scattering_lazy_block(CloogScattering *s1, CloogScattering *s2,
783 struct isl_set *delta;
784 isl_map *map1 = isl_map_from_cloog_scattering(s1);
785 isl_map *map2 = isl_map_from_cloog_scattering(s2);
792 n_scat = isl_map_dim(map1, isl_dim_out);
793 @@ -1225,22 +1245,33 @@ int cloog_scattering_lazy_block(CloogScattering *s1, CloogScattering *s2,
794 rel = isl_map_apply_domain(rel, isl_map_copy(map1));
795 rel = isl_map_apply_range(rel, isl_map_copy(map2));
796 delta = isl_map_deltas(rel);
799 for (i = 0; i < n_scat; ++i) {
800 - fixed = isl_set_fast_dim_is_fixed(delta, i, &cst);
802 + cst = isl_set_plain_get_val_if_fixed(delta, isl_dim_set, i);
806 - if (isl_int_is_zero(cst))
808 + if (isl_val_is_zero(cst)){
811 - if (i + 1 < n_scat)
813 + if (i + 1 < n_scat){
816 - if (!isl_int_is_one(cst))
818 + if (!isl_val_is_one(cst)){
821 - if (!injective_scattering(scattering))
823 + if (!injective_scattering(scattering)){
831 - isl_int_clear(cst);
835 @@ -1345,10 +1376,25 @@ CloogDomain *cloog_domain_simplify_union(CloogDomain *domain)
836 * If value is not NULL, then it is set to the constant value of dimension.
838 int cloog_scattering_lazy_isscalar(CloogScattering *scatt, int dimension,
839 - cloog_int_t *value)
840 + cloog_int_t *value)
842 isl_map *map = isl_map_from_cloog_scattering(scatt);
843 - return isl_map_fast_is_fixed(map, isl_dim_out, dimension, value);
844 + isl_val *v = isl_map_plain_get_val_if_fixed(map, isl_dim_out, dimension);
846 + if (!isl_val_is_nan(v)){
848 + isl_val_to_cloog_int(v, value);
863 @@ -1362,7 +1408,22 @@ int cloog_domain_lazy_isconstant(CloogDomain *domain, int dimension,
866 isl_set *set = isl_set_from_cloog_domain(domain);
867 - return isl_set_fast_dim_is_fixed(set, dimension, value);
868 + isl_val *cst = isl_set_plain_get_val_if_fixed(set, isl_dim_set, dimension);
870 + if (!isl_val_is_nan(cst)){
872 + isl_val_to_cloog_int(cst, value);
887 @@ -1391,6 +1452,8 @@ CloogDomain *cloog_domain_cube(CloogState *state,
895 return cloog_domain_universe(state, dim);
896 @@ -1398,8 +1461,10 @@ CloogDomain *cloog_domain_cube(CloogState *state,
897 space = isl_space_set_alloc(state->backend->ctx, 0, dim);
898 cube = isl_set_universe(space);
899 for (i = 0; i < dim; ++i) {
900 - cube = isl_set_lower_bound(cube, isl_dim_set, i, min);
901 - cube = isl_set_upper_bound(cube, isl_dim_set, i, max);
902 + min_v = cloog_int_to_isl_val(isl_set_get_ctx(cube), min);
903 + max_v = cloog_int_to_isl_val(isl_set_get_ctx(cube), max);
904 + cube = isl_set_lower_bound_val(cube, isl_dim_set, i, min_v);
905 + cube = isl_set_upper_bound_val(cube, isl_dim_set, i, max_v);
908 return cloog_domain_from_isl_set(cube);
909 @@ -1595,7 +1660,7 @@ static void Euclid(cloog_int_t a, cloog_int_t b,
910 cloog_int_mul(tmp, tmp, d);
911 cloog_int_sub(c, c, tmp);
912 cloog_int_swap(c, d);
913 - cloog_int_swap(e, f);
914 + cloog_int_swap(e, f);
916 cloog_int_set(*g, c);
917 if (cloog_int_is_zero(a))
918 @@ -1631,49 +1696,70 @@ static void Euclid(cloog_int_t a, cloog_int_t b,
919 static CloogStride *construct_stride(isl_constraint *c, int level)
922 - isl_int v, m, gcd, stride, factor;
923 + isl_val *v, *m, *gcd, *stride;
924 + isl_val *v_copy, *m_copy, *gcd_copy;
925 + cloog_int_t c_v, c_m, c_gcd, c_stride, c_factor;
927 + isl_ctx *ctx = isl_constraint_get_ctx(c);;
935 - isl_int_init(factor);
936 - isl_int_init(stride);
937 + v = isl_constraint_get_coefficient_val(c, isl_dim_set, level - 1);
939 - isl_constraint_get_coefficient(c, isl_dim_set, level - 1, &v);
940 - sign = isl_int_sgn(v);
942 + sign = isl_val_sgn(v);
943 + m = isl_val_abs(v); /* *takes* v. */
945 - isl_int_set_si(gcd, 0);
946 + gcd = isl_val_int_from_si(ctx, 0);
947 n = isl_constraint_dim(c, isl_dim_div);
948 for (i = 0; i < n; ++i) {
949 - isl_constraint_get_coefficient(c, isl_dim_div, i, &v);
950 - isl_int_gcd(gcd, gcd, v);
951 + v = isl_constraint_get_coefficient_val(c, isl_dim_div, i);
952 + gcd = isl_val_gcd(gcd, v);
955 - isl_int_gcd(v, m, gcd);
956 - isl_int_divexact(stride, gcd, v);
957 + m_copy = isl_val_copy(m);
958 + gcd_copy = isl_val_copy(gcd);
960 - if (isl_int_is_zero(stride) || isl_int_is_one(stride))
961 + v = isl_val_gcd(m, gcd);
963 + v_copy = isl_val_copy(v);
964 + gcd = isl_val_copy(gcd_copy);
965 + stride = isl_val_div(gcd, v);
967 + if (isl_val_is_zero(stride) || isl_val_is_one(stride))
970 - Euclid(m, stride, &factor, &v, &gcd);
971 + cloog_int_init(c_m);
972 + cloog_int_init(c_stride);
973 + cloog_int_init(c_v);
974 + cloog_int_init(c_gcd);
975 + cloog_int_init(c_factor);
977 + isl_val_to_cloog_int(m_copy, &c_m);
978 + isl_val_to_cloog_int(stride, &c_stride);
979 + isl_val_to_cloog_int(v_copy, &c_v);
980 + isl_val_to_cloog_int(gcd_copy, &c_gcd);
982 + Euclid(c_m, c_stride, &c_factor, &c_v, &c_gcd);
984 - isl_int_neg(factor, factor);
985 + cloog_int_neg(c_factor, c_factor);
987 c = isl_constraint_copy(c);
988 - s = cloog_stride_alloc_from_constraint(stride,
989 - cloog_constraint_from_isl_constraint(c), factor);
990 + s = cloog_stride_alloc_from_constraint(c_stride,
991 + cloog_constraint_from_isl_constraint(c), c_factor);
994 + cloog_int_clear(c_m);
995 + cloog_int_clear(c_stride);
996 + cloog_int_clear(c_v);
997 + cloog_int_clear(c_gcd);
998 + cloog_int_clear(c_factor);
1001 - isl_int_clear(stride);
1002 - isl_int_clear(factor);
1003 - isl_int_clear(gcd);
1006 + isl_val_free(stride);
1007 + isl_val_free(gcd_copy);
1008 + isl_val_free(m_copy);
1009 + isl_val_free(v_copy);
1013 @@ -1694,7 +1780,7 @@ static int find_stride(__isl_take isl_constraint *c, void *user)
1015 struct cloog_isl_find_stride_data *data;
1020 if (!isl_constraint_is_equality(c)) {
1021 isl_constraint_free(c);
1022 @@ -1714,13 +1800,11 @@ static int find_stride(__isl_take isl_constraint *c, void *user)
1028 - isl_constraint_get_coefficient(c, isl_dim_set, data->level - 1, &v);
1029 - if (!isl_int_is_zero(v))
1030 + v = isl_constraint_get_coefficient_val(c, isl_dim_set, data->level - 1);
1031 + if (!isl_val_is_zero(v))
1032 data->stride = construct_stride(c, data->level);
1037 isl_constraint_free(c);
1039 @@ -1769,7 +1853,7 @@ struct cloog_can_unroll {
1048 @@ -1782,11 +1866,11 @@ struct cloog_can_unroll {
1049 * with l the given lower bound and i the iterator identified by level.
1051 static int is_valid_unrolling_lower_bound(struct cloog_can_unroll *ccu,
1052 - __isl_keep isl_constraint *c, isl_int *v)
1053 + __isl_keep isl_constraint *c, isl_val **v)
1057 - enum isl_lp_result res;
1058 + enum isl_lp_result;
1060 n_div = isl_constraint_dim(c, isl_dim_div);
1061 if (isl_constraint_involves_dims(c, isl_dim_div, 0, n_div))
1062 @@ -1796,15 +1880,19 @@ static int is_valid_unrolling_lower_bound(struct cloog_can_unroll *ccu,
1063 aff = isl_aff_ceil(aff);
1064 aff = isl_aff_neg(aff);
1065 aff = isl_aff_add_coefficient_si(aff, isl_dim_in, ccu->level - 1, 1);
1066 - res = isl_set_max(ccu->set, aff, v);
1067 + *v = isl_set_max_val(ccu->set, aff);
1070 - if (res == isl_lp_unbounded)
1072 + if (!*v || isl_val_is_nan(*v))
1073 + cloog_die("Fail to decide about unrolling (cannot find max)");
1075 - assert(res == isl_lp_ok);
1076 + if (isl_val_is_infty(*v) || isl_val_is_neginfty(*v)){
1082 - cloog_int_add_ui(*v, *v, 1);
1083 + *v = isl_val_add_ui(*v, 1);
1087 @@ -1818,21 +1906,21 @@ static int is_valid_unrolling_lower_bound(struct cloog_can_unroll *ccu,
1088 static int constraint_can_unroll(__isl_take isl_constraint *c, void *user)
1090 struct cloog_can_unroll *ccu = (struct cloog_can_unroll *)user;
1095 - isl_int_init(count);
1096 - isl_constraint_get_coefficient(c, isl_dim_set, ccu->level - 1, &v);
1097 - if (isl_int_is_pos(v) &&
1098 - is_valid_unrolling_lower_bound(ccu, c, &count) &&
1099 - (!ccu->c || isl_int_lt(count, *ccu->n))) {
1101 + isl_val *count = NULL;
1103 + v = isl_constraint_get_coefficient_val(c, isl_dim_set, ccu->level - 1);
1104 + if (isl_val_is_pos(v) &&
1105 + is_valid_unrolling_lower_bound(ccu, c, &count) &&
1106 + (!ccu->c || (isl_val_lt(count, ccu->n))) ) {
1107 isl_constraint_free(ccu->c);
1108 ccu->c = isl_constraint_copy(c);
1109 - isl_int_set(*ccu->n, count);
1111 + isl_val_free(ccu->n);
1112 + ccu->n = isl_val_copy(count);
1114 - isl_int_clear(count);
1116 + isl_val_free(count);
1118 isl_constraint_free(c);
1121 @@ -1872,7 +1960,8 @@ int cloog_domain_can_unroll(CloogDomain *domain, int level, cloog_int_t *n,
1122 CloogConstraint **lb)
1124 isl_set *set = isl_set_from_cloog_domain(domain);
1125 - struct cloog_can_unroll ccu = { 1, level, NULL, set, n };
1126 + isl_val *v = cloog_int_to_isl_val(isl_set_get_ctx(set), *n);
1127 + struct cloog_can_unroll ccu = { 1, level, NULL, set, v };
1131 @@ -1887,6 +1976,11 @@ int cloog_domain_can_unroll(CloogDomain *domain, int level, cloog_int_t *n,
1133 *lb = cloog_constraint_from_isl_constraint(ccu.c);
1135 + isl_val_to_cloog_int(ccu.n, n);
1136 + /* Note: we have to free ccu.n and not v because v has been
1137 + * freed and replaced in ccu during isl_set_foreach_basic_set
1139 + isl_val_free(ccu.n);
1140 return ccu.can_unroll;
1143 @@ -1904,6 +1998,7 @@ CloogDomain *cloog_domain_fixed_offset(CloogDomain *domain,
1146 isl_set *set = isl_set_from_cloog_domain(domain);
1147 + isl_ctx *ctx = isl_set_get_ctx(set);
1151 @@ -1911,7 +2006,7 @@ CloogDomain *cloog_domain_fixed_offset(CloogDomain *domain,
1152 aff = isl_constraint_get_bound(c, isl_dim_set, level - 1);
1153 aff = isl_aff_ceil(aff);
1154 aff = isl_aff_add_coefficient_si(aff, isl_dim_in, level - 1, -1);
1155 - aff = isl_aff_add_constant(aff, offset);
1156 + aff = isl_aff_add_constant_val(aff, cloog_int_to_isl_val(ctx, offset));
1157 eq = isl_equality_from_aff(aff);
1158 set = isl_set_add_constraint(set, eq);