Sorry for the delay to fixlibgomp.fortran/reverse-offload-6.f90 It turned out to be a simple
combination of copy-and-paste and missing that one condition should be
the reverse of the other - plus too many other urgent things which
delayed looking at this. - And, obviously, for some reasons missing that
the test case started failing before doing the commit. Hence: Caused by
my commit: r17-2404-g2468c79741f97c Fixed by my commit:
r17-2451-ge2e54655d9d655 Tobias
commit e2e54655d9d655bdef42a2c9eadb81dfdf88e1c7
Author: Tobias Burnus <[email protected]>
Date: Thu Jul 16 13:23:15 2026 +0200
OpenMP: Fix implicit declare target - aka fix libgomp.fortran/reverse-offload-6.f90
This fixes a bug I introduced in commit r17-2404-g2468c79741f97c,
OpenMP: Handle 'device_type(host)' on 'target'
For code inside a target region with either 'device(ancestor:1)' or
with 'device_type(host)' no device code should be generated. That's
handled by both omp_discover_declare_target_tgt_fn_r and by
omp_discover_declare_target_fn_r.
While for the latter, walk_tree_without_duplicates is called when
the condition is true, the former sets '*walk_subtrees = 0'.
Looking too similar, r17-2404 ended up using the same condition for
both. - The solution is to inverse the current condition for
omp_discover_declare_target_tgt_fn_r.
Testcase: The already existing and since r17-2404 failing
test libgomp.fortran/reverse-offload-6.f90.
gcc/ChangeLog:
* omp-offload.cc (omp_discover_declare_target_tgt_fn_r): Fix
the condition for anchestor + nohost handling.
---
gcc/omp-offload.cc | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/gcc/omp-offload.cc b/gcc/omp-offload.cc
index bbe13154d8f..3c37956a28c 100644
--- a/gcc/omp-offload.cc
+++ b/gcc/omp-offload.cc
@@ -273,9 +273,9 @@ omp_discover_declare_target_tgt_fn_r (tree *tp, int *walk_subtrees, void *data)
{
tree c = omp_find_clause (OMP_CLAUSES (*tp), OMP_CLAUSE_DEVICE);
tree c2 = omp_find_clause (OMP_CLAUSES (*tp), OMP_CLAUSE_DEVICE_TYPE);
- if ((!c || !OMP_CLAUSE_DEVICE_ANCESTOR (c))
- && (!c2 || (OMP_CLAUSE_DEVICE_TYPE_KIND (c2)
- != OMP_CLAUSE_DEVICE_TYPE_HOST)))
+ if ((c && OMP_CLAUSE_DEVICE_ANCESTOR (c))
+ || (c2 && (OMP_CLAUSE_DEVICE_TYPE_KIND (c2)
+ == OMP_CLAUSE_DEVICE_TYPE_HOST)))
*walk_subtrees = 0;
}
return NULL_TREE;