blob: 11022593e3e594b21ee22f3d02c77a58d376e4be [file] [log] [blame]
/* { 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;
}