diff options
author | Valentin Clement <clementval@gmail.com> | 2023-05-10 08:31:35 -0700 |
---|---|---|
committer | Valentin Clement <clementval@gmail.com> | 2023-05-10 08:31:53 -0700 |
commit | b60e49165ee10d11eacfdce9bf9c59d132d95e25 (patch) | |
tree | 822ff8a22374b1cdeaf40876e1e8d8d0016090ae /flang | |
parent | 647db57cdd08b7c3a01e22b0d4d31c4d116ab07e (diff) | |
download | llvm-b60e49165ee10d11eacfdce9bf9c59d132d95e25.tar.gz |
[flang][openacc] Preserve user order for entry data operand on compute construct
The order of operand in clauses that are decomposed was not
preserved. This patch change how operands are handled and preserve
the user ordering for the entry data operation on the acc.parallel
operation.
Reviewed By: vzakhari
Differential Revision: https://reviews.llvm.org/D150214
Diffstat (limited to 'flang')
-rw-r--r-- | flang/lib/Lower/OpenACC.cpp | 25 | ||||
-rw-r--r-- | flang/test/Lower/OpenACC/acc-parallel.f90 | 7 |
2 files changed, 23 insertions, 9 deletions
diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp index 1dbc92770efd..0980e1c6181b 100644 --- a/flang/lib/Lower/OpenACC.cpp +++ b/flang/lib/Lower/OpenACC.cpp @@ -902,10 +902,13 @@ createComputeOp(Fortran::lower::AbstractConverter &converter, } } else if (const auto *copyClause = std::get_if<Fortran::parser::AccClause::Copy>(&clause.u)) { + auto crtDataStart = dataClauseOperands.size(); genDataOperandOperations<mlir::acc::CopyinOp>( copyClause->v, converter, semanticsContext, stmtCtx, - copyEntryOperands, mlir::acc::DataClause::acc_copy, + dataClauseOperands, mlir::acc::DataClause::acc_copy, /*structured=*/true); + copyEntryOperands.append(dataClauseOperands.begin() + crtDataStart, + dataClauseOperands.end()); } else if (const auto *copyinClause = std::get_if<Fortran::parser::AccClause::Copyin>(&clause.u)) { genDataOperandOperationsWithModifier<mlir::acc::CopyinOp, @@ -917,20 +920,26 @@ createComputeOp(Fortran::lower::AbstractConverter &converter, } else if (const auto *copyoutClause = std::get_if<Fortran::parser::AccClause::Copyout>( &clause.u)) { + auto crtDataStart = dataClauseOperands.size(); genDataOperandOperationsWithModifier<mlir::acc::CreateOp, Fortran::parser::AccClause::Copyout>( copyoutClause, converter, semanticsContext, stmtCtx, Fortran::parser::AccDataModifier::Modifier::ReadOnly, - copyoutEntryOperands, mlir::acc::DataClause::acc_copyout, + dataClauseOperands, mlir::acc::DataClause::acc_copyout, mlir::acc::DataClause::acc_copyout_zero); + copyoutEntryOperands.append(dataClauseOperands.begin() + crtDataStart, + dataClauseOperands.end()); } else if (const auto *createClause = std::get_if<Fortran::parser::AccClause::Create>(&clause.u)) { + auto crtDataStart = dataClauseOperands.size(); genDataOperandOperationsWithModifier<mlir::acc::CreateOp, Fortran::parser::AccClause::Create>( createClause, converter, semanticsContext, stmtCtx, - Fortran::parser::AccDataModifier::Modifier::Zero, createEntryOperands, + Fortran::parser::AccDataModifier::Modifier::Zero, dataClauseOperands, mlir::acc::DataClause::acc_create, mlir::acc::DataClause::acc_create_zero); + createEntryOperands.append(dataClauseOperands.begin() + crtDataStart, + dataClauseOperands.end()); } else if (const auto *noCreateClause = std::get_if<Fortran::parser::AccClause::NoCreate>( &clause.u)) { @@ -954,10 +963,13 @@ createComputeOp(Fortran::lower::AbstractConverter &converter, /*structured=*/true); } else if (const auto *attachClause = std::get_if<Fortran::parser::AccClause::Attach>(&clause.u)) { + auto crtDataStart = dataClauseOperands.size(); genDataOperandOperations<mlir::acc::AttachOp>( attachClause->v, converter, semanticsContext, stmtCtx, - attachEntryOperands, mlir::acc::DataClause::acc_attach, + dataClauseOperands, mlir::acc::DataClause::acc_attach, /*structured=*/true); + attachEntryOperands.append(dataClauseOperands.begin() + crtDataStart, + dataClauseOperands.end()); } else if (const auto *privateClause = std::get_if<Fortran::parser::AccClause::Private>( &clause.u)) { @@ -973,11 +985,6 @@ createComputeOp(Fortran::lower::AbstractConverter &converter, } } - dataClauseOperands.append(attachEntryOperands); - dataClauseOperands.append(copyEntryOperands); - dataClauseOperands.append(copyoutEntryOperands); - dataClauseOperands.append(createEntryOperands); - // Prepare the operand segment size attribute and the operands value range. llvm::SmallVector<mlir::Value, 8> operands; llvm::SmallVector<int32_t, 8> operandSegments; diff --git a/flang/test/Lower/OpenACC/acc-parallel.f90 b/flang/test/Lower/OpenACC/acc-parallel.f90 index 8229890f9a87..a880f151d7eb 100644 --- a/flang/test/Lower/OpenACC/acc-parallel.f90 +++ b/flang/test/Lower/OpenACC/acc-parallel.f90 @@ -235,6 +235,13 @@ subroutine acc_parallel !CHECK: acc.delete accPtr(%[[CREATE_B]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {dataClause = 7 : i64, name = "b"} !CHECK: acc.delete accPtr(%[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {dataClause = 8 : i64, name = "c"} + !$acc parallel create(c) copy(b) create(a) + !$acc end parallel +!CHECK: %[[CREATE_C:.*]] = acc.create varPtr(%[[C]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref<!fir.array<10x10xf32>> {name = "c"} +!CHECK: %[[COPY_B:.*]] = acc.copyin varPtr(%[[B]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = 3 : i64, name = "b"} +!CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[A]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref<!fir.array<10x10xf32>> {name = "a"} +!CHECK: acc.parallel dataOperands(%[[CREATE_C]], %[[COPY_B]], %[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) { + !$acc parallel no_create(a, b) create(zero: c) !$acc end parallel |