https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111154
Bug ID: 111154 Summary: vect-cost-model=dynamic triggers false warning on array operation Product: gcc Version: 13.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: changyp6 at gmail dot com Target Milestone: --- Created attachment 55792 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=55792&action=edit Test case of vect-cost-model I have a program, which operates on an array, which size is defined by a macro. When compiling this code, GCC always reports following warnings: ``` test.c:35:18: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 35 | desta[i] = src[i]; | ~~~~~~~~~^~~~~~~~ test.c:7:16: note: at offset 8 into destination object 'desta' of size 8 7 | static uint8_t desta[ARRAY_SIZE]; | ^~~~~ test.c:35:18: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 35 | desta[i] = src[i]; | ~~~~~~~~~^~~~~~~~ test.c:7:16: note: at offset 9 into destination object 'desta' of size 8 7 | static uint8_t desta[ARRAY_SIZE]; | ^~~~~ test.c:35:18: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 35 | desta[i] = src[i]; | ~~~~~~~~~^~~~~~~~ ``` After digging on this issue, I found that this warning is triggered by `-fvect-cost-model=dynamic`, in -O3 `-fvect-cost-model=very-cheap` won't trigger this warning. Attached is the test case program, just run `make bugs` to produce this false warning This source code file has 3 functions, each function has a for-loop to operate the array. The upper bound of the for-loop is determined by a global static variable, which will be set by another function. If I remove 1 function which operate on the array, this warning won't show up. It seems that this issue is related to loop-vectorization, if there are enough loops, loop-vectorization will be triggered, and the array's bound is an variable, which cannot be determined directly by GCC, in this case, GCC vectorize the loop, accessed regions outside of the array.