Skip to content

Commit 314ef96

Browse files
authored
[flang][cuda] Lower attribute for module variables (#81226)
Propagate the CUDA attribute to fir.global operation for simple module variables.
1 parent 0329c1b commit 314ef96

File tree

5 files changed

+61
-38
lines changed

5 files changed

+61
-38
lines changed

flang/include/flang/Optimizer/Builder/FIRBuilder.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,12 +230,14 @@ class FirOpBuilder : public mlir::OpBuilder, public mlir::OpBuilder::Listener {
230230
llvm::StringRef name,
231231
mlir::StringAttr linkage = {},
232232
mlir::Attribute value = {}, bool isConst = false,
233-
bool isTarget = false);
233+
bool isTarget = false,
234+
fir::CUDAAttributeAttr cudaAttr = {});
234235

235236
fir::GlobalOp createGlobal(mlir::Location loc, mlir::Type type,
236237
llvm::StringRef name, bool isConst, bool isTarget,
237238
std::function<void(FirOpBuilder &)> bodyBuilder,
238-
mlir::StringAttr linkage = {});
239+
mlir::StringAttr linkage = {},
240+
fir::CUDAAttributeAttr cudaAttr = {});
239241

240242
/// Create a global constant (read-only) value.
241243
fir::GlobalOp createGlobalConstant(mlir::Location loc, mlir::Type type,

flang/include/flang/Optimizer/Dialect/FIROps.td

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2737,7 +2737,8 @@ def fir_GlobalOp : fir_Op<"global", [IsolatedFromAbove, Symbol]> {
27372737
OptionalAttr<AnyAttr>:$initVal,
27382738
OptionalAttr<UnitAttr>:$constant,
27392739
OptionalAttr<UnitAttr>:$target,
2740-
OptionalAttr<StrAttr>:$linkName
2740+
OptionalAttr<StrAttr>:$linkName,
2741+
OptionalAttr<fir_CUDAAttributeAttr>:$cuda_attr
27412742
);
27422743

27432744
let regions = (region AtMostRegion<1>:$region);

flang/lib/Lower/ConvertVariable.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,8 @@ static bool isConstant(const Fortran::semantics::Symbol &sym) {
138138
static fir::GlobalOp defineGlobal(Fortran::lower::AbstractConverter &converter,
139139
const Fortran::lower::pft::Variable &var,
140140
llvm::StringRef globalName,
141-
mlir::StringAttr linkage);
141+
mlir::StringAttr linkage,
142+
fir::CUDAAttributeAttr cudaAttr = {});
142143

143144
static mlir::Location genLocation(Fortran::lower::AbstractConverter &converter,
144145
const Fortran::semantics::Symbol &sym) {
@@ -462,7 +463,8 @@ void Fortran::lower::createGlobalInitialization(
462463
static fir::GlobalOp defineGlobal(Fortran::lower::AbstractConverter &converter,
463464
const Fortran::lower::pft::Variable &var,
464465
llvm::StringRef globalName,
465-
mlir::StringAttr linkage) {
466+
mlir::StringAttr linkage,
467+
fir::CUDAAttributeAttr cudaAttr) {
466468
fir::FirOpBuilder &builder = converter.getFirOpBuilder();
467469
const Fortran::semantics::Symbol &sym = var.getSymbol();
468470
mlir::Location loc = genLocation(converter, sym);
@@ -500,8 +502,9 @@ static fir::GlobalOp defineGlobal(Fortran::lower::AbstractConverter &converter,
500502
}
501503
}
502504
if (!global)
503-
global = builder.createGlobal(loc, symTy, globalName, linkage,
504-
mlir::Attribute{}, isConst, var.isTarget());
505+
global =
506+
builder.createGlobal(loc, symTy, globalName, linkage, mlir::Attribute{},
507+
isConst, var.isTarget(), cudaAttr);
505508
if (Fortran::semantics::IsAllocatableOrPointer(sym) &&
506509
!Fortran::semantics::IsProcedure(sym)) {
507510
const auto *details =
@@ -2219,7 +2222,10 @@ void Fortran::lower::defineModuleVariable(
22192222
// Do nothing. Mapping will be done on user side.
22202223
} else {
22212224
std::string globalName = converter.mangleName(sym);
2222-
defineGlobal(converter, var, globalName, linkage);
2225+
fir::CUDAAttributeAttr cudaAttr =
2226+
Fortran::lower::translateSymbolCUDAAttribute(
2227+
converter.getFirOpBuilder().getContext(), sym);
2228+
defineGlobal(converter, var, globalName, linkage, cudaAttr);
22232229
}
22242230
}
22252231

flang/lib/Optimizer/Builder/FIRBuilder.cpp

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -271,27 +271,32 @@ mlir::Value fir::FirOpBuilder::createHeapTemporary(
271271

272272
/// Create a global variable in the (read-only) data section. A global variable
273273
/// must have a unique name to identify and reference it.
274-
fir::GlobalOp fir::FirOpBuilder::createGlobal(mlir::Location loc,
275-
mlir::Type type,
276-
llvm::StringRef name,
277-
mlir::StringAttr linkage,
278-
mlir::Attribute value,
279-
bool isConst, bool isTarget) {
274+
fir::GlobalOp fir::FirOpBuilder::createGlobal(
275+
mlir::Location loc, mlir::Type type, llvm::StringRef name,
276+
mlir::StringAttr linkage, mlir::Attribute value, bool isConst,
277+
bool isTarget, fir::CUDAAttributeAttr cudaAttr) {
280278
auto module = getModule();
281279
auto insertPt = saveInsertionPoint();
282280
if (auto glob = module.lookupSymbol<fir::GlobalOp>(name))
283281
return glob;
284282
setInsertionPoint(module.getBody(), module.getBody()->end());
285-
auto glob =
286-
create<fir::GlobalOp>(loc, name, isConst, isTarget, type, value, linkage);
283+
llvm::SmallVector<mlir::NamedAttribute> attrs;
284+
if (cudaAttr) {
285+
auto globalOpName = mlir::OperationName(fir::GlobalOp::getOperationName(),
286+
module.getContext());
287+
attrs.push_back(mlir::NamedAttribute(
288+
fir::GlobalOp::getCudaAttrAttrName(globalOpName), cudaAttr));
289+
}
290+
auto glob = create<fir::GlobalOp>(loc, name, isConst, isTarget, type, value,
291+
linkage, attrs);
287292
restoreInsertionPoint(insertPt);
288293
return glob;
289294
}
290295

291296
fir::GlobalOp fir::FirOpBuilder::createGlobal(
292297
mlir::Location loc, mlir::Type type, llvm::StringRef name, bool isConst,
293298
bool isTarget, std::function<void(FirOpBuilder &)> bodyBuilder,
294-
mlir::StringAttr linkage) {
299+
mlir::StringAttr linkage, fir::CUDAAttributeAttr cudaAttr) {
295300
auto module = getModule();
296301
auto insertPt = saveInsertionPoint();
297302
if (auto glob = module.lookupSymbol<fir::GlobalOp>(name))

flang/test/Lower/CUDA/cuda-data-attribute.cuf

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,53 +3,62 @@
33

44
! Test lowering of CUDA attribute on variables.
55

6+
module cuda_var
7+
real, constant :: mod_a_rc
8+
! CHECK: fir.global @_QMcuda_varEmod_a_rc {cuda_attr = #fir.cuda<constant>} : f32
9+
real, device :: mod_b_ra
10+
! CHECK: fir.global @_QMcuda_varEmod_b_ra {cuda_attr = #fir.cuda<device>} : f32
11+
real, allocatable, managed :: mod_c_rm
12+
! CHECK: fir.global @_QMcuda_varEmod_c_rm {cuda_attr = #fir.cuda<managed>} : !fir.box<!fir.heap<f32>>
13+
real, allocatable, pinned :: mod_d_rp
14+
! CHECK: fir.global @_QMcuda_varEmod_d_rp {cuda_attr = #fir.cuda<pinned>} : !fir.box<!fir.heap<f32>>
15+
16+
contains
17+
618
subroutine local_var_attrs
719
real, constant :: rc
820
real, device :: rd
921
real, allocatable, managed :: rm
1022
real, allocatable, pinned :: rp
1123
end subroutine
1224

13-
! CHECK-LABEL: func.func @_QPlocal_var_attrs()
14-
! CHECK: %{{.*}}:2 = hlfir.declare %{{.*}} {cuda_attr = #fir.cuda<constant>, uniq_name = "_QFlocal_var_attrsErc"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
15-
! CHECK: %{{.*}}:2 = hlfir.declare %{{.*}} {cuda_attr = #fir.cuda<device>, uniq_name = "_QFlocal_var_attrsErd"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
16-
! CHECK: %{{.*}}:2 = hlfir.declare %{{.*}} {cuda_attr = #fir.cuda<managed>, fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFlocal_var_attrsErm"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> (!fir.ref<!fir.box<!fir.heap<f32>>>, !fir.ref<!fir.box<!fir.heap<f32>>>)
17-
! CHECK: %{{.*}}:2 = hlfir.declare %{{.*}} {cuda_attr = #fir.cuda<pinned>, fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFlocal_var_attrsErp"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> (!fir.ref<!fir.box<!fir.heap<f32>>>, !fir.ref<!fir.box<!fir.heap<f32>>>)
25+
! CHECK-LABEL: func.func @_QMcuda_varPlocal_var_attrs()
26+
! CHECK: %{{.*}}:2 = hlfir.declare %{{.*}} {cuda_attr = #fir.cuda<constant>, uniq_name = "_QMcuda_varFlocal_var_attrsErc"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
27+
! CHECK: %{{.*}}:2 = hlfir.declare %{{.*}} {cuda_attr = #fir.cuda<device>, uniq_name = "_QMcuda_varFlocal_var_attrsErd"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
28+
! CHECK: %{{.*}}:2 = hlfir.declare %{{.*}} {cuda_attr = #fir.cuda<managed>, fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QMcuda_varFlocal_var_attrsErm"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> (!fir.ref<!fir.box<!fir.heap<f32>>>, !fir.ref<!fir.box<!fir.heap<f32>>>)
29+
! CHECK: %{{.*}}:2 = hlfir.declare %{{.*}} {cuda_attr = #fir.cuda<pinned>, fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QMcuda_varFlocal_var_attrsErp"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> (!fir.ref<!fir.box<!fir.heap<f32>>>, !fir.ref<!fir.box<!fir.heap<f32>>>)
1830

19-
! FIR: %{{.*}} = fir.declare %{{.*}} {cuda_attr = #fir.cuda<constant>, uniq_name = "_QFlocal_var_attrsErc"} : (!fir.ref<f32>) -> !fir.ref<f32>
20-
! FIR: %{{.*}} = fir.declare %{{.*}} {cuda_attr = #fir.cuda<device>, uniq_name = "_QFlocal_var_attrsErd"} : (!fir.ref<f32>) -> !fir.ref<f32>
21-
! FIR: %{{.*}} = fir.declare %{{.*}} {cuda_attr = #fir.cuda<managed>, fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFlocal_var_attrsErm"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> !fir.ref<!fir.box<!fir.heap<f32>>>
22-
! FIR: %{{.*}} = fir.declare %{{.*}} {cuda_attr = #fir.cuda<pinned>, fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFlocal_var_attrsErp"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> !fir.ref<!fir.box<!fir.heap<f32>>>
31+
! FIR: %{{.*}} = fir.declare %{{.*}} {cuda_attr = #fir.cuda<constant>, uniq_name = "_QMcuda_varFlocal_var_attrsErc"} : (!fir.ref<f32>) -> !fir.ref<f32>
32+
! FIR: %{{.*}} = fir.declare %{{.*}} {cuda_attr = #fir.cuda<device>, uniq_name = "_QMcuda_varFlocal_var_attrsErd"} : (!fir.ref<f32>) -> !fir.ref<f32>
33+
! FIR: %{{.*}} = fir.declare %{{.*}} {cuda_attr = #fir.cuda<managed>, fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QMcuda_varFlocal_var_attrsErm"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> !fir.ref<!fir.box<!fir.heap<f32>>>
34+
! FIR: %{{.*}} = fir.declare %{{.*}} {cuda_attr = #fir.cuda<pinned>, fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QMcuda_varFlocal_var_attrsErp"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> !fir.ref<!fir.box<!fir.heap<f32>>>
2335

2436
subroutine dummy_arg_constant(dc)
2537
real, constant :: dc
2638
end subroutine
27-
! CHECK-LABEL: func.func @_QPdummy_arg_constant(
39+
! CHECK-LABEL: func.func @_QMcuda_varPdummy_arg_constant(
2840
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<f32> {fir.bindc_name = "dc", fir.cuda_attr = #fir.cuda<constant>}
29-
! CHECK: %{{.*}}:2 = hlfir.declare %[[ARG0]] {cuda_attr = #fir.cuda<constant>, uniq_name = "_QFdummy_arg_constantEdc"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
41+
! CHECK: %{{.*}}:2 = hlfir.declare %[[ARG0]] {cuda_attr = #fir.cuda<constant>, uniq_name = "_QMcuda_varFdummy_arg_constantEdc"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
3042

3143
subroutine dummy_arg_device(dd)
3244
real, device :: dd
3345
end subroutine
34-
! CHECK-LABEL: func.func @_QPdummy_arg_device(
46+
! CHECK-LABEL: func.func @_QMcuda_varPdummy_arg_device(
3547
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<f32> {fir.bindc_name = "dd", fir.cuda_attr = #fir.cuda<device>}) {
36-
! CHECK: %{{.*}}:2 = hlfir.declare %[[ARG0]] {cuda_attr = #fir.cuda<device>, uniq_name = "_QFdummy_arg_deviceEdd"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
48+
! CHECK: %{{.*}}:2 = hlfir.declare %[[ARG0]] {cuda_attr = #fir.cuda<device>, uniq_name = "_QMcuda_varFdummy_arg_deviceEdd"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
3749

3850
subroutine dummy_arg_managed(dm)
3951
real, allocatable, managed :: dm
4052
end subroutine
41-
! CHECK-LABEL: func.func @_QPdummy_arg_managed(
53+
! CHECK-LABEL: func.func @_QMcuda_varPdummy_arg_managed(
4254
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.box<!fir.heap<f32>>> {fir.bindc_name = "dm", fir.cuda_attr = #fir.cuda<managed>}) {
43-
! CHECK: %{{.*}}:2 = hlfir.declare %[[ARG0]] {cuda_attr = #fir.cuda<managed>, fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFdummy_arg_managedEdm"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> (!fir.ref<!fir.box<!fir.heap<f32>>>, !fir.ref<!fir.box<!fir.heap<f32>>>)
55+
! CHECK: %{{.*}}:2 = hlfir.declare %[[ARG0]] {cuda_attr = #fir.cuda<managed>, fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QMcuda_varFdummy_arg_managedEdm"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> (!fir.ref<!fir.box<!fir.heap<f32>>>, !fir.ref<!fir.box<!fir.heap<f32>>>)
4456

4557
subroutine dummy_arg_pinned(dp)
4658
real, allocatable, pinned :: dp
4759
end subroutine
48-
! CHECK-LABEL: func.func @_QPdummy_arg_pinned(
60+
! CHECK-LABEL: func.func @_QMcuda_varPdummy_arg_pinned(
4961
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.box<!fir.heap<f32>>> {fir.bindc_name = "dp", fir.cuda_attr = #fir.cuda<pinned>}) {
50-
! CHECK: %{{.*}}:2 = hlfir.declare %[[ARG0]] {cuda_attr = #fir.cuda<pinned>, fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFdummy_arg_pinnedEdp"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> (!fir.ref<!fir.box<!fir.heap<f32>>>, !fir.ref<!fir.box<!fir.heap<f32>>>)
51-
52-
53-
54-
62+
! CHECK: %{{.*}}:2 = hlfir.declare %[[ARG0]] {cuda_attr = #fir.cuda<pinned>, fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QMcuda_varFdummy_arg_pinnedEdp"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> (!fir.ref<!fir.box<!fir.heap<f32>>>, !fir.ref<!fir.box<!fir.heap<f32>>>)
5563

64+
end module

0 commit comments

Comments
 (0)