https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121493
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |ASSIGNED Last reconfirmed| |2025-08-11 Ever confirmed|0 |1 Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- Confirmed. So what happens is that we do not handle inserting fake refs that are missing here. For the first aggregate copy we thus run into /* When the LHS is already at the outermost level simply adjust for any offset difference. Further lookups will fail when there's too gross of a type compatibility issue. */ if (!found && j == 0) { extra_off = vr->operands[i].off - lhs_ops[j].off; i--, j--; but there's now a "gross type compatibility issue", we have tt.t and tt.t with once a FIELD_DECL for struct s1 and once for int. So when visiting the earlier aggregate copy tt.t = t but with the lookup RHS of tt.t (with the int field) we go past the MEM_REFs which match up exactly but then we fail to process further (we don't allow for even more gross type compatibility issues). One could argue that for components we can handle by offset we should simply go ahead, hoping for the best. That helps in this case. I will test this.