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
      18  f (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
      39  main ()
      40  {
      41    uint32_t S[2] = {0xffff, 0xffffff};
      42  
      43    if (f (S,2)!= 1392607300)
      44      abort();
      45  
      46    return 0;
      47  }