124f836e8SJoachim Protze // RUN: %libomptarget-compilexx-run-and-check-generic
202896967SShilei 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 
702896967SShilei Tian #include <omp.h>
802896967SShilei Tian 
902896967SShilei Tian #include <cassert>
1002896967SShilei Tian #include <iostream>
1102896967SShilei Tian 
main(int argc,char * argv[])1202896967SShilei Tian int main(int argc, char *argv[]) {
1302896967SShilei Tian #pragma omp parallel for
1402896967SShilei Tian   for (int i = 0; i < 16; ++i) {
1502896967SShilei Tian     for (int n = 1; n < (1 << 13); n <<= 1) {
1602896967SShilei Tian       void *p = omp_target_alloc(n * sizeof(int), 0);
1702896967SShilei Tian       omp_target_free(p, 0);
1802896967SShilei Tian     }
1902896967SShilei Tian   }
2002896967SShilei Tian 
2102896967SShilei Tian #pragma omp parallel for
2202896967SShilei Tian   for (int i = 0; i < 16; ++i) {
2302896967SShilei Tian     for (int n = 1; n < (1 << 13); n <<= 1) {
2402896967SShilei Tian       int *p = (int *)omp_target_alloc(n * sizeof(int), 0);
2502896967SShilei Tian #pragma omp target teams distribute parallel for is_device_ptr(p)
2602896967SShilei Tian       for (int j = 0; j < n; ++j) {
2702896967SShilei Tian         p[j] = i;
2802896967SShilei Tian       }
2902896967SShilei Tian       int buffer[n];
3002896967SShilei Tian #pragma omp target teams distribute parallel for is_device_ptr(p)              \
3102896967SShilei Tian     map(from                                                                   \
3202896967SShilei Tian         : buffer)
3302896967SShilei Tian       for (int j = 0; j < n; ++j) {
3402896967SShilei Tian         buffer[j] = p[j];
3502896967SShilei Tian       }
3602896967SShilei Tian       for (int j = 0; j < n; ++j) {
3702896967SShilei Tian         assert(buffer[j] == i);
3802896967SShilei Tian       }
3902896967SShilei Tian       omp_target_free(p, 0);
4002896967SShilei Tian     }
4102896967SShilei Tian   }
4202896967SShilei Tian 
4302896967SShilei Tian   std::cout << "PASS\n";
4402896967SShilei Tian   return 0;
4502896967SShilei Tian }
4602896967SShilei Tian 
4702896967SShilei Tian // CHECK: PASS
48