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

via flang-commits flang-commits at lists.llvm.org
Fri Sep 18 23:08:00 PDT 2026


Author: Valentin Clement (バレンタイン クレメン)
Date: 2026-09-18T23:07:55-07:00
New Revision: 6f516d1c555462cf20404cb0da9c58716fd618db

URL: https://github.com/llvm/llvm-project/commit/6f516d1c555462cf20404cb0da9c58716fd618db
DIFF: https://github.com/llvm/llvm-project/commit/6f516d1c555462cf20404cb0da9c58716fd618db.diff

LOG: [flang][cuda] Emit cuda sentinel only when compiling main (#224507)

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

Added: 
    

Modified: 
    flang/lib/Optimizer/Transforms/CUDA/CUFAddConstructor.cpp
    flang/test/Fir/CUDA/cuda-constructor-2.f90

Removed: 
    


################################################################################
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
+


        


More information about the flang-commits mailing list