@@ -2281,8 +2281,8 @@ static Op createComputeOp(
2281
2281
mlir::Value selfCond;
2282
2282
llvm::SmallVector<mlir::Value> waitOperands, attachEntryOperands,
2283
2283
copyEntryOperands, copyinEntryOperands, copyoutEntryOperands,
2284
- createEntryOperands, dataClauseOperands, numGangs, numWorkers ,
2285
- vectorLength, async;
2284
+ createEntryOperands, nocreateEntryOperands, presentEntryOperands ,
2285
+ dataClauseOperands, numGangs, numWorkers, vectorLength, async;
2286
2286
llvm::SmallVector<mlir::Attribute> numGangsDeviceTypes, numWorkersDeviceTypes,
2287
2287
vectorLengthDeviceTypes, asyncDeviceTypes, asyncOnlyDeviceTypes,
2288
2288
waitOperandsDeviceTypes, waitOnlyDeviceTypes;
@@ -2457,19 +2457,25 @@ static Op createComputeOp(
2457
2457
} else if (const auto *noCreateClause =
2458
2458
std::get_if<Fortran::parser::AccClause::NoCreate>(
2459
2459
&clause.u )) {
2460
+ auto crtDataStart = dataClauseOperands.size ();
2460
2461
genDataOperandOperations<mlir::acc::NoCreateOp>(
2461
2462
noCreateClause->v , converter, semanticsContext, stmtCtx,
2462
2463
dataClauseOperands, mlir::acc::DataClause::acc_no_create,
2463
2464
/* structured=*/ true , /* implicit=*/ false , async, asyncDeviceTypes,
2464
2465
asyncOnlyDeviceTypes);
2466
+ nocreateEntryOperands.append (dataClauseOperands.begin () + crtDataStart,
2467
+ dataClauseOperands.end ());
2465
2468
} else if (const auto *presentClause =
2466
2469
std::get_if<Fortran::parser::AccClause::Present>(
2467
2470
&clause.u )) {
2471
+ auto crtDataStart = dataClauseOperands.size ();
2468
2472
genDataOperandOperations<mlir::acc::PresentOp>(
2469
2473
presentClause->v , converter, semanticsContext, stmtCtx,
2470
2474
dataClauseOperands, mlir::acc::DataClause::acc_present,
2471
2475
/* structured=*/ true , /* implicit=*/ false , async, asyncDeviceTypes,
2472
2476
asyncOnlyDeviceTypes);
2477
+ presentEntryOperands.append (dataClauseOperands.begin () + crtDataStart,
2478
+ dataClauseOperands.end ());
2473
2479
} else if (const auto *devicePtrClause =
2474
2480
std::get_if<Fortran::parser::AccClause::Deviceptr>(
2475
2481
&clause.u )) {
@@ -2634,6 +2640,10 @@ static Op createComputeOp(
2634
2640
builder, attachEntryOperands, /* structured=*/ true );
2635
2641
genDataExitOperations<mlir::acc::CreateOp, mlir::acc::DeleteOp>(
2636
2642
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 );
2637
2647
2638
2648
builder.restoreInsertionPoint (insPt);
2639
2649
return computeOp;
@@ -2648,7 +2658,8 @@ static void genACCDataOp(Fortran::lower::AbstractConverter &converter,
2648
2658
mlir::Value ifCond;
2649
2659
llvm::SmallVector<mlir::Value> attachEntryOperands, createEntryOperands,
2650
2660
copyEntryOperands, copyinEntryOperands, copyoutEntryOperands,
2651
- dataClauseOperands, waitOperands, async;
2661
+ nocreateEntryOperands, presentEntryOperands, dataClauseOperands,
2662
+ waitOperands, async;
2652
2663
llvm::SmallVector<mlir::Attribute> asyncDeviceTypes, asyncOnlyDeviceTypes,
2653
2664
waitOperandsDeviceTypes, waitOnlyDeviceTypes;
2654
2665
llvm::SmallVector<int32_t > waitOperandsSegments;
@@ -2745,19 +2756,25 @@ static void genACCDataOp(Fortran::lower::AbstractConverter &converter,
2745
2756
} else if (const auto *noCreateClause =
2746
2757
std::get_if<Fortran::parser::AccClause::NoCreate>(
2747
2758
&clause.u )) {
2759
+ auto crtDataStart = dataClauseOperands.size ();
2748
2760
genDataOperandOperations<mlir::acc::NoCreateOp>(
2749
2761
noCreateClause->v , converter, semanticsContext, stmtCtx,
2750
2762
dataClauseOperands, mlir::acc::DataClause::acc_no_create,
2751
2763
/* structured=*/ true , /* implicit=*/ false , async, asyncDeviceTypes,
2752
2764
asyncOnlyDeviceTypes);
2765
+ nocreateEntryOperands.append (dataClauseOperands.begin () + crtDataStart,
2766
+ dataClauseOperands.end ());
2753
2767
} else if (const auto *presentClause =
2754
2768
std::get_if<Fortran::parser::AccClause::Present>(
2755
2769
&clause.u )) {
2770
+ auto crtDataStart = dataClauseOperands.size ();
2756
2771
genDataOperandOperations<mlir::acc::PresentOp>(
2757
2772
presentClause->v , converter, semanticsContext, stmtCtx,
2758
2773
dataClauseOperands, mlir::acc::DataClause::acc_present,
2759
2774
/* structured=*/ true , /* implicit=*/ false , async, asyncDeviceTypes,
2760
2775
asyncOnlyDeviceTypes);
2776
+ presentEntryOperands.append (dataClauseOperands.begin () + crtDataStart,
2777
+ dataClauseOperands.end ());
2761
2778
} else if (const auto *deviceptrClause =
2762
2779
std::get_if<Fortran::parser::AccClause::Deviceptr>(
2763
2780
&clause.u )) {
@@ -2837,6 +2854,10 @@ static void genACCDataOp(Fortran::lower::AbstractConverter &converter,
2837
2854
builder, attachEntryOperands, /* structured=*/ true );
2838
2855
genDataExitOperations<mlir::acc::CreateOp, mlir::acc::DeleteOp>(
2839
2856
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 );
2840
2861
2841
2862
builder.restoreInsertionPoint (insPt);
2842
2863
}
@@ -3814,7 +3835,7 @@ genDeclareInFunction(Fortran::lower::AbstractConverter &converter,
3814
3835
const Fortran::parser::AccClauseList &accClauseList) {
3815
3836
llvm::SmallVector<mlir::Value> dataClauseOperands, copyEntryOperands,
3816
3837
copyinEntryOperands, createEntryOperands, copyoutEntryOperands,
3817
- deviceResidentEntryOperands;
3838
+ presentEntryOperands, deviceResidentEntryOperands;
3818
3839
Fortran::lower::StatementContext stmtCtx;
3819
3840
fir::FirOpBuilder &builder = converter.getFirOpBuilder ();
3820
3841
@@ -3845,11 +3866,14 @@ genDeclareInFunction(Fortran::lower::AbstractConverter &converter,
3845
3866
} else if (const auto *presentClause =
3846
3867
std::get_if<Fortran::parser::AccClause::Present>(
3847
3868
&clause.u )) {
3869
+ auto crtDataStart = dataClauseOperands.size ();
3848
3870
genDeclareDataOperandOperations<mlir::acc::PresentOp,
3849
- mlir::acc::PresentOp >(
3871
+ mlir::acc::DeleteOp >(
3850
3872
presentClause->v , converter, semanticsContext, stmtCtx,
3851
3873
dataClauseOperands, mlir::acc::DataClause::acc_present,
3852
3874
/* structured=*/ true , /* implicit=*/ false );
3875
+ presentEntryOperands.append (dataClauseOperands.begin () + crtDataStart,
3876
+ dataClauseOperands.end ());
3853
3877
} else if (const auto *copyinClause =
3854
3878
std::get_if<Fortran::parser::AccClause::Copyin>(&clause.u )) {
3855
3879
auto crtDataStart = dataClauseOperands.size ();
@@ -3928,14 +3952,15 @@ genDeclareInFunction(Fortran::lower::AbstractConverter &converter,
3928
3952
3929
3953
openAccCtx.attachCleanup ([&builder, loc, createEntryOperands,
3930
3954
copyEntryOperands, copyinEntryOperands,
3931
- copyoutEntryOperands, deviceResidentEntryOperands ,
3932
- declareToken]() {
3955
+ copyoutEntryOperands, presentEntryOperands ,
3956
+ deviceResidentEntryOperands, declareToken]() {
3933
3957
llvm::SmallVector<mlir::Value> operands;
3934
3958
operands.append (createEntryOperands);
3935
3959
operands.append (deviceResidentEntryOperands);
3936
3960
operands.append (copyEntryOperands);
3937
3961
operands.append (copyinEntryOperands);
3938
3962
operands.append (copyoutEntryOperands);
3963
+ operands.append (presentEntryOperands);
3939
3964
3940
3965
mlir::func::FuncOp funcOp = builder.getFunction ();
3941
3966
auto ops = funcOp.getOps <mlir::acc::DeclareExitOp>();
@@ -3957,6 +3982,8 @@ genDeclareInFunction(Fortran::lower::AbstractConverter &converter,
3957
3982
builder, copyinEntryOperands, /* structured=*/ true );
3958
3983
genDataExitOperations<mlir::acc::CreateOp, mlir::acc::CopyoutOp>(
3959
3984
builder, copyoutEntryOperands, /* structured=*/ true );
3985
+ genDataExitOperations<mlir::acc::PresentOp, mlir::acc::DeleteOp>(
3986
+ builder, presentEntryOperands, /* structured=*/ true );
3960
3987
});
3961
3988
}
3962
3989
0 commit comments