diff options
| author | Alexey Bataev <a.bataev@hotmail.com> | 2018-03-02 17:17:12 +0000 |
|---|---|---|
| committer | Alexey Bataev <a.bataev@hotmail.com> | 2018-03-02 17:17:12 +0000 |
| commit | 852525de25aa24c93a8193e56096d44230c25e7a (patch) | |
| tree | fc5c2027f1830d4964c3ca9bf2a1e465472d440a /clang/test/OpenMP | |
| parent | b9699c009df52abde18f9c95ff54414e99ff9922 (diff) | |
| download | bcm5719-llvm-852525de25aa24c93a8193e56096d44230c25e7a.tar.gz bcm5719-llvm-852525de25aa24c93a8193e56096d44230c25e7a.zip | |
[OPENMP] Treat local variables in CUDA mode as thread local.
In CUDA mode all local variables are actually thread
local|threadprivate, not private, and, thus, they cannot be shared
between threads|lanes.
llvm-svn: 326590
Diffstat (limited to 'clang/test/OpenMP')
| -rw-r--r-- | clang/test/OpenMP/nvptx_target_cuda_mode_messages.cpp | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/clang/test/OpenMP/nvptx_target_cuda_mode_messages.cpp b/clang/test/OpenMP/nvptx_target_cuda_mode_messages.cpp new file mode 100644 index 00000000000..eecc26c6181 --- /dev/null +++ b/clang/test/OpenMP/nvptx_target_cuda_mode_messages.cpp @@ -0,0 +1,108 @@ +// RUN: %clang_cc1 -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc +// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-cuda-mode -fopenmp-host-ir-file-path %t-ppc-host.bc -o - + +template <typename tx, typename ty> +struct TT { + tx X; + ty Y; +}; + +int foo(int n, double *ptr) { + int a = 0; + short aa = 0; + float b[10]; + double c[5][10]; + TT<long long, char> d; + +#pragma omp target firstprivate(a) map(tofrom: b) // expected-note 2 {{defined as threadprivate or thread local}} + { + int c; // expected-note {{defined as threadprivate or thread local}} +#pragma omp parallel shared(a, b, c, aa) // expected-error 3 {{threadprivate or thread local variable cannot be shared}} + b[a] = a; +#pragma omp parallel for + for (int i = 0; i < 10; ++i) // expected-note {{defined as threadprivate or thread local}} +#pragma omp parallel shared(i) // expected-error {{threadprivate or thread local variable cannot be shared}} + ++i; + } + +#pragma omp target map(aa, b, c, d) + { + int e; // expected-note {{defined as threadprivate or thread local}} +#pragma omp parallel private(b, e) // expected-error {{threadprivate or thread local variable cannot be private}} + { + aa += 1; + b[2] = 1.0; + c[1][2] = 1.0; + d.X = 1; + d.Y = 1; + } + } + +#pragma omp target private(ptr) + { + ptr[0]++; + } + + return a; +} + +template <typename tx> +tx ftemplate(int n) { + tx a = 0; + tx b[10]; + +#pragma omp target reduction(+ \ + : a, b) // expected-note {{defined as threadprivate or thread local}} + { + int e; // expected-note {{defined as threadprivate or thread local}} +#pragma omp parallel shared(a, e) // expected-error 2 {{threadprivate or thread local variable cannot be shared}} + a += 1; + b[2] += 1; + } + + return a; +} + +static int fstatic(int n) { + int a = 0; + char aaa = 0; + int b[10]; + +#pragma omp target firstprivate(a, aaa, b) + { + a += 1; + aaa += 1; + b[2] += 1; + } + + return a; +} + +struct S1 { + double a; + + int r1(int n) { + int b = n + 1; + +#pragma omp target firstprivate(b) // expected-note {{defined as threadprivate or thread local}} + { + int c; // expected-note {{defined as threadprivate or thread local}} +#pragma omp parallel shared(b, c) // expected-error 2 {{threadprivate or thread local variable cannot be shared}} + this->a = (double)b + 1.5; + } + + return (int)b; + } +}; + +int bar(int n, double *ptr) { + int a = 0; + a += foo(n, ptr); + S1 S; + a += S.r1(n); + a += fstatic(n); + a += ftemplate<int>(n); // expected-note {{in instantiation of function template specialization 'ftemplate<int>' requested here}} + + return a; +} + |

