[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