1  /* PR tree-optimization/51581 */
       2  /* { dg-require-effective-target int32plus } */
       3  
       4  extern void abort (void);
       5  
       6  #define N 4096
       7  int a[N], c[N];
       8  unsigned int b[N], d[N];
       9  
      10  __attribute__((noinline, noclone)) void
      11  f1 (void)
      12  {
      13    int i;
      14    for (i = 0; i < N; i++)
      15      c[i] = a[i] % 3;
      16  }
      17  
      18  __attribute__((noinline, noclone)) void
      19  f2 (void)
      20  {
      21    int i;
      22    for (i = 0; i < N; i++)
      23      d[i] = b[i] % 3;
      24  }
      25  
      26  __attribute__((noinline, noclone)) void
      27  f3 (void)
      28  {
      29    int i;
      30    for (i = 0; i < N; i++)
      31      c[i] = a[i] % 18;
      32  }
      33  
      34  __attribute__((noinline, noclone)) void
      35  f4 (void)
      36  {
      37    int i;
      38    for (i = 0; i < N; i++)
      39      d[i] = b[i] % 18;
      40  }
      41  
      42  __attribute__((noinline, noclone)) void
      43  f5 (void)
      44  {
      45    int i;
      46    for (i = 0; i < N; i++)
      47      c[i] = a[i] % 19;
      48  }
      49  
      50  __attribute__((noinline, noclone)) void
      51  f6 (void)
      52  {
      53    int i;
      54    for (i = 0; i < N; i++)
      55      d[i] = b[i] % 19;
      56  }
      57  
      58  #if __SIZEOF_INT__ == 4 && __SIZEOF_LONG_LONG__ == 8
      59  __attribute__((noinline, noclone)) void
      60  f7 (void)
      61  {
      62    int i;
      63    for (i = 0; i < N; i++)
      64      {
      65        int x = (int) ((unsigned long long) (a[i] * 0x55555556LL) >> 32) - (a[i] >> 31);
      66        c[i] = a[i] - x * 3;
      67      }
      68  }
      69  
      70  __attribute__((noinline, noclone)) void
      71  f8 (void)
      72  {
      73    int i;
      74    for (i = 0; i < N; i++)
      75      {
      76        unsigned int x = ((unsigned int) ((b[i] * 0xaaaaaaabULL) >> 32) >> 1);
      77        d[i] = b[i] - x * 3;
      78      }
      79  }
      80  
      81  __attribute__((noinline, noclone)) void
      82  f9 (void)
      83  {
      84    int i;
      85    for (i = 0; i < N; i++)
      86      {
      87        int x = (((int) ((unsigned long long) (a[i] * 0x38e38e39LL) >> 32)) >> 2) - (a[i] >> 31);
      88        c[i] = a[i] - x * 18;
      89      }
      90  }
      91  
      92  __attribute__((noinline, noclone)) void
      93  f10 (void)
      94  {
      95    int i;
      96    for (i = 0; i < N; i++)
      97      {
      98        unsigned int x = (unsigned int) ((b[i] * 0x38e38e39ULL) >> 32) >> 2;
      99        d[i] = b[i] - x * 18;
     100      }
     101  }
     102  
     103  __attribute__((noinline, noclone)) void
     104  f11 (void)
     105  {
     106    int i;
     107    for (i = 0; i < N; i++)
     108      {
     109        int x = (((int) ((unsigned long long) (a[i] * 0x6bca1af3LL) >> 32)) >> 3) - (a[i] >> 31);
     110        c[i] = a[i] - x * 19;
     111      }
     112  }
     113  
     114  __attribute__((noinline, noclone)) void
     115  f12 (void)
     116  {
     117    int i;
     118    for (i = 0; i < N; i++)
     119      {
     120        unsigned int tmp = (b[i] * 0xaf286bcbULL) >> 32;
     121        unsigned int x = (((b[i] - tmp) >> 1) + tmp) >> 4;
     122        d[i] = b[i] - x * 19;
     123      }
     124  }
     125  #endif
     126  
     127  int
     128  main ()
     129  {
     130    int i;
     131    for (i = 0; i < N; i++)
     132      {
     133        asm ("");
     134        a[i] = i - N / 2;
     135        b[i] = i;
     136      }
     137    a[0] = -__INT_MAX__ - 1;
     138    a[1] = -__INT_MAX__;
     139    a[N - 1] = __INT_MAX__;
     140    b[N - 1] = ~0;
     141    f1 ();
     142    f2 ();
     143    for (i = 0; i < N; i++)
     144      if (c[i] != a[i] % 3 || d[i] != b[i] % 3)
     145        abort ();
     146    f3 ();
     147    f4 ();
     148    for (i = 0; i < N; i++)
     149      if (c[i] != a[i] % 18 || d[i] != b[i] % 18)
     150        abort ();
     151    f5 ();
     152    f6 ();
     153    for (i = 0; i < N; i++)
     154      if (c[i] != a[i] % 19 || d[i] != b[i] % 19)
     155        abort ();
     156  #if __SIZEOF_INT__ == 4 && __SIZEOF_LONG_LONG__ == 8
     157    f7 ();
     158    f8 ();
     159    for (i = 0; i < N; i++)
     160      if (c[i] != a[i] % 3 || d[i] != b[i] % 3)
     161        abort ();
     162    f9 ();
     163    f10 ();
     164    for (i = 0; i < N; i++)
     165      if (c[i] != a[i] % 18 || d[i] != b[i] % 18)
     166        abort ();
     167    f11 ();
     168    f12 ();
     169    for (i = 0; i < N; i++)
     170      if (c[i] != a[i] % 19 || d[i] != b[i] % 19)
     171        abort ();
     172  #endif
     173    return 0;
     174  }