diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp index bb8b4d8e833c2..02dba22c29c7f 100644 --- a/flang/lib/Lower/OpenACC.cpp +++ b/flang/lib/Lower/OpenACC.cpp @@ -812,23 +812,25 @@ static void genDeclareDataOperandOperationsWithModifier( } template -static void genDataExitOperations(fir::FirOpBuilder &builder, - llvm::SmallVector operands, - bool structured) { +static void +genDataExitOperations(fir::FirOpBuilder &builder, + llvm::SmallVector operands, bool structured, + std::optional exitLoc = std::nullopt) { for (mlir::Value operand : operands) { auto entryOp = mlir::dyn_cast_or_null(operand.getDefiningOp()); assert(entryOp && "data entry op expected"); + mlir::Location opLoc = exitLoc ? *exitLoc : entryOp.getLoc(); if constexpr (std::is_same_v || std::is_same_v) builder.create( - entryOp.getLoc(), entryOp.getAccVar(), entryOp.getVar(), - entryOp.getVarType(), entryOp.getBounds(), entryOp.getAsyncOperands(), + opLoc, entryOp.getAccVar(), entryOp.getVar(), entryOp.getVarType(), + entryOp.getBounds(), entryOp.getAsyncOperands(), entryOp.getAsyncOperandsDeviceTypeAttr(), entryOp.getAsyncOnlyAttr(), entryOp.getDataClause(), structured, entryOp.getImplicit(), builder.getStringAttr(*entryOp.getName())); else builder.create( - entryOp.getLoc(), entryOp.getAccVar(), entryOp.getBounds(), + opLoc, entryOp.getAccVar(), entryOp.getBounds(), entryOp.getAsyncOperands(), entryOp.getAsyncOperandsDeviceTypeAttr(), entryOp.getAsyncOnlyAttr(), entryOp.getDataClause(), structured, entryOp.getImplicit(), builder.getStringAttr(*entryOp.getName())); @@ -2976,6 +2978,7 @@ static Op createComputeOp( static void genACCDataOp(Fortran::lower::AbstractConverter &converter, mlir::Location currentLocation, + mlir::Location endLocation, Fortran::lower::pft::Evaluation &eval, Fortran::semantics::SemanticsContext &semanticsContext, Fortran::lower::StatementContext &stmtCtx, @@ -3170,19 +3173,19 @@ static void genACCDataOp(Fortran::lower::AbstractConverter &converter, // Create the exit operations after the region. genDataExitOperations( - builder, copyEntryOperands, /*structured=*/true); + builder, copyEntryOperands, /*structured=*/true, endLocation); genDataExitOperations( - builder, copyinEntryOperands, /*structured=*/true); + builder, copyinEntryOperands, /*structured=*/true, endLocation); genDataExitOperations( - builder, copyoutEntryOperands, /*structured=*/true); + builder, copyoutEntryOperands, /*structured=*/true, endLocation); genDataExitOperations( - builder, attachEntryOperands, /*structured=*/true); + builder, attachEntryOperands, /*structured=*/true, endLocation); genDataExitOperations( - builder, createEntryOperands, /*structured=*/true); + builder, createEntryOperands, /*structured=*/true, endLocation); genDataExitOperations( - builder, nocreateEntryOperands, /*structured=*/true); + builder, nocreateEntryOperands, /*structured=*/true, endLocation); genDataExitOperations( - builder, presentEntryOperands, /*structured=*/true); + builder, presentEntryOperands, /*structured=*/true, endLocation); builder.restoreInsertionPoint(insPt); } @@ -3259,7 +3262,9 @@ genACC(Fortran::lower::AbstractConverter &converter, std::get(beginBlockDirective.t); const auto &accClauseList = std::get(beginBlockDirective.t); - + const auto &endBlockDirective = + std::get(blockConstruct.t); + mlir::Location endLocation = converter.genLocation(endBlockDirective.source); mlir::Location currentLocation = converter.genLocation(blockDirective.source); Fortran::lower::StatementContext stmtCtx; @@ -3268,8 +3273,8 @@ genACC(Fortran::lower::AbstractConverter &converter, semanticsContext, stmtCtx, accClauseList); } else if (blockDirective.v == llvm::acc::ACCD_data) { - genACCDataOp(converter, currentLocation, eval, semanticsContext, stmtCtx, - accClauseList); + genACCDataOp(converter, currentLocation, endLocation, eval, + semanticsContext, stmtCtx, accClauseList); } else if (blockDirective.v == llvm::acc::ACCD_serial) { createComputeOp(converter, currentLocation, eval, semanticsContext, stmtCtx, diff --git a/flang/test/Lower/OpenACC/locations.f90 b/flang/test/Lower/OpenACC/locations.f90 index 84dd512a5d43f..69873b3fbca4f 100644 --- a/flang/test/Lower/OpenACC/locations.f90 +++ b/flang/test/Lower/OpenACC/locations.f90 @@ -171,6 +171,17 @@ subroutine acc_loop_fused_locations(arr) ! CHECK: acc.loop ! CHECK: } attributes {collapse = [3]{{.*}}} loc(fused["{{.*}}locations.f90":160:11, "{{.*}}locations.f90":161:5, "{{.*}}locations.f90":162:7, "{{.*}}locations.f90":163:9]) + subroutine data_end_locations(arr) + real, dimension(10) :: arr + + !$acc data copy(arr) + !CHECK-LABEL: acc.copyin + !CHECK-SAME: loc("{{.*}}locations.f90":177:21) + + !$acc end data + !CHECK-LABEL: acc.copyout + !CHECK-SAME: loc("{{.*}}locations.f90":181:11) + end subroutine end module