[clang] 2fb6268 - [OPENMP50]Add support for hint clause in atomic directive.

Alexey Bataev via cfe-commits cfe-commits at lists.llvm.org
Thu Feb 13 10:35:36 PST 2020


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;
+}


        


More information about the cfe-commits mailing list