mirror of git://gcc.gnu.org/git/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 <ams@codesourcery.com> PR middle-end/64491 Revert: 2014-11-20 Andrew Stubbs <ams@codesourcery.com> * 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 <ams@codesourcery.com> PR middle-end/64491 Revert: 2014-11-20 Andrew Stubbs <ams@codesourcery.com> * gcc.dg/undefined-loop-1.c: New file. * gcc.dg/undefined-loop-2.c: New file. 2014-12-24 Andrew Stubbs <ams@codesourcery.com> PR testsuite/64032 * gcc.dg/undefined-loop-2.c: Don't allow GCC to optimize away the loop exits too early. From-SVN: r221492
This commit is contained in:
parent
1aec2ecce4
commit
b4f3051a5f
|
|
@ -1,3 +1,12 @@
|
|||
2015-03-18 Andrew Stubbs <ams@codesourcery.com>
|
||||
|
||||
PR middle-end/64491
|
||||
Revert:
|
||||
2014-11-20 Andrew Stubbs <ams@codesourcery.com>
|
||||
|
||||
* 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 <mliska@suse.cz>
|
||||
|
||||
PR ipa/65432
|
||||
|
|
|
|||
|
|
@ -1,3 +1,18 @@
|
|||
2015-03-18 Andrew Stubbs <ams@codesourcery.com>
|
||||
|
||||
PR middle-end/64491
|
||||
Revert:
|
||||
2014-11-20 Andrew Stubbs <ams@codesourcery.com>
|
||||
|
||||
* gcc.dg/undefined-loop-1.c: New file.
|
||||
* gcc.dg/undefined-loop-2.c: New file.
|
||||
|
||||
2014-12-24 Andrew Stubbs <ams@codesourcery.com>
|
||||
|
||||
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 <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/65450
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
}
|
||||
|
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
|
@ -3329,7 +3329,6 @@ maybe_lower_iteration_bound (struct loop *loop)
|
|||
struct nb_iter_bound *elt;
|
||||
bool found_exit = false;
|
||||
vec<basic_block> queue = vNULL;
|
||||
vec<gimple> 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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue