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