On Tue, Oct 26, 2021 at 10:22:19PM -0700, sunil.k.pandey via Gcc-patches wrote:
> FAIL: libgomp.c/doacross-1.c (test for excess errors)

At least this one is a clear false positive.
int a[256];
...
    #pragma omp for schedule(static, 1) ordered (1) nowait
    for (i = 0; i < 256; i++)
      {
        #pragma omp atomic write
        a[i] = 1;
        #pragma omp ordered depend(sink: i - 1)
        if (i)
          {
            #pragma omp atomic read
            l = a[i - 1];               // <-------- Here is the false positive 
warning: '__atomic_load_4' writing 4 bytes into a region of size 0 overflows 
the destination [-Wstring-overflow=]
                                        // note: at offset [-8589934592, -8] 
into destination object ‘a’ of size 1024
            if (l < 2)
              abort ();
          }
The loop iterates i from 0 to 255 and the if body is guarded with i != 0,
so __atomic_load_4 (&a[i - 1].
Due to the doacross loop vrp doesn't know that the loop iterates from 0 to
256, because different threads are given just some subset of that interval,
so it is effectively VARYING.  Perhaps it derives some quite useless range
from the i - 1 or i + 1 expressions on signed integer, but that doesn't mean
the warnings should assume the value is likely to be out of bounds.
And there is no warning on the a[i] either (which is also in bounds, but
if for the atomic load the warning code thinks i - 1 can be in
[-8589934592, -8] range, why doesn't it think that i can be in
[-8589934588, -4] range?

        Jakub

Reply via email to