blob: 82cfafc04c0614b3acc1e4cb6a8821ce64b4f65d [file] [log] [blame]
/* 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;
}