https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119733
Krister Walfridsson <kristerw at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Resolution|INVALID |FIXED --- Comment #4 from Krister Walfridsson <kristerw at gcc dot gnu.org> --- The struct is 64-bit aligned in the C semantics, but the GIMPLE semantics is more permissive (see the recent discussions on the mailing list [1][2]), and several passes create misaligned pointers. For example, ivopts decides to calculate &u.buf[off] as: union { char buf[31]; long long int align_int; long double align_fp; } * _13; _14 = (sizetype) off_4(D); _13 = &u + _14; when compiling the function static union { char buf[31]; long long align_int; long double align_fp; } u; void check (int off) { char *q; int i; q = u.buf; for (i = 0; i < off; i++, q++) if (*q != 'a') __builtin_abort (); } which makes _13 misaligned when off is not a multiple of 8. So I claim the store-merging pass is not allowed to use the alignment of the pointer to do the optimization. But it may of course be the case that it's store-merging that is correct, and ivopts, etc. that are wrong. In that case, I need some additional information about what the correct GIMPLE semantics is, so I can report the real issues... References: 1. https://gcc.gnu.org/pipermail/gcc/2025-March/245763.html 2. https://gcc.gnu.org/pipermail/gcc/2025-April/245870.html