From: Andrew Stubbs Date: Wed, 18 Mar 2015 14:27:13 +0000 (+0000) Subject: re PR middle-end/64491 (incorrect warning: loop exit may only be reached after undefi... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b4f3051a5fc315c5103f034b81e4d4b3c288fdc4;p=gcc.git re PR middle-end/64491 (incorrect warning: loop exit may only be reached after undefined behavior) Fix PR64491 2015-03-18 Andrew Stubbs PR middle-end/64491 Revert: 2014-11-20 Andrew Stubbs * tree-ssa-loop-niter.c (maybe_lower_iteration_bound): Warn if a loop condition would be removed due to undefined behaviour. 2015-03-18 Andrew Stubbs PR middle-end/64491 Revert: 2014-11-20 Andrew Stubbs * gcc.dg/undefined-loop-1.c: New file. * gcc.dg/undefined-loop-2.c: New file. 2014-12-24 Andrew Stubbs PR testsuite/64032 * gcc.dg/undefined-loop-2.c: Don't allow GCC to optimize away the loop exits too early. From-SVN: r221492 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7325636dd25..a447690324f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2015-03-18 Andrew Stubbs + + PR middle-end/64491 + Revert: + 2014-11-20 Andrew Stubbs + + * tree-ssa-loop-niter.c (maybe_lower_iteration_bound): Warn if a loop + condition would be removed due to undefined behaviour. + 2015-03-18 Martin Liska PR ipa/65432 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c4d283c0d95..7530c2b9b01 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,18 @@ +2015-03-18 Andrew Stubbs + + PR middle-end/64491 + Revert: + 2014-11-20 Andrew Stubbs + + * gcc.dg/undefined-loop-1.c: New file. + * gcc.dg/undefined-loop-2.c: New file. + + 2014-12-24 Andrew Stubbs + + PR testsuite/64032 + * gcc.dg/undefined-loop-2.c: Don't allow GCC to optimize away the + loop exits too early. + 2015-03-18 Jakub Jelinek PR tree-optimization/65450 diff --git a/gcc/testsuite/gcc.dg/undefined-loop-1.c b/gcc/testsuite/gcc.dg/undefined-loop-1.c deleted file mode 100644 index 80260cc8b01..00000000000 --- a/gcc/testsuite/gcc.dg/undefined-loop-1.c +++ /dev/null @@ -1,18 +0,0 @@ -/* Check that loops whose final iteration is undefined are detected. */ -/* { dg-do compile } */ -/* { dg-options "-O2 -Waggressive-loop-optimizations" } */ - -void doSomething(char); - -char array[5]; - -void -foo (void) -{ - int i; - for (i = 0; - array[i] /* { dg-message "note: possible undefined statement is here" } */ - && i < 5; /* { dg-warning "loop exit may only be reached after undefined behavior" } */ - i++) - doSomething(array[i]); -} diff --git a/gcc/testsuite/gcc.dg/undefined-loop-2.c b/gcc/testsuite/gcc.dg/undefined-loop-2.c deleted file mode 100644 index 7ab37f4e9e1..00000000000 --- a/gcc/testsuite/gcc.dg/undefined-loop-2.c +++ /dev/null @@ -1,25 +0,0 @@ -/* Check that loops whose final iteration is undefined are detected. */ -/* { dg-do compile } */ -/* { dg-options "-O2 -Waggressive-loop-optimizations" } */ - -void doSomething(char); - -char array1[5]; -char array2[5]; - -void -foo (int p) -{ - int i; - for (i=0; - (p - ? array1[i] /* { dg-message "note: possible undefined statement is here" } */ - : array2[i]) /* { dg-message "note: possible undefined statement is here" } */ - && i < 100; /* { dg-warning "loop exit may only be reached after undefined behavior" } */ - i++) - { - if (i >= 5) /* { dg-warning "loop exit may only be reached after undefined behavior" } */ - break; - doSomething(array1[i]); - } -} diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c index 7f6c451c0c2..fc63825904f 100644 --- a/gcc/tree-ssa-loop-niter.c +++ b/gcc/tree-ssa-loop-niter.c @@ -3329,7 +3329,6 @@ maybe_lower_iteration_bound (struct loop *loop) struct nb_iter_bound *elt; bool found_exit = false; vec queue = vNULL; - vec problem_stmts = vNULL; bitmap visited; /* Collect all statements with interesting (i.e. lower than @@ -3375,7 +3374,6 @@ maybe_lower_iteration_bound (struct loop *loop) if (not_executed_last_iteration->contains (stmt)) { stmt_found = true; - problem_stmts.safe_push (stmt); break; } if (gimple_has_side_effects (stmt)) @@ -3419,53 +3417,10 @@ maybe_lower_iteration_bound (struct loop *loop) "undefined statement must be executed at the last iteration.\n"); record_niter_bound (loop, loop->nb_iterations_upper_bound - 1, false, true); - - if (warn_aggressive_loop_optimizations) - { - bool exit_warned = false; - for (elt = loop->bounds; elt; elt = elt->next) - { - if (elt->is_exit - && wi::gtu_p (elt->bound, loop->nb_iterations_upper_bound)) - { - basic_block bb = gimple_bb (elt->stmt); - edge exit_edge = EDGE_SUCC (bb, 0); - struct tree_niter_desc niter; - - if (!loop_exit_edge_p (loop, exit_edge)) - exit_edge = EDGE_SUCC (bb, 1); - - if(number_of_iterations_exit (loop, exit_edge, - &niter, false, false) - && integer_onep (niter.assumptions) - && integer_zerop (niter.may_be_zero) - && niter.niter - && TREE_CODE (niter.niter) == INTEGER_CST - && wi::ltu_p (loop->nb_iterations_upper_bound, - wi::to_widest (niter.niter))) - { - if (warning_at (gimple_location (elt->stmt), - OPT_Waggressive_loop_optimizations, - "loop exit may only be reached after undefined behavior")) - exit_warned = true; - } - } - } - - if (exit_warned && !problem_stmts.is_empty ()) - { - gimple stmt; - int index; - FOR_EACH_VEC_ELT (problem_stmts, index, stmt) - inform (gimple_location (stmt), - "possible undefined statement is here"); - } - } } BITMAP_FREE (visited); queue.release (); - problem_stmts.release (); delete not_executed_last_iteration; }