1/* PR rtl-optimization/65401 */
2
3struct S { unsigned short s[64]; };
4
5__attribute__((noinline, noclone)) void
6foo (struct S *x)
7{
8  unsigned int i;
9  unsigned char *s;
10
11  s = (unsigned char *) x->s;
12  for (i = 0; i < 64; i++)
13    x->s[i] = s[i * 2] | (s[i * 2 + 1] << 8);
14}
15
16__attribute__((noinline, noclone)) void
17bar (struct S *x)
18{
19  unsigned int i;
20  unsigned char *s;
21
22  s = (unsigned char *) x->s;
23  for (i = 0; i < 64; i++)
24    x->s[i] = (s[i * 2] << 8) | s[i * 2 + 1];
25}
26
27int
28main ()
29{
30  unsigned int i;
31  struct S s;
32  if (sizeof (unsigned short) != 2)
33    return 0;
34  for (i = 0; i < 64; i++)
35    s.s[i] = i + ((64 - i) << 8);
36  foo (&s);
37#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
38  for (i = 0; i < 64; i++)
39    if (s.s[i] != (64 - i) + (i << 8))
40      __builtin_abort ();
41#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
42  for (i = 0; i < 64; i++)
43    if (s.s[i] != i + ((64 - i) << 8))
44      __builtin_abort ();
45#endif
46  for (i = 0; i < 64; i++)
47    s.s[i] = i + ((64 - i) << 8);
48  bar (&s);
49#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
50  for (i = 0; i < 64; i++)
51    if (s.s[i] != (64 - i) + (i << 8))
52      __builtin_abort ();
53#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
54  for (i = 0; i < 64; i++)
55    if (s.s[i] != i + ((64 - i) << 8))
56      __builtin_abort ();
57#endif
58  return 0;
59}
60