/* PR rtl-optimization/65401 */ struct S { unsigned short s[64]; }; __attribute__((noinline, noclone)) void foo (struct S *x) { unsigned int i; unsigned char *s; s = (unsigned char *) x->s; for (i = 0; i < 64; i++) x->s[i] = s[i * 2] | (s[i * 2 + 1] << 8); } __attribute__((noinline, noclone)) void bar (struct S *x) { unsigned int i; unsigned char *s; s = (unsigned char *) x->s; for (i = 0; i < 64; i++) x->s[i] = (s[i * 2] << 8) | s[i * 2 + 1]; } int main () { unsigned int i; struct S s; if (sizeof (unsigned short) != 2) return 0; for (i = 0; i < 64; i++) s.s[i] = i + ((64 - i) << 8); foo (&s); #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ for (i = 0; i < 64; i++) if (s.s[i] != (64 - i) + (i << 8)) __builtin_abort (); #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ for (i = 0; i < 64; i++) if (s.s[i] != i + ((64 - i) << 8)) __builtin_abort (); #endif for (i = 0; i < 64; i++) s.s[i] = i + ((64 - i) << 8); bar (&s); #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ for (i = 0; i < 64; i++) if (s.s[i] != (64 - i) + (i << 8)) __builtin_abort (); #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ for (i = 0; i < 64; i++) if (s.s[i] != i + ((64 - i) << 8)) __builtin_abort (); #endif return 0; }