Skip to content

Commit 52387f9

Browse files
clementvalaokblast
authored andcommitted
[flang][cuda] Fix linkage for dynamic shared memory (llvm#161940)
1 parent b160617 commit 52387f9

File tree

3 files changed

+10
-2
lines changed

3 files changed

+10
-2
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,8 @@ class FirOpBuilder : public mlir::OpBuilder, public mlir::OpBuilder::Listener {
372372
return createCommonLinkage(getContext());
373373
}
374374

375+
mlir::StringAttr createExternalLinkage() { return getStringAttr("external"); }
376+
375377
mlir::StringAttr createInternalLinkage() { return getStringAttr("internal"); }
376378

377379
mlir::StringAttr createLinkOnceLinkage() { return getStringAttr("linkonce"); }

flang/lib/Optimizer/Transforms/CUFComputeSharedMemoryOffsetsAndSize.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,11 @@ struct CUFComputeSharedMemoryOffsetsAndSize
143143
auto sharedMemType = fir::SequenceType::get(sharedMemSize, i8Ty);
144144
std::string sharedMemGlobalName =
145145
(funcOp.getName() + llvm::Twine(cudaSharedMemSuffix)).str();
146-
mlir::StringAttr linkage = builder.createInternalLinkage();
146+
// Dynamic shared memory needs an external linkage while static shared
147+
// memory needs an internal linkage.
148+
mlir::StringAttr linkage = nbDynamicSharedVariables > 0
149+
? builder.createExternalLinkage()
150+
: builder.createInternalLinkage();
147151
builder.setInsertionPointToEnd(gpuMod.getBody());
148152
llvm::SmallVector<mlir::NamedAttribute> attrs;
149153
auto globalOpName = mlir::OperationName(fir::GlobalOp::getOperationName(),

flang/test/Fir/CUDA/cuda-shared-offset.mlir

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ module attributes {dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<!llvm.ptr, dense<
1717
// CHECK: %{{.*}} = cuf.shared_memory[%c0{{.*}} : i32] !fir.array<?xf32>, %c-1 : index {bindc_name = "r", uniq_name = "_QFdynsharedEr"} -> !fir.ref<!fir.array<?xf32>>
1818
// CHECK: gpu.return
1919
// CHECK: }
20-
// CHECK: fir.global internal @_QPdynshared__shared_mem {alignment = 4 : i64, data_attr = #cuf.cuda<shared>} : !fir.array<0xi8>
20+
// CHECK: fir.global external @_QPdynshared__shared_mem {alignment = 4 : i64, data_attr = #cuf.cuda<shared>} : !fir.array<0xi8>
2121

2222
// -----
2323

@@ -158,3 +158,5 @@ module attributes {dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<!llvm.ptr, dense<
158158
// CHECK-LABEL: gpu.func @_QMmtestsPtestany
159159
// CHECK: %{{.*}} = cuf.shared_memory[%c0{{.*}} : i32] !fir.array<?xf64>, %c-1{{.*}} : index {bindc_name = "dmasks", uniq_name = "_QMmtestsFtestanyEdmasks"} -> !fir.ref<!fir.array<?xf64>>
160160
// CHECK: %{{.*}} = cuf.shared_memory[%c0{{.*}} : i32] !fir.array<?xf32>, %c-1{{.*}} : index {bindc_name = "smasks", uniq_name = "_QMmtestsFtestanyEsmasks"} -> !fir.ref<!fir.array<?xf32>>
161+
162+
// CHECK: fir.global external @_QMmtestsPtestany__shared_mem {alignment = 8 : i64, data_attr = #cuf.cuda<shared>} : !fir.array<0xi8>

0 commit comments

Comments
 (0)