2015-01-27 12:47 GMT+03:00 Richard Biener <rguent...@suse.de>:
> 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).

Are you going to port it to 4.9 branch?

Thanks,
Ilya

>
> 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