https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83201
--- Comment #15 from Richard Biener <rguenth at gcc dot gnu.org> --- SWAPINIT should end up with swaptype_long == 1 I think and swaptype_int == 1 for the cases in question. Enforcing swaptype_int = swaptype_long = 2 should make it work (scratch SWAPINIT calls). #define SWAPINIT(TYPE, a, es) swaptype_ ## TYPE = \ ((char *)a - (char *)0) % sizeof(TYPE) || \ es % sizeof(TYPE) ? 2 : es == sizeof(TYPE) ? 0 : 1; static INLINE void swapfunc(char *a, char *b, int n, int swaptype_long, int swaptype_int) { if (swaptype_long <= 1) swapcode(long, a, b, n) else if (swaptype_int <= 1) swapcode(int, a, b, n) else swapcode(char, a, b, n) } #define swap(a, b) \ if (swaptype_long == 0) { \ long t = *(long *)(a); \ *(long *)(a) = *(long *)(b); \ *(long *)(b) = t; \ } else if (swaptype_int == 0) { \ int t = *(int *)(a); \ *(int *)(a) = *(int *)(b); \ *(int *)(b) = t; \ } else \ swapfunc((char *)a, (char *)b, es, swaptype_long, swaptype_int) ... loop: SWAPINIT(long, a, es); SWAPINIT(int, a, es);