[flang][openacc] Lower acc declare link for module variable

This patch adds support to lower the link clause on OpenACC
declare construct in module declaration.

Depends on D156463

Reviewed By: razvanlupusoru

Differential Revision: https://reviews.llvm.org/D156464
This commit is contained in:
Valentin Clement 2023-07-27 13:02:01 -07:00
parent bbd214d997
commit a2b92017d3
No known key found for this signature in database
GPG Key ID: 086D54783C928776
2 changed files with 22 additions and 2 deletions

View File

@ -2416,7 +2416,6 @@ static void genACC(Fortran::lower::AbstractConverter &converter,
} else if (moduleOp) {
mlir::OpBuilder modBuilder(moduleOp.getBodyRegion());
for (const Fortran::parser::AccClause &clause : accClauseList.v) {
mlir::Location clauseLocation = converter.genLocation(clause.source);
if (const auto *createClause =
std::get_if<Fortran::parser::AccClause::Create>(&clause.u)) {
genGlobalCtorsWithModifier<Fortran::parser::AccClause::Create,
@ -2441,8 +2440,14 @@ static void genACC(Fortran::lower::AbstractConverter &converter,
mlir::acc::DeclareDeviceResidentOp>(
converter, modBuilder, deviceResidentClause->v,
mlir::acc::DataClause::acc_declare_device_resident);
} else if (const auto *linkClause =
std::get_if<Fortran::parser::AccClause::Link>(
&clause.u)) {
genGlobalCtors<mlir::acc::DeclareLinkOp, mlir::acc::DeclareLinkOp>(
converter, modBuilder, linkClause->v,
mlir::acc::DataClause::acc_declare_link);
} else {
TODO(clauseLocation, "OpenACC declare clause");
llvm::report_fatal_error("unsupported clause on DECLARE directive");
}
}
}

View File

@ -70,3 +70,18 @@ end module
! CHECK: acc.declare_enter dataOperands(%[[DEVICERESIDENT]] : !fir.ref<!fir.array<5000xi32>>)
! CHECK: acc.terminator
! CHECK: }
module acc_declare_device_link_test
integer, parameter :: n = 5000
integer, dimension(n) :: data1
!$acc declare link(data1)
end module
! CHECK-LABEL: fir.global @_QMacc_declare_device_link_testEdata1 {acc.declare = #acc.declare<dataClause = acc_declare_link>} : !fir.array<5000xi32> {
! CHECK-LABEL: acc.global_ctor @_QMacc_declare_device_link_testEdata1_acc_ctor {
! CHECK: %[[GLOBAL_ADDR:.*]] = fir.address_of(@_QMacc_declare_device_link_testEdata1) {acc.declare = #acc.declare<dataClause = acc_declare_link>} : !fir.ref<!fir.array<5000xi32>>
! CHECK: %[[LINK:.*]] = acc.declare_link varPtr(%[[GLOBAL_ADDR]] : !fir.ref<!fir.array<5000xi32>>) -> !fir.ref<!fir.array<5000xi32>> {name = "data1"}
! CHECK: acc.declare_enter dataOperands(%[[LINK]] : !fir.ref<!fir.array<5000xi32>>)
! CHECK: acc.terminator
! CHECK: }