From 73c865fab7acc35517e28e09dc417db6a5697f12 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Sat, 9 Jan 2010 12:04:17 +0000 Subject: [PATCH] re PR middle-end/42512 (integer wrong code bug with loop) 2010-01-09 Richard Guenther PR middle-end/42512 * tree-scalar-evolution.c (interpret_loop_phi): Make sure the evolution is compatible with the initial condition. * gcc.c-torture/execute/pr42512.c: New testcase. From-SVN: r155757 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/execute/pr42512.c | 13 +++++++++++++ gcc/tree-scalar-evolution.c | 17 +++++++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr42512.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 708dbf6803f..99f59899bb6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-01-09 Richard Guenther + + PR middle-end/42512 + * tree-scalar-evolution.c (interpret_loop_phi): Make sure + the evolution is compatible with the initial condition. + 2010-01-09 Jakub Jelinek * gcc.c (process_command): Update copyright notice dates. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fc9ee831db6..87d7a18c7e7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-01-09 Richard Guenther + + PR middle-end/42512 + * gcc.c-torture/execute/pr42512.c: New testcase. + 2010-01-09 Tobias Burnus PR fortran/41298 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr42512.c b/gcc/testsuite/gcc.c-torture/execute/pr42512.c new file mode 100644 index 00000000000..f4e5cedbfc9 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr42512.c @@ -0,0 +1,13 @@ +extern void abort (void); + +short g_3; + +int main (void) +{ + int l_2; + for (l_2 = -1; l_2 != 0; l_2 = (unsigned char)(l_2 - 1)) + g_3 |= l_2; + if (g_3 != -1) + abort (); + return 0; +} diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c index 087ba798830..3ebc54e8556 100644 --- a/gcc/tree-scalar-evolution.c +++ b/gcc/tree-scalar-evolution.c @@ -1642,6 +1642,23 @@ interpret_loop_phi (struct loop *loop, gimple loop_phi_node) init_cond = analyze_initial_condition (loop_phi_node); res = analyze_evolution_in_loop (loop_phi_node, init_cond); + /* Verify we maintained the correct initial condition throughout + possible conversions in the SSA chain. */ + if (res != chrec_dont_know) + { + tree new_init = res; + if (CONVERT_EXPR_P (res) + && TREE_CODE (TREE_OPERAND (res, 0)) == POLYNOMIAL_CHREC) + new_init = fold_convert (TREE_TYPE (res), + CHREC_LEFT (TREE_OPERAND (res, 0))); + else if (TREE_CODE (res) == POLYNOMIAL_CHREC) + new_init = CHREC_LEFT (res); + STRIP_USELESS_TYPE_CONVERSION (new_init); + gcc_assert (TREE_CODE (new_init) != POLYNOMIAL_CHREC); + if (!operand_equal_p (init_cond, new_init, 0)) + return chrec_dont_know; + } + return res; }