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);