1 | // RUN: %libomp-compile |
2 | // RUN: env OMP_WAIT_POLICY=passive \ |
3 | // RUN: KMP_FORKJOIN_BARRIER_PATTERN='linear,linear' %libomp-run |
4 | // RUN: env OMP_WAIT_POLICY=passive \ |
5 | // RUN: KMP_FORKJOIN_BARRIER_PATTERN='tree,tree' %libomp-run |
6 | // RUN: env OMP_WAIT_POLICY=passive \ |
7 | // RUN: KMP_FORKJOIN_BARRIER_PATTERN='hyper,hyper' %libomp-run |
8 | // RUN: env OMP_WAIT_POLICY=passive \ |
9 | // RUN: KMP_FORKJOIN_BARRIER_PATTERN='dist,dist' %libomp-run |
10 | // |
11 | // LLVM ISSUE 80664: https://github.com/llvm/llvm-project/issues/80664 |
12 | // |
13 | // Distributed barrier + OMP_WAIT_POLICY=passive hangs in library termination |
14 | // Reason: the resume logic in __kmp_free_team() was faulty and, when checking |
15 | // for sleep status, didn't look at correct location for distributed barrier. |
16 | |
17 | #include <stdio.h> |
18 | #include <stdlib.h> |
19 | |
20 | int a = 0; |
21 | |
22 | void test_omp_barrier() { |
23 | #pragma omp parallel |
24 | { |
25 | #pragma omp task |
26 | { |
27 | #pragma omp atomic |
28 | a++; |
29 | } |
30 | } |
31 | } |
32 | |
33 | int main() { |
34 | test_omp_barrier(); |
35 | printf(format: "a = %d\n" , a); |
36 | return EXIT_SUCCESS; |
37 | } |
38 | |