1 /* This revealed a bug when rotates are expanded into 2 two shifts. */ 3 4 /* { dg-do run } */ 5 /* { dg-options "-O1 -std=c99" } */ 6 7 extern void abort (void); 8 9 #if __INT_MAX__ == 2147483647 10 typedef unsigned int uint32_t; 11 #elif __LONG_MAX__ == 2147483647 12 typedef unsigned long uint32_t; 13 #else 14 #error unable to find 32-bit integer type 15 #endif 16 17 uint32_t f(uint32_t * S,int j)18f (uint32_t *S, int j) 19 { 20 uint32_t A, B, k, L[2] = {1234, 5678}; 21 int i, m; 22 23 A = B = 0; 24 for (i = 0; i < j; i++) 25 { 26 k = (S[i] + A + B) & 0xffffffffL; 27 A = S[i] = 28 ((k << (3 & 0x1f)) | ((k & 0xffffffff) >> (32 - (3 & 0x1f)))); 29 30 m = (int) (A + B); 31 k = (L[i] + A + B) & 0xffffffffL; 32 B = L[i] = 33 ((k << (m & 0x1f)) | ((k & 0xffffffff) >> (32 - (m & 0x1f)))); 34 } 35 return L[0] + L[1]; 36 } 37 38 int main()39main () 40 { 41 uint32_t S[2] = {0xffff, 0xffffff}; 42 43 if (f (S,2)!= 1392607300) 44 abort(); 45 46 return 0; 47 } 48