From b9b79ba4264cf635fbd3cc66530c5eb83d3ce568 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 3 Jun 2015 07:57:13 +0000 Subject: [PATCH] re PR middle-end/66375 (wrong code at -O2 and -O3 on x86_64-linux-gnu) 2015-06-03 Richard Biener PR tree-optimization/66375 * tree-scalar-evolution.c (follow_ssa_edge_binary): First add to the evolution before following SSA edges. * gcc.dg/torture/pr66375.c: New testcase. From-SVN: r224060 --- gcc/ChangeLog | 6 +++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/torture/pr66375.c | 13 +++++++ gcc/tree-scalar-evolution.c | 52 +++++++++++++------------- 4 files changed, 49 insertions(+), 27 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr66375.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 07743bba32e..06dda145fd6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-06-03 Richard Biener + + PR tree-optimization/66375 + * tree-scalar-evolution.c (follow_ssa_edge_binary): First + add to the evolution before following SSA edges. + 2015-06-03 Bin Cheng * tree-ssa-loop-ivopts.c (dump_iv): New parameter. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3abe065e648..9fd5941e979 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-06-03 Richard Biener + + PR tree-optimization/66375 + * gcc.dg/torture/pr66375.c: New testcase. + 2015-06-03 Bin Cheng * gcc.dg/tree-ssa/pr65447.c: Increase searching number. diff --git a/gcc/testsuite/gcc.dg/torture/pr66375.c b/gcc/testsuite/gcc.dg/torture/pr66375.c new file mode 100644 index 00000000000..2447b43c17b --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr66375.c @@ -0,0 +1,13 @@ +/* { dg-do run } */ + +int a; +extern void abort (void); +int main () +{ + int c = 0; + for (; a < 13; ++a) + c = (signed char)c - 11; + if (c != 113) + abort (); + return 0; +} diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c index 013fc507830..3a2c284b582 100644 --- a/gcc/tree-scalar-evolution.c +++ b/gcc/tree-scalar-evolution.c @@ -958,27 +958,25 @@ follow_ssa_edge_binary (struct loop *loop, gimple at_stmt, limit++; evol = *evolution_of_loop; - res = follow_ssa_edge - (loop, SSA_NAME_DEF_STMT (rhs0), halting_phi, &evol, limit); - - if (res == t_true) - *evolution_of_loop = add_to_evolution + evol = add_to_evolution (loop->num, chrec_convert (type, evol, at_stmt), code, rhs1, at_stmt); - + res = follow_ssa_edge + (loop, SSA_NAME_DEF_STMT (rhs0), halting_phi, &evol, limit); + if (res == t_true) + *evolution_of_loop = evol; else if (res == t_false) { - res = follow_ssa_edge - (loop, SSA_NAME_DEF_STMT (rhs1), halting_phi, - evolution_of_loop, limit); - - if (res == t_true) - *evolution_of_loop = add_to_evolution + *evolution_of_loop = add_to_evolution (loop->num, chrec_convert (type, *evolution_of_loop, at_stmt), code, rhs0, at_stmt); - + res = follow_ssa_edge + (loop, SSA_NAME_DEF_STMT (rhs1), halting_phi, + evolution_of_loop, limit); + if (res == t_true) + ; else if (res == t_dont_know) *evolution_of_loop = chrec_dont_know; } @@ -991,15 +989,15 @@ follow_ssa_edge_binary (struct loop *loop, gimple at_stmt, { /* Match an assignment under the form: "a = b + ...". */ + *evolution_of_loop = add_to_evolution + (loop->num, chrec_convert (type, *evolution_of_loop, + at_stmt), + code, rhs1, at_stmt); res = follow_ssa_edge (loop, SSA_NAME_DEF_STMT (rhs0), halting_phi, evolution_of_loop, limit); if (res == t_true) - *evolution_of_loop = add_to_evolution - (loop->num, chrec_convert (type, *evolution_of_loop, - at_stmt), - code, rhs1, at_stmt); - + ; else if (res == t_dont_know) *evolution_of_loop = chrec_dont_know; } @@ -1009,15 +1007,15 @@ follow_ssa_edge_binary (struct loop *loop, gimple at_stmt, { /* Match an assignment under the form: "a = ... + c". */ + *evolution_of_loop = add_to_evolution + (loop->num, chrec_convert (type, *evolution_of_loop, + at_stmt), + code, rhs0, at_stmt); res = follow_ssa_edge (loop, SSA_NAME_DEF_STMT (rhs1), halting_phi, evolution_of_loop, limit); if (res == t_true) - *evolution_of_loop = add_to_evolution - (loop->num, chrec_convert (type, *evolution_of_loop, - at_stmt), - code, rhs0, at_stmt); - + ; else if (res == t_dont_know) *evolution_of_loop = chrec_dont_know; } @@ -1042,13 +1040,13 @@ follow_ssa_edge_binary (struct loop *loop, gimple at_stmt, if (TREE_CODE (rhs1) == SSA_NAME) limit++; + *evolution_of_loop = add_to_evolution + (loop->num, chrec_convert (type, *evolution_of_loop, at_stmt), + MINUS_EXPR, rhs1, at_stmt); res = follow_ssa_edge (loop, SSA_NAME_DEF_STMT (rhs0), halting_phi, evolution_of_loop, limit); if (res == t_true) - *evolution_of_loop = add_to_evolution - (loop->num, chrec_convert (type, *evolution_of_loop, at_stmt), - MINUS_EXPR, rhs1, at_stmt); - + ; else if (res == t_dont_know) *evolution_of_loop = chrec_dont_know; }