| /* { dg-do run } */ |
| /* { dg-require-effective-target tls_runtime } */ |
| /* { dg-additional-options "-std=gnu99" {target c } } */ |
| |
| #include <omp.h> |
| #include <stdlib.h> |
| |
| int r, s, u, v, t; |
| int *x; |
| |
| void |
| foo (int *a) |
| { |
| int i; |
| long long j; |
| #pragma omp for lastprivate (conditional: u, x) ordered |
| for (i = 15; i < 64; i++) |
| { |
| #pragma omp critical |
| { |
| if ((a[i] % 5) == 3) |
| u = i; |
| } |
| #pragma omp ordered |
| { |
| if ((a[i] % 7) == 2) |
| x = &a[i]; |
| } |
| } |
| #pragma omp for lastprivate (conditional: v) reduction (+:r, s) schedule (nonmonotonic: static) reduction (task, +: t) |
| for (i = -3; i < 119; i += 2) |
| { |
| ++s; |
| #pragma omp taskgroup |
| { |
| #pragma omp task in_reduction (+: t) |
| ++t; |
| if ((a[i + 4] % 11) == 9) |
| v = i; |
| else |
| ++r; |
| } |
| } |
| } |
| |
| int |
| main () |
| { |
| int a[128], i; |
| for (i = 0; i < 128; i++) |
| a[i] = i; |
| #pragma omp parallel |
| foo (a); |
| if (u != 63 || v != 115 || x != &a[58] || r != 55 || s != 61 || t != 61) |
| abort (); |
| return 0; |
| } |