[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