[flang-commits] [flang] [flang][cuda] Emit cuda sentinel only when compiling main (PR #224507)

via flang-commits flang-commits at lists.llvm.org
Thu Sep 17 21:16:32 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-flang-fir-hlfir

Author: Valentin Clement (バレンタイン クレメン) (clementval)

<details>
<summary>Changes</summary>

The sentinel must be added only when the `PROGRAM` is build in the TU. 

---
Full diff: https://github.com/llvm/llvm-project/pull/224507.diff


2 Files Affected:

- (modified) flang/lib/Optimizer/Transforms/CUDA/CUFAddConstructor.cpp (+6-2) 
- (modified) flang/test/Fir/CUDA/cuda-constructor-2.f90 (+20-6) 


``````````diff
diff --git a/flang/lib/Optimizer/Transforms/CUDA/CUFAddConstructor.cpp b/flang/lib/Optimizer/Transforms/CUDA/CUFAddConstructor.cpp
index 8b38f1290d736..4f6613bc8017f 100644
--- a/flang/lib/Optimizer/Transforms/CUDA/CUFAddConstructor.cpp
+++ b/flang/lib/Optimizer/Transforms/CUDA/CUFAddConstructor.cpp
@@ -321,7 +321,11 @@ struct CUFAddConstructor
     // Create the constructor function that call CUFRegisterAllocator.
     builder.setInsertionPointToEnd(mod.getBody());
     mlir::LLVM::GlobalOp cudaCompiledGlobal;
-    if (emitCudaCompiled) {
+    // Only the program unit needs the link-time CUDA Fortran runtime check.
+    bool emitCudaCompiledMarker =
+        emitCudaCompiled &&
+        symTab.lookup<mlir::func::FuncOp>(fir::NameUniquer::doProgramEntry());
+    if (emitCudaCompiledMarker) {
       // Undefined sentinel: objects compiled as CUDA Fortran reference this
       // symbol so linking without the CUDA Fortran runtime produces
       // "undefined reference to `Mcuda_compiled'".
@@ -478,7 +482,7 @@ struct CUFAddConstructor
         }
       }
     }
-    if (emitCudaCompiled) {
+    if (emitCudaCompiledMarker) {
       // Keep the sentinel reference alive: an unused non-volatile load would
       // be folded away before it reaches the object file.
       auto addr =
diff --git a/flang/test/Fir/CUDA/cuda-constructor-2.f90 b/flang/test/Fir/CUDA/cuda-constructor-2.f90
index 84ada65887e1e..a9a4f8bab2bdc 100644
--- a/flang/test/Fir/CUDA/cuda-constructor-2.f90
+++ b/flang/test/Fir/CUDA/cuda-constructor-2.f90
@@ -31,10 +31,9 @@ module attributes {dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<!llvm.ptr, dense<
 
 // CHECK: gpu.module @cuda_device_mod
 
-// MARKER: llvm.mlir.global external @Mcuda_compiled
 // NOMARKER-NOT: Mcuda_compiled
+// MARKER-NOT: Mcuda_compiled
 // CHECK: llvm.func internal @__cudaFortranConstructor() {
-// MARKER-DAG: llvm.mlir.addressof @Mcuda_compiled
 // NOUNIFIED-DAG: %[[MODULE:.*]] = cuf.register_module @cuda_device_mod -> !llvm.ptr
 // NOUNIFIED-DAG: %[[VAR_NAME:.*]] = fir.address_of(@_QQ{{.*}}) : !fir.ref<!fir.char<1,12>>
 // NOUNIFIED-DAG: %[[VAR_ADDR:.*]] = fir.address_of(@_QMmtestsEn) : !fir.ref<!fir.array<5xi32>>
@@ -178,10 +177,7 @@ module attributes {dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<!llvm.ptr, dense<
 }
 
 // CHECK: llvm.func internal @__cudaFortranConstructor()
-// NOMARKER-NEXT: llvm.return
-// MARKER-NEXT: llvm.mlir.addressof @Mcuda_compiled
-// MARKER-NEXT: llvm.load volatile
-// MARKER-NEXT: llvm.return
+// CHECK-NEXT: llvm.return
 // CHECK: llvm.mlir.global_ctors ctors = [@__cudaFortranConstructor]
 
 // -----
@@ -430,3 +426,21 @@ module attributes {dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<!llvm.ptr, dense<
 // NOUNIFIED-DAG: %[[SZ12I64:.*]] = fir.convert %[[SZ12]] : (index) -> i64
 // NOUNIFIED-DAG: fir.call @_FortranACUFRegisterVariable(%{{.*}}, %[[TPPKDEV2]], %{{.*}}, %[[SZ12I64]])
 // UNIFIED: cuf.register_variable_static @_QMtestEtp_packed_dev("_QMtestEtp_packed_dev", 12) {deviceResident}
+
+// -----
+
+// Mcuda_compiled is emitted only for the program unit (_QQmain).
+
+module attributes {dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<!llvm.ptr, dense<64> : vector<4xi64>>, #dlti.dl_entry<i8, dense<8> : vector<2xi64>>, #dlti.dl_entry<i64, dense<64> : vector<2xi64>>, #dlti.dl_entry<"dlti.endianness", "little">>, fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", llvm.data_layout = "e-m:e-i64:64-i128:128-n8:16:32:64-S128"} {
+  func.func @_QQmain() {
+    return
+  }
+}
+
+// MARKER: llvm.mlir.global external @Mcuda_compiled
+// NOMARKER-NOT: Mcuda_compiled
+// CHECK: llvm.func internal @__cudaFortranConstructor() {
+// MARKER: llvm.mlir.addressof @Mcuda_compiled
+// MARKER: llvm.load volatile
+// CHECK: llvm.return
+

``````````

</details>


https://github.com/llvm/llvm-project/pull/224507


More information about the flang-commits mailing list