Skip to content

Commit 83edbd4

Browse files
[flang][acc] Ensure data exit action is generated for present & nocreate (#126560)
The acc.delete operation has semantics of decrementing present counter and deleting the data when the counter reaches zero. Since both acc.present and acc.nocreate are both intended to increment present counter, this matching exit action must be inserted. This is also what was specified in OpenACC dialect documentation: https://mlir.llvm.org/docs/Dialects/OpenACCDialect/#operation-categories
1 parent 6536579 commit 83edbd4

File tree

10 files changed

+70
-10
lines changed

10 files changed

+70
-10
lines changed

flang/lib/Lower/OpenACC.cpp

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

flang/test/Lower/OpenACC/acc-declare-unwrap-defaultbounds.f90

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,10 @@ subroutine acc_declare_present(a)
6565
! CHECK-DAG: %[[DECL:.*]]:2 = hlfir.declare %[[ARG0]](%{{.*}}) dummy_scope %{{[0-9]+}} {acc.declare = #acc.declare<dataClause = acc_present>, uniq_name = "_QMacc_declareFacc_declare_presentEa"} : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>, !fir.dscope) -> (!fir.ref<!fir.array<100xi32>>, !fir.ref<!fir.array<100xi32>>)
6666
! CHECK: %[[BOUND:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) extent(%{{.*}} : index) stride(%{{.*}} : index) startIdx(%[[C1]] : index)
6767
! CHECK: %[[PRESENT:.*]] = acc.present varPtr(%[[DECL]]#0 : !fir.ref<!fir.array<100xi32>>) bounds(%[[BOUND]]) -> !fir.ref<!fir.array<100xi32>> {name = "a"}
68-
! CHECK: acc.declare_enter dataOperands(%[[PRESENT]] : !fir.ref<!fir.array<100xi32>>)
68+
! CHECK: %[[TOKEN:.*]] = acc.declare_enter dataOperands(%[[PRESENT]] : !fir.ref<!fir.array<100xi32>>)
6969
! CHECK: %{{.*}}:2 = fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%arg{{.*}} = %{{.*}}) -> (index, i32)
70+
! CHECK: acc.declare_exit token(%[[TOKEN]]) dataOperands(%[[PRESENT]] : !fir.ref<!fir.array<100xi32>>)
71+
! CHECK: acc.delete accPtr(%[[PRESENT]] : !fir.ref<!fir.array<100xi32>>) bounds(%[[BOUND]]) {dataClause = #acc<data_clause acc_present>, name = "a"}
7072

7173
subroutine acc_declare_copyin()
7274
integer :: a(100), b(10), i

flang/test/Lower/OpenACC/acc-declare.f90

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,10 @@ subroutine acc_declare_present(a)
5959
! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.array<100xi32>> {fir.bindc_name = "a"})
6060
! CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ARG0]](%{{.*}}) dummy_scope %{{[0-9]+}} {acc.declare = #acc.declare<dataClause = acc_present>, uniq_name = "_QMacc_declareFacc_declare_presentEa"} : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>, !fir.dscope) -> (!fir.ref<!fir.array<100xi32>>, !fir.ref<!fir.array<100xi32>>)
6161
! CHECK: %[[PRESENT:.*]] = acc.present varPtr(%[[DECL]]#0 : !fir.ref<!fir.array<100xi32>>) -> !fir.ref<!fir.array<100xi32>> {name = "a"}
62-
! CHECK: acc.declare_enter dataOperands(%[[PRESENT]] : !fir.ref<!fir.array<100xi32>>)
62+
! CHECK: %[[TOKEN:.*]] = acc.declare_enter dataOperands(%[[PRESENT]] : !fir.ref<!fir.array<100xi32>>)
6363
! CHECK: %{{.*}}:2 = fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%arg{{.*}} = %{{.*}}) -> (index, i32)
64+
! CHECK: acc.declare_exit token(%[[TOKEN]]) dataOperands(%[[PRESENT]] : !fir.ref<!fir.array<100xi32>>)
65+
! CHECK: acc.delete accPtr(%[[PRESENT]] : !fir.ref<!fir.array<100xi32>>) {dataClause = #acc<data_clause acc_present>, name = "a"}
6466

6567
subroutine acc_declare_copyin()
6668
integer :: a(100), b(10), i

flang/test/Lower/OpenACC/acc-kernels-loop.f90

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,8 @@ subroutine acc_kernels_loop
393393
! CHECK-NEXT: }{{$}}
394394
! CHECK: acc.terminator
395395
! CHECK-NEXT: }{{$}}
396+
! CHECK: acc.delete accPtr(%[[NOCREATE_A]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "a"}
397+
! CHECK: acc.delete accPtr(%[[NOCREATE_B]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "b"}
396398

397399
!$acc kernels loop present(a, b)
398400
DO i = 1, n
@@ -407,6 +409,8 @@ subroutine acc_kernels_loop
407409
! CHECK-NEXT: }{{$}}
408410
! CHECK: acc.terminator
409411
! CHECK-NEXT: }{{$}}
412+
! CHECK: acc.delete accPtr(%[[PRESENT_A]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "a"}
413+
! CHECK: acc.delete accPtr(%[[PRESENT_B]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "b"}
410414

411415
!$acc kernels loop deviceptr(a) deviceptr(b)
412416
DO i = 1, n

flang/test/Lower/OpenACC/acc-kernels.f90

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,9 @@ subroutine acc_kernels
253253
! CHECK: acc.kernels dataOperands(%[[NO_CREATE_A]], %[[NO_CREATE_B]], %[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {
254254
! CHECK: acc.terminator
255255
! CHECK-NEXT: }{{$}}
256+
! CHECK: acc.delete accPtr(%[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_create_zero>, name = "c"}
257+
! CHECK: acc.delete accPtr(%[[NO_CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "a"}
258+
! CHECK: acc.delete accPtr(%[[NO_CREATE_B]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "b"}
256259

257260
!$acc kernels present(a, b, c)
258261
!$acc end kernels
@@ -263,6 +266,9 @@ subroutine acc_kernels
263266
! CHECK: acc.kernels dataOperands(%[[PRESENT_A]], %[[PRESENT_B]], %[[PRESENT_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {
264267
! CHECK: acc.terminator
265268
! CHECK-NEXT: }{{$}}
269+
! CHECK: acc.delete accPtr(%[[PRESENT_A]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "a"}
270+
! CHECK: acc.delete accPtr(%[[PRESENT_B]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "b"}
271+
! CHECK: acc.delete accPtr(%[[PRESENT_C]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "c"}
266272

267273
!$acc kernels deviceptr(a) deviceptr(c)
268274
!$acc end kernels

flang/test/Lower/OpenACC/acc-parallel-loop.f90

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,8 @@ subroutine acc_parallel_loop
393393
! CHECK-NEXT: }{{$}}
394394
! CHECK: acc.yield
395395
! CHECK-NEXT: }{{$}}
396+
! CHECK: acc.delete accPtr(%[[NOCREATE_A]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "a"}
397+
! CHECK: acc.delete accPtr(%[[NOCREATE_B]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "b"}
396398

397399
!$acc parallel loop present(a, b)
398400
DO i = 1, n
@@ -407,6 +409,8 @@ subroutine acc_parallel_loop
407409
! CHECK-NEXT: }{{$}}
408410
! CHECK: acc.yield
409411
! CHECK-NEXT: }{{$}}
412+
! CHECK: acc.delete accPtr(%[[PRESENT_A]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "a"}
413+
! CHECK: acc.delete accPtr(%[[PRESENT_B]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "b"}
410414

411415
!$acc parallel loop deviceptr(a) deviceptr(b)
412416
DO i = 1, n

flang/test/Lower/OpenACC/acc-parallel.f90

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,8 @@ subroutine acc_parallel
291291
! CHECK: acc.yield
292292
! CHECK-NEXT: }{{$}}
293293
! CHECK: acc.delete accPtr(%[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_create_zero>, name = "c"}
294-
294+
! CHECK: acc.delete accPtr(%[[NO_CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "a"}
295+
! CHECK: acc.delete accPtr(%[[NO_CREATE_B]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "b"}
295296

296297
!$acc parallel present(a, b, c)
297298
!$acc end parallel
@@ -302,6 +303,9 @@ subroutine acc_parallel
302303
! CHECK: acc.parallel dataOperands(%[[PRESENT_A]], %[[PRESENT_B]], %[[PRESENT_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {
303304
! CHECK: acc.yield
304305
! CHECK-NEXT: }{{$}}
306+
! CHECK: acc.delete accPtr(%[[PRESENT_A]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "a"}
307+
! CHECK: acc.delete accPtr(%[[PRESENT_B]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "b"}
308+
! CHECK: acc.delete accPtr(%[[PRESENT_C]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "c"}
305309

306310
!$acc parallel deviceptr(a) deviceptr(c)
307311
!$acc end parallel

flang/test/Lower/OpenACC/acc-serial-loop.f90

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,8 @@ subroutine acc_serial_loop
334334
! CHECK-NEXT: }{{$}}
335335
! CHECK: acc.yield
336336
! CHECK-NEXT: }{{$}}
337+
! CHECK: acc.delete accPtr(%[[NOCREATE_A]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "a"}
338+
! CHECK: acc.delete accPtr(%[[NOCREATE_B]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "b"}
337339

338340
!$acc serial loop present(a, b)
339341
DO i = 1, n
@@ -348,6 +350,8 @@ subroutine acc_serial_loop
348350
! CHECK-NEXT: }{{$}}
349351
! CHECK: acc.yield
350352
! CHECK-NEXT: }{{$}}
353+
! CHECK: acc.delete accPtr(%[[PRESENT_A]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "a"}
354+
! CHECK: acc.delete accPtr(%[[PRESENT_B]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "b"}
351355

352356
!$acc serial loop deviceptr(a) deviceptr(b)
353357
DO i = 1, n

flang/test/Lower/OpenACC/acc-serial.f90

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,9 @@ subroutine acc_serial
227227
! CHECK: acc.serial dataOperands(%[[NO_CREATE_A]], %[[NO_CREATE_B]], %[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {
228228
! CHECK: acc.yield
229229
! CHECK-NEXT: }{{$}}
230+
! CHECK: acc.delete accPtr(%[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_create_zero>, name = "c"}
231+
! CHECK: acc.delete accPtr(%[[NO_CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "a"}
232+
! CHECK: acc.delete accPtr(%[[NO_CREATE_B]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "b"}
230233

231234
!$acc serial present(a, b, c)
232235
!$acc end serial
@@ -237,6 +240,9 @@ subroutine acc_serial
237240
! CHECK: acc.serial dataOperands(%[[PRESENT_A]], %[[PRESENT_B]], %[[PRESENT_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {
238241
! CHECK: acc.yield
239242
! CHECK-NEXT: }{{$}}
243+
! CHECK: acc.delete accPtr(%[[PRESENT_A]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "a"}
244+
! CHECK: acc.delete accPtr(%[[PRESENT_B]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "b"}
245+
! CHECK: acc.delete accPtr(%[[PRESENT_C]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "c"}
240246

241247
!$acc serial deviceptr(a) deviceptr(c)
242248
!$acc end serial

mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,7 @@ LogicalResult acc::DeleteOp::verify() {
580580
getDataClause() != acc::DataClause::acc_copyin &&
581581
getDataClause() != acc::DataClause::acc_copyin_readonly &&
582582
getDataClause() != acc::DataClause::acc_present &&
583+
getDataClause() != acc::DataClause::acc_no_create &&
583584
getDataClause() != acc::DataClause::acc_declare_device_resident &&
584585
getDataClause() != acc::DataClause::acc_declare_link)
585586
return emitError(

0 commit comments

Comments
 (0)