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