Skip to content

Commit

Permalink
[flang][openacc] Lower acc declare link for module variable
Browse files Browse the repository at this point in the history
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
  • Loading branch information
clementval committed Jul 27, 2023
1 parent bbd214d commit a2b9201
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 2 deletions.
9 changes: 7 additions & 2 deletions flang/lib/Lower/OpenACC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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");
}
}
}
Expand Down
15 changes: 15 additions & 0 deletions flang/test/Lower/OpenACC/acc-declare.f90
Original file line number Diff line number Diff line change
Expand Up @@ -70,3 +70,18 @@ module acc_declare_device_resident_test
! 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: }

0 comments on commit a2b9201

Please sign in to comment.