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