https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87296
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> --- The MEM_REF type is significant only when actually accessing that memory, for &MEM_REF[...]; it is insignificant and you really shouldn't assume anything from it except for the address computation (like if it was _7 + 4). Not really sure why we don't just fold &MEM_REF[x, y] to x p+ y though if x is SSA_NAME. Another example: struct S { char a[4]; char b[6]; char c[2]; }; struct T { char a[10]; char b[4]; char c[2]; }; union U { struct S s; struct T t; }; void bar (union U *); void baz (char *, char *, char *); void foo (union U *u) { char (*q)[4] = &u->s.a; q++; baz ((char *) q, &u->s.b[2], &u->s.b[6]); bar (u); __builtin_strncpy (&u->t.a[4], "abcdef", 6); } Because pointer conversions are useless, one pointer can be replaced for another one which has provenly the same value, but might point to different fields etc.