279 lines · cpp
1// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -ast-print %s -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP502// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping3// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP504// RUN: %clang_cc1 -verify -fopenmp -ast-print %s -Wno-openmp-mapping -DOMP51 | FileCheck %s --check-prefix=CHECK --check-prefix=OMP515// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping -DOMP516// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -verify %s -ast-print -Wno-openmp-mapping -DOMP51 | FileCheck %s --check-prefix=CHECK --check-prefix=OMP517 8// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -ast-print %s -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP509// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping10// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -std=c++11 -include-pch %t -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP5011// RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s -Wno-openmp-mapping -DOMP51 | FileCheck %s --check-prefix=CHECK --check-prefix=OMP5112// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping -DOMP5113// RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -verify %s -ast-print -Wno-openmp-mapping -DOMP51 | FileCheck %s --check-prefix=CHECK --check-prefix=OMP5114// expected-no-diagnostics15 16#ifndef HEADER17#define HEADER18 19typedef void **omp_allocator_handle_t;20extern const omp_allocator_handle_t omp_null_allocator;21extern const omp_allocator_handle_t omp_default_mem_alloc;22extern const omp_allocator_handle_t omp_large_cap_mem_alloc;23extern const omp_allocator_handle_t omp_const_mem_alloc;24extern const omp_allocator_handle_t omp_high_bw_mem_alloc;25extern const omp_allocator_handle_t omp_low_lat_mem_alloc;26extern const omp_allocator_handle_t omp_cgroup_mem_alloc;27extern const omp_allocator_handle_t omp_pteam_mem_alloc;28extern const omp_allocator_handle_t omp_thread_mem_alloc;29 30void foo() {}31 32struct S {33 S(): a(0) {}34 S(int v) : a(v) {}35 int a;36 typedef int type;37};38 39template <typename T>40class S7 : public T {41protected:42 T a;43 S7() : a(0) {}44 45public:46 S7(typename T::type v) : a(v) {47#pragma omp target parallel for private(a) private(this->a) private(T::a)48 for (int k = 0; k < a.a; ++k)49 ++this->a.a;50 }51 S7 &operator=(S7 &s) {52#pragma omp target parallel for private(a) private(this->a)53 for (int k = 0; k < s.a.a; ++k)54 ++s.a.a;55 return *this;56 }57};58 59// CHECK: #pragma omp target parallel for private(this->a) private(this->a) private(T::a){{$}}60// CHECK: #pragma omp target parallel for private(this->a) private(this->a)61// CHECK: #pragma omp target parallel for private(this->a) private(this->a) private(this->S::a)62 63class S8 : public S7<S> {64 S8() {}65 66public:67 S8(int v) : S7<S>(v){68#pragma omp target parallel for private(a) private(this->a) private(S7<S>::a)69 for (int k = 0; k < a.a; ++k)70 ++this->a.a;71 }72 S8 &operator=(S8 &s) {73#pragma omp target parallel for private(a) private(this->a)74 for (int k = 0; k < s.a.a; ++k)75 ++s.a.a;76 return *this;77 }78};79 80// CHECK: #pragma omp target parallel for private(this->a) private(this->a) private(this->S7<S>::a)81// CHECK: #pragma omp target parallel for private(this->a) private(this->a)82 83template <class T, int N>84T tmain(T argc, T *argv) {85 T b = argc, c, d, e, f, h;86 T arr[N][10], arr1[N];87 T i, j;88 T s;89 static T a;90// CHECK: static T a;91 static T g;92#pragma omp threadprivate(g)93#ifdef OMP5194#pragma omp target parallel for schedule(dynamic) default(none) linear(a) allocate(a) order(reproducible:concurrent)95#else96#pragma omp target parallel for schedule(dynamic) default(none) linear(a) allocate(a) order(concurrent)97#endif // OMP5198 // OMP51: #pragma omp target parallel for schedule(dynamic) default(none) linear(a) allocate(a) order(reproducible: concurrent)99 // OMP50: #pragma omp target parallel for schedule(dynamic) default(none) linear(a) allocate(a) order(concurrent)100 for (int i = 0; i < 2; ++i)101 a = 2;102// CHECK-NEXT: for (int i = 0; i < 2; ++i)103// CHECK-NEXT: a = 2;104#pragma omp target parallel for allocate(b) private(argc, b), firstprivate(c, d), lastprivate(d, f) collapse(N) schedule(static, N) ordered(N) if (parallel :argc) num_threads(N) default(shared) shared(e) reduction(+ : h)105 for (int i = 0; i < 2; ++i)106 for (int j = 0; j < 2; ++j)107 for (int j = 0; j < 2; ++j)108 for (int j = 0; j < 2; ++j)109 for (int j = 0; j < 2; ++j)110 for (int i = 0; i < 2; ++i)111 for (int j = 0; j < 2; ++j)112 for (int j = 0; j < 2; ++j)113 for (int j = 0; j < 2; ++j)114 for (int j = 0; j < 2; ++j)115 foo();116 // CHECK-NEXT: #pragma omp target parallel for allocate(b) private(argc,b) firstprivate(c,d) lastprivate(d,f) collapse(N) schedule(static, N) ordered(N) if(parallel: argc) num_threads(N) default(shared) shared(e) reduction(+: h)117 // CHECK-NEXT: for (int i = 0; i < 2; ++i)118 // CHECK-NEXT: for (int j = 0; j < 2; ++j)119 // CHECK-NEXT: for (int j = 0; j < 2; ++j)120 // CHECK-NEXT: for (int j = 0; j < 2; ++j)121 // CHECK-NEXT: for (int j = 0; j < 2; ++j)122 // CHECK-NEXT: for (int i = 0; i < 2; ++i)123 // CHECK-NEXT: for (int j = 0; j < 2; ++j)124 // CHECK-NEXT: for (int j = 0; j < 2; ++j)125 // CHECK-NEXT: for (int j = 0; j < 2; ++j)126 // CHECK-NEXT: for (int j = 0; j < 2; ++j)127 // CHECK-NEXT: foo();128#pragma omp target parallel for default(none), private(argc,b) firstprivate(argv) shared (d) if (parallel:argc > 0) num_threads(N) proc_bind(master) reduction(+:c, arr1[argc]) reduction(max:e, arr[:N][0:10])129 for (int i = 0; i < 2; ++i) {}130// CHECK-NEXT: #pragma omp target parallel for default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(N) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:N][0:10])131 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {132 // CHECK-NEXT: }133#pragma omp target parallel for if (N) num_threads(s) proc_bind(close) reduction(^:e, f, arr[0:N][:argc]) reduction(&& : h)134// CHECK-NEXT: #pragma omp target parallel for if(N) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:N][:argc]) reduction(&&: h)135 for (int i = 0; i < 2; ++i) {}136 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {137 // CHECK-NEXT: }138#pragma omp target parallel for if (target:argc > 0)139// CHECK-NEXT: #pragma omp target parallel for if(target: argc > 0)140 for (int i = 0; i < 2; ++i) {}141 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {142 // CHECK-NEXT: }143#pragma omp target parallel for if (parallel:argc > 0)144// CHECK-NEXT: #pragma omp target parallel for if(parallel: argc > 0)145 for (int i = 0; i < 2; ++i) {}146 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {147 // CHECK-NEXT: }148#pragma omp target parallel for if (N)149// CHECK-NEXT: #pragma omp target parallel for if(N)150 for (int i = 0; i < 2; ++i) {}151 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {152 // CHECK-NEXT: }153#pragma omp target parallel for map(i)154// CHECK-NEXT: #pragma omp target parallel for map(tofrom: i)155 for (int i = 0; i < 2; ++i) {}156 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {157 // CHECK-NEXT: }158#pragma omp target parallel for map(arr1[0:10], i)159// CHECK-NEXT: #pragma omp target parallel for map(tofrom: arr1[0:10],i)160 for (int i = 0; i < 2; ++i) {}161 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {162 // CHECK-NEXT: }163#pragma omp target parallel for map(to: i) map(from: j)164// CHECK-NEXT: #pragma omp target parallel for map(to: i) map(from: j)165 for (int i = 0; i < 2; ++i) {}166 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {167 // CHECK-NEXT: }168#pragma omp target parallel for map(always,alloc: i)169// CHECK-NEXT: #pragma omp target parallel for map(always,alloc: i)170 for (int i = 0; i < 2; ++i) {}171 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {172 // CHECK-NEXT: }173#pragma omp target parallel for nowait174// CHECK-NEXT: #pragma omp target parallel for nowait175 for (int i = 0; i < 2; ++i) {}176 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {177 // CHECK-NEXT: }178#pragma omp target parallel for depend(in : argc, arr[i:argc], arr1[:])179// CHECK-NEXT: #pragma omp target parallel for depend(in : argc,arr[i:argc],arr1[:])180 for (int i = 0; i < 2; ++i) {}181 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {182 // CHECK-NEXT: }183#pragma omp target parallel for defaultmap(tofrom: scalar)184// CHECK-NEXT: #pragma omp target parallel for defaultmap(tofrom: scalar)185 for (int i = 0; i < 2; ++i) {}186 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {187 // CHECK-NEXT: }188 189 return T();190}191 192int main(int argc, char **argv) {193 int b = argc, c, d, e, f, h;194 int arr[5][10], arr1[5];195 int i, j;196 int s;197 static int a;198// CHECK: static int a;199 static float g;200#pragma omp threadprivate(g)201#pragma omp target parallel for schedule(guided, argc) default(none) linear(a) shared(argc)202 // CHECK: #pragma omp target parallel for schedule(guided, argc) default(none) linear(a) shared(argc)203 for (int i = 0; i < 2; ++i)204 a = 2;205// CHECK-NEXT: for (int i = 0; i < 2; ++i)206// CHECK-NEXT: a = 2;207#pragma omp target parallel for private(argc, b), firstprivate(argv, c), lastprivate(d, f) collapse(2) schedule(auto) ordered if (target: argc) num_threads(a) default(shared) shared(e) reduction(+ : h) linear(a:-5)208 for (int i = 0; i < 10; ++i)209 for (int j = 0; j < 10; ++j)210 foo();211 // CHECK-NEXT: #pragma omp target parallel for private(argc,b) firstprivate(argv,c) lastprivate(d,f) collapse(2) schedule(auto) ordered if(target: argc) num_threads(a) default(shared) shared(e) reduction(+: h) linear(a: step(-5))212 // CHECK-NEXT: for (int i = 0; i < 10; ++i)213 // CHECK-NEXT: for (int j = 0; j < 10; ++j)214 // CHECK-NEXT: foo();215#pragma omp target parallel for default(none), private(argc,b) firstprivate(argv) shared (d) if (parallel:argc > 0) num_threads(5) proc_bind(master) reduction(+:c, arr1[argc]) reduction(max:e, arr[:5][0:10])216 for (int i = 0; i < 2; ++i) {}217// CHECK-NEXT: #pragma omp target parallel for default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(5) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:5][0:10])218 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {219 // CHECK-NEXT: }220#pragma omp target parallel for if (5) num_threads(s) proc_bind(close) reduction(^:e, f, arr[0:5][:argc]) reduction(&& : h) allocate(omp_const_mem_alloc: h) uses_allocators(omp_const_mem_alloc)221// CHECK-NEXT: #pragma omp target parallel for if(5) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:5][:argc]) reduction(&&: h) allocate(omp_const_mem_alloc: h) uses_allocators(omp_const_mem_alloc)222 for (int i = 0; i < 2; ++i) {}223 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {224 // CHECK-NEXT: }225#pragma omp target parallel for if (target:argc > 0)226// CHECK-NEXT: #pragma omp target parallel for if(target: argc > 0)227 for (int i = 0; i < 2; ++i) {}228 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {229 // CHECK-NEXT: }230#pragma omp target parallel for if (parallel:argc > 0)231// CHECK-NEXT: #pragma omp target parallel for if(parallel: argc > 0)232 for (int i = 0; i < 2; ++i) {}233 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {234 // CHECK-NEXT: }235#pragma omp target parallel for if (5)236// CHECK-NEXT: #pragma omp target parallel for if(5)237 for (int i = 0; i < 2; ++i) {}238 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {239 // CHECK-NEXT: }240#pragma omp target parallel for map(i)241// CHECK-NEXT: #pragma omp target parallel for map(tofrom: i)242 for (int i = 0; i < 2; ++i) {}243 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {244 // CHECK-NEXT: }245#pragma omp target parallel for map(arr1[0:10], i)246// CHECK-NEXT: #pragma omp target parallel for map(tofrom: arr1[0:10],i)247 for (int i = 0; i < 2; ++i) {}248 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {249 // CHECK-NEXT: }250#pragma omp target parallel for map(to: i) map(from: j)251// CHECK-NEXT: #pragma omp target parallel for map(to: i) map(from: j)252 for (int i = 0; i < 2; ++i) {}253 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {254 // CHECK-NEXT: }255#pragma omp target parallel for map(always,alloc: i)256// CHECK-NEXT: #pragma omp target parallel for map(always,alloc: i)257 for (int i = 0; i < 2; ++i) {}258 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {259 // CHECK-NEXT: }260#pragma omp target parallel for nowait261// CHECK-NEXT: #pragma omp target parallel for nowait262 for (int i = 0; i < 2; ++i) {}263 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {264 // CHECK-NEXT: }265#pragma omp target parallel for depend(in : argc, arr[i:argc], arr1[:])266// CHECK-NEXT: #pragma omp target parallel for depend(in : argc,arr[i:argc],arr1[:])267 for (int i = 0; i < 2; ++i) {}268 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {269 // CHECK-NEXT: }270#pragma omp target parallel for defaultmap(tofrom: scalar) reduction(task, +: argc)271// CHECK-NEXT: #pragma omp target parallel for defaultmap(tofrom: scalar) reduction(task, +: argc)272 for (int i = 0; i < 2; ++i) {}273 // CHECK-NEXT: for (int i = 0; i < 2; ++i) {274 // CHECK-NEXT: }275 return (tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]));276}277 278#endif279