124f836e8SJoachim Protze // RUN: %libomptarget-compilexx-run-and-check-generic
2f5eebc25SShilei Tian 
3ad0f6e1dSJon Chesterfield // UNSUPPORTED: x86_64-pc-linux-gnu
4ae23be84SJoseph Huber // UNSUPPORTED: x86_64-pc-linux-gnu-oldDriver
5*d5d83663SJoseph Huber // UNSUPPORTED: x86_64-pc-linux-gnu-LTO
6ad0f6e1dSJon Chesterfield 
7f5eebc25SShilei Tian #include <cassert>
8f5eebc25SShilei Tian #include <iostream>
9f5eebc25SShilei Tian 
main(int argc,char * argv[])10f5eebc25SShilei Tian int main(int argc, char *argv[]) {
11f5eebc25SShilei Tian   constexpr const int num_threads = 64, N = 128;
12f5eebc25SShilei Tian   int array[num_threads] = {0};
13f5eebc25SShilei Tian 
14f5eebc25SShilei Tian #pragma omp parallel for
15f5eebc25SShilei Tian   for (int i = 0; i < num_threads; ++i) {
16f5eebc25SShilei Tian     int tmp[N];
17f5eebc25SShilei Tian 
18f5eebc25SShilei Tian     for (int j = 0; j < N; ++j) {
19f5eebc25SShilei Tian       tmp[j] = i;
20f5eebc25SShilei Tian     }
21f5eebc25SShilei Tian 
22f5eebc25SShilei Tian #pragma omp target teams distribute parallel for map(tofrom : tmp)
23f5eebc25SShilei Tian     for (int j = 0; j < N; ++j) {
24f5eebc25SShilei Tian       tmp[j] += j;
25f5eebc25SShilei Tian     }
26f5eebc25SShilei Tian 
27f5eebc25SShilei Tian     for (int j = 0; j < N; ++j) {
28f5eebc25SShilei Tian       array[i] += tmp[j];
29f5eebc25SShilei Tian     }
30f5eebc25SShilei Tian   }
31f5eebc25SShilei Tian 
32f5eebc25SShilei Tian   // Verify
33f5eebc25SShilei Tian   for (int i = 0; i < num_threads; ++i) {
34f5eebc25SShilei Tian     const int ref = (0 + N - 1) * N / 2 + i * N;
35f5eebc25SShilei Tian     assert(array[i] == ref);
36f5eebc25SShilei Tian   }
37f5eebc25SShilei Tian 
38f5eebc25SShilei Tian   std::cout << "PASS\n";
39f5eebc25SShilei Tian 
40f5eebc25SShilei Tian   return 0;
41f5eebc25SShilei Tian }
42f5eebc25SShilei Tian 
43f5eebc25SShilei Tian // CHECK: PASS
44