Hi, This patch fixes PR47653 by sign extending the double int constants before converting them to a GMP value. There still are some places where we should not sign extend the values converted: upper bounds of unsigned types should for example not be sign extended.
The patch passed make -k check RUNTESTFLAGS=graphite.exp on c,c++,fortran. Regstrap with all languages in progress on amd64-linux. Ok for trunk? Thanks, Sebastian 2011-06-29 Sebastian Pop <sebastian....@amd.com> PR tree-optimization/47653 * graphite-ppl.h (tree_int_to_gmp): Sign extend before converting constants to GMP values. Add a sext parameter. (ppl_set_inhomogeneous_tree): Add sext parameter. (ppl_set_coef_tree): Removed. * graphite-sese-to-poly.c (scan_tree_for_params_right_scev): Adjust call to tree_int_to_gmp. (scan_tree_for_params_int): Use tree_int_to_gmp. (scan_tree_for_params): Adjust call to tree_int_to_gmp. (build_loop_iteration_domains): Adjust call to ppl_set_inhomogeneous_tree. (add_param_constraints): Same. (pdr_add_data_dimensions): Same. * gcc.dg/graphite/run-id-pr47653.c: New. --- gcc/ChangeLog | 16 ++++++++++++ gcc/graphite-ppl.h | 30 +++++++++-------------- gcc/graphite-sese-to-poly.c | 27 ++++++++++----------- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.dg/graphite/run-id-pr47653.c | 17 +++++++++++++ 5 files changed, 63 insertions(+), 32 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/graphite/run-id-pr47653.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e37d823..bed0070 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2011-06-29 Sebastian Pop <sebastian....@amd.com> + + PR tree-optimization/47653 + * graphite-ppl.h (tree_int_to_gmp): Sign extend before converting + constants to GMP values. Add a sext parameter. + (ppl_set_inhomogeneous_tree): Add sext parameter. + (ppl_set_coef_tree): Removed. + * graphite-sese-to-poly.c (scan_tree_for_params_right_scev): Adjust + call to tree_int_to_gmp. + (scan_tree_for_params_int): Use tree_int_to_gmp. + (scan_tree_for_params): Adjust call to tree_int_to_gmp. + (build_loop_iteration_domains): Adjust call to + ppl_set_inhomogeneous_tree. + (add_param_constraints): Same. + (pdr_add_data_dimensions): Same. + 2011-06-29 Eric Botcazou <ebotca...@adacore.com> PR tree-optimization/49539 diff --git a/gcc/graphite-ppl.h b/gcc/graphite-ppl.h index 695d01f..4ae9f63 100644 --- a/gcc/graphite-ppl.h +++ b/gcc/graphite-ppl.h @@ -50,13 +50,18 @@ void debug_gmp_value (mpz_t); bool ppl_powerset_is_empty (ppl_Pointset_Powerset_C_Polyhedron_t); -/* Assigns to RES the value of the INTEGER_CST T. */ +/* Assigns to RES the value of the INTEGER_CST T. When SEXT is true, + sign extend the value of T to not get "-1 = 2^n - 1". */ static inline void -tree_int_to_gmp (tree t, mpz_t res) +tree_int_to_gmp (tree t, mpz_t res, bool sext) { + tree type = TREE_TYPE (t); double_int di = tree_to_double_int (t); - mpz_set_double_int (res, di, TYPE_UNSIGNED (TREE_TYPE (t))); + + if (sext) + di = double_int_sext (di, TYPE_PRECISION (type)); + mpz_set_double_int (res, di, false); } /* Converts a GMP constant VAL to a tree and returns it. */ @@ -88,14 +93,15 @@ ppl_set_inhomogeneous (ppl_Linear_Expression_t e, int x) mpz_clear (v); } -/* Set the inhomogeneous term of E to the tree X. */ +/* Set the inhomogeneous term of E to the tree X. When SEXT is true, + sign extend the value of X. */ static inline void -ppl_set_inhomogeneous_tree (ppl_Linear_Expression_t e, tree x) +ppl_set_inhomogeneous_tree (ppl_Linear_Expression_t e, tree x, bool sext) { mpz_t v; mpz_init (v); - tree_int_to_gmp (x, v); + tree_int_to_gmp (x, v, sext); ppl_set_inhomogeneous_gmp (e, v); mpz_clear (v); } @@ -112,18 +118,6 @@ ppl_set_coef (ppl_Linear_Expression_t e, ppl_dimension_type i, int x) mpz_clear (v); } -/* Set E[I] to tree X. */ - -static inline void -ppl_set_coef_tree (ppl_Linear_Expression_t e, ppl_dimension_type i, tree x) -{ - mpz_t v; - mpz_init (v); - tree_int_to_gmp (x, v); - ppl_set_coef_gmp (e, i, v); - mpz_clear (v); -} - /* Sets RES to the max of V1 and V2. */ static inline void diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c index 7e23c9d..5f8188b 100644 --- a/gcc/graphite-sese-to-poly.c +++ b/gcc/graphite-sese-to-poly.c @@ -633,7 +633,7 @@ scan_tree_for_params_right_scev (sese s, tree e, int var, gcc_assert (TREE_CODE (e) == INTEGER_CST); mpz_init (val); - tree_int_to_gmp (e, val); + tree_int_to_gmp (e, val, true); add_value_to_dim (l, expr, val); mpz_clear (val); } @@ -647,14 +647,9 @@ scan_tree_for_params_int (tree cst, ppl_Linear_Expression_t expr, mpz_t k) { mpz_t val; ppl_Coefficient_t coef; - tree type = TREE_TYPE (cst); mpz_init (val); - - /* Necessary to not get "-1 = 2^n - 1". */ - mpz_set_double_int (val, double_int_sext (tree_to_double_int (cst), - TYPE_PRECISION (type)), false); - + tree_int_to_gmp (cst, val, true); mpz_mul (val, val, k); ppl_new_Coefficient (&coef); ppl_assign_Coefficient_from_mpz_t (coef, val); @@ -731,7 +726,7 @@ scan_tree_for_params (sese s, tree e, ppl_Linear_Expression_t c, mpz_t val; gcc_assert (host_integerp (TREE_OPERAND (e, 1), 0)); mpz_init (val); - tree_int_to_gmp (TREE_OPERAND (e, 1), val); + tree_int_to_gmp (TREE_OPERAND (e, 1), val, true); mpz_mul (val, val, k); scan_tree_for_params (s, TREE_OPERAND (e, 0), c, val); mpz_clear (val); @@ -746,7 +741,7 @@ scan_tree_for_params (sese s, tree e, ppl_Linear_Expression_t c, mpz_t val; gcc_assert (host_integerp (TREE_OPERAND (e, 0), 0)); mpz_init (val); - tree_int_to_gmp (TREE_OPERAND (e, 0), val); + tree_int_to_gmp (TREE_OPERAND (e, 0), val, true); mpz_mul (val, val, k); scan_tree_for_params (s, TREE_OPERAND (e, 1), c, val); mpz_clear (val); @@ -1072,7 +1067,9 @@ build_loop_iteration_domains (scop_p scop, struct loop *loop, /* loop_i <= cst_nb_iters */ ppl_set_coef (ub_expr, nb, -1); - ppl_set_inhomogeneous_tree (ub_expr, nb_iters); + /* The number of iterations should not be sign extended as it is + a positive number. */ + ppl_set_inhomogeneous_tree (ub_expr, nb_iters, false); ppl_new_Constraint (&ub, ub_expr, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL); ppl_Polyhedron_add_constraint (ph, ub); ppl_delete_Linear_Expression (ub_expr); @@ -1448,7 +1445,7 @@ add_param_constraints (scop_p scop, ppl_Polyhedron_t context, graphite_dim_t p) { ppl_new_Linear_Expression_with_dimension (&le, scop_nb_params (scop)); ppl_set_coef (le, p, -1); - ppl_set_inhomogeneous_tree (le, lb); + ppl_set_inhomogeneous_tree (le, lb, true); ppl_new_Constraint (&cstr, le, PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL); ppl_Polyhedron_add_constraint (context, cstr); ppl_delete_Linear_Expression (le); @@ -1459,7 +1456,9 @@ add_param_constraints (scop_p scop, ppl_Polyhedron_t context, graphite_dim_t p) { ppl_new_Linear_Expression_with_dimension (&le, scop_nb_params (scop)); ppl_set_coef (le, p, -1); - ppl_set_inhomogeneous_tree (le, ub); + /* Do not sign extend the upper bound of an unsigned type, as + that would become -1. */ + ppl_set_inhomogeneous_tree (le, ub, !TYPE_UNSIGNED (type)); ppl_new_Constraint (&cstr, le, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL); ppl_Polyhedron_add_constraint (context, cstr); ppl_delete_Linear_Expression (le); @@ -1641,7 +1640,7 @@ pdr_add_data_dimensions (ppl_Polyhedron_t accesses, data_reference_p dr, ppl_set_coef (expr, subscript, 1); minus_low = fold_build1 (NEGATE_EXPR, TREE_TYPE (low), low); - ppl_set_inhomogeneous_tree (expr, minus_low); + ppl_set_inhomogeneous_tree (expr, minus_low, true); ppl_new_Constraint (&cstr, expr, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL); ppl_Polyhedron_add_constraint (accesses, cstr); @@ -1661,7 +1660,7 @@ pdr_add_data_dimensions (ppl_Polyhedron_t accesses, data_reference_p dr, ppl_new_Linear_Expression_with_dimension (&expr, accessp_nb_dims); ppl_set_coef (expr, subscript, -1); - ppl_set_inhomogeneous_tree (expr, high); + ppl_set_inhomogeneous_tree (expr, high, true); ppl_new_Constraint (&cstr, expr, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL); ppl_Polyhedron_add_constraint (accesses, cstr); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d30d8b0..6d48df4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-06-29 Sebastian Pop <sebastian....@amd.com> + + PR tree-optimization/47653 + * gcc.dg/graphite/run-id-pr47653.c: New. + 2011-06-29 Jason Merrill <ja...@redhat.com> PR c++/45923 diff --git a/gcc/testsuite/gcc.dg/graphite/run-id-pr47653.c b/gcc/testsuite/gcc.dg/graphite/run-id-pr47653.c new file mode 100644 index 0000000..b62b891 --- /dev/null +++ b/gcc/testsuite/gcc.dg/graphite/run-id-pr47653.c @@ -0,0 +1,17 @@ +/* { dg-options "-O -fstack-check=generic -ftree-pre -fgraphite-identity" } */ + +int main () +{ + int i, j; + int x[8][8]; + for (i = 0; i < 8; i++) + for (j = i; j < 8; j++) + x[i][j] = 4; + + for (i = 0; i < 8; i++) + for (j = i; j < 8; j++) + if (x[i][j] != 4) + __builtin_abort (); + + return 0; +} -- 1.7.4.1