[flang-commits] [flang] [flang][cuda] Fix ignore_tkr(m) to also cover CUDA unified attribute (PR #192131)
via flang-commits
flang-commits at lists.llvm.org
Tue Apr 14 13:47:02 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-semantics
Author: Zhen Wang (wangzpgi)
<details>
<summary>Changes</summary>
The ignore_tkr(m) directive suppresses CUDA managed attribute checking on dummy arguments, but it was not covering the unified attribute. This caused a spurious error when passing a plain host array to a unified dummy with ignore_tkr(m):
```
error: dummy argument 'x=' has ATTRIBUTES(UNIFIED) but its associated actual argument has no CUDA data attribute
```
Extend the IgnoreTKR::Managed check in AreCompatibleCUDADataAttrs to accept Unified in addition to Managed and no-attribute.
---
Full diff: https://github.com/llvm/llvm-project/pull/192131.diff
3 Files Affected:
- (modified) flang/include/flang/Support/Fortran.h (+1-1)
- (modified) flang/lib/Support/Fortran.cpp (+2-2)
- (modified) flang/test/Semantics/cuf10.cuf (+12-1)
``````````diff
diff --git a/flang/include/flang/Support/Fortran.h b/flang/include/flang/Support/Fortran.h
index dc6f7ec900e74..9f8d7295f586e 100644
--- a/flang/include/flang/Support/Fortran.h
+++ b/flang/include/flang/Support/Fortran.h
@@ -88,7 +88,7 @@ ENUM_CLASS(IgnoreTKR,
Kind, // K - don't check kind
Rank, // R - don't check ranks
Device, // D - don't check host/device residence
- Managed, // M - don't check managed storage
+ Managed, // M - don't check managed/unified storage
Contiguous, // C - don't check for storage sequence association with a
// potentially non-contiguous object
Pointer) // P - ignore pointer and allocatable matching
diff --git a/flang/lib/Support/Fortran.cpp b/flang/lib/Support/Fortran.cpp
index 05d6e0e709e91..83a68b4cfa94c 100644
--- a/flang/lib/Support/Fortran.cpp
+++ b/flang/lib/Support/Fortran.cpp
@@ -132,8 +132,8 @@ bool AreCompatibleCUDADataAttrs(std::optional<CUDADataAttr> x,
y.value_or(CUDADataAttr::Device) == CUDADataAttr::Device) {
return true;
} else if (ignoreTKR.test(IgnoreTKR::Managed) &&
- x.value_or(CUDADataAttr::Managed) == CUDADataAttr::Managed &&
- y.value_or(CUDADataAttr::Managed) == CUDADataAttr::Managed) {
+ (!x || *x == CUDADataAttr::Managed || *x == CUDADataAttr::Unified) &&
+ (!y || *y == CUDADataAttr::Managed || *y == CUDADataAttr::Unified)) {
return true;
} else if (allowUnifiedMatchingRule) {
if (!x) { // Dummy argument has no attribute -> host
diff --git a/flang/test/Semantics/cuf10.cuf b/flang/test/Semantics/cuf10.cuf
index 2cb1d0d227036..86637a92b2196 100644
--- a/flang/test/Semantics/cuf10.cuf
+++ b/flang/test/Semantics/cuf10.cuf
@@ -58,6 +58,17 @@ module m
integer :: a(10)
call hostdev(a) ! ok because hostdev is attributes(host,device)
end subroutine
-
+
+ subroutine sub_ignore_tkr_m(x, n)
+!dir$ ignore_tkr (m) x
+ integer, unified :: x(n)
+ integer, value :: n
+ end subroutine
+ subroutine test_ignore_tkr_m()
+ integer :: host_arr(10)
+ integer, managed :: managed_arr(10)
+ call sub_ignore_tkr_m(host_arr, 10)
+ call sub_ignore_tkr_m(managed_arr, 10)
+ end subroutine
end
``````````
</details>
https://github.com/llvm/llvm-project/pull/192131
More information about the flang-commits
mailing list