@@ -738,9 +738,11 @@ static mlir::Value createNewLocal(Fortran::lower::AbstractConverter &converter,
738
738
auto idxTy = builder.getIndexType ();
739
739
for (mlir::Value sh : elidedShape)
740
740
indices.push_back (builder.createConvert (loc, idxTy, sh));
741
- mlir::Value alloc = builder.create <cuf::AllocOp>(
742
- loc, ty, nm, symNm, dataAttr, lenParams, indices);
743
- return alloc;
741
+ if (dataAttr.getValue () == cuf::DataAttribute::Shared)
742
+ return builder.create <cuf::SharedMemoryOp>(loc, ty, nm, symNm, lenParams,
743
+ indices);
744
+ return builder.create <cuf::AllocOp>(loc, ty, nm, symNm, dataAttr, lenParams,
745
+ indices);
744
746
}
745
747
746
748
// Let the builder do all the heavy lifting.
@@ -1032,12 +1034,16 @@ static void instantiateLocal(Fortran::lower::AbstractConverter &converter,
1032
1034
symMap);
1033
1035
if (Fortran::semantics::NeedCUDAAlloc (var.getSymbol ())) {
1034
1036
auto *builder = &converter.getFirOpBuilder ();
1037
+ cuf::DataAttributeAttr dataAttr =
1038
+ Fortran::lower::translateSymbolCUFDataAttribute (builder->getContext (),
1039
+ var.getSymbol ());
1035
1040
mlir::Location loc = converter.getCurrentLocation ();
1036
1041
fir::ExtendedValue exv =
1037
1042
converter.getSymbolExtendedValue (var.getSymbol (), &symMap);
1038
1043
auto *sym = &var.getSymbol ();
1039
1044
const Fortran::semantics::Scope &owner = sym->owner ();
1040
- if (owner.kind () != Fortran::semantics::Scope::Kind::MainProgram) {
1045
+ if (owner.kind () != Fortran::semantics::Scope::Kind::MainProgram &&
1046
+ dataAttr.getValue () != cuf::DataAttribute::Shared) {
1041
1047
converter.getFctCtx ().attachCleanup ([builder, loc, exv, sym]() {
1042
1048
cuf::DataAttributeAttr dataAttr =
1043
1049
Fortran::lower::translateSymbolCUFDataAttribute (
0 commit comments