@@ -738,9 +738,11 @@ static mlir::Value createNewLocal(Fortran::lower::AbstractConverter &converter,
738738 auto idxTy = builder.getIndexType ();
739739 for (mlir::Value sh : elidedShape)
740740 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);
744746 }
745747
746748 // Let the builder do all the heavy lifting.
@@ -1032,12 +1034,16 @@ static void instantiateLocal(Fortran::lower::AbstractConverter &converter,
10321034 symMap);
10331035 if (Fortran::semantics::NeedCUDAAlloc (var.getSymbol ())) {
10341036 auto *builder = &converter.getFirOpBuilder ();
1037+ cuf::DataAttributeAttr dataAttr =
1038+ Fortran::lower::translateSymbolCUFDataAttribute (builder->getContext (),
1039+ var.getSymbol ());
10351040 mlir::Location loc = converter.getCurrentLocation ();
10361041 fir::ExtendedValue exv =
10371042 converter.getSymbolExtendedValue (var.getSymbol (), &symMap);
10381043 auto *sym = &var.getSymbol ();
10391044 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) {
10411047 converter.getFctCtx ().attachCleanup ([builder, loc, exv, sym]() {
10421048 cuf::DataAttributeAttr dataAttr =
10431049 Fortran::lower::translateSymbolCUFDataAttribute (
0 commit comments