19582f096SJoseph Huber // RUN: %libomptarget-compilexx-generic && \
29582f096SJoseph Huber // RUN:   env LIBOMPTARGET_STACK_SIZE=2048 %libomptarget-run-generic
39582f096SJoseph Huber 
49582f096SJoseph Huber // UNSUPPORTED: amdgcn-amd-amdhsa
5ae23be84SJoseph Huber // UNSUPPORTED: amdgcn-amd-amdhsa-oldDriver
6*d5d83663SJoseph Huber // UNSUPPORTED: amdgcn-amd-amdhsa-LTO
7a2dbfb6bSGiorgis Georgakoudis 
8a2dbfb6bSGiorgis Georgakoudis #include <cassert>
9a2dbfb6bSGiorgis Georgakoudis #include <iostream>
10a2dbfb6bSGiorgis Georgakoudis 
work(int * C)11a2dbfb6bSGiorgis Georgakoudis void work(int *C) {
12a2dbfb6bSGiorgis Georgakoudis #pragma omp atomic
13a2dbfb6bSGiorgis Georgakoudis   ++(*C);
14a2dbfb6bSGiorgis Georgakoudis }
15a2dbfb6bSGiorgis Georgakoudis 
use(int * C)16a2dbfb6bSGiorgis Georgakoudis void use(int *C) {
17a2dbfb6bSGiorgis Georgakoudis #pragma omp parallel num_threads(2)
18a2dbfb6bSGiorgis Georgakoudis   work(C);
19a2dbfb6bSGiorgis Georgakoudis }
20a2dbfb6bSGiorgis Georgakoudis 
main()21a2dbfb6bSGiorgis Georgakoudis int main() {
22a2dbfb6bSGiorgis Georgakoudis   int C = 0;
23a2dbfb6bSGiorgis Georgakoudis #pragma omp target map(C)
24a2dbfb6bSGiorgis Georgakoudis   {
25a2dbfb6bSGiorgis Georgakoudis     use(&C);
26a2dbfb6bSGiorgis Georgakoudis #pragma omp parallel num_threads(2)
27a2dbfb6bSGiorgis Georgakoudis     use(&C);
28a2dbfb6bSGiorgis Georgakoudis   }
29a2dbfb6bSGiorgis Georgakoudis 
30a2dbfb6bSGiorgis Georgakoudis   assert(C >= 2 && C <= 6);
31a2dbfb6bSGiorgis Georgakoudis 
32a2dbfb6bSGiorgis Georgakoudis   std::cout << "PASS\n";
33a2dbfb6bSGiorgis Georgakoudis 
34a2dbfb6bSGiorgis Georgakoudis   return 0;
35a2dbfb6bSGiorgis Georgakoudis }
36a2dbfb6bSGiorgis Georgakoudis 
37a2dbfb6bSGiorgis Georgakoudis // CHECK: PASS
38