https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101641
Bug ID: 101641 Summary: Bogus redundant store removal Product: gcc Version: 11.1.1 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 x; long long y; }; __attribute__((noinline,noclone)) long test(long *px, long long *py, union u *pu) { *px = 0; *py = 1; long xy = pu->y; pu->x = xy; return *px; } int main () { union u u; if (test (&u.x, &u.y, &u) != 1) __builtin_abort (); return 0; } is miscompiled at -O2+ as FRE removes the seemingly redundant store to pu->x but that's needed to make the read via *px pick up the value stored via *py = 1 rather than (correctly) disambiguating against that and running into *px = 0.