https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61912
Jeffrey A. Law <law at redhat dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |law at redhat dot com --- Comment #2 from Jeffrey A. Law <law at redhat dot com> --- So testing this with my improvements to DSE, we discover that the first 12 bytes and the last 4 bytes of the CONSTRUCTOR assignment are dead. Leaving just 4 bytes to be handled by the CONSTRUCTOR assignment. Prior to DSE this looked like: info = {}; info.prec = prec_11(D); [ ... more explicit assignments ... ] With the DSE improvements it turns into; MEM[(char[4] *)&info + 12B] = {}; info.prec = prec_11(D); [ more explicit assignment follow. ] Note how we turned the full CONSTRUCTOR into one that starts at byte offset 12 and just writes 4 bytes. We could have started the CONSTRUCTOR at byte 13 instead of byte 12, as the first 8 single bit fields are assigned explicitly. The code detects this properly, but explicitly avoids trimming to an odd start byte so as not to totally muck up alignments.