https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93721
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- A simple testcase: void f(unsigned short *a) { unsigned short t0 = a[0]; unsigned short t1 = a[1]; a[1] = t0; a[0] = t1; } ---- CUT ---- Should produce the same as: void f0(unsigned short *a) { unsigned t0 = ((unsigned int*)a)[0]; unsigned t1 = t0>>sizeof(unsigned short)*8; unsigned t2 = t0<<sizeof(unsigned short)*8; ((unsigned int*)a)[0] = t1 | t2; } --- CUT ---