Author: Alexey Bataev Date: 2020-02-13T13:28:43-05:00 New Revision: 2fb6268854f178609e974002e4781dbdb1074b90
URL: https://github.com/llvm/llvm-project/commit/2fb6268854f178609e974002e4781dbdb1074b90 DIFF: https://github.com/llvm/llvm-project/commit/2fb6268854f178609e974002e4781dbdb1074b90.diff LOG: [OPENMP50]Add support for hint clause in atomic directive. According to OpenMP 5.0, hint clause is alowed to be used in atomic directives. Added: Modified: clang/include/clang/Basic/OpenMPKinds.def clang/lib/Basic/OpenMPKinds.cpp clang/test/OpenMP/atomic_ast_print.cpp clang/test/OpenMP/atomic_messages.c Removed: ################################################################################ diff --git a/clang/include/clang/Basic/OpenMPKinds.def b/clang/include/clang/Basic/OpenMPKinds.def index 13b3438fec2c..dd840b270e63 100644 --- a/clang/include/clang/Basic/OpenMPKinds.def +++ b/clang/include/clang/Basic/OpenMPKinds.def @@ -497,6 +497,7 @@ OPENMP_ATOMIC_CLAUSE(acq_rel) OPENMP_ATOMIC_CLAUSE(acquire) OPENMP_ATOMIC_CLAUSE(release) OPENMP_ATOMIC_CLAUSE(relaxed) +OPENMP_ATOMIC_CLAUSE(hint) // Clauses allowed for OpenMP directive 'target'. OPENMP_TARGET_CLAUSE(if) diff --git a/clang/lib/Basic/OpenMPKinds.cpp b/clang/lib/Basic/OpenMPKinds.cpp index f13364e5378b..70817f8e464a 100644 --- a/clang/lib/Basic/OpenMPKinds.cpp +++ b/clang/lib/Basic/OpenMPKinds.cpp @@ -599,8 +599,9 @@ bool clang::isAllowedClauseForDirective(OpenMPDirectiveKind DKind, } break; case OMPD_atomic: - if (OpenMPVersion < 50 && (CKind == OMPC_acq_rel || CKind == OMPC_acquire || - CKind == OMPC_release || CKind == OMPC_relaxed)) + if (OpenMPVersion < 50 && + (CKind == OMPC_acq_rel || CKind == OMPC_acquire || + CKind == OMPC_release || CKind == OMPC_relaxed || CKind == OMPC_hint)) return false; switch (CKind) { #define OPENMP_ATOMIC_CLAUSE(Name) \ diff --git a/clang/test/OpenMP/atomic_ast_print.cpp b/clang/test/OpenMP/atomic_ast_print.cpp index 5d8e92c14765..1b55c56ad17f 100644 --- a/clang/test/OpenMP/atomic_ast_print.cpp +++ b/clang/test/OpenMP/atomic_ast_print.cpp @@ -104,6 +104,21 @@ T foo(T argc) { a = b; b++; } +#pragma omp atomic hint(6) + a++; +#pragma omp atomic read hint(6) + a = argc; +#pragma omp atomic hint(6) write + a = argc + argc; +#pragma omp atomic update hint(6) + a = a + argc; +#pragma omp atomic hint(6) capture + a = b++; +#pragma omp atomic capture hint(6) + { + a = b; + b++; + } return T(); } @@ -198,6 +213,21 @@ T foo(T argc) { // CHECK-NEXT: a = b; // CHECK-NEXT: b++; // CHECK-NEXT: } +// CHECK-NEXT: #pragma omp atomic hint(6) +// CHECK-NEXT: a++; +// CHECK-NEXT: #pragma omp atomic read hint(6) +// CHECK-NEXT: a = argc; +// CHECK-NEXT: #pragma omp atomic hint(6) write +// CHECK-NEXT: a = argc + argc; +// CHECK-NEXT: #pragma omp atomic update hint(6) +// CHECK-NEXT: a = a + argc; +// CHECK-NEXT: #pragma omp atomic hint(6) capture +// CHECK-NEXT: a = b++; +// CHECK-NEXT: #pragma omp atomic capture hint(6) +// CHECK-NEXT: { +// CHECK-NEXT: a = b; +// CHECK-NEXT: b++; +// CHECK-NEXT: } // CHECK: int a = int(); // CHECK-NEXT: #pragma omp atomic // CHECK-NEXT: a++; @@ -289,6 +319,21 @@ T foo(T argc) { // CHECK-NEXT: a = b; // CHECK-NEXT: b++; // CHECK-NEXT: } +// CHECK-NEXT: #pragma omp atomic hint(6) +// CHECK-NEXT: a++; +// CHECK-NEXT: #pragma omp atomic read hint(6) +// CHECK-NEXT: a = argc; +// CHECK-NEXT: #pragma omp atomic hint(6) write +// CHECK-NEXT: a = argc + argc; +// CHECK-NEXT: #pragma omp atomic update hint(6) +// CHECK-NEXT: a = a + argc; +// CHECK-NEXT: #pragma omp atomic hint(6) capture +// CHECK-NEXT: a = b++; +// CHECK-NEXT: #pragma omp atomic capture hint(6) +// CHECK-NEXT: { +// CHECK-NEXT: a = b; +// CHECK-NEXT: b++; +// CHECK-NEXT: } int main(int argc, char **argv) { int b = 0; @@ -384,6 +429,21 @@ int main(int argc, char **argv) { a = b; b++; } +#pragma omp atomic hint(6) + a++; +#pragma omp atomic read hint(6) + a = argc; +#pragma omp atomic hint(6) write + a = argc + argc; +#pragma omp atomic update hint(6) + a = a + argc; +#pragma omp atomic hint(6) capture + a = b++; +#pragma omp atomic capture hint(6) + { + a = b; + b++; + } // CHECK-NEXT: #pragma omp atomic // CHECK-NEXT: a++; // CHECK-NEXT: #pragma omp atomic read @@ -474,6 +534,21 @@ int main(int argc, char **argv) { // CHECK-NEXT: a = b; // CHECK-NEXT: b++; // CHECK-NEXT: } + // CHECK-NEXT: #pragma omp atomic hint(6) + // CHECK-NEXT: a++; + // CHECK-NEXT: #pragma omp atomic read hint(6) + // CHECK-NEXT: a = argc; + // CHECK-NEXT: #pragma omp atomic hint(6) write + // CHECK-NEXT: a = argc + argc; + // CHECK-NEXT: #pragma omp atomic update hint(6) + // CHECK-NEXT: a = a + argc; + // CHECK-NEXT: #pragma omp atomic hint(6) capture + // CHECK-NEXT: a = b++; + // CHECK-NEXT: #pragma omp atomic capture hint(6) + // CHECK-NEXT: { + // CHECK-NEXT: a = b; + // CHECK-NEXT: b++; + // CHECK-NEXT: } return foo(a); } diff --git a/clang/test/OpenMP/atomic_messages.c b/clang/test/OpenMP/atomic_messages.c index abc703d578d2..7a2150f9416b 100644 --- a/clang/test/OpenMP/atomic_messages.c +++ b/clang/test/OpenMP/atomic_messages.c @@ -1,6 +1,8 @@ -// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s -Wuninitialized +// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -fopenmp-version=45 -ferror-limit 100 %s -Wuninitialized +// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -fopenmp-version=50 -ferror-limit 100 %s -Wuninitialized -// RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s -Wuninitialized +// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -fopenmp-version=45 -ferror-limit 100 %s -Wuninitialized +// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -fopenmp-version=50 -ferror-limit 100 %s -Wuninitialized void xxx(int argc) { int x; // expected-note {{initialize the variable 'x' to silence this warning}} @@ -377,3 +379,18 @@ int captureint() { return 0; } +void hint() { + int a = 0; +#pragma omp atomic hint // omp45-error {{unexpected OpenMP clause 'hint' in directive '#pragma omp atomic'}} expected-error {{expected '(' after 'hint'}} + a += 1; +#pragma omp atomic hint( // omp45-error {{unexpected OpenMP clause 'hint' in directive '#pragma omp atomic'}} expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + a += 1; +#pragma omp atomic hint(+ // omp45-error {{unexpected OpenMP clause 'hint' in directive '#pragma omp atomic'}} expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} + a += 1; +#pragma omp atomic hint(a // omp45-error {{unexpected OpenMP clause 'hint' in directive '#pragma omp atomic'}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expression is not an integer constant expression}} + a += 1; +#pragma omp atomic hint(a) // omp45-error {{unexpected OpenMP clause 'hint' in directive '#pragma omp atomic'}} omp50-error {{expression is not an integer constant expression}} + a += 1; +#pragma omp atomic hint(1) hint(1) // omp45-error 2 {{unexpected OpenMP clause 'hint' in directive '#pragma omp atomic'}} expected-error {{directive '#pragma omp atomic' cannot contain more than one 'hint' clause}} + a += 1; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits