2 // { dg-set-target-env-var OMP_CANCELLATION "true" }
5 #include "cancel-test.h"
7 __attribute__((noinline, noclone)) int
12 #pragma omp parallel num_threads (32) shared (v, w) private (c, d) firstprivate (e)
18 #pragma omp for private (d, g) firstprivate (b)
19 for (i = 0; i < 1000; ++i)
24 #pragma omp cancel for if (x[0])
27 #pragma omp for private (d, g) firstprivate (b)
28 for (i = 0; i < 1000; ++i)
33 #pragma omp cancel for if (x[1])
37 #pragma omp for private (d, g) firstprivate (b)
38 for (i = 0; i < 1000; ++i)
43 #pragma omp cancel for if (x[2])
47 #pragma omp for private (d, g) firstprivate (b)
48 for (i = 0; i < 1000; ++i)
53 #pragma omp cancel for if (x[3])
58 if (v != 3000 || w != 0)
60 #pragma omp parallel num_threads (32) shared (v, w) private (c, d) firstprivate (e)
66 /* None of these cancel directives should actually cancel anything,
67 but the compiler shouldn't know that and thus should use cancellable
68 barriers at the end of all the workshares. */
69 #pragma omp cancel parallel if (omp_get_thread_num () == 1 && x[4])
70 #pragma omp for private (d, g) firstprivate (b)
71 for (i = 0; i < 1000; ++i)
76 #pragma omp cancel for if (x[0])
79 #pragma omp cancel parallel if (omp_get_thread_num () == 2 && x[4])
80 #pragma omp for private (d, g) firstprivate (b)
81 for (i = 0; i < 1000; ++i)
86 #pragma omp cancel for if (x[1])
90 #pragma omp cancel parallel if (omp_get_thread_num () == 3 && x[4])
91 #pragma omp for private (d, g) firstprivate (b)
92 for (i = 0; i < 1000; ++i)
97 #pragma omp cancel for if (x[2])
101 #pragma omp cancel parallel if (omp_get_thread_num () == 4 && x[4])
102 #pragma omp for private (d, g) firstprivate (b)
103 for (i = 0; i < 1000; ++i)
108 #pragma omp cancel for if (x[3])
112 #pragma omp cancel parallel if (omp_get_thread_num () == 5 && x[4])
114 if (v != 6000 || w != 0)
122 int x[] = { 1, 0, 1, 0, 0 };
123 if (omp_get_cancellation ())