https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119085
Bug ID: 119085 Summary: tree-sra generates wrong code for unions containing structs with holes Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: pipcet at protonmail dot com Target Milestone: --- Created attachment 60633 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=60633&action=edit test case The attached test case asserts when compiled with trunk gcc: $ gcc -O3 -o gcc-001 gcc-001.c -fdump-tree-sra $ ./gcc-001 gcc-001: gcc-001.c:32: main: Assertion `u.without_hole.y == -1' failed. Aborted I believe it should succeed, as it does when I specify -fno-tree-sra. Po Lu identified the problem to most likely reside in sort_and_splice_var_accesses, which chooses as the representative access for an access group one which uses the "with_hole" structure, which has a hole, which results in an incomplete copy being made. This is similar to PR 58416, which introduced types_risk_mangled_binary_repr_p, except that it is aggregate types which aren't "compatible" rather than integer types. A quick fix would be to replace types_risk_mangled_binary_repr_p by !types_compatible_p, but that uses the language backend's definition of compatibility, whereas we're only interested in the types having equivalent "bit masks", meaning that the same bits are copied. My apologies if I messed up in reducing the test case, but I'm convinced the bug is real.