Mercurial > hg > CbC > CbC_gcc
diff gcc/testsuite/c-c++-common/gomp/ordered-1.c @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcc/testsuite/c-c++-common/gomp/ordered-1.c Fri Oct 27 22:46:09 2017 +0900 @@ -0,0 +1,91 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fopenmp-simd" } */ +/* { dg-additional-options "-msse2" { target sse2_runtime } } */ +/* { dg-additional-options "-mavx" { target avx_runtime } } */ + +#define N 1024 +extern +#ifdef __cplusplus +"C" +#endif +void abort (void); + +int last; + +void +bar (unsigned char *a, int i, int safelen) +{ + int j, k; + if (i != last++) + abort (); + for (j = i - safelen - 32; j < i; j++) + if (j >= 0 && a[j] != 2) + break; + if (j <= i - safelen || a[j] != 1) + abort (); + for (k = j; k < i + safelen + 32; k++) + if (k >= N || a[k] != 1) + break; + if (k <= i || k > j + safelen) + abort (); + if (k < N && a[k] != 0) + abort (); + for (; k < i + safelen + 32; k++) + if (k < N && a[k] != 0) + abort (); +} + +static inline void +foo (unsigned char *a, int i) +{ + #pragma omp ordered simd + bar (a, i, 64); +} + +int +main () +{ + unsigned char a[N], b[N]; + int i; + #pragma omp simd + for (i = 0; i < N; i++) + a[i] = 0; + #pragma omp simd safelen (64) + for (i = 0; i < N; i++) + { + a[i]++; + foo (a, i); + a[i]++; + } + #pragma omp simd + for (i = 0; i < N; i++) + { + a[i] = 0; + b[i] = 0; + } + last = 0; + #pragma omp simd safelen (32) + for (i = 0; i < N; i++) + { + a[i]++; + #pragma omp ordered simd + bar (a, i, 32); + a[i]++; + } + for (i = 0; i < N; i++) + if (a[i] != 2) + abort (); + #pragma omp simd safelen (32) + for (i = 1; i < N; i++) + { + #pragma omp ordered simd + b[i] = b[i - 1] + 1; + a[i]++; + #pragma omp ordered simd + a[i] += a[i - 1]; + } + for (i = 0; i < N; i++) + if (a[i] != (unsigned char) (2 + 3 * i) || b[i] != (unsigned char) i) + abort (); + return 0; +}