https://gcc.gnu.org/g:9788a1e24822226b55dd1ab521e34bfaf9f4974d

commit r16-1119-g9788a1e24822226b55dd1ab521e34bfaf9f4974d
Author: Sandra Loosemore <sloosem...@baylibre.com>
Date:   Wed Jun 4 04:03:03 2025 +0000

    OpenMP: Fix regressions in metadirective-target-device-2.c [PR120518]
    
    My previous patch that added a CLEANUP_POINT_EXPR around the device_num
    selector expression in the C++ front end broke the testcase
    c-c++-common/gomp/metadirective-target-device-2.c on offload targets.
    It confused the code in omp_device_num_check that tries to bypass error
    checking and do early resolution when the expression is a call to one
    of the OpenMP library functions.  The solution is to make that code smart
    enough to look inside a CLEANUP_POINT_EXPR.
    
    gcc/ChangeLog
            PR c++/120518
            * omp-general.cc (omp_device_num_check): Look inside a
            CLEANUP_POINT_EXPR when trying to optimize special cases.

Diff:
---
 gcc/omp-general.cc | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/gcc/omp-general.cc b/gcc/omp-general.cc
index 0b7c3b9d3181..c799b8936f99 100644
--- a/gcc/omp-general.cc
+++ b/gcc/omp-general.cc
@@ -2659,10 +2659,16 @@ omp_selector_is_dynamic (tree ctx)
 static tree
 omp_device_num_check (tree *device_num, bool *is_host)
 {
+  /* C++ may wrap the device_num expr in a CLEANUP_POINT_EXPR; we want
+     to look inside of it for the special cases.  */
+  tree t = *device_num;
+  if (TREE_CODE (t) == CLEANUP_POINT_EXPR)
+    t = TREE_OPERAND (t, 0);
+
   /* First check for some constant values we can treat specially.  */
-  if (tree_fits_shwi_p (*device_num))
+  if (tree_fits_shwi_p (t))
     {
-      HOST_WIDE_INT num = tree_to_shwi (*device_num);
+      HOST_WIDE_INT num = tree_to_shwi (t);
       if (num < -1)
        return integer_zero_node;
       /* Initial device?  */
@@ -2681,9 +2687,9 @@ omp_device_num_check (tree *device_num, bool *is_host)
 
   /* Also test for direct calls to OpenMP routines that return valid
      device numbers.  */
-  if (TREE_CODE (*device_num) == CALL_EXPR)
+  if (TREE_CODE (t) == CALL_EXPR)
     {
-      tree fndecl = get_callee_fndecl (*device_num);
+      tree fndecl = get_callee_fndecl (t);
       if (fndecl && omp_runtime_api_call (fndecl))
        {
          const char *fnname = IDENTIFIER_POINTER (DECL_NAME (fndecl));

Reply via email to