https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87843
--- Comment #10 from Richard Biener <rguenth at gcc dot gnu.org> --- I can only see that v->locs might be affected by fld because the type of the FIELD_DECL changes but the (alias) type of *p_11 remains the same. Thus we have get_alias_set (ptr-to-incomplete) and get_alias_set (ptr-to-complete) not agreeing. But of course they have to. I guess we can make a two-unit LTO testcase like the following - but it doesn't miscompile since we end up substituting the MEM_REF base type for the store in foo() somehow so even with more fiddling I always get *p_5 = &a; py ={v} &y; _1 ={v} py; MEM[(struct Y *)_1].p = &b; ^^^ will not use the alias set of .p _2 = *p_5; struct X; struct Y { struct X *p; }; void foo (struct Y *p, struct X *v) { p->p = v; } --- struct X { int i; }; struct Y { struct X *p; }; void foo (struct Y *, struct X *); struct X ** volatile px; struct X a, b; int main() { struct Y y; px = &y.p; struct X **p = px; *p = &a; foo (&y, &b); if (*p != &b) __builtin_abort (); return 0; }