From 96f61e8459e75f83611b59acc44cd53650c4d6c9 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Sun, 14 Dec 2008 23:51:01 +0100 Subject: [PATCH] minor changes to CloogConstraint abstraction Most notably, CloogConstraint were assumed not to allocate any memory beyond the value of the CloogConstraint itself. This will no longer hold for the upcoming changes in the isl backend. We therefore need to make sure that we properly release any memory possibly allocated by a CloogConstraint. Signed-off-by: Sven Verdoolaege --- include/cloog/constraints.h | 6 ++++-- source/clast.c | 35 +++++++++++++++++++++++++---------- source/isl/constraints.c | 26 ++++++++++++++++++-------- source/polylib/matrix.c | 24 +++++++++++++++++------- 4 files changed, 64 insertions(+), 27 deletions(-) diff --git a/include/cloog/constraints.h b/include/cloog/constraints.h index a37f094..621fee3 100644 --- a/include/cloog/constraints.h +++ b/include/cloog/constraints.h @@ -80,8 +80,10 @@ CloogConstraintSet *cloog_constraint_set_simplify(CloogConstraintSet *, CloogEqu CloogConstraint cloog_constraint_first(CloogConstraintSet *constraints); int cloog_constraint_is_valid(CloogConstraint constraint); CloogConstraint cloog_constraint_next(CloogConstraint constraint); +CloogConstraint cloog_constraint_copy(CloogConstraint constraint); +void cloog_constraint_release(CloogConstraint constraint); CloogConstraint cloog_constraint_invalid(void); -CloogConstraintSet *cloog_constraint_set(CloogConstraint constraint); +int cloog_constraint_total_dimension(CloogConstraint constraint); CloogConstraint cloog_equal_constraint(CloogEqualities *equal, int j); void cloog_equal_add(CloogEqualities *equal, @@ -104,7 +106,7 @@ void cloog_constraint_coefficient_get(CloogConstraint constraint, void cloog_constraint_coefficient_set(CloogConstraint constraint, int var, cloog_int_t val); void cloog_constraint_clear(CloogConstraint constraint); -void cloog_constraint_copy(CloogConstraint constraint, +void cloog_constraint_copy_coefficients(CloogConstraint constraint, cloog_int_t *dst); #endif diff --git a/source/clast.c b/source/clast.c index 215a4d4..a9c4332 100644 --- a/source/clast.c +++ b/source/clast.c @@ -493,6 +493,7 @@ static struct clast_stmt * clast_equal(CloogInfos *infos) iterator = i - infos->names->nb_scattering ; equal_constraint = cloog_equal_constraint(equal, i); e = clast_bound_from_constraint(equal_constraint, i+1, infos->names); + cloog_constraint_release(equal_constraint); *next = &new_clast_assignment(infos->names->iterators[iterator], e)->stmt; next = &(*next)->next; } @@ -532,6 +533,7 @@ static struct clast_stmt * clast_equal_cpp(int level, CloogInfos *infos) { if (cloog_equal_type(equal, i+1)) { equal_constraint = cloog_equal_constraint(equal, i); e = clast_bound_from_constraint(equal_constraint, i+1, infos->names); + cloog_constraint_release(equal_constraint); } else { cloog_int_set_si(one, 1); e = &new_clast_term(one, @@ -572,10 +574,10 @@ struct clast_expr *clast_bound_from_constraint(CloogConstraint constraint, struct clast_expr *e = NULL; struct cloog_vec *line_vector; - len = cloog_constraint_set_total_dimension(cloog_constraint_set(constraint)) + 2; + len = cloog_constraint_total_dimension(constraint) + 2; line_vector = cloog_vec_alloc(len); line = line_vector->p; - cloog_constraint_copy(constraint, line+1); + cloog_constraint_copy_coefficients(constraint, line+1); cloog_int_init(temp); cloog_int_init(numerator); cloog_int_init(denominator); @@ -874,7 +876,8 @@ static void insert_guard(CloogConstraintSet *constraints, int level, if (minmax == -1) continue; - for (l = cloog_constraint_next(j); cloog_constraint_is_valid(l); + l = cloog_constraint_copy(j); + for (l = cloog_constraint_next(l); cloog_constraint_is_valid(l); l = cloog_constraint_next(l)) if (((minmax == 1) && cloog_constraint_is_lower_bound(l, i-1)) || ((minmax == 0) && cloog_constraint_is_upper_bound(l, i-1))) @@ -972,7 +975,7 @@ static void insert_modulo_guard(CloogConstraint upper, return; } - len = cloog_constraint_set_total_dimension(cloog_constraint_set(upper)) + 2; + len = cloog_constraint_total_dimension(upper) + 2; len2 = cloog_equal_total_dimension(infos->equal) + 2; nb_par = infos->names->nb_parameters; nb_iter = len - 2 - nb_par; @@ -1000,7 +1003,7 @@ static void insert_modulo_guard(CloogConstraint upper, line_vector2 = cloog_vec_alloc(len2); line = line_vector->p; line2 = line_vector2->p; - cloog_constraint_copy(upper, line+1); + cloog_constraint_copy_coefficients(upper, line+1); if (cloog_int_is_pos(line[level])) cloog_seq_neg(line+1, line+1, len-1); cloog_int_neg(line[level], line[level]); @@ -1026,11 +1029,15 @@ static void insert_modulo_guard(CloogConstraint upper, continue; equal_constraint = cloog_equal_constraint(infos->equal, j); cloog_constraint_coefficient_get(equal_constraint, j, &val); - if (!cloog_int_is_divisible_by(val, line[level])) + if (!cloog_int_is_divisible_by(val, line[level])) { + cloog_constraint_release(equal_constraint); continue; + } cloog_constraint_coefficient_get(equal_constraint, i-1, &val); - if (cloog_int_is_divisible_by(val, line[level])) + if (cloog_int_is_divisible_by(val, line[level])) { + cloog_constraint_release(equal_constraint); continue; + } for (k = j; k > i; --k) { cloog_constraint_coefficient_get(equal_constraint, k-1, &val); if (cloog_int_is_zero(val)) @@ -1038,21 +1045,26 @@ static void insert_modulo_guard(CloogConstraint upper, if (!cloog_int_is_divisible_by(val, line[level])) break; } - if (k > i) + if (k > i) { + cloog_constraint_release(equal_constraint); continue; + } cloog_constraint_coefficient_get(equal_constraint, i-1, &val); Euclid(val, line[level], &x, &y, &g); - if (!cloog_int_is_divisible_by(val, line[i])) + if (!cloog_int_is_divisible_by(val, line[i])) { + cloog_constraint_release(equal_constraint); continue; + } cloog_int_divexact(val, line[i], g); cloog_int_neg(val, val); cloog_int_mul(val, val, x); cloog_int_set_si(y, 1); /* Add (infos->equal->p[j][i])^{-1} * line[i] times the equality */ - cloog_constraint_copy(equal_constraint, line2+1); + cloog_constraint_copy_coefficients(equal_constraint, line2+1); cloog_seq_combine(line+1, y, line+1, val, line2+1, i); cloog_seq_combine(line+len-nb_par-1, y, line+len-nb_par-1, val, line2+len2-nb_par-1, nb_par+1); + cloog_constraint_release(equal_constraint); break; } if (j >= 0) { @@ -1209,6 +1221,9 @@ static void insert_equation(CloogConstraint upper, CloogConstraint lower, *next = &(**next)->next; } + cloog_constraint_release(lower); + cloog_constraint_release(upper); + return; } diff --git a/source/isl/constraints.c b/source/isl/constraints.c index 66e0a77..781f0b2 100644 --- a/source/isl/constraints.c +++ b/source/isl/constraints.c @@ -378,7 +378,7 @@ void cloog_constraint_clear(CloogConstraint constraint) void cloog_constraint_coefficient_get(CloogConstraint constraint, int var, cloog_int_t *val) { - struct isl_basic_set *bset = cloog_constraint_set(constraint); + struct isl_basic_set *bset = isl_basic_set_constraint_set(constraint); if (var < bset->dim) isl_basic_set_constraint_get_dim(constraint, var, val); @@ -390,7 +390,7 @@ void cloog_constraint_coefficient_get(CloogConstraint constraint, void cloog_constraint_coefficient_set(CloogConstraint constraint, int var, cloog_int_t val) { - struct isl_basic_set *bset = cloog_constraint_set(constraint); + struct isl_basic_set *bset = isl_basic_set_constraint_set(constraint); if (var < bset->dim) isl_basic_set_constraint_set_dim(constraint, var, val); @@ -409,13 +409,13 @@ void cloog_constraint_constant_get(CloogConstraint constraint, cloog_int_t *val) * i.e., first the coefficients of the variables, then the coefficients * of the parameters and finally the constant. */ -void cloog_constraint_copy(CloogConstraint constraint, cloog_int_t *dst) +void cloog_constraint_copy_coefficients(CloogConstraint constraint, cloog_int_t *dst) { int i; unsigned dim; dim = cloog_constraint_set_total_dimension( - cloog_constraint_set(constraint)); + isl_basic_set_constraint_set(constraint)); for (i = 0; i < dim; ++i) cloog_constraint_coefficient_get(constraint, i, dst+i); @@ -432,6 +432,12 @@ int cloog_constraint_is_valid(CloogConstraint constraint) return isl_basic_set_constraint_is_valid(constraint); } +int cloog_constraint_total_dimension(CloogConstraint constraint) +{ + return cloog_constraint_set_total_dimension( + isl_basic_set_constraint_set(constraint)); +} + CloogConstraint cloog_constraint_first(CloogConstraintSet *constraints) { return isl_basic_set_first_constraint(constraints); @@ -442,12 +448,16 @@ CloogConstraint cloog_constraint_next(CloogConstraint constraint) return isl_basic_set_constraint_next(constraint); } -CloogConstraint cloog_equal_constraint(CloogEqualities *equal, int j) +void cloog_constraint_release(CloogConstraint constraint) { - return isl_basic_set_first_constraint(equal->constraints[j]); } -CloogConstraintSet *cloog_constraint_set(CloogConstraint constraint) +CloogConstraint cloog_constraint_copy(CloogConstraint constraint) { - return isl_basic_set_constraint_set(constraint); + return constraint; +} + +CloogConstraint cloog_equal_constraint(CloogEqualities *equal, int j) +{ + return isl_basic_set_first_constraint(equal->constraints[j]); } diff --git a/source/polylib/matrix.c b/source/polylib/matrix.c index 1c379e5..220db7b 100644 --- a/source/polylib/matrix.c +++ b/source/polylib/matrix.c @@ -253,6 +253,11 @@ int cloog_equal_total_dimension(CloogEqualities *equal) return cloog_constraint_set_total_dimension(equal->constraints); } +int cloog_constraint_total_dimension(CloogConstraint constraint) +{ + return cloog_constraint_set_total_dimension(constraint.set); +} + /** * cloog_matrix_alloc function: * This function allocates the memory space for a CloogMatrix structure having @@ -648,7 +653,7 @@ void cloog_equal_add(CloogEqualities *equal, CloogConstraintSet *matrix, value_assign(equal->constraints->p[level-1][j], line.line[0][j]); for (j = 0; j < nb_par + 1; j++) value_assign(equal->constraints->p[level-1][equal->constraints->NbColumns-j-1], - line.line[0][cloog_constraint_set(line)->NbColumns-j-1]); + line.line[0][line.set->NbColumns-j-1]); cloog_equal_update(equal, level, nb_par); } @@ -1003,7 +1008,8 @@ void cloog_constraint_constant_get(CloogConstraint constraint, cloog_int_t *val) * i.e., first the coefficients of the variables, then the coefficients * of the parameters and finally the constant. */ -void cloog_constraint_copy(CloogConstraint constraint, cloog_int_t *dst) +void cloog_constraint_copy_coefficients(CloogConstraint constraint, + cloog_int_t *dst) { Vector_Copy(constraint.line[0]+1, dst, constraint.set->NbColumns-1); } @@ -1042,6 +1048,15 @@ CloogConstraint cloog_constraint_next(CloogConstraint constraint) return c; } +CloogConstraint cloog_constraint_copy(CloogConstraint constraint) +{ + return constraint; +} + +void cloog_constraint_release(CloogConstraint constraint) +{ +} + CloogConstraint cloog_equal_constraint(CloogEqualities *equal, int j) { CloogConstraint c; @@ -1049,8 +1064,3 @@ CloogConstraint cloog_equal_constraint(CloogEqualities *equal, int j) c.line = &equal->constraints->p[j]; return c; } - -CloogConstraintSet *cloog_constraint_set(CloogConstraint constraint) -{ - return constraint.set; -} -- 2.11.4.GIT