From: Alexey Bataev Date: Wed, 5 Mar 2014 07:21:14 +0000 (+0000) Subject: [OPENMP] allow clause 'private' on directive 'omp simd' X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2c9a039c9bdfb19c769cd0224e30fc66e5ad49d4;p=clang [OPENMP] allow clause 'private' on directive 'omp simd' git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@202944 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/OpenMPKinds.def b/include/clang/Basic/OpenMPKinds.def index 956a886e8a..41b77ef843 100644 --- a/include/clang/Basic/OpenMPKinds.def +++ b/include/clang/Basic/OpenMPKinds.def @@ -48,7 +48,8 @@ OPENMP_PARALLEL_CLAUSE(private) OPENMP_PARALLEL_CLAUSE(firstprivate) OPENMP_PARALLEL_CLAUSE(shared) -// FIXME: clauses allowed for directive 'omp simd'. +// FIXME: more clauses allowed for directive 'omp simd'. +OPENMP_SIMD_CLAUSE(private) // Static attributes for 'default' clause. OPENMP_DEFAULT_KIND(none) diff --git a/test/OpenMP/simd_ast_print.cpp b/test/OpenMP/simd_ast_print.cpp index e51d5165e8..7cdf131b08 100644 --- a/test/OpenMP/simd_ast_print.cpp +++ b/test/OpenMP/simd_ast_print.cpp @@ -7,17 +7,19 @@ #define HEADER void foo() {} - +int g_ind = 1; template T reduct(T* arr, N num) { N i; N ind; + N myind; T sum = (T)0; // CHECK: T sum = (T)0; -#pragma omp simd -// CHECK-NEXT: #pragma omp simd +#pragma omp simd private(myind, g_ind) +// CHECK-NEXT: #pragma omp simd private(myind,g_ind) for (i = 0; i < num; ++i) { - T cur = arr[ind]; - ++ind; + myind = ind; + T cur = arr[myind]; + ind += g_ind; sum += cur; } } @@ -28,11 +30,14 @@ template struct S { {} T result(T *v) const { T res; + T val; // CHECK: T res; -#pragma omp simd -// CHECK-NEXT: #pragma omp simd +// CHECK: T val; +#pragma omp simd private(val) +// CHECK-NEXT: #pragma omp simd private(val) for (T i = 7; i < m_a; ++i) { - res = v[i-7] + m_a; + val = v[i-7] + m_a; + res = val; } return res; } @@ -51,10 +56,10 @@ int main (int argc, char **argv) { for (int i=0; i < 2; ++i)*a=2; // CHECK-NEXT: for (int i = 0; i < 2; ++i) // CHECK-NEXT: *a = 2; -#pragma omp simd +#pragma omp simd private(argc, b) for (int i = 0; i < 10; ++i) for (int j = 0; j < 10; ++j) {foo(); k1 += 8; k2 += 8;} -// CHECK-NEXT: #pragma omp simd +// CHECK-NEXT: #pragma omp simd private(argc,b) // CHECK-NEXT: for (int i = 0; i < 10; ++i) // CHECK-NEXT: for (int j = 0; j < 10; ++j) { // CHECK-NEXT: foo(); diff --git a/test/OpenMP/simd_misc_messages.c b/test/OpenMP/simd_misc_messages.c index aabcb02aef..90a7bb441e 100644 --- a/test/OpenMP/simd_misc_messages.c +++ b/test/OpenMP/simd_misc_messages.c @@ -59,6 +59,7 @@ void test_invalid_clause() void test_non_identifiers() { int i, x; + // expected-warning@+1 {{extra tokens at the end of '#pragma omp simd' are ignored}} #pragma omp simd; for (i = 0; i < 16; ++i) ; @@ -66,8 +67,57 @@ void test_non_identifiers() // expected-warning@+1 {{extra tokens at the end of '#pragma omp simd' are ignored}} #pragma omp simd firstprivate(x); for (i = 0; i < 16; ++i) ; + + // expected-warning@+1 {{extra tokens at the end of '#pragma omp simd' are ignored}} + #pragma omp simd private(x); + for (i = 0; i < 16; ++i) ; + // expected-warning@+1 {{extra tokens at the end of '#pragma omp simd' are ignored}} #pragma omp simd , private(x); for (i = 0; i < 16; ++i) ; } +void test_private() +{ + int i; + // expected-error@+2 {{expected expression}} + // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} + #pragma omp simd private( + for (i = 0; i < 16; ++i) ; + // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} + // expected-error@+1 2 {{expected expression}} + #pragma omp simd private(, + for (i = 0; i < 16; ++i) ; + // expected-error@+1 2 {{expected expression}} + #pragma omp simd private(,) + for (i = 0; i < 16; ++i) ; + // expected-error@+1 {{expected expression}} + #pragma omp simd private() + for (i = 0; i < 16; ++i) ; + // expected-error@+1 {{expected expression}} + #pragma omp simd private(int) + for (i = 0; i < 16; ++i) ; + // expected-error@+1 {{expected variable name}} + #pragma omp simd private(0) + for (i = 0; i < 16; ++i) ; + + int x, y, z; + #pragma omp simd private(x) + for (i = 0; i < 16; ++i) ; + #pragma omp simd private(x, y) + for (i = 0; i < 16; ++i) ; + #pragma omp simd private(x, y, z) + for (i = 0; i < 16; ++i) { + x = y * i + z; + } +} + +void test_firstprivate() +{ + int i; + // expected-error@+3 {{expected ')'}} expected-note@+3 {{to match this '('}} + // expected-error@+2 {{unexpected OpenMP clause 'firstprivate' in directive '#pragma omp simd'}} + // expected-error@+1 {{expected expression}} + #pragma omp simd firstprivate( + for (i = 0; i < 16; ++i) ; +}