On Wed, Sep 22, 2021 at 10:21 PM Martin Sebor <mse...@gmail.com> wrote:
>
> On 9/21/21 7:38 PM, Hongtao Liu wrote:
> > On Mon, Sep 20, 2021 at 4:13 AM Martin Sebor <mse...@gmail.com> wrote:
> ...
> >>>>> diff --git a/gcc/testsuite/c-c++-common/Wstringop-overflow-2.c 
> >>>>> b/gcc/testsuite/c-c++-common/Wstringop-overflow-2.c
> >>>>> index 1d79930cd58..9351f7e7a1a 100644
> >>>>> --- a/gcc/testsuite/c-c++-common/Wstringop-overflow-2.c
> >>>>> +++ b/gcc/testsuite/c-c++-common/Wstringop-overflow-2.c
> >>>>> @@ -1,7 +1,7 @@
> >>>>>    /* PR middle-end/91458 - inconsistent warning for writing past the 
> >>>>> end
> >>>>>       of an array member
> >>>>>       { dg-do compile }
> >>>>> -   { dg-options "-O2 -Wall -Wno-array-bounds -fno-ipa-icf" } */
> >>>>> +   { dg-options "-O2 -Wall -Wno-array-bounds -fno-ipa-icf 
> >>>>> -fno-tree-vectorize" } */
> >>>>
> >>>> The testcase is large - what part requires this change?  Given the
> >>>> testcase was added for inconsistent warnings do they now become
> >>>> inconsistent again as we enable vectorization at -O2?
> >>>>
> >>>> That said, the testcase adjustments need some explaining - I suppose
> >>>> you didn't just slap -fno-tree-vectorize to all of those changing
> >>>> behavior?
> >>>>
> >>> void ga1_ (void)
> >>> {
> >>>     a1_.a[0] = 0;
> >>>     a1_.a[1] = 1;                 // { dg-warning 
> >>> "\\\[-Wstringop-overflow" }
> >>>     a1_.a[2] = 2;                 // { dg-warning 
> >>> "\\\[-Wstringop-overflow" }
> >>>
> >>>     struct A1 a;
> >>>     a.a[0] = 0;
> >>>     a.a[1] = 1;                   // { dg-warning 
> >>> "\\\[-Wstringop-overflow" }
> >>>     a.a[2] = 2;                   // { dg-warning 
> >>> "\\\[-Wstringop-overflow" }
> >>>     sink (&a);
> >>> }
> >>>
> >>> It's supposed to be 2 warning for a.a[1] = 1 and a.a[2] = 1 since
> >>> there are 2 accesses, but after enabling vectorization, there's only
> >>> one access, so one warning is missing which causes the failure.
>
> With the stores vectorized, is the warning on the correct line or
> does it point to the first store, the one that's in bounds, as
> it does with -O3?  The latter would be a regression at -O2.
For the upper case, It points to the second store which is out of
bounds, the third store warning is missing.
>
> >>
> >> I would find it preferable to change the test code over disabling
> >> optimizations that are on by default.  My concern is that the test
> >> would no longer exercise the default behavior.  (The same goes for
> >> the -fno-ipa-icf option.)
> > Hmm, it's a middle-end test, for some backend, it may not do
> > vectorization(it depends on TARGET_VECTOR_MODE_SUPPORTED_P and
> > relative cost model).
>
> Yes, there are quite a few warning tests like that.  Their main
> purpose is to verify that in common GCC invocations (i.e., without
> any special options) warnings are a) issued when expected and b)
> not issued when not expected.  Otherwise, middle end warnings are
> known to have both false positives and false negatives in some
> invocations, depending on what optimizations are in effect.
> Indiscriminately disabling common optimizations for these large
> tests and invoking them under artificial conditions would
> compromise this goal and hide the problems.
>
> If enabling vectorization at -O2 causes regressions in the quality
> of diagnostics (as the test failure above indicates seems to be
> happening) we should investigate these and open bugs for them so
> they can be fixed.  We can then tweak the specific failing test
> cases to avoid the failures until they are fixed.
There are indeed cases of false positives and false negatives
.i.e.
// Verify warning for access to a definition with an initializer that
// initializes the one-element array member.
struct A1 a1i_1 = { 0, { 1 } };

void ga1i_1 (void)
{
  a1i_1.a[0] = 0;
  a1i_1.a[1] = 1;               // { dg-warning "\\\[-Wstringop-overflow" }
  a1i_1.a[2] = 2;               // { dg-warning "\\\[-Wstringop-overflow" }

  struct A1 a = { 0, { 1 } }; --- false positive here.
  a.a[0] = 1;
  a.a[1] = 2;                   // { dg-warning
"\\\[-Wstringop-overflow" } false negative here.
  a.a[2] = 3;                   // { dg-warning
"\\\[-Wstringop-overflow" } false negative here.
  sink (&a);
}

the last 2 warnings are missing, and there's new warning on the line
*struct A1 a = { 0, { 1 } };
>
> Martin



-- 
BR,
Hongtao

Reply via email to