Skip to content

Commit f3d3ec8

Browse files
authored
[flang][acc] Add a missing acc.delete generation for the copyin clause (llvm#122539)
We are missing the deletion part of the copyin clause after a region or in a destructor. This PR completes its implementation for data regions, compute regions, and global declarations. Example: ```f90 subroutine sub() real :: x(1:10) !$acc data copyin(x) !$acc end data end subroutine sub ``` We are getting the following: ```mlir %5 = acc.copyin varPtr(%2#0 : !fir.ref<!fir.array<10xf32>>) bounds(%4) -> !fir.ref<!fir.array<10xf32>> {name = "x"} acc.data dataOperands(%5 : !fir.ref<!fir.array<10xf32>>) { acc.terminator } return ``` With this PR, we'll get: ```mlir %5 = acc.copyin varPtr(%2#0 : !fir.ref<!fir.array<10xf32>>) bounds(%4) -> !fir.ref<!fir.array<10xf32>> {name = "x"} acc.data dataOperands(%5 : !fir.ref<!fir.array<10xf32>>) { acc.terminator } acc.delete accPtr(%5 : !fir.ref<!fir.array<10xf32>>) bounds(%4) {dataClause = #acc<data_clause acc_copyin>, name = "x"} return ```
1 parent 0384069 commit f3d3ec8

11 files changed

+67
-17
lines changed

flang/lib/Lower/OpenACC.cpp

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2183,8 +2183,9 @@ static Op createComputeOp(
21832183
mlir::Value ifCond;
21842184
mlir::Value selfCond;
21852185
llvm::SmallVector<mlir::Value> waitOperands, attachEntryOperands,
2186-
copyEntryOperands, copyoutEntryOperands, createEntryOperands,
2187-
dataClauseOperands, numGangs, numWorkers, vectorLength, async;
2186+
copyEntryOperands, copyinEntryOperands, copyoutEntryOperands,
2187+
createEntryOperands, dataClauseOperands, numGangs, numWorkers,
2188+
vectorLength, async;
21882189
llvm::SmallVector<mlir::Attribute> numGangsDeviceTypes, numWorkersDeviceTypes,
21892190
vectorLengthDeviceTypes, asyncDeviceTypes, asyncOnlyDeviceTypes,
21902191
waitOperandsDeviceTypes, waitOnlyDeviceTypes;
@@ -2321,13 +2322,16 @@ static Op createComputeOp(
23212322
dataClauseOperands.end());
23222323
} else if (const auto *copyinClause =
23232324
std::get_if<Fortran::parser::AccClause::Copyin>(&clause.u)) {
2325+
auto crtDataStart = dataClauseOperands.size();
23242326
genDataOperandOperationsWithModifier<mlir::acc::CopyinOp,
23252327
Fortran::parser::AccClause::Copyin>(
23262328
copyinClause, converter, semanticsContext, stmtCtx,
23272329
Fortran::parser::AccDataModifier::Modifier::ReadOnly,
23282330
dataClauseOperands, mlir::acc::DataClause::acc_copyin,
23292331
mlir::acc::DataClause::acc_copyin_readonly, async, asyncDeviceTypes,
23302332
asyncOnlyDeviceTypes);
2333+
copyinEntryOperands.append(dataClauseOperands.begin() + crtDataStart,
2334+
dataClauseOperands.end());
23312335
} else if (const auto *copyoutClause =
23322336
std::get_if<Fortran::parser::AccClause::Copyout>(
23332337
&clause.u)) {
@@ -2525,6 +2529,8 @@ static Op createComputeOp(
25252529
// Create the exit operations after the region.
25262530
genDataExitOperations<mlir::acc::CopyinOp, mlir::acc::CopyoutOp>(
25272531
builder, copyEntryOperands, /*structured=*/true);
2532+
genDataExitOperations<mlir::acc::CopyinOp, mlir::acc::DeleteOp>(
2533+
builder, copyinEntryOperands, /*structured=*/true);
25282534
genDataExitOperations<mlir::acc::CreateOp, mlir::acc::CopyoutOp>(
25292535
builder, copyoutEntryOperands, /*structured=*/true);
25302536
genDataExitOperations<mlir::acc::AttachOp, mlir::acc::DetachOp>(
@@ -2544,8 +2550,8 @@ static void genACCDataOp(Fortran::lower::AbstractConverter &converter,
25442550
const Fortran::parser::AccClauseList &accClauseList) {
25452551
mlir::Value ifCond;
25462552
llvm::SmallVector<mlir::Value> attachEntryOperands, createEntryOperands,
2547-
copyEntryOperands, copyoutEntryOperands, dataClauseOperands, waitOperands,
2548-
async;
2553+
copyEntryOperands, copyinEntryOperands, copyoutEntryOperands,
2554+
dataClauseOperands, waitOperands, async;
25492555
llvm::SmallVector<mlir::Attribute> asyncDeviceTypes, asyncOnlyDeviceTypes,
25502556
waitOperandsDeviceTypes, waitOnlyDeviceTypes;
25512557
llvm::SmallVector<int32_t> waitOperandsSegments;
@@ -2604,13 +2610,16 @@ static void genACCDataOp(Fortran::lower::AbstractConverter &converter,
26042610
dataClauseOperands.end());
26052611
} else if (const auto *copyinClause =
26062612
std::get_if<Fortran::parser::AccClause::Copyin>(&clause.u)) {
2613+
auto crtDataStart = dataClauseOperands.size();
26072614
genDataOperandOperationsWithModifier<mlir::acc::CopyinOp,
26082615
Fortran::parser::AccClause::Copyin>(
26092616
copyinClause, converter, semanticsContext, stmtCtx,
26102617
Fortran::parser::AccDataModifier::Modifier::ReadOnly,
26112618
dataClauseOperands, mlir::acc::DataClause::acc_copyin,
26122619
mlir::acc::DataClause::acc_copyin_readonly, async, asyncDeviceTypes,
26132620
asyncOnlyDeviceTypes);
2621+
copyinEntryOperands.append(dataClauseOperands.begin() + crtDataStart,
2622+
dataClauseOperands.end());
26142623
} else if (const auto *copyoutClause =
26152624
std::get_if<Fortran::parser::AccClause::Copyout>(
26162625
&clause.u)) {
@@ -2723,6 +2732,8 @@ static void genACCDataOp(Fortran::lower::AbstractConverter &converter,
27232732
// Create the exit operations after the region.
27242733
genDataExitOperations<mlir::acc::CopyinOp, mlir::acc::CopyoutOp>(
27252734
builder, copyEntryOperands, /*structured=*/true);
2735+
genDataExitOperations<mlir::acc::CopyinOp, mlir::acc::DeleteOp>(
2736+
builder, copyinEntryOperands, /*structured=*/true);
27262737
genDataExitOperations<mlir::acc::CreateOp, mlir::acc::CopyoutOp>(
27272738
builder, copyoutEntryOperands, /*structured=*/true);
27282739
genDataExitOperations<mlir::acc::AttachOp, mlir::acc::DetachOp>(
@@ -3691,7 +3702,8 @@ genDeclareInFunction(Fortran::lower::AbstractConverter &converter,
36913702
mlir::Location loc,
36923703
const Fortran::parser::AccClauseList &accClauseList) {
36933704
llvm::SmallVector<mlir::Value> dataClauseOperands, copyEntryOperands,
3694-
createEntryOperands, copyoutEntryOperands, deviceResidentEntryOperands;
3705+
copyinEntryOperands, createEntryOperands, copyoutEntryOperands,
3706+
deviceResidentEntryOperands;
36953707
Fortran::lower::StatementContext stmtCtx;
36963708
fir::FirOpBuilder &builder = converter.getFirOpBuilder();
36973709

@@ -3729,12 +3741,15 @@ genDeclareInFunction(Fortran::lower::AbstractConverter &converter,
37293741
/*structured=*/true, /*implicit=*/false);
37303742
} else if (const auto *copyinClause =
37313743
std::get_if<Fortran::parser::AccClause::Copyin>(&clause.u)) {
3744+
auto crtDataStart = dataClauseOperands.size();
37323745
genDeclareDataOperandOperationsWithModifier<mlir::acc::CopyinOp,
37333746
mlir::acc::DeleteOp>(
37343747
copyinClause, converter, semanticsContext, stmtCtx,
37353748
Fortran::parser::AccDataModifier::Modifier::ReadOnly,
37363749
dataClauseOperands, mlir::acc::DataClause::acc_copyin,
37373750
mlir::acc::DataClause::acc_copyin_readonly);
3751+
copyinEntryOperands.append(dataClauseOperands.begin() + crtDataStart,
3752+
dataClauseOperands.end());
37383753
} else if (const auto *copyoutClause =
37393754
std::get_if<Fortran::parser::AccClause::Copyout>(
37403755
&clause.u)) {
@@ -3801,12 +3816,14 @@ genDeclareInFunction(Fortran::lower::AbstractConverter &converter,
38013816
}
38023817

38033818
openAccCtx.attachCleanup([&builder, loc, createEntryOperands,
3804-
copyEntryOperands, copyoutEntryOperands,
3805-
deviceResidentEntryOperands, declareToken]() {
3819+
copyEntryOperands, copyinEntryOperands,
3820+
copyoutEntryOperands, deviceResidentEntryOperands,
3821+
declareToken]() {
38063822
llvm::SmallVector<mlir::Value> operands;
38073823
operands.append(createEntryOperands);
38083824
operands.append(deviceResidentEntryOperands);
38093825
operands.append(copyEntryOperands);
3826+
operands.append(copyinEntryOperands);
38103827
operands.append(copyoutEntryOperands);
38113828

38123829
mlir::func::FuncOp funcOp = builder.getFunction();
@@ -3825,6 +3842,8 @@ genDeclareInFunction(Fortran::lower::AbstractConverter &converter,
38253842
builder, deviceResidentEntryOperands, /*structured=*/true);
38263843
genDataExitOperations<mlir::acc::CopyinOp, mlir::acc::CopyoutOp>(
38273844
builder, copyEntryOperands, /*structured=*/true);
3845+
genDataExitOperations<mlir::acc::CopyinOp, mlir::acc::DeleteOp>(
3846+
builder, copyinEntryOperands, /*structured=*/true);
38283847
genDataExitOperations<mlir::acc::CreateOp, mlir::acc::CopyoutOp>(
38293848
builder, copyoutEntryOperands, /*structured=*/true);
38303849
});
@@ -3848,7 +3867,7 @@ genDeclareInModule(Fortran::lower::AbstractConverter &converter,
38483867
} else if (const auto *copyinClause =
38493868
std::get_if<Fortran::parser::AccClause::Copyin>(&clause.u)) {
38503869
genGlobalCtorsWithModifier<Fortran::parser::AccClause::Copyin,
3851-
mlir::acc::CopyinOp, mlir::acc::CopyinOp>(
3870+
mlir::acc::CopyinOp, mlir::acc::DeleteOp>(
38523871
converter, modBuilder, copyinClause,
38533872
Fortran::parser::AccDataModifier::Modifier::ReadOnly,
38543873
mlir::acc::DataClause::acc_copyin,

flang/test/Lower/OpenACC/acc-data-operands.f90

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ subroutine acc_operand_array_section()
3535
! CHECK: acc.data dataOperands(%[[COPYIN]], %[[COPYOUT_CREATE]] : !fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>) {
3636
! CHECK: acc.terminator
3737
! CHECK: }
38+
! CHECK: acc.delete accPtr(%[[COPYIN]] : !fir.ref<!fir.array<100xf32>>) bounds(%[[BOUND_1_50]]) {dataClause = #acc<data_clause acc_copyin>, name = "a(1:50)"}
3839
! CHECK: acc.copyout accPtr(%[[COPYOUT_CREATE]] : !fir.ref<!fir.array<100xf32>>) bounds(%[[BOUND_51_100]]) to varPtr(%[[DECL]]#0 : !fir.ref<!fir.array<100xf32>>) {name = "a(51:100)"}
3940

4041
! Testing array sections of a derived-type component
@@ -138,9 +139,9 @@ subroutine acc_operand_array_section_allocatable()
138139
! CHECK: %[[LOAD_BOX_A_2:.*]] = fir.load %[[DECLA]]#1 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
139140
! CHECK: %[[C0:.*]] = arith.constant 0 : index
140141
! CHECK: %[[DIMS0_2:.*]]:3 = fir.box_dims %[[LOAD_BOX_A_2]], %[[C0]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index)
141-
! CHECK: %[[BOUND:.*]] = acc.bounds lowerbound(%[[LB]] : index) upperbound(%[[UB]] : index) extent(%[[DIMS0_2]]#1 : index) stride(%[[DIMS0_1]]#2 : index) startIdx(%[[DIMS0_0]]#0 : index) {strideInBytes = true}
142+
! CHECK: %[[BOUND_1_50:.*]] = acc.bounds lowerbound(%[[LB]] : index) upperbound(%[[UB]] : index) extent(%[[DIMS0_2]]#1 : index) stride(%[[DIMS0_1]]#2 : index) startIdx(%[[DIMS0_0]]#0 : index) {strideInBytes = true}
142143
! CHECK: %[[BOX_ADDR:.*]] = fir.box_addr %[[LOAD_BOX_A_0]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>>
143-
! CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[BOX_ADDR]] : !fir.heap<!fir.array<?xf32>>) bounds(%[[BOUND]]) -> !fir.heap<!fir.array<?xf32>> {name = "a(1:50)"}
144+
! CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[BOX_ADDR]] : !fir.heap<!fir.array<?xf32>>) bounds(%[[BOUND_1_50]]) -> !fir.heap<!fir.array<?xf32>> {name = "a(1:50)"}
144145
! CHECK: %[[LOAD_BOX_A_0:.*]] = fir.load %[[DECLA]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
145146
! CHECK: %[[LOAD_BOX_A_1:.*]] = fir.load %[[DECLA]]#1 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
146147
! CHECK: %[[C0:.*]] = arith.constant 0 : index
@@ -154,13 +155,14 @@ subroutine acc_operand_array_section_allocatable()
154155
! CHECK: %[[LOAD_BOX_A_2:.*]] = fir.load %[[DECLA]]#1 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
155156
! CHECK: %[[C0:.*]] = arith.constant 0 : index
156157
! CHECK: %[[DIMS0_2:.*]]:3 = fir.box_dims %[[LOAD_BOX_A_2]], %[[C0]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index)
157-
! CHECK: %[[BOUND:.*]] = acc.bounds lowerbound(%[[LB]] : index) upperbound(%[[UB]] : index) extent(%[[DIMS0_2]]#1 : index) stride(%[[DIMS0_1]]#2 : index) startIdx(%[[DIMS0_0]]#0 : index) {strideInBytes = true}
158+
! CHECK: %[[BOUND_51_100:.*]] = acc.bounds lowerbound(%[[LB]] : index) upperbound(%[[UB]] : index) extent(%[[DIMS0_2]]#1 : index) stride(%[[DIMS0_1]]#2 : index) startIdx(%[[DIMS0_0]]#0 : index) {strideInBytes = true}
158159
! CHECK: %[[BOX_ADDR:.*]] = fir.box_addr %[[LOAD_BOX_A_0]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>>
159-
! CHECK: %[[COPYOUT_CREATE:.*]] = acc.create varPtr(%[[BOX_ADDR]] : !fir.heap<!fir.array<?xf32>>) bounds(%[[BOUND]]) -> !fir.heap<!fir.array<?xf32>> {dataClause = #acc<data_clause acc_copyout>, name = "a(51:100)"}
160+
! CHECK: %[[COPYOUT_CREATE:.*]] = acc.create varPtr(%[[BOX_ADDR]] : !fir.heap<!fir.array<?xf32>>) bounds(%[[BOUND_51_100]]) -> !fir.heap<!fir.array<?xf32>> {dataClause = #acc<data_clause acc_copyout>, name = "a(51:100)"}
160161
! CHECK: acc.data dataOperands(%[[COPYIN]], %[[COPYOUT_CREATE]] : !fir.heap<!fir.array<?xf32>>, !fir.heap<!fir.array<?xf32>>) {
161162
! CHECK: acc.terminator
162163
! CHECK: }
163-
! CHECK: acc.copyout accPtr(%[[COPYOUT_CREATE]] : !fir.heap<!fir.array<?xf32>>) bounds(%[[BOUND]]) to varPtr(%[[BOX_ADDR]] : !fir.heap<!fir.array<?xf32>>) {name = "a(51:100)"}
164+
! CHECK: acc.delete accPtr(%[[COPYIN]] : !fir.heap<!fir.array<?xf32>>) bounds(%[[BOUND_1_50]]) {dataClause = #acc<data_clause acc_copyin>, name = "a(1:50)"}
165+
! CHECK: acc.copyout accPtr(%[[COPYOUT_CREATE]] : !fir.heap<!fir.array<?xf32>>) bounds(%[[BOUND_51_100]]) to varPtr(%[[BOX_ADDR]] : !fir.heap<!fir.array<?xf32>>) {name = "a(51:100)"}
164166

165167

166168
! Testing array sections on pointer array
@@ -196,6 +198,7 @@ subroutine acc_operand_array_section_pointer()
196198
! CHECK: acc.data dataOperands(%[[COPYIN]] : !fir.ptr<!fir.array<?xf32>>) {
197199
! CHECK: acc.terminator
198200
! CHECK: }
201+
! CHECK: acc.delete accPtr(%[[COPYIN]] : !fir.ptr<!fir.array<?xf32>>) bounds(%[[BOUND]]) {dataClause = #acc<data_clause acc_copyin>, name = "p(1:50)"}
199202

200203

201204
end module

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ subroutine acc_data
7474
! CHECK: acc.data dataOperands(%[[COPYIN_A]], %[[COPYIN_B]], %[[COPYIN_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {
7575
! CHECK: acc.terminator
7676
! CHECK-NEXT: }{{$}}
77+
! CHECK: acc.delete accPtr(%[[COPYIN_A]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {dataClause = #acc<data_clause acc_copyin>, name = "a"}
78+
! CHECK: acc.delete accPtr(%[[COPYIN_B]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {dataClause = #acc<data_clause acc_copyin_readonly>, name = "b"}
79+
! CHECK: acc.delete accPtr(%[[COPYIN_C]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {dataClause = #acc<data_clause acc_copyin_readonly>, name = "c"}
7780

7881
!$acc data copyout(a) copyout(zero: b) copyout(c)
7982
!$acc end data

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@ module acc_declare_copyin_test
3939
! CHECK: acc.terminator
4040
! CHECK: }
4141

42+
! CHECK-LABEL: acc.global_dtor @_QMacc_declare_copyin_testEdata1_acc_dtor {
43+
! CHECK: %[[GLOBAL_ADDR:.*]] = fir.address_of(@_QMacc_declare_copyin_testEdata1) {acc.declare = #acc.declare<dataClause = acc_copyin>} : !fir.ref<!fir.array<100000xf32>>
44+
! CHECK: %[[DEVICEPTR:.*]] = acc.getdeviceptr varPtr(%[[GLOBAL_ADDR]] : !fir.ref<!fir.array<100000xf32>>) -> !fir.ref<!fir.array<100000xf32>> {dataClause = #acc<data_clause acc_copyin>, name = "data1", structured = false}
45+
! CHECK: acc.declare_exit dataOperands(%[[DEVICEPTR]] : !fir.ref<!fir.array<100000xf32>>)
46+
! CHECK: acc.delete accPtr(%[[DEVICEPTR]] : !fir.ref<!fir.array<100000xf32>>) {dataClause = #acc<data_clause acc_copyin>, name = "data1", structured = false}
47+
! CHECK: acc.terminator
48+
! CHECK: }
49+
4250
module acc_declare_device_resident_test
4351
integer, parameter :: n = 5000
4452
integer, dimension(n) :: data1

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,14 @@ subroutine acc_declare_copyin()
8282
! CHECK: %[[ADECL:.*]]:2 = hlfir.declare %[[A]](%{{.*}}) {acc.declare = #acc.declare<dataClause = acc_copyin>, uniq_name = "_QMacc_declareFacc_declare_copyinEa"} : (!fir.ref<!fir.array<100xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xi32>>, !fir.ref<!fir.array<100xi32>>)
8383
! CHECK: %[[B:.*]] = fir.alloca !fir.array<10xi32> {bindc_name = "b", uniq_name = "_QMacc_declareFacc_declare_copyinEb"}
8484
! CHECK: %[[BDECL:.*]]:2 = hlfir.declare %[[B]](%{{.*}}) {acc.declare = #acc.declare<dataClause = acc_copyin_readonly>, uniq_name = "_QMacc_declareFacc_declare_copyinEb"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)
85-
! CHECK: %[[BOUND:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) extent(%{{.*}} : index) stride(%{{.*}} : index) startIdx(%{{.*}} : index)
86-
! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[ADECL]]#0 : !fir.ref<!fir.array<100xi32>>) bounds(%[[BOUND]]) -> !fir.ref<!fir.array<100xi32>> {name = "a"}
87-
! CHECK: %[[BOUND:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) extent(%{{.*}} : index) stride(%{{.*}} : index) startIdx(%{{.*}} : index)
88-
! CHECK: %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[BDECL]]#0 : !fir.ref<!fir.array<10xi32>>) bounds(%[[BOUND]]) -> !fir.ref<!fir.array<10xi32>> {dataClause = #acc<data_clause acc_copyin_readonly>, name = "b"}
85+
! CHECK: %[[BOUND_A:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) extent(%{{.*}} : index) stride(%{{.*}} : index) startIdx(%{{.*}} : index)
86+
! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[ADECL]]#0 : !fir.ref<!fir.array<100xi32>>) bounds(%[[BOUND_A]]) -> !fir.ref<!fir.array<100xi32>> {name = "a"}
87+
! CHECK: %[[BOUND_B:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) extent(%{{.*}} : index) stride(%{{.*}} : index) startIdx(%{{.*}} : index)
88+
! CHECK: %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[BDECL]]#0 : !fir.ref<!fir.array<10xi32>>) bounds(%[[BOUND_B]]) -> !fir.ref<!fir.array<10xi32>> {dataClause = #acc<data_clause acc_copyin_readonly>, name = "b"}
8989
! CHECK: acc.declare_enter dataOperands(%[[COPYIN_A]], %[[COPYIN_B]] : !fir.ref<!fir.array<100xi32>>, !fir.ref<!fir.array<10xi32>>)
9090
! CHECK: %{{.*}}:2 = fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%arg{{.*}} = %{{.*}}) -> (index, i32)
91+
! CHECK: acc.delete accPtr(%[[COPYIN_A]] : !fir.ref<!fir.array<100xi32>>) bounds(%[[BOUND_A]]) {dataClause = #acc<data_clause acc_copyin>, name = "a"}
92+
! CHECK: acc.delete accPtr(%[[COPYIN_B]] : !fir.ref<!fir.array<10xi32>>) bounds(%[[BOUND_B]]) {dataClause = #acc<data_clause acc_copyin_readonly>, name = "b"}
9193

9294
subroutine acc_declare_copyout()
9395
integer :: a(100), i

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,8 @@ subroutine acc_kernels_loop
345345
! CHECK-NEXT: }{{$}}
346346
! CHECK: acc.terminator
347347
! CHECK-NEXT: }{{$}}
348+
! CHECK: acc.delete accPtr(%[[COPYIN_A]] : !fir.ref<!fir.array<10xf32>>) bounds(%{{.*}}) {dataClause = #acc<data_clause acc_copyin>, name = "a"}
349+
! CHECK: acc.delete accPtr(%[[COPYIN_B]] : !fir.ref<!fir.array<10xf32>>) bounds(%{{.*}}) {dataClause = #acc<data_clause acc_copyin_readonly>, name = "b"}
348350

349351
!$acc kernels loop copyout(a) copyout(zero: b)
350352
DO i = 1, n

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,9 @@ subroutine acc_kernels
214214
! CHECK: acc.kernels dataOperands(%[[COPYIN_A]], %[[COPYIN_B]], %[[COPYIN_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {
215215
! CHECK: acc.terminator
216216
! CHECK-NEXT: }{{$}}
217+
! CHECK: acc.delete accPtr(%[[COPYIN_A]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {dataClause = #acc<data_clause acc_copyin>, name = "a"}
218+
! CHECK: acc.delete accPtr(%[[COPYIN_B]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {dataClause = #acc<data_clause acc_copyin_readonly>, name = "b"}
219+
! CHECK: acc.delete accPtr(%[[COPYIN_C]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {dataClause = #acc<data_clause acc_copyin_readonly>, name = "c"}
217220

218221
!$acc kernels copyout(a) copyout(zero: b) copyout(c)
219222
!$acc end kernels

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,8 @@ subroutine acc_parallel_loop
345345
! CHECK-NEXT: }{{$}}
346346
! CHECK: acc.yield
347347
! CHECK-NEXT: }{{$}}
348+
! CHECK: acc.delete accPtr(%[[COPYIN_A]] : !fir.ref<!fir.array<10xf32>>) bounds(%{{.*}}) {dataClause = #acc<data_clause acc_copyin>, name = "a"}
349+
! CHECK: acc.delete accPtr(%[[COPYIN_B]] : !fir.ref<!fir.array<10xf32>>) bounds(%{{.*}}) {dataClause = #acc<data_clause acc_copyin_readonly>, name = "b"}
348350

349351
!$acc parallel loop copyout(a) copyout(zero: b)
350352
DO i = 1, n

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,9 @@ subroutine acc_parallel
244244
! CHECK: acc.parallel dataOperands(%[[COPYIN_A]], %[[COPYIN_B]], %[[COPYIN_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {
245245
! CHECK: acc.yield
246246
! CHECK-NEXT: }{{$}}
247+
! CHECK: acc.delete accPtr(%[[COPYIN_A]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {dataClause = #acc<data_clause acc_copyin>, name = "a"}
248+
! CHECK: acc.delete accPtr(%[[COPYIN_B]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {dataClause = #acc<data_clause acc_copyin_readonly>, name = "b"}
249+
! CHECK: acc.delete accPtr(%[[COPYIN_C]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {dataClause = #acc<data_clause acc_copyin_readonly>, name = "c"}
247250

248251
!$acc parallel copyout(a) copyout(zero: b) copyout(c)
249252
!$acc end parallel

0 commit comments

Comments
 (0)