| /* { 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, r2, s2, u2, v2, r3, s3, u3, v3; |
| long long w, w2, w3, p, p2, p3; |
| int *x, *x2, *x3; |
| short y, y2, y3; |
| int z; |
| int thr1, thr2; |
| #pragma omp threadprivate (thr1, thr2) |
| |
| void |
| foo (int *a, long long int b, long long int c) |
| { |
| int i; |
| long long j; |
| #pragma omp parallel for lastprivate (conditional: u, x) |
| for (i = 15; i < 64; i++) |
| { |
| if ((a[i] % 5) == 3) |
| u = i; |
| if ((a[i] % 7) == 2) |
| x = &a[i]; |
| } |
| #pragma omp parallel for lastprivate (conditional: v) reduction (+:r, s) schedule (nonmonotonic: static) |
| for (i = -3; i < 119; i += 2) |
| { |
| ++s; |
| if ((a[i + 4] % 11) == 9) |
| v = i; |
| else |
| ++r; |
| } |
| #pragma omp parallel for schedule (monotonic: static) lastprivate (conditional: w) |
| for (j = b; j < b + 115 * c; j += (b & 3) + 7) |
| if ((a[j] % 13) == 5) |
| w = j * 2; |
| #pragma omp parallel for schedule (auto) lastprivate (conditional: p) collapse(3) |
| for (i = -5; i < (int) (b + 5); i += 2) |
| for (j = b + 12 + c; j > b; --j) |
| for (int k = 0; k < 5; k += c) |
| if (((((i + 5) * 13 + (13 - j)) * 5 + k) % 17) == 6) |
| p = i * 10000 + j * 100 + k; |
| |
| #pragma omp parallel for schedule (nonmonotonic: static, 2) lastprivate (conditional: u2, x2) |
| for (i = 15; i < 64; i++) |
| { |
| if ((a[i] % 5) == 3) |
| u2 = i; |
| if ((a[i] % 7) == 2) |
| x2 = &a[i]; |
| } |
| #pragma omp parallel for schedule (static, 3) lastprivate (conditional: v2) reduction (+:r2, s2) |
| for (i = -3; i < 119; i += 2) |
| { |
| ++s2; |
| if ((a[i + 4] % 11) == 9) |
| v2 = i; |
| else |
| ++r2; |
| } |
| #pragma omp parallel for lastprivate (conditional: w2) schedule (static, 1) |
| for (j = b; j < b + 115 * c; j += (b & 3) + 7) |
| if ((a[j] % 13) == 5) |
| w2 = j * 2; |
| #pragma omp parallel for schedule (static, 3) collapse (3) lastprivate (conditional: p2) |
| for (i = -5; i < (int) (b + 5); i += 2) |
| for (j = b + 12 + c; j > b; --j) |
| for (int k = 0; k < 5; k += c) |
| if (((((i + 5) * 13 + (13 - j)) * 5 + k) % 17) == 6) |
| p2 = i * 10000 + j * 100 + k; |
| |
| #pragma omp parallel for lastprivate (conditional: u3, x3) schedule (runtime) |
| for (i = 15; i < 64; i++) |
| { |
| if ((a[i] % 5) == 3) |
| u3 = i; |
| if ((a[i] % 7) == 2) |
| x3 = &a[i]; |
| } |
| #pragma omp parallel for lastprivate (conditional: v3) reduction (+:r3, s3) schedule (nonmonotonic: dynamic) |
| for (i = -3; i < 119; i += 2) |
| { |
| ++s3; |
| if ((a[i + 4] % 11) == 9) |
| v3 = i; |
| else |
| ++r3; |
| } |
| #pragma omp parallel for schedule (monotonic: guided, 3) lastprivate (conditional: w3) |
| for (j = b; j < b + 115 * c; j += (b & 3) + 7) |
| if ((a[j] % 13) == 5) |
| w3 = j * 2; |
| #pragma omp parallel for schedule (dynamic, 4) lastprivate (conditional: p3) collapse(3) |
| for (i = -5; i < (int) (b + 5); i += 2) |
| for (j = b + 12 + c; j > b; --j) |
| for (int k = 0; k < 5; k += c) |
| if (((((i + 5) * 13 + (13 - j)) * 5 + k) % 17) == 6) |
| p3 = i * 10000 + j * 100 + k; |
| |
| /* Nasty testcase, verify that even a no-op assignment is accounted |
| for in lastprivate(conditional:). */ |
| #pragma omp parallel for schedule (monotonic: static, 2) firstprivate (z) \ |
| lastprivate (conditional: z) |
| for (int k = -2000; k < 8000; ++k) |
| { |
| if (k < 3000 && (k & 3) == 1) |
| { |
| z = k; |
| thr1 = k; |
| } |
| else if (k == 7931) |
| { |
| z = z; |
| thr2 = 1; |
| } |
| } |
| |
| if (thr2 && z != thr1) |
| abort (); |
| } |
| |
| int |
| main () |
| { |
| int a[128], i; |
| volatile int j = 0; |
| for (i = 0; i < 128; i++) |
| a[i] = i; |
| w = 1234; |
| foo (a, j, j + 1); |
| if (u != 63 || v != 115 || w != 140 || x != &a[58] || r != 55 || s != 61 || p != 30104) |
| abort (); |
| if (u2 != 63 || v2 != 115 || w2 != 140 || x2 != &a[58] || r2 != 55 || s2 != 61 || p2 != 30104) |
| abort (); |
| if (u3 != 63 || v3 != 115 || w3 != 140 || x3 != &a[58] || r3 != 55 || s3 != 61 || p3 != 30104) |
| abort (); |
| return 0; |
| } |