https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97428
--- Comment #9 from Michael_S <already5chosen at yahoo dot com> --- Hopefully, you did regression tests for all main AoS<->SoA cases. I.e. typedef struct { double re, im; } dcmlx_t; void soa2aos(double* restrict dstRe, double* restrict dstIm, const dcmlx_t src[], int nq) { for (int i = 0; i < nq*4; ++i) { dcmlx_t s = src[i]; dstRe[i] = s.re; dstIm[i] = s.im; } } void aos2soa(dcmlx_t* restrict dst, const double* srcRe, const double* srcIm, int nq) { for (int i = 0; i < nq*4; ++i) { dst[i].re = srcRe[i]; dst[i].im = srcIm[i]; } } And equivalents with float instead of double. Right now 'gcc.10.2 -march=skylake -O3' does very good job for soa2aos() and suboptimal, but not horrible job for aos2soa(). Hopefully, your changes do not break any of it. Personally, I don't like SoA layouts and very much prefer AoSoA, but I recognize that in existing code bases SoA is more common.