Skip to content

Conversation

@zahiraam
Copy link
Contributor

@zahiraam zahiraam commented Nov 20, 2025

This patch adds parsing, semantic handling, and diagnostics for the OpenMP 6.1 fb_nullify and fb_preserve fallback modifiers used with the need_device_ptr map modifier.

@zahiraam zahiraam changed the title [OpenMP][Clang] Add support for OpenMP6.0 fb_nullify and fb_preserve … [OpenMP][Clang] Add support for OMP6.0 fb_nullify and fb_preserve in need_device_ptr modifier Nov 20, 2025
@github-actions

This comment was marked as outdated.

@abhinavgaba abhinavgaba changed the title [OpenMP][Clang] Add support for OMP6.0 fb_nullify and fb_preserve in need_device_ptr modifier [OpenMP][Clang] Add support for OMP6.1 fb_nullify and fb_preserve in need_device_ptr modifier Nov 20, 2025
@github-actions
Copy link

github-actions bot commented Nov 21, 2025

✅ With the latest revision this PR passed the C/C++ code formatter.

@zahiraam zahiraam changed the title [OpenMP][Clang] Add support for OMP6.1 fb_nullify and fb_preserve in need_device_ptr modifier [OpenMP][Clang] Add support for fb_nullify/fb_preserve fallback modifiers for need_device_ptr, Nov 24, 2025
@zahiraam zahiraam changed the title [OpenMP][Clang] Add support for fb_nullify/fb_preserve fallback modifiers for need_device_ptr, [OpenMP][Clang] Add support for fb_nullify/fb_preserve fallback modifiers for need_device_ptr. Nov 24, 2025
@zahiraam zahiraam marked this pull request as ready for review November 24, 2025 13:09
@llvmbot llvmbot added clang Clang issues not falling into any other category clang:frontend Language frontend issues, e.g. anything involving "Sema" clang:openmp OpenMP related changes to Clang labels Nov 24, 2025
@llvmbot
Copy link
Member

llvmbot commented Nov 24, 2025

@llvm/pr-subscribers-clang

Author: Zahira Ammarguellat (zahiraam)

Changes

This patch adds parsing, semantic handling, and diagnostics for the OpenMP 6.1 fb_nullify and fb_preserve fallback modifiers used with the need_device_ptr map modifier.


Full diff: https://github.com/llvm/llvm-project/pull/168905.diff

7 Files Affected:

  • (modified) clang/include/clang/Basic/DiagnosticParseKinds.td (+4)
  • (modified) clang/include/clang/Basic/OpenMPKinds.def (+8)
  • (modified) clang/include/clang/Basic/OpenMPKinds.h (+7)
  • (modified) clang/include/clang/Sema/SemaOpenMP.h (+2)
  • (modified) clang/lib/Parse/ParseOpenMP.cpp (+31)
  • (added) clang/test/OpenMP/need_device_ptr_modifier_ast_print.cpp (+24)
  • (added) clang/test/OpenMP/need_device_ptr_modifier_messages.cpp (+26)
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;
+}

Copy link
Contributor

@abhinavgaba abhinavgaba left a 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.

@abhinavgaba abhinavgaba changed the title [OpenMP][Clang] Add support for fb_nullify/fb_preserve fallback modifiers for need_device_ptr. [OpenMP][Clang] Support fb_nullify/fb_preserve arguments for need_device_ptr modifier. Nov 24, 2025
@abhinavgaba abhinavgaba changed the title [OpenMP][Clang] Support fb_nullify/fb_preserve arguments for need_device_ptr modifier. [OpenMP][Clang] Parsing/Sema support for need_device_ptr(fb_nullify/fb_preserve). Nov 24, 2025
@zahiraam zahiraam merged commit 2d78b14 into llvm:main Nov 25, 2025
10 checks passed
@abhinavgaba
Copy link
Contributor

Please remember to update OpenMPSupport.rst and ReleaseNotes.rst in a follow-up PR.

zahiraam added a commit that referenced this pull request Nov 26, 2025
Adding documentation following the merge of
#168905.
llvm-sync bot pushed a commit to arm/arm-toolchain that referenced this pull request Nov 26, 2025
tanji-dg pushed a commit to tanji-dg/llvm-project that referenced this pull request Nov 27, 2025
Adding documentation following the merge of
llvm#168905.
GeneraluseAI pushed a commit to GeneraluseAI/llvm-project that referenced this pull request Nov 27, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

clang:frontend Language frontend issues, e.g. anything involving "Sema" clang:openmp OpenMP related changes to Clang clang Clang issues not falling into any other category

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants