diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp --- a/flang/lib/Lower/OpenACC.cpp +++ b/flang/lib/Lower/OpenACC.cpp @@ -2531,13 +2531,13 @@ genDataOperandOperations( devicePtrClause->v, converter, semanticsContext, stmtCtx, dataClauseOperands, mlir::acc::DataClause::acc_deviceptr, - /*structured=*/true, /*implicit=*/false); + /*structured=*/true, /*implicit=*/false, /*setDeclareAttr=*/true); } else if (const auto *linkClause = std::get_if(&clause.u)) { genDataOperandOperations( linkClause->v, converter, semanticsContext, stmtCtx, dataClauseOperands, mlir::acc::DataClause::acc_declare_link, - /*structured=*/true, /*implicit=*/false); + /*structured=*/true, /*implicit=*/false, /*setDeclareAttr=*/true); } else if (const auto *deviceResidentClause = std::get_if( &clause.u)) { @@ -2546,7 +2546,7 @@ deviceResidentClause->v, converter, semanticsContext, stmtCtx, dataClauseOperands, mlir::acc::DataClause::acc_declare_device_resident, - /*structured=*/true, /*implicit=*/false); + /*structured=*/true, /*implicit=*/false, /*setDeclareAttr=*/true); deviceResidentEntryOperands.append( dataClauseOperands.begin() + crtDataStart, dataClauseOperands.end()); } else { diff --git a/flang/test/Lower/OpenACC/acc-declare.f90 b/flang/test/Lower/OpenACC/acc-declare.f90 --- a/flang/test/Lower/OpenACC/acc-declare.f90 +++ b/flang/test/Lower/OpenACC/acc-declare.f90 @@ -220,7 +220,42 @@ ! CHECK: acc.declare_enter dataOperands(%[[DEVICERES]] : !fir.ref>) ! CHECK: %{{.*}}:2 = fir.do_loop %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%arg{{.*}} = %{{.*}}) -> (index, i32) ! CHECK: acc.declare_exit dataOperands(%[[DEVICERES]] : !fir.ref>) -! CHECK: acc.delete accPtr(%[[DEVICERES]] : !fir.ref>) bounds(%{{.*}}) {dataClause = #acc, name = "a"} +! CHECK: acc.delete accPtr(%[[DEVICERES]] : !fir.ref>) bounds(%{{.*}}) {dataClause = #acc, name = "a"} + + subroutine acc_declare_device_resident2() + integer, parameter :: n = 100 + real, dimension(n) :: dataparam + !$acc declare device_resident(dataparam) + end subroutine + +! CHECK-LABEL: func.func @_QMacc_declarePacc_declare_device_resident2() +! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.array<100xf32> {acc.declare = #acc.declare, bindc_name = "dataparam", uniq_name = "_QMacc_declareFacc_declare_device_resident2Edataparam"} +! CHECK: %[[DEVICERES:.*]] = acc.declare_device_resident varPtr(%[[ALLOCA]] : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "dataparam"} +! CHECK: acc.declare_enter dataOperands(%[[DEVICERES]] : !fir.ref>) +! CHECK: acc.declare_exit dataOperands(%[[DEVICERES]] : !fir.ref>) +! CHECK: acc.delete accPtr(%[[DEVICERES]] : !fir.ref>) bounds(%{{.*}}) {dataClause = #acc, name = "dataparam"} + + subroutine acc_declare_link2() + integer, parameter :: n = 100 + real, dimension(n) :: dataparam + !$acc declare link(dataparam) + end subroutine + +! CHECK-LABEL: func.func @_QMacc_declarePacc_declare_link2() +! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.array<100xf32> {acc.declare = #acc.declare, bindc_name = "dataparam", uniq_name = "_QMacc_declareFacc_declare_link2Edataparam"} +! CHECK: %[[LINK:.*]] = acc.declare_link varPtr(%[[ALLOCA]] : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "dataparam"} +! CHECK: acc.declare_enter dataOperands(%[[LINK]] : !fir.ref>) + + subroutine acc_declare_deviceptr2() + integer, parameter :: n = 100 + real, dimension(n) :: dataparam + !$acc declare deviceptr(dataparam) + end subroutine + +! CHECK-LABEL: func.func @_QMacc_declarePacc_declare_deviceptr2() +! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.array<100xf32> {acc.declare = #acc.declare, bindc_name = "dataparam", uniq_name = "_QMacc_declareFacc_declare_deviceptr2Edataparam"} +! CHECK: %[[DEVICEPTR:.*]] = acc.deviceptr varPtr(%[[ALLOCA]] : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {name = "dataparam"} +! CHECK: acc.declare_enter dataOperands(%[[DEVICEPTR]] : !fir.ref>) end module