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