On Tue, 27 Jan 2015, Jakub Jelinek wrote: > On Tue, Jan 27, 2015 at 10:25:48AM +0100, Richard Biener wrote: > > > > This disables array-bound warnings from VRP2 as discussed. > > > > Bootstrapped and tested on x86_64-unknown-linux-gnu - ok for trunk? > > So nothing in the testsuite needed to change? Nice.
Yes. > Ok for trunk. > > > I'll search for duplicates and add a few testcases. > > Thanks. Committed as follows (first testcase in PR59124 not fixed - it warns from the first pass). 2015-01-27 Richard Biener <rguent...@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. Index: gcc/tree-vrp.c =================================================================== *** gcc/tree-vrp.c.orig 2015-01-27 10:34:26.453743828 +0100 --- gcc/tree-vrp.c 2015-01-27 10:43:04.970610102 +0100 *************** vrp_finalize (void) *** 10229,10235 **** substitute_and_fold (op_with_constant_singleton_value_range, vrp_fold_stmt, false); ! if (warn_array_bounds) check_all_array_refs (); /* We must identify jump threading opportunities before we release --- 10229,10235 ---- substitute_and_fold (op_with_constant_singleton_value_range, vrp_fold_stmt, false); ! if (warn_array_bounds && first_pass_instance) check_all_array_refs (); /* We must identify jump threading opportunities before we release Index: gcc/testsuite/g++.dg/warn/Warray-bounds-6.C =================================================================== *** /dev/null 1970-01-01 00:00:00.000000000 +0000 --- gcc/testsuite/g++.dg/warn/Warray-bounds-6.C 2015-01-27 10:40:31.311871855 +0100 *************** *** 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; + } + } Index: gcc/testsuite/gcc.dg/Warray-bounds-12.c =================================================================== *** /dev/null 1970-01-01 00:00:00.000000000 +0000 --- gcc/testsuite/gcc.dg/Warray-bounds-12.c 2015-01-27 10:40:58.196175989 +0100 *************** *** 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; + } Index: gcc/testsuite/gcc.dg/Warray-bounds-13.c =================================================================== *** /dev/null 1970-01-01 00:00:00.000000000 +0000 --- gcc/testsuite/gcc.dg/Warray-bounds-13.c 2015-01-27 10:42:43.738369929 +0100 *************** *** 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; + }