/* OpenACC 'cache' directive: valid usage. */ /* See also corresponding C++ variant: '../../g++.dg/goacc/cache-1.C'. */ /* For execution testing, this file is '#include'd from '../../../../libgomp/testsuite/libgomp.oacc-c-c++-common/cache-1.c'. */ #ifdef TEMPLATIZE template #endif static void test () { #define N 2 int a[N], b[N]; int i; for (i = 0; i < N; i++) { a[i] = 3; b[i] = 0; } #pragma acc parallel copyin (a[0:N]) copyout (b[0:N]) { int ii; for (ii = 0; ii < N; ii++) { const int idx = ii; int n = 1; const int len = n; /* Have at it, GCC! */ #pragma acc cache (a[0:N]) #pragma acc cache (a[0:N], a[0:N]) #pragma acc cache (a[0:N], b[0:N]) #pragma acc cache (a[0]) #pragma acc cache (a[0], a[1], b[0:N]) #pragma acc cache (a[i - 5]) #pragma acc cache (a[i + 5:len]) #pragma acc cache (a[i + 5:len - 1]) #pragma acc cache (b[i]) #pragma acc cache (b[i:len]) #pragma acc cache (a[ii]) #pragma acc cache (a[ii:len]) #pragma acc cache (b[ii - 1]) #pragma acc cache (b[ii - 1:len]) #pragma acc cache (b[i - ii + 1]) #pragma acc cache (b[i + ii - 1:len]) #pragma acc cache (b[i * ii - 1:len + 1]) #pragma acc cache (a[idx + 2]) #pragma acc cache (a[idx:len + 2]) #pragma acc cache (a[idx]) #pragma acc cache (a[idx:len]) #pragma acc cache (a[idx + 2:len]) #pragma acc cache (a[idx + 2 + i:len]) #pragma acc cache (a[idx + 2 + i + ii:len]) b[ii] = a[ii]; } } for (i = 0; i < N; i++) { if (a[i] != b[i]) __builtin_abort (); } }