Commit 4df28528 by Ian Lance Taylor Committed by Ian Lance Taylor

re PR tree-optimization/31602 (Overflow warning causes GDB -Werror build failure)

./:	PR tree-optimization/31602
	* tree-ssa-loop-ch.c (copy_loop_headers): Set TREE_NO_WARNING for
	conditionals in the copied loop header.
	* tree-cfg.c (fold_cond_expr_cond): Don't issue undefined overflow
	warnings if TREE_NO_WARNING is set.
	* doc/invoke.texi (Warning Options): Clarify that
	-Wstrict-overflow does not warn about loops.
testsuite/:
	PR tree-optimization/31602
	* gcc.dg/Wstrict-overflow-11.c: We no longer issue a warning.

From-SVN: r124120
parent 7c4a9265
2007-04-24 Ian Lance Taylor <iant@google.com>
PR tree-optimization/31602
* tree-ssa-loop-ch.c (copy_loop_headers): Set TREE_NO_WARNING for
conditionals in the copied loop header.
* tree-cfg.c (fold_cond_expr_cond): Don't issue undefined overflow
warnings if TREE_NO_WARNING is set.
* doc/invoke.texi (Warning Options): Clarify that
-Wstrict-overflow does not warn about loops.
2007-04-24 Janis Johnson <janis187@us.ibm.com> 2007-04-24 Janis Johnson <janis187@us.ibm.com>
* config/rs6000/rs6000.c (function_arg_advance): For 32-bit ELF ABI, * config/rs6000/rs6000.c (function_arg_advance): For 32-bit ELF ABI,
......
...@@ -3029,7 +3029,10 @@ perfectly safe if the values of the variables involved are such that ...@@ -3029,7 +3029,10 @@ perfectly safe if the values of the variables involved are such that
overflow never does, in fact, occur. Therefore this warning can overflow never does, in fact, occur. Therefore this warning can
easily give a false positive: a warning about code which is not easily give a false positive: a warning about code which is not
actually a problem. To help focus on important issues, several actually a problem. To help focus on important issues, several
warning levels are defined. warning levels are defined. No warnings are issued for the use of
undefined signed overflow when estimating how many iterations a loop
will require, in particular when determining whether a loop will be
executed at all.
@table @option @table @option
@item -Wstrict-overflow=1 @item -Wstrict-overflow=1
......
2007-04-24 Ian Lance Taylor <iant@google.com>
PR tree-optimization/31602
* gcc.dg/Wstrict-overflow-11.c: We no longer issue a warning.
2007-04-24 Janis Johnson <janis187@us.ibm.com> 2007-04-24 Janis Johnson <janis187@us.ibm.com>
* gcc.target/powerpc/ppc32-abi-dfp-1.c: New test. * gcc.target/powerpc/ppc32-abi-dfp-1.c: New test.
...@@ -3,14 +3,16 @@ ...@@ -3,14 +3,16 @@
/* Based on strict-overflow-5.c. */ /* Based on strict-overflow-5.c. */
/* We can only unroll when using strict overflow semantics. */ /* We can only unroll when using strict overflow semantics. But we
don't issue a warning for relying on undefined overflow in
loops. */
int foo (int i) int foo (int i)
{ {
int index; int index;
int r=0; int r=0;
for (index = i; index <= i+4; index+=2) /* { dg-warning "assuming signed overflow does not occur" "correct warning" } */ for (index = i; index <= i+4; index+=2)
r++; r++;
return r; return r;
......
...@@ -416,7 +416,9 @@ fold_cond_expr_cond (void) ...@@ -416,7 +416,9 @@ fold_cond_expr_cond (void)
cond = fold (COND_EXPR_COND (stmt)); cond = fold (COND_EXPR_COND (stmt));
zerop = integer_zerop (cond); zerop = integer_zerop (cond);
onep = integer_onep (cond); onep = integer_onep (cond);
fold_undefer_overflow_warnings (zerop || onep, stmt, fold_undefer_overflow_warnings (((zerop || onep)
&& !TREE_NO_WARNING (stmt)),
stmt,
WARN_STRICT_OVERFLOW_CONDITIONAL); WARN_STRICT_OVERFLOW_CONDITIONAL);
if (zerop) if (zerop)
COND_EXPR_COND (stmt) = boolean_false_node; COND_EXPR_COND (stmt) = boolean_false_node;
......
/* Loop header copying on trees. /* Loop header copying on trees.
Copyright (C) 2004, 2005 Free Software Foundation, Inc. Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
...@@ -200,6 +200,27 @@ copy_loop_headers (void) ...@@ -200,6 +200,27 @@ copy_loop_headers (void)
continue; continue;
} }
/* If the loop has the form "for (i = j; i < j + 10; i++)" then
this copying can introduce a case where we rely on undefined
signed overflow to eliminate the preheader condition, because
we assume that "j < j + 10" is true. We don't want to warn
about that case for -Wstrict-overflow, because in general we
don't warn about overflow involving loops. Prevent the
warning by setting TREE_NO_WARNING. */
if (warn_strict_overflow > 0)
{
unsigned int i;
for (i = 0; i < n_bbs; ++i)
{
tree last;
last = last_stmt (copied_bbs[i]);
if (TREE_CODE (last) == COND_EXPR)
TREE_NO_WARNING (last) = 1;
}
}
/* Ensure that the latch and the preheader is simple (we know that they /* Ensure that the latch and the preheader is simple (we know that they
are not now, since there was the loop exit condition. */ are not now, since there was the loop exit condition. */
split_edge (loop_preheader_edge (loop)); split_edge (loop_preheader_edge (loop));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment