/* { 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; }