https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93946
Bug ID: 93946 Summary: Bogus redundant store removal Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: rguenth at gcc dot gnu.org Target Milestone: --- union U { long long i; long f; }; struct a {union U u;}; struct aa {struct a a;}; struct b {union U u;}; struct bb {struct b b;}; long foo (struct bb *bv, void *ptr) { struct aa *a = ptr; struct bb *b = ptr; bv->b.u.f = 1; a->a.u.i = 0; b->b.u.f = 0; return bv->b.u.f; } int main () { union C {struct aa aa; struct bb bb;} v; if (foo (&v.bb, &v) != 0) __builtin_abort (); return 0; } we treat b->b.u.f = 0 as redundant because the alias-set of that and the a->a.u.i = 0 store are actually the same.