[flang-commits] [flang] [flang][cuda] Add option to set priority to the CUDA Fortran constructor (PR #212561)

Valentin Clement バレンタイン クレメン via flang-commits flang-commits at lists.llvm.org
Tue Jul 28 10:46:03 PDT 2026


https://github.com/clementval created https://github.com/llvm/llvm-project/pull/212561

None

>From c1d08c562974d3dbffc411ebf8381d81bac9aa45 Mon Sep 17 00:00:00 2001
From: Valentin Clement <clementval at gmail.com>
Date: Tue, 28 Jul 2026 10:44:38 -0700
Subject: [PATCH] [flang][cuda] Add option to set priority to the CUDA Fortran
 constructor

---
 flang/include/flang/Optimizer/Transforms/Passes.td        | 5 ++++-
 flang/lib/Optimizer/Transforms/CUDA/CUFAddConstructor.cpp | 2 +-
 flang/test/Fir/CUDA/cuda-constructor.f90                  | 5 +++++
 3 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/flang/include/flang/Optimizer/Transforms/Passes.td b/flang/include/flang/Optimizer/Transforms/Passes.td
index 8573c0e4f3f00..e51ac93596546 100644
--- a/flang/include/flang/Optimizer/Transforms/Passes.td
+++ b/flang/include/flang/Optimizer/Transforms/Passes.td
@@ -558,7 +558,10 @@ def CUFAddConstructor : Pass<"cuf-add-constructor", "mlir::ModuleOp"> {
            "register every plain host module global that is mirrored in the "
            "GPU module via cuf.register_variable_static, so the CUDA driver "
            "maps the device-side symbol to the host pointer at module-load "
-           "time and HMM/ATS handles migration.">
+           "time and HMM/ATS handles migration.">,
+    Option<"priority", "priority", "int32_t", /*default=*/"0",
+           "Priority for the CUDA Fortran global constructor in "
+           "llvm.mlir.global_ctors.">
   ];
 }
 
diff --git a/flang/lib/Optimizer/Transforms/CUDA/CUFAddConstructor.cpp b/flang/lib/Optimizer/Transforms/CUDA/CUFAddConstructor.cpp
index 2c788b2947070..8727e8318c1cb 100644
--- a/flang/lib/Optimizer/Transforms/CUDA/CUFAddConstructor.cpp
+++ b/flang/lib/Optimizer/Transforms/CUDA/CUFAddConstructor.cpp
@@ -445,7 +445,7 @@ struct CUFAddConstructor
         mlir::FlatSymbolRefAttr::get(mod.getContext(), func.getSymName()));
     llvm::SmallVector<int> priorities;
     llvm::SmallVector<mlir::Attribute> data;
-    priorities.push_back(0);
+    priorities.push_back(priority);
     data.push_back(mlir::LLVM::ZeroAttr::get(mod.getContext()));
     mlir::LLVM::GlobalCtorsOp::create(
         builder, mod.getLoc(), builder.getArrayAttr(funcs),
diff --git a/flang/test/Fir/CUDA/cuda-constructor.f90 b/flang/test/Fir/CUDA/cuda-constructor.f90
index f81d26ccd78b5..5ac76f9108f78 100644
--- a/flang/test/Fir/CUDA/cuda-constructor.f90
+++ b/flang/test/Fir/CUDA/cuda-constructor.f90
@@ -2,6 +2,9 @@
 ! RUN: bbc -fcuda -emit-fir %s -o - | fir-opt \
 ! RUN:   --cuf-add-constructor="allocator-registration-function=custom_register" \
 ! RUN:   | FileCheck %s --check-prefix=CUSTOM
+! RUN: bbc -fcuda -emit-fir %s -o - | fir-opt \
+! RUN:   --cuf-add-constructor="priority=100" \
+! RUN:   | FileCheck %s --check-prefix=PRIORITY
 
 program main
   real, allocatable, device :: ahost(:)
@@ -18,3 +21,5 @@ program main
 ! CUSTOM:   llvm.call @custom_register() : () -> ()
 ! CUSTOM: }
 ! CUSTOM: llvm.func @custom_register() attributes {sym_visibility = "private"}
+
+! PRIORITY: llvm.mlir.global_ctors ctors = [@__cudaFortranConstructor], priorities = [100 : i32], data = [#llvm.zero]



More information about the flang-commits mailing list