| // { dg-additional-options "-Wno-deprecated-openmp" } | |
| extern "C" void abort (); | |
| int arr[64], arr2[64], arr3[64]; | |
| int * | |
| foo (int x, int y, long z) | |
| { | |
| int v; | |
| switch (x) | |
| { | |
| case 1: | |
| if (z != 0 || y < 0 || y >= 64) | |
| abort (); | |
| #pragma omp atomic capture | |
| { | |
| v = arr2[y]; | |
| arr2[y]++; | |
| } | |
| if (v != 0) abort (); | |
| return &arr[y]; | |
| case 2: | |
| if (y < 0 || y > 60 || (y & 3) || z < 0 || z >= 4) | |
| abort (); | |
| #pragma omp atomic | |
| arr2[y + z] = arr2[y + z] + 4; | |
| return &arr[y + z]; | |
| case 3: | |
| if (z < 0 || z > 60 || (z & 3) || y < 0 || y >= 4) | |
| abort (); | |
| #pragma omp atomic | |
| arr2[y + z] = arr2[y + z] + 16; | |
| return &arr[y + z]; | |
| case 4: | |
| if (y != 0 || z > 64 || z <= 0) | |
| abort (); | |
| #pragma omp atomic | |
| arr2[z - 1] = arr2[z - 1] + 64; | |
| return &arr[z - 1]; | |
| case 5: | |
| if ((y & 3) != 0 || y < 64 || y >= 96 | |
| || (z & 127) != 0 || z < 512 || z >= 1024) | |
| abort (); | |
| y = (y - 64) + (z - 512) / 128; | |
| #pragma omp atomic | |
| arr2[y] = arr2[y] + 256; | |
| return &arr[y]; | |
| case 6: | |
| if ((y & 3) != 0 || y <= 64 || y > 96 | |
| || (z & 127) != 1 || z <= 513 || z > 1025) | |
| abort (); | |
| y = (y - 68) + (z - 641) / 128; | |
| #pragma omp atomic | |
| arr2[y] = arr2[y] + 1024; | |
| return &arr[y]; | |
| default: | |
| abort (); | |
| } | |
| } | |
| volatile int beg, end, step, step2; | |
| volatile unsigned int begu, endu; | |
| template <int N> | |
| void | |
| bar () | |
| { | |
| #pragma omp parallel | |
| #pragma omp master | |
| { | |
| int i; | |
| for (i = 0; i < 64; i++) | |
| #pragma omp task depend (iterator (j=i:i+1) , out : foo (1, j, 0)[0]) | |
| arr[i] = i; | |
| #pragma omp task depend (iterator (int k=beg:end:step,long int l=0:4:1) , inout : \ | |
| foo (2, k, l)[0], foo (3, l, k)[0]) private (i) | |
| for (i = 0; i < 64; i++) | |
| if (arr[i] != i) | |
| abort (); | |
| else | |
| arr[i] = arr[i] + 1; | |
| #pragma omp task depend (iterator (int *p=&arr3[64]:&arr3[0]:-1), inout : \ | |
| foo (4, 0, p - &arr3[0])[0]) depend (in : beg) | |
| for (i = 0; i < 64; i++) | |
| if (arr[i] != i + 1) | |
| abort (); | |
| else | |
| arr[i] = arr[i] + 2; | |
| #pragma omp task depend (iterator (unsigned n=begu:endu:step2, unsigned int o = 512: 1024U: (unsigned char) 128), inout : \ | |
| foo (5, n + 128, o)[0]) | |
| for (i = 0; i < 64; i++) | |
| if (arr[i] != i + 3) | |
| abort (); | |
| else | |
| arr[i] = arr[i] + 4; | |
| #pragma omp task depend (iterator (int unsigned p=endu:begu:step,unsigned q= 1025U:513U:(signed char) -128), in : \ | |
| foo (6, p + 128, q)[0]) | |
| for (i = 0; i < 64; i++) | |
| if (arr[i] != i + 7) | |
| abort (); | |
| else | |
| arr[i] = arr[i] + 8; | |
| } | |
| } | |
| template <typename A, typename B, typename C, typename D, typename E, typename F> | |
| void | |
| baz (A beg, A end, A step, D begu, D endu, A step2) | |
| { | |
| #pragma omp parallel | |
| #pragma omp master | |
| { | |
| int i; | |
| for (i = 0; i < 64; i++) | |
| #pragma omp task depend (iterator (A j=i:i+1),out : foo (1, j, 0)[0]) | |
| arr[i] = i; | |
| #pragma omp task depend (iterator (A k=beg:end:step,B l=0:4:1), inout : \ | |
| foo (2, k, l)[0], foo (3, l, k)[0]) private (i) | |
| for (i = 0; i < 64; i++) | |
| if (arr[i] != i) | |
| abort (); | |
| else | |
| arr[i] = arr[i] + 1; | |
| #pragma omp task depend (iterator (C p=&arr3[64]:&arr3[0]:-1), in : \ | |
| foo (4, 0, p - &arr3[0])[0]) depend (in : beg) | |
| for (i = 0; i < 64; i++) | |
| if (arr[i] != i + 1) | |
| abort (); | |
| else | |
| arr[i] = arr[i] + 2; | |
| #pragma omp task depend (iterator (D n=begu:endu:step2, D o = 512: 1024U:(E) 128), inout : \ | |
| foo (5, n + 128, o)[0]) | |
| for (i = 0; i < 64; i++) | |
| if (arr[i] != i + 3) | |
| abort (); | |
| else | |
| arr[i] = arr[i] + 4; | |
| #pragma omp task depend (iterator (D p=endu:begu:step,D q= 1025U:513U:(F) -128), in : \ | |
| foo (6, p + 128, q)[0]) | |
| for (i = 0; i < 64; i++) | |
| if (arr[i] != i + 7) | |
| abort (); | |
| else | |
| arr[i] = arr[i] + 8; | |
| } | |
| } | |
| int | |
| main () | |
| { | |
| int m; | |
| beg = 60; | |
| end = -4; | |
| step = -4; | |
| step2 = 4; | |
| begu = -64U; | |
| endu = -32U; | |
| bar<0> (); | |
| for (m = 0; m < 64; m++) | |
| if (arr[m] != m + 15 || arr2[m] != (m < 32 ? 1365 : 85)) | |
| abort (); | |
| else | |
| arr[m] = arr2[m] = 0; | |
| baz<int, long int, int *, unsigned int, unsigned char, signed char> (beg, end, step, begu, endu, step2); | |
| for (m = 0; m < 64; m++) | |
| if (arr[m] != m + 15 || arr2[m] != (m < 32 ? 1365 : 85)) | |
| abort (); | |
| return 0; | |
| } |