(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c-c++-common/
for-13.c
       1  unsigned short a[256];
       2  
       3  __attribute__((noinline, noclone)) void
       4  bar (void *x, unsigned short z)
       5  {
       6    unsigned short *y = (unsigned short *) x;
       7    if (y < &a[5] || y > &a[222] || y == &a[124])
       8      __builtin_abort ();
       9    *y += z;
      10  }
      11  
      12  __attribute__((noinline, noclone)) void
      13  foo (void *qx, void *rx, void *sx, int n)
      14  {
      15    unsigned short (*q)[n], (*r)[n], (*s)[n], (*p)[n];
      16    q = (typeof (q)) qx;
      17    r = (typeof (r)) rx;
      18    s = (typeof (s)) sx;
      19    #pragma omp for
      20    for (p = q; p != r; p++)
      21      bar (p, 1);
      22    #pragma omp for
      23    for (p = s; p != r; p--)
      24      bar (p, 2);
      25    #pragma omp for
      26    for (p = q; p != r; p = p + 1)
      27      bar (p, 4);
      28    #pragma omp for
      29    for (p = s; p != r; p = p - 1)
      30      bar (p, 8);
      31    #pragma omp for
      32    for (p = q; p != r; p = 1 + p)
      33      bar (p, 16);
      34    #pragma omp for
      35    for (p = s; p != r; p = -1 + p)
      36      bar (p, 32);
      37    #pragma omp for
      38    for (p = q; p != r; p += 1)
      39      bar (p, 64);
      40    #pragma omp for
      41    for (p = s; p != r; p -= 1)
      42      bar (p, 128);
      43  }
      44  
      45  __attribute__((noinline, noclone)) void
      46  baz (void *qx, void *rx, void *sx, int n)
      47  {
      48    unsigned short (*q)[n], (*r)[n], (*s)[n], (*p)[n];
      49    q = (typeof (q)) qx;
      50    r = (typeof (r)) rx;
      51    s = (typeof (s)) sx;
      52    #pragma omp for
      53    for (p = q; p < r; p++)
      54      bar (p, 256);
      55    #pragma omp for
      56    for (p = s; p > r; p--)
      57      bar (p, 512);
      58    #pragma omp for
      59    for (p = q; p < r; p = p + 1)
      60      bar (p, 1024);
      61    #pragma omp for
      62    for (p = s; p > r; p = p - 1)
      63      bar (p, 2048);
      64    #pragma omp for
      65    for (p = q; p < r; p = 1 + p)
      66      bar (p, 4096);
      67    #pragma omp for
      68    for (p = s; p > r; p = -1 + p)
      69      bar (p, 8192);
      70    #pragma omp for
      71    for (p = q; p < r; p += 1)
      72      bar (p, 16384);
      73    #pragma omp for
      74    for (p = s; p > r; p -= 1)
      75      bar (p, 32768U);
      76  }
      77  
      78  int
      79  main ()
      80  {
      81    int i;
      82    volatile int j = 7;
      83  #pragma omp parallel
      84    {
      85      foo (&a[5 + (j - 7)], &a[124 + (j - 7)], &a[222 + (j - 7)], j);
      86      baz (&a[5 + (j - 7)], &a[124 + (j - 7)], &a[222 + (j - 7)], j);
      87    }
      88    for (i = 0; i < 256; i++)
      89      if (i < 5 || i > 222 || i == 124 || ((i - 5) % 7) != 0)
      90        {
      91  	if (a[i])
      92  	  __builtin_abort ();
      93        }
      94      else if (i < 124 && a[i] != 1 + 4 + 16 + 64 + 256 + 1024 + 4096 + 16384)
      95        __builtin_abort ();
      96      else if (i > 124 && a[i] != 2 + 8 + 32 + 128 + 512 + 2048 + 8192 + 32768U)
      97        __builtin_abort ();
      98    return 0;
      99  }