@@ -2281,8 +2281,8 @@ static Op createComputeOp(
22812281 mlir::Value selfCond;
22822282 llvm::SmallVector<mlir::Value> waitOperands, attachEntryOperands,
22832283 copyEntryOperands, copyinEntryOperands, copyoutEntryOperands,
2284- createEntryOperands, dataClauseOperands, numGangs, numWorkers ,
2285- vectorLength, async;
2284+ createEntryOperands, nocreateEntryOperands, presentEntryOperands ,
2285+ dataClauseOperands, numGangs, numWorkers, vectorLength, async;
22862286 llvm::SmallVector<mlir::Attribute> numGangsDeviceTypes, numWorkersDeviceTypes,
22872287 vectorLengthDeviceTypes, asyncDeviceTypes, asyncOnlyDeviceTypes,
22882288 waitOperandsDeviceTypes, waitOnlyDeviceTypes;
@@ -2457,19 +2457,25 @@ static Op createComputeOp(
24572457 } else if (const auto *noCreateClause =
24582458 std::get_if<Fortran::parser::AccClause::NoCreate>(
24592459 &clause.u )) {
2460+ auto crtDataStart = dataClauseOperands.size ();
24602461 genDataOperandOperations<mlir::acc::NoCreateOp>(
24612462 noCreateClause->v , converter, semanticsContext, stmtCtx,
24622463 dataClauseOperands, mlir::acc::DataClause::acc_no_create,
24632464 /* structured=*/ true , /* implicit=*/ false , async, asyncDeviceTypes,
24642465 asyncOnlyDeviceTypes);
2466+ nocreateEntryOperands.append (dataClauseOperands.begin () + crtDataStart,
2467+ dataClauseOperands.end ());
24652468 } else if (const auto *presentClause =
24662469 std::get_if<Fortran::parser::AccClause::Present>(
24672470 &clause.u )) {
2471+ auto crtDataStart = dataClauseOperands.size ();
24682472 genDataOperandOperations<mlir::acc::PresentOp>(
24692473 presentClause->v , converter, semanticsContext, stmtCtx,
24702474 dataClauseOperands, mlir::acc::DataClause::acc_present,
24712475 /* structured=*/ true , /* implicit=*/ false , async, asyncDeviceTypes,
24722476 asyncOnlyDeviceTypes);
2477+ presentEntryOperands.append (dataClauseOperands.begin () + crtDataStart,
2478+ dataClauseOperands.end ());
24732479 } else if (const auto *devicePtrClause =
24742480 std::get_if<Fortran::parser::AccClause::Deviceptr>(
24752481 &clause.u )) {
@@ -2634,6 +2640,10 @@ static Op createComputeOp(
26342640 builder, attachEntryOperands, /* structured=*/ true );
26352641 genDataExitOperations<mlir::acc::CreateOp, mlir::acc::DeleteOp>(
26362642 builder, createEntryOperands, /* structured=*/ true );
2643+ genDataExitOperations<mlir::acc::NoCreateOp, mlir::acc::DeleteOp>(
2644+ builder, nocreateEntryOperands, /* structured=*/ true );
2645+ genDataExitOperations<mlir::acc::PresentOp, mlir::acc::DeleteOp>(
2646+ builder, presentEntryOperands, /* structured=*/ true );
26372647
26382648 builder.restoreInsertionPoint (insPt);
26392649 return computeOp;
@@ -2648,7 +2658,8 @@ static void genACCDataOp(Fortran::lower::AbstractConverter &converter,
26482658 mlir::Value ifCond;
26492659 llvm::SmallVector<mlir::Value> attachEntryOperands, createEntryOperands,
26502660 copyEntryOperands, copyinEntryOperands, copyoutEntryOperands,
2651- dataClauseOperands, waitOperands, async;
2661+ nocreateEntryOperands, presentEntryOperands, dataClauseOperands,
2662+ waitOperands, async;
26522663 llvm::SmallVector<mlir::Attribute> asyncDeviceTypes, asyncOnlyDeviceTypes,
26532664 waitOperandsDeviceTypes, waitOnlyDeviceTypes;
26542665 llvm::SmallVector<int32_t > waitOperandsSegments;
@@ -2745,19 +2756,25 @@ static void genACCDataOp(Fortran::lower::AbstractConverter &converter,
27452756 } else if (const auto *noCreateClause =
27462757 std::get_if<Fortran::parser::AccClause::NoCreate>(
27472758 &clause.u )) {
2759+ auto crtDataStart = dataClauseOperands.size ();
27482760 genDataOperandOperations<mlir::acc::NoCreateOp>(
27492761 noCreateClause->v , converter, semanticsContext, stmtCtx,
27502762 dataClauseOperands, mlir::acc::DataClause::acc_no_create,
27512763 /* structured=*/ true , /* implicit=*/ false , async, asyncDeviceTypes,
27522764 asyncOnlyDeviceTypes);
2765+ nocreateEntryOperands.append (dataClauseOperands.begin () + crtDataStart,
2766+ dataClauseOperands.end ());
27532767 } else if (const auto *presentClause =
27542768 std::get_if<Fortran::parser::AccClause::Present>(
27552769 &clause.u )) {
2770+ auto crtDataStart = dataClauseOperands.size ();
27562771 genDataOperandOperations<mlir::acc::PresentOp>(
27572772 presentClause->v , converter, semanticsContext, stmtCtx,
27582773 dataClauseOperands, mlir::acc::DataClause::acc_present,
27592774 /* structured=*/ true , /* implicit=*/ false , async, asyncDeviceTypes,
27602775 asyncOnlyDeviceTypes);
2776+ presentEntryOperands.append (dataClauseOperands.begin () + crtDataStart,
2777+ dataClauseOperands.end ());
27612778 } else if (const auto *deviceptrClause =
27622779 std::get_if<Fortran::parser::AccClause::Deviceptr>(
27632780 &clause.u )) {
@@ -2837,6 +2854,10 @@ static void genACCDataOp(Fortran::lower::AbstractConverter &converter,
28372854 builder, attachEntryOperands, /* structured=*/ true );
28382855 genDataExitOperations<mlir::acc::CreateOp, mlir::acc::DeleteOp>(
28392856 builder, createEntryOperands, /* structured=*/ true );
2857+ genDataExitOperations<mlir::acc::NoCreateOp, mlir::acc::DeleteOp>(
2858+ builder, nocreateEntryOperands, /* structured=*/ true );
2859+ genDataExitOperations<mlir::acc::PresentOp, mlir::acc::DeleteOp>(
2860+ builder, presentEntryOperands, /* structured=*/ true );
28402861
28412862 builder.restoreInsertionPoint (insPt);
28422863}
@@ -3814,7 +3835,7 @@ genDeclareInFunction(Fortran::lower::AbstractConverter &converter,
38143835 const Fortran::parser::AccClauseList &accClauseList) {
38153836 llvm::SmallVector<mlir::Value> dataClauseOperands, copyEntryOperands,
38163837 copyinEntryOperands, createEntryOperands, copyoutEntryOperands,
3817- deviceResidentEntryOperands;
3838+ presentEntryOperands, deviceResidentEntryOperands;
38183839 Fortran::lower::StatementContext stmtCtx;
38193840 fir::FirOpBuilder &builder = converter.getFirOpBuilder ();
38203841
@@ -3845,11 +3866,14 @@ genDeclareInFunction(Fortran::lower::AbstractConverter &converter,
38453866 } else if (const auto *presentClause =
38463867 std::get_if<Fortran::parser::AccClause::Present>(
38473868 &clause.u )) {
3869+ auto crtDataStart = dataClauseOperands.size ();
38483870 genDeclareDataOperandOperations<mlir::acc::PresentOp,
3849- mlir::acc::PresentOp >(
3871+ mlir::acc::DeleteOp >(
38503872 presentClause->v , converter, semanticsContext, stmtCtx,
38513873 dataClauseOperands, mlir::acc::DataClause::acc_present,
38523874 /* structured=*/ true , /* implicit=*/ false );
3875+ presentEntryOperands.append (dataClauseOperands.begin () + crtDataStart,
3876+ dataClauseOperands.end ());
38533877 } else if (const auto *copyinClause =
38543878 std::get_if<Fortran::parser::AccClause::Copyin>(&clause.u )) {
38553879 auto crtDataStart = dataClauseOperands.size ();
@@ -3928,14 +3952,15 @@ genDeclareInFunction(Fortran::lower::AbstractConverter &converter,
39283952
39293953 openAccCtx.attachCleanup ([&builder, loc, createEntryOperands,
39303954 copyEntryOperands, copyinEntryOperands,
3931- copyoutEntryOperands, deviceResidentEntryOperands ,
3932- declareToken]() {
3955+ copyoutEntryOperands, presentEntryOperands ,
3956+ deviceResidentEntryOperands, declareToken]() {
39333957 llvm::SmallVector<mlir::Value> operands;
39343958 operands.append (createEntryOperands);
39353959 operands.append (deviceResidentEntryOperands);
39363960 operands.append (copyEntryOperands);
39373961 operands.append (copyinEntryOperands);
39383962 operands.append (copyoutEntryOperands);
3963+ operands.append (presentEntryOperands);
39393964
39403965 mlir::func::FuncOp funcOp = builder.getFunction ();
39413966 auto ops = funcOp.getOps <mlir::acc::DeclareExitOp>();
@@ -3957,6 +3982,8 @@ genDeclareInFunction(Fortran::lower::AbstractConverter &converter,
39573982 builder, copyinEntryOperands, /* structured=*/ true );
39583983 genDataExitOperations<mlir::acc::CreateOp, mlir::acc::CopyoutOp>(
39593984 builder, copyoutEntryOperands, /* structured=*/ true );
3985+ genDataExitOperations<mlir::acc::PresentOp, mlir::acc::DeleteOp>(
3986+ builder, presentEntryOperands, /* structured=*/ true );
39603987 });
39613988}
39623989
0 commit comments