"Bug 47594 - gfortran.dg/vect/vect-5.f90 execution test fails when compiled with -O2 -fgraphite-identity"
The problem is due to the fact that Graphite generates this loop: for (scat_3=0;scat_3<=4294967295*scat_1+T_51-1;scat_3++) { S6(scat_1,scat_3); } that has a "-1" encoded as an unsigned "4294967295". This constant comes from the computation of the number of iterations "M - I" of the inner loop: do I = 1, N do J = I, M A(J,2) = B(J) end do end do The patch fixes the problem by sign-extending the constants for the step of a chain of recurrence in scan_tree_for_params_right_scev. The same patter could occur for multiplication by a scalar, like in "-1 * N" and so the patch also fixes these cases in scan_tree_for_params. Bootstrapped and tested on amd64-linux. 2011-07-23 Sebastian Pop <sebastian....@amd.com> PR middle-end/47594 * graphite-sese-to-poly.c (scan_tree_for_params_right_scev): Sign extend constants. (scan_tree_for_params): Same. * gfortran.dg/graphite/run-id-pr47594.f90: New. --- gcc/ChangeLog | 7 ++++ gcc/graphite-sese-to-poly.c | 26 ++++++++++++-- gcc/testsuite/ChangeLog | 5 +++ .../gfortran.dg/graphite/run-id-pr47594.f90 | 35 ++++++++++++++++++++ 4 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/graphite/run-id-pr47594.f90 diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 65676cb..f7e2f7d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2011-07-23 Sebastian Pop <sebastian....@amd.com> + PR middle-end/47594 + * graphite-sese-to-poly.c (scan_tree_for_params_right_scev): Sign + extend constants. + (scan_tree_for_params): Same. + +2011-07-23 Sebastian Pop <sebastian....@amd.com> + * tree-ssa-loop-manip.c (canonicalize_loop_ivs): Build an unsigned iv only when the largest type is unsigned. Do not call lang_hooks.types.type_for_size. diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c index 7e23c9d..5c9e984 100644 --- a/gcc/graphite-sese-to-poly.c +++ b/gcc/graphite-sese-to-poly.c @@ -633,7 +633,11 @@ 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); + + /* Necessary to not get "-1 = 2^n - 1". */ + mpz_set_double_int + (val, double_int_sext (tree_to_double_int (e), + TYPE_PRECISION (TREE_TYPE (e))), false); add_value_to_dim (l, expr, val); mpz_clear (val); } @@ -729,9 +733,16 @@ scan_tree_for_params (sese s, tree e, ppl_Linear_Expression_t c, if (c) { mpz_t val; - gcc_assert (host_integerp (TREE_OPERAND (e, 1), 0)); + tree cst = TREE_OPERAND (e, 1); + + gcc_assert (host_integerp (cst, 0)); mpz_init (val); - tree_int_to_gmp (TREE_OPERAND (e, 1), val); + + /* Necessary to not get "-1 = 2^n - 1". */ + mpz_set_double_int + (val, double_int_sext (tree_to_double_int (cst), + TYPE_PRECISION (TREE_TYPE (cst))), false); + mpz_mul (val, val, k); scan_tree_for_params (s, TREE_OPERAND (e, 0), c, val); mpz_clear (val); @@ -744,9 +755,16 @@ scan_tree_for_params (sese s, tree e, ppl_Linear_Expression_t c, if (c) { mpz_t val; + tree cst = TREE_OPERAND (e, 0); + gcc_assert (host_integerp (TREE_OPERAND (e, 0), 0)); mpz_init (val); - tree_int_to_gmp (TREE_OPERAND (e, 0), val); + + /* Necessary to not get "-1 = 2^n - 1". */ + mpz_set_double_int + (val, double_int_sext (tree_to_double_int (cst), + TYPE_PRECISION (TREE_TYPE (cst))), false); + mpz_mul (val, val, k); scan_tree_for_params (s, TREE_OPERAND (e, 1), c, val); mpz_clear (val); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1f93f4c..b7c2be3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2011-07-23 Sebastian Pop <sebastian....@amd.com> + PR middle-end/47594 + * gfortran.dg/graphite/run-id-pr47594.f90: New. + +2011-07-23 Sebastian Pop <sebastian....@amd.com> + PR middle-end/47653 * gcc.dg/graphite/run-id-pr47653.c: New. * gcc.dg/graphite/interchange-3.c: Do not use unsigned types for diff --git a/gcc/testsuite/gfortran.dg/graphite/run-id-pr47594.f90 b/gcc/testsuite/gfortran.dg/graphite/run-id-pr47594.f90 new file mode 100644 index 0000000..7f36fc6 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/graphite/run-id-pr47594.f90 @@ -0,0 +1,35 @@ +! { dg-options "-O2 -fgraphite-identity" } + + Subroutine foo (N, M) + Integer N + Integer M + integer A(8,16) + integer B(8) + + B = (/ 2, 3, 5, 7, 11, 13, 17, 23 /) + + do I = 1, N + do J = I, M + A(J,2) = B(J) + end do + end do + + do I = 1, N + do J = I, M + if (A(J,2) /= B(J)) then + call abort () + endif + end do + end do + + Return + end + + + program main + + Call foo (16, 8) + + stop + end + -- 1.7.4.1