https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109543
Bug ID: 109543 Summary: Avoid using BLKmode for unions with a non-BLKmode member when possible Product: gcc Version: 14.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: avieira at gcc dot gnu.org Target Milestone: --- Hi, So with the following C-code: $ cat t.c #include <arm_neon.h> #ifdef GOOD typedef float64x2x2_t TYPE; #else typedef union { float64x2x2_t v; double d[4]; } TYPE; #endif void foo (TYPE *a, TYPE *b, TYPE *c, unsigned n) { TYPE X = a[0]; TYPE Y = b[0]; TYPE Z = c[0]; for (unsigned i = 0; i < n; ++n) { TYPE temp = X; X = Y; Y = Z; Z = temp; } a[0] = X; b[0] = Y; c[0] = Z; } If compiled for aarch64 with -DGOOD the compiler will use vector register moves in the loop, whereas without -DGOOD it will use the stack with memmoves. The reason for this is because when picking the mode to address a UNION with gcc will always choose BLKmode as soon as any member of a UNION is BLKmode. In such cases I think it would be safe to go with not-BLKmode of members that have the same size as the entire UNION?