https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67955
--- Comment #2 from vries at gcc dot gnu.org --- (In reply to Richard Biener from comment #1) > The same points-to set results from > > int *p = (int *)((char *)&a + 2); > > or even > > int *p = &a + 1; > I see, I didn't realize that. But AFAICT, in both these cases, storing to *p is illegal (if 'a' is a scalar int). > so you can't use points-to info that way (to derive a must-alias). I see your point related to an array object, there pointers to different array elements would have identical points-to sets. I wonder though: if we have a store '*p = 0', and the size of the store is the same as the size of the pointed-to object of pointer p, can't we conclude that pointer p points to the start of the object?