modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/pr51581-1.c (about)

     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  }