(root)/
gcc-13.2.0/
gcc/
testsuite/
c-c++-common/
gomp/
ordered-1.c
       1  /* { dg-do run } */
       2  /* { dg-options "-O2 -fopenmp-simd" } */
       3  /* { dg-additional-options "-msse2" { target sse2_runtime } } */
       4  /* { dg-additional-options "-mavx" { target avx_runtime } } */
       5  
       6  #define N 1024
       7  extern
       8  #ifdef __cplusplus
       9  "C"
      10  #endif
      11  void abort (void);
      12  
      13  int last;
      14  
      15  void
      16  bar (unsigned char *a, int i, int safelen)
      17  {
      18    int j, k;
      19    if (i != last++)
      20      abort ();
      21    for (j = i - safelen - 32; j < i; j++)
      22      if (j >= 0 && a[j] != 2)
      23        break;
      24    if (j <= i - safelen || a[j] != 1)
      25      abort ();
      26    for (k = j; k < i + safelen + 32; k++)
      27      if (k >= N || a[k] != 1)
      28        break;
      29    if (k <= i || k > j + safelen)
      30      abort ();
      31    if (k < N && a[k] != 0)
      32      abort ();
      33    for (; k < i + safelen + 32; k++)
      34      if (k < N && a[k] != 0)
      35        abort ();
      36  }
      37  
      38  static inline void
      39  foo (unsigned char *a, int i)
      40  {
      41    #pragma omp ordered simd
      42    bar (a, i, 64);
      43  }
      44  
      45  int
      46  main ()
      47  {
      48    unsigned char a[N], b[N];
      49    int i;
      50    #pragma omp simd
      51    for (i = 0; i < N; i++)
      52      a[i] = 0;
      53    #pragma omp simd safelen (64)
      54    for (i = 0; i < N; i++)
      55      {
      56        a[i]++;
      57        foo (a, i);
      58        a[i]++;
      59      }
      60    #pragma omp simd
      61    for (i = 0; i < N; i++)
      62      {
      63        a[i] = 0;
      64        b[i] = 0;
      65      }
      66    last = 0;
      67    #pragma omp simd safelen (32)
      68    for (i = 0; i < N; i++)
      69      {
      70        a[i]++;
      71        #pragma omp ordered simd
      72        bar (a, i, 32);
      73        a[i]++;
      74      }
      75    for (i = 0; i < N; i++)
      76      if (a[i] != 2)
      77        abort ();
      78    #pragma omp simd safelen (32)
      79    for (i = 1; i < N; i++)
      80      {
      81        #pragma omp ordered simd
      82        b[i] = b[i - 1] + 1;
      83        a[i]++;
      84        #pragma omp ordered simd
      85        a[i] += a[i - 1];
      86      }
      87    for (i = 0; i < N; i++)
      88      if (a[i] != (unsigned char) (2 + 3 * i) || b[i] != (unsigned char) i)
      89        abort ();
      90    return 0;
      91  }