https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109215
--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Slightly simplified -O2 -Wall: struct S {}; struct T { struct S s[3]; struct S t; }; void bar (struct S *); void foo (struct T *t) { for (int i = 0; i < 3; i++) bar (&t->s[i]); } On: void baz (struct T *t) { for (int i = 0; i < 4; i++) bar (&t->s[i]); } we on the other side don't warn iN GCC 12 even when we probably should: fre3 in that case replaces: _10 = &t_5(D)->s[0]; bar (_10); _15 = &t_5(D)->s[1]; bar (_15); _20 = &t_5(D)->s[2]; bar (_20); _25 = &t_5(D)->s[3]; bar (_25); with _10 = &t_5(D)->s[0]; bar (_10); bar (_10); bar (_10); bar (_10); and the warning is only in vrp1. void qux (struct T *t) { bar (&t->s[2]); } void corge (struct T *t) { bar (&t->s[3]); } are then even simpler cases. r13-4521 and later warns for all those, GCC 12 for none of those.