-
Notifications
You must be signed in to change notification settings - Fork 15.3k
[OpenMP][Clang] Parsing/Sema support for need_device_ptr(fb_nullify/fb_preserve).
#168905
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
…in need_device_ptr modifier
This comment was marked as outdated.
This comment was marked as outdated.
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
|
@llvm/pr-subscribers-clang Author: Zahira Ammarguellat (zahiraam) ChangesThis patch adds parsing, semantic handling, and diagnostics for the Full diff: https://github.com/llvm/llvm-project/pull/168905.diff 7 Files Affected:
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
index aa0ccb0c05101..63b77858481f5 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -1724,6 +1724,10 @@ def warn_omp_invalid_attribute_for_ompx_attributes : Warning<"'ompx_attribute' c
"%0 is ignored">, InGroup<OpenMPExtensions>;
def err_omp_duplicate_modifier : Error<"duplicate modifier '%0' in '%1' clause">;
def err_omp_expected_modifier : Error<"expected modifier in '%0' clause">;
+def err_omp_unknown_need_device_ptr_modifier
+ : Error<
+ "invalid argument for 'need_device_ptr' modifier in 'adjust_args' clause. "
+ "Expected 'fp_nullify' or 'fb_preserve'">;
// Pragma loop support.
def err_pragma_loop_missing_argument : Error<
diff --git a/clang/include/clang/Basic/OpenMPKinds.def b/clang/include/clang/Basic/OpenMPKinds.def
index 328a0747a82a8..23f4df7ec4215 100644
--- a/clang/include/clang/Basic/OpenMPKinds.def
+++ b/clang/include/clang/Basic/OpenMPKinds.def
@@ -101,6 +101,9 @@
#ifndef OPENMP_THREADSET_KIND
#define OPENMP_THREADSET_KIND(Name)
#endif
+#ifndef OPENMP_NEED_DEVICE_PTR_MODIFIER
+#define OPENMP_NEED_DEVICE_PTR_MODIFIER(Name)
+#endif
// Static attributes for 'schedule' clause.
OPENMP_SCHEDULE_KIND(static)
@@ -261,6 +264,10 @@ OPENMP_DOACROSS_MODIFIER(source_omp_cur_iteration)
OPENMP_THREADSET_KIND(omp_pool)
OPENMP_THREADSET_KIND(omp_team)
+// OpenMP 6.1 modifiers for 'adjust_args' clause.
+OPENMP_NEED_DEVICE_PTR_MODIFIER(fb_nullify)
+OPENMP_NEED_DEVICE_PTR_MODIFIER(fb_preserve)
+
#undef OPENMP_NUMTASKS_MODIFIER
#undef OPENMP_NUMTHREADS_MODIFIER
#undef OPENMP_GRAINSIZE_MODIFIER
@@ -291,3 +298,4 @@ OPENMP_THREADSET_KIND(omp_team)
#undef OPENMP_DOACROSS_MODIFIER
#undef OPENMP_ALLOCATE_MODIFIER
#undef OPENMP_THREADSET_KIND
+#undef OPENMP_NEED_DEVICE_PTR_MODIFIER
diff --git a/clang/include/clang/Basic/OpenMPKinds.h b/clang/include/clang/Basic/OpenMPKinds.h
index c9ddbcd6d46c1..b9905b250ebc2 100644
--- a/clang/include/clang/Basic/OpenMPKinds.h
+++ b/clang/include/clang/Basic/OpenMPKinds.h
@@ -211,6 +211,13 @@ enum OpenMPAdjustArgsOpKind {
OMPC_ADJUST_ARGS_unknown,
};
+/// OpenMP 6.1 need_device modifier
+enum OpenMPNeedDevicePtrModifier {
+#define OPENMP_NEED_DEVICE_PTR_MODIFIER(Name) OMPC_NEED_DEVICE_PTR_##Name,
+#include "clang/Basic/OpenMPKinds.def"
+ OMPC_NEED_DEVICE_PTR_unknown,
+};
+
/// OpenMP bindings for the 'bind' clause.
enum OpenMPBindClauseKind {
#define OPENMP_BIND_KIND(Name) OMPC_BIND_##Name,
diff --git a/clang/include/clang/Sema/SemaOpenMP.h b/clang/include/clang/Sema/SemaOpenMP.h
index ba12b403d9b9a..d277636ad77ea 100644
--- a/clang/include/clang/Sema/SemaOpenMP.h
+++ b/clang/include/clang/Sema/SemaOpenMP.h
@@ -1174,6 +1174,8 @@ class SemaOpenMP : public SemaBase {
int ExtraModifier = -1; ///< Additional modifier for linear, map, depend or
///< lastprivate clause.
int OriginalSharingModifier = 0; // Default is shared
+ int NeedDevicePtrModifier = 0;
+ SourceLocation NeedDevicePtrModifierLoc;
SmallVector<OpenMPMapModifierKind, NumberOfOMPMapClauseModifiers>
MapTypeModifiers;
SmallVector<SourceLocation, NumberOfOMPMapClauseModifiers>
diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp
index 31bc941e6a015..04fad70b24123 100644
--- a/clang/lib/Parse/ParseOpenMP.cpp
+++ b/clang/lib/Parse/ParseOpenMP.cpp
@@ -4932,6 +4932,37 @@ bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind,
ConsumeToken();
if (Tok.is(tok::colon))
Data.ColonLoc = Tok.getLocation();
+ if (getLangOpts().OpenMP >= 61) {
+ // Handle the optional fallback argument for the need_device_ptr
+ // modifier.
+ if (Tok.is(tok::l_paren)) {
+ BalancedDelimiterTracker T(*this, tok::l_paren);
+ T.consumeOpen();
+ if (Tok.is(tok::identifier)) {
+ std::string Modifier = PP.getSpelling(Tok);
+ if (Modifier == "fb_nullify" || Modifier == "fb_preserve") {
+ Data.NeedDevicePtrModifier =
+ Modifier == "fb_nullify" ? OMPC_NEED_DEVICE_PTR_fb_nullify
+ : OMPC_NEED_DEVICE_PTR_fb_preserve;
+ } else {
+ Diag(Tok, diag::err_omp_unknown_need_device_ptr_modifier);
+ SkipUntil(tok::r_paren, tok::annot_pragma_openmp_end,
+ StopBeforeMatch);
+ return false;
+ }
+ ConsumeToken();
+ if (Tok.is(tok::r_paren)) {
+ Data.NeedDevicePtrModifierLoc = Tok.getLocation();
+ ConsumeAnyToken();
+ } else {
+ Diag(Tok, diag::err_expected) << tok::r_paren;
+ SkipUntil(tok::r_paren, tok::annot_pragma_openmp_end,
+ StopBeforeMatch);
+ return false;
+ }
+ }
+ }
+ }
ExpectAndConsume(tok::colon, diag::warn_pragma_expected_colon,
"adjust-op");
}
diff --git a/clang/test/OpenMP/need_device_ptr_modifier_ast_print.cpp b/clang/test/OpenMP/need_device_ptr_modifier_ast_print.cpp
new file mode 100644
index 0000000000000..ae8c5550ed6ab
--- /dev/null
+++ b/clang/test/OpenMP/need_device_ptr_modifier_ast_print.cpp
@@ -0,0 +1,24 @@
+// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=61 -ast-print %s \
+// RUN: | FileCheck %s
+
+// expected-no-diagnostics
+
+void __attribute__((noinline)) device_impl(int *xp, int *&xpref, int n) {}
+
+#pragma omp declare variant(device_impl) \
+ adjust_args(need_device_ptr(fb_nullify) : xp, xpref)
+void __attribute__((noinline)) host_entry_a(int *xp, int *&xpref, int n) {}
+
+#pragma omp declare variant(device_impl) \
+ adjust_args(need_device_ptr(fb_preserve) : xp, xpref)
+void __attribute__((noinline)) host_entry_b(int *xp, int *&xpref, int n) {}
+
+// CHECK-LABEL: int main()
+int main() {
+ int x;
+ int *xp = &x;
+
+ host_entry_a(xp, xp, 1);
+ host_entry_b(xp, xp, 1);
+ return 0;
+}
diff --git a/clang/test/OpenMP/need_device_ptr_modifier_messages.cpp b/clang/test/OpenMP/need_device_ptr_modifier_messages.cpp
new file mode 100644
index 0000000000000..0ac1a7e95b81f
--- /dev/null
+++ b/clang/test/OpenMP/need_device_ptr_modifier_messages.cpp
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 -verify=omp61 -fopenmp -fopenmp-version=61 %s
+
+void __attribute__((noinline)) device_impl(int *xp, int *&xpref, int n) {}
+
+#pragma omp declare variant(device_impl) \
+ adjust_args(need_device_ptr(foo) : xp, xpref) // omp61-error{{invalid argument for 'need_device_ptr' modifier in 'adjust_args' clause. Expected 'fp_nullify' or 'fb_preserve'}} // omp61-error{{expected 'match', 'adjust_args', or 'append_args' clause on 'omp declare variant' directive}}
+void __attribute__((noinline)) host_entry_a(int *xp, int *&xpref, int n) {}
+
+#pragma omp declare variant(device_impl) \
+ adjust_args(need_device_ptr(fb_nullify) : xp, xpref)
+void __attribute__((noinline)) host_entry_b(int *xp, int *&xpref, int n) {}
+
+#pragma omp declare variant(device_impl) \
+ adjust_args(need_device_ptr(fb_preserve) : xp, xpref)
+void __attribute__((noinline)) host_entry_c(int *xp, int *&xpref, int n) {}
+
+
+int main() {
+ int x;
+ int *xp = &x;
+
+ host_entry_a(xp, xp, 1);
+ host_entry_b(xp, xp, 1);
+ host_entry_c(xp, xp, 1);
+ return 0;
+}
|
abhinavgaba
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, Zahira. One minor comment, otherwise looks good to me.
need_device_ptr(fb_nullify/fb_preserve).
|
Please remember to update OpenMPSupport.rst and ReleaseNotes.rst in a follow-up PR. |
Adding documentation following the merge of #168905.
Adding documentation following the merge of llvm/llvm-project#168905.
Adding documentation following the merge of llvm#168905.
Adding documentation following the merge of llvm#168905.
This patch adds parsing, semantic handling, and diagnostics for the
OpenMP 6.1 fb_nullifyandfb_preservefallback modifiers used with theneed_device_ptrmap modifier.