[Bug c/69224] -Warray-bounds false positive with -O3 and struct pointer parameter
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon Jan 11 09:57:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69224
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2016-01-11
CC| |hubicka at gcc dot gnu.org
Ever confirmed|0 |1
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
If you comment the line x is a trailing array we don't know its size for and
thus
we don't warn.
As with (many?) other cases this happens because complete peeling added one
copy too much (too conservative number of iteration upper bound):
_72 = s_47->x[4];
if (_39 >= _72)
goto <bb 20>;
else
goto <bb 23>;
<bb 20>:
_74 = s_47->x[5];
if (_39 <= _74)
goto <bb 22>;
else
goto <bb 23>;
so we have a x[5] in the IL and VRP can't prove it is not reachable either
(obviously).
niter analysis does:
Statement _22 = s_7(D)->x[j_2];
is executed at most 4 (bounded by 4) + 1 times in loop 2.
Statement _25 = s_7(D)->x[_24];
is executed at most 3 (bounded by 3) + 1 times in loop 2.
Loop 2 iterates at most 5 times.
t.c:16:33: note: loop with 6 iterations completely unrolled
Latch of last iteration was marked by __builtin_unreachable ().
Forced statement unreachable: _25 = s_7(D)->x[_24];
Forced statement unreachable: _22 = s_7(D)->x[j_2];
it looks like the conditionally read s->x[j] is not properly marked
unreachable.
More information about the Gcc-bugs
mailing list