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;
+ }

Reply via email to