re PR tree-optimization/56273 (Bogus -Warray-bounds warning)

2015-01-27  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/56273
	PR tree-optimization/59124
	PR tree-optimization/64277
	* tree-vrp.c (vrp_finalize): Emit array-bound warnings only
	from the first VRP pass.

	* g++.dg/warn/Warray-bounds-6.C: New testcase.
	* gcc.dg/Warray-bounds-12.c: Likewise.
	* gcc.dg/Warray-bounds-13.c: Likewise.

From-SVN: r220157
This commit is contained in:
Richard Biener 2015-01-27 09:49:29 +00:00 committed by Richard Biener
parent 4eaf52aabb
commit f101c4b47a
6 changed files with 88 additions and 1 deletions

View file

@ -1,3 +1,11 @@
2015-01-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/56273
PR tree-optimization/59124
PR tree-optimization/64277
* tree-vrp.c (vrp_finalize): Emit array-bound warnings only
from the first VRP pass.
2015-01-27 Jakub Jelinek <jakub@redhat.com>
PR ipa/64776

View file

@ -1,3 +1,12 @@
2015-01-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/56273
PR tree-optimization/59124
PR tree-optimization/64277
* g++.dg/warn/Warray-bounds-6.C: New testcase.
* gcc.dg/Warray-bounds-12.c: Likewise.
* gcc.dg/Warray-bounds-13.c: Likewise.
2015-01-27 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/61058

View file

@ -0,0 +1,26 @@
// { dg-do compile }
// { dg-options "-O3 -Warray-bounds" }
struct type {
bool a, b;
bool get_b() { return b; }
};
type stuff[9u];
void bar();
void foo()
{
for(unsigned i = 0u; i < 9u; i++)
{
if(!stuff[i].a)
continue;
bar();
for(unsigned j = i + 1u; j < 9u; j++)
if(stuff[j].a && stuff[j].get_b()) // { dg-bogus "above array bounds" }
return;
}
}

View file

@ -0,0 +1,26 @@
/* { dg-do compile } */
/* { dg-options "-O3 -Warray-bounds" } */
/* { dg-additional-options "-mssse3" { target x86_64-*-* i?86-*-* } } */
void foo(short a[], short m)
{
int i, j;
int f1[10];
short nc;
nc = m + 1;
if (nc > 3)
{
for (i = 0; i <= nc; i++)
{
f1[i] = f1[i] + 1;
}
}
for (i = 0, j = m; i < nc; i++, j--)
{
a[i] = f1[i]; /* { dg-bogus "above array bounds" } */
a[j] = i;
}
return;
}

View file

@ -0,0 +1,18 @@
/* { dg-do compile } */
/* { dg-options "-O3 -Warray-bounds" } */
extern char *bar[17];
int foo(int argc, char **argv)
{
int i;
int n = 0;
for (i = 0; i < argc; i++)
n++;
for (i = 0; i < argc; i++)
argv[i] = bar[i + n]; /* { dg-bogus "above array bounds" } */
return 0;
}

View file

@ -10229,7 +10229,7 @@ vrp_finalize (void)
substitute_and_fold (op_with_constant_singleton_value_range,
vrp_fold_stmt, false);
if (warn_array_bounds)
if (warn_array_bounds && first_pass_instance)
check_all_array_refs ();
/* We must identify jump threading opportunities before we release