blob: 69504e40251c738c0eda828293518a31a3e1425b [file]
// Both parallel regions have to be nested for this to reproduce, and only at
// -O2 and above; either one alone is correct at every optimization level.
// RUN: %libomptarget-compileopt-generic
// RUN: %libomptarget-run-generic | %fcheck-generic
// REQUIRES: gpu
// XFAIL: intelgpu
#include <stdio.h>
#define N 5
int main(void) {
long aa = 0;
int ng = 6, cmom = 4, nxyz = 5;
#pragma omp target teams distribute num_teams(nxyz) thread_limit(4) \
map(tofrom : aa)
for (int gid = 0; gid < nxyz; gid++) {
#pragma omp parallel for collapse(2)
for (unsigned g = 0; g < ng; g++)
for (unsigned l = 0; l < cmom - 1; l++) {
int a = 0;
for (int ii = 0; ii < N + 2; ii++) {
#pragma omp parallel for reduction(+ : a)
for (int i = 0; i < N; i++)
a += i;
}
#pragma omp atomic
aa += a;
}
}
long expected = (long)ng * (cmom - 1) * nxyz * (N * (N - 1) / 2) * (N + 2);
printf("aa = %ld, expected %ld\n", aa, expected);
return aa != expected;
}
// CHECK: aa = 6300, expected 6300