1 /* PR rtl-optimization/65401 */
2 
3 struct S { unsigned short s[64]; };
4 
5 __attribute__((noinline, noclone)) void
foo(struct S * x)6 foo (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
bar(struct S * x)17 bar (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 
27 int
main()28 main ()
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