[flang-commits] [flang] 4b6231d - [flang][cuda] Accept attributes(value) as a CUDA Fortran extension (#192560)
via flang-commits
flang-commits at lists.llvm.org
Thu Apr 16 16:49:30 PDT 2026
Author: Valentin Clement (バレンタイン クレメン)
Date: 2026-04-16T16:49:26-07:00
New Revision: 4b6231d410696dad377f4997cc17ac886fcbab57
URL: https://github.com/llvm/llvm-project/commit/4b6231d410696dad377f4997cc17ac886fcbab57
DIFF: https://github.com/llvm/llvm-project/commit/4b6231d410696dad377f4997cc17ac886fcbab57.diff
LOG: [flang][cuda] Accept attributes(value) as a CUDA Fortran extension (#192560)
This is accepted by legacy compiler and is part of some documentation
Added:
Modified:
flang/include/flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h
flang/include/flang/Support/Fortran.h
flang/lib/Parser/Fortran-parsers.cpp
flang/lib/Semantics/check-declarations.cpp
flang/lib/Semantics/resolve-names.cpp
flang/test/Lower/CUDA/cuda-data-attribute.cuf
flang/test/Semantics/cuf03.cuf
Removed:
################################################################################
diff --git a/flang/include/flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h b/flang/include/flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h
index 17b92501727aa..f08a89c47170c 100644
--- a/flang/include/flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h
+++ b/flang/include/flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h
@@ -73,6 +73,8 @@ getDataAttribute(mlir::MLIRContext *mlirContext,
case Fortran::common::CUDADataAttr::Unified:
attr = cuf::DataAttribute::Unified;
break;
+ case Fortran::common::CUDADataAttr::Value:
+ return {}; // Extension, not a real CUDA Fortran data attribute
}
return cuf::DataAttributeAttr::get(mlirContext, attr);
}
diff --git a/flang/include/flang/Support/Fortran.h b/flang/include/flang/Support/Fortran.h
index 9f8d7295f586e..4939f1d09067f 100644
--- a/flang/include/flang/Support/Fortran.h
+++ b/flang/include/flang/Support/Fortran.h
@@ -65,8 +65,8 @@ using Label = std::uint64_t;
ENUM_CLASS(CUDASubprogramAttrs, Host, Device, HostDevice, Global, Grid_Global)
// CUDA data attributes; mutually exclusive
-ENUM_CLASS(
- CUDADataAttr, Constant, Device, Managed, Pinned, Shared, Texture, Unified)
+ENUM_CLASS(CUDADataAttr, Constant, Device, Managed, Pinned, Shared, Texture,
+ Unified, Value)
// OpenACC device types
ENUM_CLASS(
diff --git a/flang/lib/Parser/Fortran-parsers.cpp b/flang/lib/Parser/Fortran-parsers.cpp
index e86b5e7f79c74..b67475074217c 100644
--- a/flang/lib/Parser/Fortran-parsers.cpp
+++ b/flang/lib/Parser/Fortran-parsers.cpp
@@ -732,7 +732,8 @@ TYPE_PARSER("CONSTANT" >> pure(common::CUDADataAttr::Constant) ||
"PINNED" >> pure(common::CUDADataAttr::Pinned) ||
"SHARED" >> pure(common::CUDADataAttr::Shared) ||
"TEXTURE" >> pure(common::CUDADataAttr::Texture) ||
- "UNIFIED" >> pure(common::CUDADataAttr::Unified))
+ "UNIFIED" >> pure(common::CUDADataAttr::Unified) ||
+ "VALUE" >> pure(common::CUDADataAttr::Value))
// R804 object-name -> name
constexpr auto objectName{name};
diff --git a/flang/lib/Semantics/check-declarations.cpp b/flang/lib/Semantics/check-declarations.cpp
index b9c807a63638b..4174cf6d1e340 100644
--- a/flang/lib/Semantics/check-declarations.cpp
+++ b/flang/lib/Semantics/check-declarations.cpp
@@ -1165,6 +1165,8 @@ void CheckHelper::CheckObjectEntity(
}
auto attr{*details.cudaDataAttr()};
switch (attr) {
+ case common::CUDADataAttr::Value:
+ break; // Nothing to check for VALUE attribute
case common::CUDADataAttr::Constant:
if (subpDetails && !inDeviceSubprogram) {
messages_.Say(
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index a554174b7d30a..e1c1167af1604 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -6016,7 +6016,11 @@ bool DeclarationVisitor::Pre(const parser::CUDAAttributesStmt &x) {
if (!symbol) {
symbol = &MakeSymbol(name, ObjectEntityDetails{});
}
- SetCUDADataAttr(name.source, *symbol, attr);
+ if (attr == common::CUDADataAttr::Value) {
+ SetExplicitAttr(*symbol, Attr::VALUE);
+ } else {
+ SetCUDADataAttr(name.source, *symbol, attr);
+ }
}
}
return false;
diff --git a/flang/test/Lower/CUDA/cuda-data-attribute.cuf b/flang/test/Lower/CUDA/cuda-data-attribute.cuf
index d0fe58a07410a..2b06f29af1ef0 100644
--- a/flang/test/Lower/CUDA/cuda-data-attribute.cuf
+++ b/flang/test/Lower/CUDA/cuda-data-attribute.cuf
@@ -104,8 +104,16 @@ end
! CHECK-LABEL: func.func @_QPcraypointer()
! CHECK: %{{.*}} = cuf.alloc !fir.box<!fir.ptr<!fir.array<?xf32>>> {data_attr = #cuf.cuda<device>} -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>
- ! CHECK: fir.global @_QMcuda_varEmod_a_rc {data_attr = #cuf.cuda<constant>} : f32
+attributes(global) subroutine attr_value(a)
+ integer :: a
+ attributes(value) :: a
+end subroutine
+
+! CHECK-LABEL: func.func @_QPattr_value(%{{.*}}: i32 {fir.bindc_name = "a"})
+! CHECK: hlfir.declare %{{.*}} {fortran_attrs = #fir.var_attrs<value>, uniq_name = "_QFattr_valueEa"}
+
+! CHECK: fir.global @_QMcuda_varEmod_a_rc {data_attr = #cuf.cuda<constant>} : f32
! CHECK: fir.global @_QMcuda_varEmod_b_ra {data_attr = #cuf.cuda<device>} : f32
! CHECK: fir.global @_QMcuda_varEmod_c_rm {data_attr = #cuf.cuda<managed>} : !fir.box<!fir.heap<f32>>
diff --git a/flang/test/Semantics/cuf03.cuf b/flang/test/Semantics/cuf03.cuf
index 49b74e9a6e6a1..f7bb8a0e54e74 100644
--- a/flang/test/Semantics/cuf03.cuf
+++ b/flang/test/Semantics/cuf03.cuf
@@ -95,6 +95,13 @@ module m
end block
end subroutine
+ attributes(global) subroutine dev2(a)
+ integer, intent(in) :: a
+ attributes(value) :: a
+ ! this is equivalent to:
+ ! integer, intent(in), value :: a
+ end subroutine
+
end module
More information about the flang-commits
mailing list