[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