@@ -37,6 +37,7 @@ static unsigned routineCounter = 0;
3737static constexpr llvm::StringRef accRoutinePrefix = " acc_routine_" ;
3838static constexpr llvm::StringRef accPrivateInitName = " acc.private.init" ;
3939static constexpr llvm::StringRef accReductionInitName = " acc.reduction.init" ;
40+ static constexpr llvm::StringRef accFirDescriptorPostfix = " _desc" ;
4041
4142static mlir::Location
4243genOperandLocation (Fortran::lower::AbstractConverter &converter,
@@ -138,27 +139,31 @@ static void createDeclareAllocFuncWithArg(mlir::OpBuilder &modBuilder,
138139 auto registerFuncOp = createDeclareFunc (
139140 modBuilder, builder, loc, registerFuncName.str (), {descTy}, {loc});
140141
142+ llvm::SmallVector<mlir::Value> bounds;
143+ std::stringstream asFortranDesc;
144+ asFortranDesc << asFortran.str () << accFirDescriptorPostfix.str ();
145+
146+ // Updating descriptor must occur before the mapping of the data so that
147+ // attached data pointer is not overwritten.
148+ mlir::acc::UpdateDeviceOp updateDeviceOp =
149+ createDataEntryOp<mlir::acc::UpdateDeviceOp>(
150+ builder, loc, registerFuncOp.getArgument (0 ), asFortranDesc, bounds,
151+ /* structured=*/ false , /* implicit=*/ true ,
152+ mlir::acc::DataClause::acc_update_device, descTy);
153+ llvm::SmallVector<int32_t > operandSegments{0 , 0 , 0 , 0 , 0 , 1 };
154+ llvm::SmallVector<mlir::Value> operands{updateDeviceOp.getResult ()};
155+ createSimpleOp<mlir::acc::UpdateOp>(builder, loc, operands, operandSegments);
156+
141157 mlir::Value desc =
142158 builder.create <fir::LoadOp>(loc, registerFuncOp.getArgument (0 ));
143159 fir::BoxAddrOp boxAddrOp = builder.create <fir::BoxAddrOp>(loc, desc);
144160 addDeclareAttr (builder, boxAddrOp.getOperation (), clause);
145-
146- llvm::SmallVector<mlir::Value> bounds;
147161 EntryOp entryOp = createDataEntryOp<EntryOp>(
148162 builder, loc, boxAddrOp.getResult (), asFortran, bounds,
149163 /* structured=*/ false , /* implicit=*/ false , clause, boxAddrOp.getType ());
150164 builder.create <mlir::acc::DeclareEnterOp>(
151165 loc, mlir::ValueRange (entryOp.getAccPtr ()));
152166
153- asFortran << " _desc" ;
154- mlir::acc::UpdateDeviceOp updateDeviceOp =
155- createDataEntryOp<mlir::acc::UpdateDeviceOp>(
156- builder, loc, registerFuncOp.getArgument (0 ), asFortran, bounds,
157- /* structured=*/ false , /* implicit=*/ true ,
158- mlir::acc::DataClause::acc_update_device, descTy);
159- llvm::SmallVector<int32_t > operandSegments{0 , 0 , 0 , 0 , 0 , 1 };
160- llvm::SmallVector<mlir::Value> operands{updateDeviceOp.getResult ()};
161- createSimpleOp<mlir::acc::UpdateOp>(builder, loc, operands, operandSegments);
162167 modBuilder.setInsertionPointAfter (registerFuncOp);
163168 builder.restoreInsertionPoint (crtInsPt);
164169}
@@ -208,7 +213,7 @@ static void createDeclareDeallocFuncWithArg(
208213 auto postDeallocOp = createDeclareFunc (
209214 modBuilder, builder, loc, postDeallocFuncName.str (), {descTy}, {loc});
210215 loadOp = builder.create <fir::LoadOp>(loc, postDeallocOp.getArgument (0 ));
211- asFortran << " _desc " ;
216+ asFortran << accFirDescriptorPostfix. str () ;
212217 mlir::acc::UpdateDeviceOp updateDeviceOp =
213218 createDataEntryOp<mlir::acc::UpdateDeviceOp>(
214219 builder, loc, loadOp, asFortran, bounds,
@@ -2753,28 +2758,33 @@ static void createDeclareAllocFunc(mlir::OpBuilder &modBuilder,
27532758
27542759 fir::AddrOfOp addrOp = builder.create <fir::AddrOfOp>(
27552760 loc, fir::ReferenceType::get (globalOp.getType ()), globalOp.getSymbol ());
2756- auto loadOp = builder.create <fir::LoadOp>(loc, addrOp.getResult ());
2757- fir::BoxAddrOp boxAddrOp = builder.create <fir::BoxAddrOp>(loc, loadOp);
2758- addDeclareAttr (builder, boxAddrOp.getOperation (), clause);
27592761
27602762 std::stringstream asFortran;
27612763 asFortran << Fortran::lower::mangle::demangleName (globalOp.getSymName ());
2764+ std::stringstream asFortranDesc;
2765+ asFortranDesc << asFortran.str () << accFirDescriptorPostfix.str ();
27622766 llvm::SmallVector<mlir::Value> bounds;
2763- EntryOp entryOp = createDataEntryOp<EntryOp>(
2764- builder, loc, boxAddrOp.getResult (), asFortran, bounds,
2765- /* structured=*/ false , /* implicit=*/ false , clause, boxAddrOp.getType ());
2766- builder.create <mlir::acc::DeclareEnterOp>(
2767- loc, mlir::ValueRange (entryOp.getAccPtr ()));
27682767
2769- asFortran << " _desc" ;
2768+ // Updating descriptor must occur before the mapping of the data so that
2769+ // attached data pointer is not overwritten.
27702770 mlir::acc::UpdateDeviceOp updateDeviceOp =
27712771 createDataEntryOp<mlir::acc::UpdateDeviceOp>(
2772- builder, loc, addrOp, asFortran , bounds,
2772+ builder, loc, addrOp, asFortranDesc , bounds,
27732773 /* structured=*/ false , /* implicit=*/ true ,
27742774 mlir::acc::DataClause::acc_update_device, addrOp.getType ());
27752775 llvm::SmallVector<int32_t > operandSegments{0 , 0 , 0 , 0 , 0 , 1 };
27762776 llvm::SmallVector<mlir::Value> operands{updateDeviceOp.getResult ()};
27772777 createSimpleOp<mlir::acc::UpdateOp>(builder, loc, operands, operandSegments);
2778+
2779+ auto loadOp = builder.create <fir::LoadOp>(loc, addrOp.getResult ());
2780+ fir::BoxAddrOp boxAddrOp = builder.create <fir::BoxAddrOp>(loc, loadOp);
2781+ addDeclareAttr (builder, boxAddrOp.getOperation (), clause);
2782+ EntryOp entryOp = createDataEntryOp<EntryOp>(
2783+ builder, loc, boxAddrOp.getResult (), asFortran, bounds,
2784+ /* structured=*/ false , /* implicit=*/ false , clause, boxAddrOp.getType ());
2785+ builder.create <mlir::acc::DeclareEnterOp>(
2786+ loc, mlir::ValueRange (entryOp.getAccPtr ()));
2787+
27782788 modBuilder.setInsertionPointAfter (registerFuncOp);
27792789}
27802790
@@ -2832,7 +2842,7 @@ static void createDeclareDeallocFunc(mlir::OpBuilder &modBuilder,
28322842
28332843 addrOp = builder.create <fir::AddrOfOp>(
28342844 loc, fir::ReferenceType::get (globalOp.getType ()), globalOp.getSymbol ());
2835- asFortran << " _desc " ;
2845+ asFortran << accFirDescriptorPostfix. str () ;
28362846 mlir::acc::UpdateDeviceOp updateDeviceOp =
28372847 createDataEntryOp<mlir::acc::UpdateDeviceOp>(
28382848 builder, loc, addrOp, asFortran, bounds,
0 commit comments